Opanowanie sztuki czyszczenia danych w Pythonie - KDnuggets

Opanowanie sztuki czyszczenia danych w Pythonie – KDnuggets

Węzeł źródłowy: 2939047

Opanowanie sztuki czyszczenia danych w Pythonie
Zdjęcie autora
 

Czyszczenie danych jest kluczową częścią każdego procesu analizy danych. Na tym etapie usuwasz błędy, uzupełniasz brakujące dane i upewniasz się, że dane są w formacie, z którym możesz pracować. Bez dobrze oczyszczonego zbioru danych wszelkie późniejsze analizy mogą być wypaczone lub nieprawidłowe.

W tym artykule przedstawiono kilka kluczowych technik czyszczenia danych w języku Python przy użyciu potężnych bibliotek, takich jak pandas, numpy, seaborn i matplotlib.

Zanim zagłębimy się w mechanikę czyszczenia danych, zrozummy jej znaczenie. Dane ze świata rzeczywistego są często nieuporządkowane. Może zawierać zduplikowane wpisy, nieprawidłowe lub niespójne typy danych, brakujące wartości, nieistotne funkcje i wartości odstające. Wszystkie te czynniki mogą prowadzić do mylnych wniosków podczas analizy danych. To sprawia, że ​​czyszczenie danych jest niezbędną częścią cyklu życia analityki danych.

Omówimy następujące zadania czyszczenia danych.
 

Opanowanie sztuki czyszczenia danych w Pythonie
Zdjęcie autora

Zanim zaczniemy, zaimportujmy niezbędne biblioteki. Będziemy używać pand do manipulacji danymi, a seaborn i matplotlib do wizualizacji.

Zaimportujemy także moduł Pythona datetime do manipulowania datami.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

Najpierw musimy załadować nasze dane. W tym przykładzie załadujemy plik CSV za pomocą pand. Dodajemy również argument ogranicznika.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

Następnie ważne jest sprawdzenie danych, aby zrozumieć ich strukturę, rodzaj zmiennych, z którymi pracujemy i czy istnieją jakieś brakujące wartości. Ponieważ dane, które zaimportowaliśmy, nie są ogromne, przyjrzyjmy się całemu zbiorowi danych.

# Look at all the rows of the dataframe
display(df)

Oto jak wygląda zbiór danych.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Od razu widać, że brakuje niektórych wartości. Ponadto formaty daty są niespójne.

Przyjrzyjmy się teraz podsumowaniu DataFrame przy użyciu metody info().

# Get a concise summary of the dataframe
print(df.info())

Oto wyjście kodu.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Widzimy, że tylko kolumna Square_feet nie ma żadnych wartości NULL, więc jakoś będziemy musieli sobie z tym poradzić. Ponadto kolumny data_reklamacji i data_sprzedaży są obiektowym typem danych, mimo że powinna to być data.

Lokalizacja kolumny jest całkowicie pusta. Czy tego potrzebujemy?

Pokażemy Ci, jak sobie poradzić z tymi problemami. Zaczniemy od nauczenia się, jak usunąć niepotrzebne kolumny.

W zestawie danych znajdują się dwie kolumny, których nie potrzebujemy w naszej analizie danych, więc je usuniemy.

Pierwsza kolumna to kupujący. Nie potrzebujemy tego, ponieważ nazwa kupującego nie ma wpływu na analizę.

Używamy metody drop() z określoną nazwą kolumny. Ustawiamy oś na 1, aby określić, że chcemy usunąć kolumnę. Ponadto argument inplace jest ustawiony na True, dzięki czemu modyfikujemy istniejącą ramkę DataFrame i nie tworzymy nowej ramki DataFrame bez usuniętej kolumny.

df.drop('buyer', axis = 1, inplace = True)

Drugą kolumną, którą chcemy usunąć, jest lokalizacja. Chociaż posiadanie tych informacji może być przydatne, jest to całkowicie pusta kolumna, więc po prostu ją usuń.

Postępujemy tak samo jak w przypadku pierwszej kolumny.

df.drop('location', axis = 1, inplace = True)

Oczywiście możesz usunąć te dwie kolumny jednocześnie.

df = df.drop(['buyer', 'location'], axis=1)

Obydwa podejścia zwracają następującą ramkę danych.

 

Opanowanie sztuki czyszczenia danych w Pythonie

Z różnych powodów w zbiorze danych mogą pojawić się zduplikowane dane, które mogą zniekształcić analizę.

Wykryjmy duplikaty w naszym zbiorze danych. Oto jak to zrobić.

Poniższy kod korzysta z metody zduplikowane() uwzględnić duplikaty w całym zbiorze danych. Domyślnym ustawieniem jest traktowanie pierwszego wystąpienia wartości jako unikalnego, a kolejnych wystąpień jako duplikatów. Możesz zmodyfikować to zachowanie za pomocą zachować parametr. Na przykład df.duplicated(keep=False) oznaczy wszystkie duplikaty jako True, łącznie z pierwszym wystąpieniem.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Oto wyniki.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Wiersz o indeksie 3 został oznaczony jako duplikat, ponieważ wiersz 2 o tych samych wartościach występuje po raz pierwszy.

Teraz musimy usunąć duplikaty, co robimy za pomocą następującego kodu.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Połączenia drop_duplikaty() funkcja uwzględnia wszystkie kolumny podczas identyfikowania duplikatów. Jeśli chcesz uwzględnić tylko niektóre kolumny, możesz przekazać je jako listę do tej funkcji w następujący sposób: df.drop_duplicates(subset=['kolumna1', 'kolumna2']).

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Jak widać, zduplikowany wiersz został usunięty. Indeksowanie pozostało jednak takie samo, brakowało indeksu 3. Uporządkujemy to, resetując indeksy.

df = df.reset_index(drop=True)

Zadanie to wykonujemy za pomocą reset_index() funkcjonować. Argument drop=True służy do odrzucenia oryginalnego indeksu. Jeśli nie uwzględnisz tego argumentu, stary indeks zostanie dodany jako nowa kolumna w ramce DataFrame. Ustawiając drop=True, mówisz pandom, aby zapomniały o starym indeksie i zresetowały go do domyślnego indeksu całkowitego.

Dla praktyki spróbuj usuń duplikaty z tego zestawu danych Microsoft.

Czasami typy danych mogą być nieprawidłowo ustawione. Na przykład kolumna daty może być interpretowana jako ciągi znaków. Należy je przekonwertować na odpowiednie typy.

W naszym zbiorze danych zrobimy to dla kolumn data_reklamacji i data_sprzedaży, ponieważ są one pokazane jako typ danych obiektowych. Ponadto daty dat są formatowane w różny sposób w poszczególnych wierszach. Musimy to uspójnić, łącznie z konwersją na bieżąco.

Najprostszym sposobem jest skorzystanie z to_datetime() metoda. Ponownie możesz to zrobić kolumna po kolumnie, jak pokazano poniżej.

Robiąc to, ustawiamy argument pierwszy dzień na True, ponieważ niektóre daty zaczynają się od pierwszego dnia.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

Możesz także przekonwertować obie kolumny jednocześnie, używając opcji zastosować() metoda z to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

Obydwa podejścia dają ten sam rezultat.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Teraz daty mają spójny format. Widzimy, że nie wszystkie dane zostały przekonwertowane. W parametrze Advertising_date znajduje się jedna wartość NaT i dwie w sale_date. Oznacza to, że brakuje daty.

Sprawdźmy, czy kolumny są konwertowane na daty za pomocą metody info () Metoda.

# Get a concise summary of the dataframe
print(df.info())

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Jak widać, obie kolumny nie są w formacie datetime64[ns].

Teraz spróbuj w tym celu przekonwertować dane z TEKST na NUMERYCZNE Zbiór danych Airbnb.

W rzeczywistych zbiorach danych często brakuje wartości. Obsługa brakujących danych jest kluczowa, ponieważ niektóre algorytmy nie są w stanie obsłużyć takich wartości.

W naszym przykładzie również brakuje niektórych wartości, więc przyjrzyjmy się dwóm najczęstszym sposobom obsługi brakujących danych.

Usuwanie wierszy z brakującymi wartościami

Jeśli liczba wierszy z brakującymi danymi jest niewielka w porównaniu z całkowitą liczbą obserwacji, można rozważyć usunięcie tych wierszy.

W naszym przykładzie ostatni wiersz nie zawiera żadnych wartości poza stopami kwadratowymi i datą ogłoszenia. Nie możemy wykorzystać takich danych, więc usuńmy ten wiersz.

Oto kod, w którym wskazujemy indeks wiersza.

df = df.drop(8)

DataFrame wygląda teraz tak.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Ostatni wiersz został usunięty, a nasza ramka DataFrame wygląda teraz lepiej. Jednakże nadal brakuje pewnych danych, którymi zajmiemy się przy użyciu innego podejścia.

Podpisywanie brakujących wartości

Jeśli brakuje Ci znaczących danych, lepszą strategią niż usuwanie może być imputacja. Proces ten polega na uzupełnieniu brakujących wartości w oparciu o inne dane. W przypadku danych liczbowych powszechne metody imputacji obejmują użycie miary tendencji centralnej (średnia, mediana, moda).

W naszej już zmienionej DataFrame mamy wartości NaT (Not a Time) w kolumnach Advertising_date i sale_date. Przypiszemy te brakujące wartości za pomocą metody oznaczać() Metoda.

Kod wykorzystuje tzw wypełniać () metoda znajdowania i wypełniania wartości null wartością średnią.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

Możesz także zrobić to samo w jednym wierszu kodu. Używamy zastosować() aby zastosować funkcję zdefiniowaną za pomocą lambda. Podobnie jak powyżej, ta funkcja wykorzystuje wypełniać () i oznaczać() metody uzupełniania brakujących wartości.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

Wynik w obu przypadkach wygląda następująco.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

W naszej kolumnie sale_date znajdują się teraz czasy, których nie potrzebujemy. Usuńmy je.

Użyjemy strftime() metoda, która konwertuje daty na ich reprezentację w postaci ciągu znaków i określony format.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Daty wyglądają teraz schludnie.

Jeśli potrzebujesz użyć strftime() w wielu kolumnach możesz ponownie użyć lambda w następujący sposób.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

Zobaczmy teraz, jak możemy przypisać brakujące wartości kategoryczne.

Dane kategoryczne to rodzaj danych używany do grupowania informacji o podobnych cechach. Każda z tych grup jest kategorią. Dane kategoryczne mogą przyjmować wartości liczbowe (np. „1” oznacza „mężczyznę” i „2” oznacza „kobietę”), ale liczby te nie mają znaczenia matematycznego. Nie można ich na przykład dodać razem.

Dane kategoryczne dzieli się zazwyczaj na dwie kategorie:

  1. Dane nominalne: Dzieje się tak wtedy, gdy kategorie są jedynie oznaczone i nie można ich ułożyć w określonej kolejności. Przykładami mogą być płeć (mężczyzna, kobieta), grupa krwi (A, B, AB, O) lub kolor (czerwony, zielony, niebieski).
  1. Dane porządkowe: W tym miejscu można uporządkować i uszeregować kategorie. Chociaż odstępy między kategoriami nie są równomiernie rozmieszczone, kolejność kategorii ma znaczenie. Przykładami mogą być skale ocen (ocena filmu od 1 do 5), poziom wykształcenia (liceum, studia licencjackie, magisterskie) lub stadia nowotworu (etap I, etap II, etap III).

Do przypisania brakujących danych kategorycznych zwykle używany jest ten tryb. W naszym przykładzie kolumna kategoria_właściwości zawiera dane kategoryczne (nominalne), a w dwóch wierszach brakuje danych.

Zastąpmy brakujące wartości trybem.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

Ten kod używa znaku wypełniać () funkcja zastępująca wszystkie wartości NaN w kolumnie kategoria_właściwości. Zastępuje go trybem.

Dodatkowo część [0] służy do wyodrębnienia pierwszej wartości z tej serii. Jeśli dostępnych jest wiele trybów, zostanie wybrany pierwszy. Jeśli jest tylko jeden tryb, nadal działa dobrze.

Oto wyniki.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Dane wyglądają obecnie całkiem nieźle. Jedyne, co pozostaje, to sprawdzić, czy istnieją wartości odstające.

Możesz na tym poćwiczyć radzenie sobie z wartościami null Meta pytanie do wywiadu, gdzie będziesz musiał zastąpić wartości NULL zerami.

Wartości odstające to punkty danych w zbiorze danych, które wyraźnie różnią się od pozostałych obserwacji. Mogą one znajdować się wyjątkowo daleko od innych wartości w zbiorze danych, wykraczając poza ogólny wzór. Uważa się je za nietypowe, ponieważ ich wartości są znacznie wyższe lub niższe w porównaniu z resztą danych.

Wartości odstające mogą powstawać z różnych powodów, np.:

  • Błędy pomiaru lub wprowadzania
  • Korupcja danych
  • Prawdziwe anomalie statystyczne

Wartości odstające mogą znacząco wpłynąć na wyniki analizy danych i modelowania statystycznego. Mogą prowadzić do wypaczonego rozkładu, błędu systematycznego lub unieważnienia podstawowych założeń statystycznych, zniekształcić szacowane dopasowanie modelu, zmniejszyć dokładność predykcyjną modeli predykcyjnych i prowadzić do błędnych wniosków.

Niektóre powszechnie stosowane metody wykrywania wartości odstających to wynik Z, IQR (rozstęp międzykwartylowy), wykresy pudełkowe, wykresy punktowe i techniki wizualizacji danych. W niektórych zaawansowanych przypadkach stosowane są również metody uczenia maszynowego.

Wizualizacja danych może pomóc w identyfikacji wartości odstających. Przydaje się do tego wykres pudełkowy Seaborna.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

Używamy funkcji plt.figure() do ustawiania szerokości i wysokości figury w calach.

Następnie tworzymy wykres skrzynkowy dla kolumn Advertisingd_price i sale_price, który wygląda następująco.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Fabułę można ulepszyć, aby była łatwiejsza w użyciu, dodając to do powyższego kodu.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Powyższy kod wykorzystujemy do ustawienia etykiet dla obu osi. Zauważamy również, że wartości na osi Y są w notacji naukowej i nie możemy tego użyć do wartości cen. Dlatego zmieniamy to na zwykły styl, używając funkcji plt.ticklabel_format().

Następnie tworzymy formater, który pokaże wartości na osi Y z przecinkami jako separatory tysięcy i kropki dziesiętne. Ostatnia linia kodu stosuje to do osi.

Dane wyjściowe wyglądają teraz tak.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Jak teraz zidentyfikować i usunąć wartość odstającą?

Jednym ze sposobów jest zastosowanie metody IQR.

IQR, czyli rozstęp międzykwartylowy, to metoda statystyczna stosowana do pomiaru zmienności poprzez podzielenie zbioru danych na kwartyle. Kwartyle dzielą zbiór danych uporządkowany według rang na cztery równe części, a wartości z zakresu pierwszego kwartyla (25. percentyl) i trzeciego kwartyla (75. percentyl) tworzą rozstęp międzykwartylowy.

Rozstęp międzykwartylowy służy do identyfikowania wartości odstających w danych. Oto jak to działa:

  1. Najpierw oblicz pierwszy kwartyl (Q1), trzeci kwartyl (Q3), a następnie określ IQR. IQR oblicza się jako Q3 – Q1.
  2. Każda wartość poniżej Q1 – 1.5IQR lub powyżej Q3 + 1.5IQR jest uważana za wartość odstającą.

Na naszym wykresie pudełkowym faktycznie reprezentuje IQR. Linia wewnątrz ramki to mediana (lub drugi kwartyl). „Wąsy” na wykresie pudełkowym reprezentują zakres w granicach 1.5*IQR od Q1 i Q3.

Wszelkie punkty danych poza tymi wąsami można uznać za wartości odstające. W naszym przypadku jest to wartość 12,000,000 XNUMX XNUMX dolarów. Jeśli spojrzysz na wykres skrzynkowy, zobaczysz, jak wyraźnie jest to przedstawione, co pokazuje, dlaczego wizualizacja danych jest ważna w wykrywaniu wartości odstających.

Teraz usuńmy wartości odstające, używając metody IQR w kodzie Pythona. Najpierw usuniemy reklamowane wartości odstające cenowo.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

Najpierw obliczamy pierwszy kwartyl (lub 25. percentyl) za pomocą kwantyl() funkcjonować. Robimy to samo dla trzeciego kwartyla lub 75. percentyla.

Pokazują wartości, poniżej których przypada odpowiednio 25% i 75% danych.

Następnie obliczamy różnicę między kwartylami. Jak dotąd wszystko sprowadza się do tłumaczenia kroków IQR na kod Pythona.

Na koniec usuwamy wartości odstające. Innymi słowy, wszystkie dane mniejsze niż Q1 – 1.5 * IQR lub więcej niż Q3 + 1.5 * IQR.

Operator „~” neguje warunek, więc pozostają nam tylko dane, które nie są wartościami odstającymi.

Następnie możemy zrobić to samo z ceną sprzedaży.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

Oczywiście możesz to zrobić w bardziej zwięzły sposób, używając dla pętli.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

Pętla wykonuje iterację po dwóch kolumnach. Dla każdej kolumny oblicza IQR, a następnie usuwa wiersze z ramki DataFrame.

Należy pamiętać, że operacja ta jest wykonywana sekwencyjnie, najpierw dla ceny_reklamowanej, a następnie ceny_sprzedażowej. W rezultacie ramka DataFrame jest modyfikowana lokalnie dla każdej kolumny, a wiersze można usunąć, ponieważ w którejkolwiek kolumnie znajdują się wartości odstające. Dlatego ta operacja może skutkować mniejszą liczbą wierszy, niż gdyby wartości odstające dla reklamowana_cena i cena_sprzedaży zostały usunięte niezależnie, a wyniki zostały później połączone.

W naszym przykładzie wynik będzie taki sam w obu przypadkach. Aby zobaczyć, jak zmienił się wykres pudełkowy, musimy narysować go ponownie, używając tego samego kodu, co wcześniej.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Oto wyniki.

 

Opanowanie sztuki czyszczenia danych w Pythonie
 

Możesz poćwiczyć obliczanie percentyli w Pythonie, rozwiązując zadanie Pytanie dotyczące wywiadu w Zgromadzeniu Ogólnym.

Czyszczenie danych jest kluczowym krokiem w procesie analizy danych. Chociaż może to być czasochłonne, ważne jest, aby zapewnić dokładność wyników.

Na szczęście bogaty ekosystem bibliotek Pythona ułatwia zarządzanie tym procesem. Dowiedzieliśmy się, jak usuwać niepotrzebne wiersze i kolumny, ponownie formatować dane oraz radzić sobie z brakującymi wartościami i wartościami odstającymi. Są to typowe kroki, które należy wykonać w przypadku większości danych. Jednak czasami będziesz musiał połączyć dwie kolumny w jedną, zweryfikować istniejące dane, przypisz do niego etykietylub pozbyć się białych znaków.

Wszystko to polega na czyszczeniu danych, ponieważ pozwala przekształcić niechlujne dane ze świata rzeczywistego w dobrze zorganizowany zbiór danych, który można bezpiecznie analizować. Wystarczy porównać zbiór danych, od którego zaczęliśmy, z tym, na którym skończyliśmy.

Jeśli nie widzisz satysfakcji w tym wyniku, a czyste dane nie napawają Cię dziwną ekscytacją, co do cholery robisz w nauce danych!?
 

Nate'a Rosidiego jest analitykiem danych i strategii produktu. Jest także adiunktem wykładającym analitykę i jest założycielem StrataScratch, platforma pomagająca analitykom danych przygotować się do rozmów kwalifikacyjnych z prawdziwymi pytaniami do wywiadów z czołowymi firmami. Połącz się z nim dalej Twitter: StrataScratch or LinkedIn.

Znak czasu:

Więcej z Knuggety