|
4 weeks ago | |
---|---|---|
.. | ||
README.md | 4 weeks ago | |
assignment.md | 4 weeks ago |
README.md
Praca z danymi: Przygotowanie danych
![]() |
---|
Przygotowanie danych - Sketchnote by @nitya |
Quiz przed wykładem
W zależności od źródła, surowe dane mogą zawierać pewne nieścisłości, które utrudniają analizę i modelowanie. Innymi słowy, takie dane można określić jako „brudne” i wymagają oczyszczenia. Ta lekcja koncentruje się na technikach czyszczenia i transformacji danych, aby poradzić sobie z problemami związanymi z brakującymi, nieprecyzyjnymi lub niekompletnymi danymi. Omawiane tematy wykorzystują Python i bibliotekę Pandas, a ich zastosowanie zostanie zademonstrowane w notatniku w tym katalogu.
Dlaczego czyszczenie danych jest ważne
-
Łatwość użycia i ponownego wykorzystania: Kiedy dane są odpowiednio zorganizowane i znormalizowane, łatwiej je wyszukiwać, używać i udostępniać innym.
-
Spójność: Praca z danymi często wymaga korzystania z więcej niż jednego zestawu danych, które pochodzą z różnych źródeł i muszą być połączone. Upewnienie się, że każdy zestaw danych jest znormalizowany według wspólnych standardów, zapewnia ich użyteczność po scaleniu w jeden zestaw.
-
Dokładność modeli: Oczyszczone dane poprawiają dokładność modeli, które na nich bazują.
Typowe cele i strategie czyszczenia danych
-
Eksploracja zestawu danych: Eksploracja danych, która jest omawiana w późniejszej lekcji, pozwala odkryć dane wymagające oczyszczenia. Obserwacja wartości w zestawie danych może pomóc w ustaleniu oczekiwań co do jego pozostałej części lub wskazać problemy, które można rozwiązać. Eksploracja może obejmować podstawowe zapytania, wizualizacje i próbkowanie.
-
Formatowanie: W zależności od źródła, dane mogą być niespójne w sposobie ich prezentacji. Może to powodować problemy w wyszukiwaniu i reprezentacji wartości, gdzie dane są widoczne w zestawie, ale nie są odpowiednio przedstawione w wizualizacjach lub wynikach zapytań. Typowe problemy z formatowaniem obejmują usuwanie białych znaków, dat i typów danych. Rozwiązywanie problemów z formatowaniem zazwyczaj należy do osób korzystających z danych. Na przykład standardy dotyczące prezentacji dat i liczb mogą różnić się w zależności od kraju.
-
Duplikaty: Dane, które występują więcej niż raz, mogą prowadzić do nieprecyzyjnych wyników i zazwyczaj powinny zostać usunięte. Jest to częsty problem przy łączeniu dwóch lub więcej zestawów danych. Jednak w niektórych przypadkach duplikaty mogą zawierać dodatkowe informacje, które warto zachować.
-
Brakujące dane: Brakujące dane mogą powodować nieścisłości oraz słabe lub stronnicze wyniki. Czasami można je rozwiązać poprzez ponowne załadowanie danych, uzupełnienie brakujących wartości za pomocą obliczeń i kodu, np. w Pythonie, lub po prostu usunięcie wartości i powiązanych danych. Przyczyny brakujących danych mogą być różne, a działania podejmowane w celu ich rozwiązania zależą od tego, jak i dlaczego dane zniknęły.
Eksploracja informacji w DataFrame
Cel nauki: Po zakończeniu tej części powinieneś być w stanie znaleźć ogólne informacje o danych przechowywanych w DataFrame w Pandas.
Po załadowaniu danych do Pandas, najprawdopodobniej będą one w formacie DataFrame (odwołaj się do poprzedniej lekcji dla szczegółowego przeglądu). Jednak jeśli zestaw danych w Twoim DataFrame zawiera 60 000 wierszy i 400 kolumn, jak zacząć rozumieć, z czym pracujesz? Na szczęście Pandas oferuje wygodne narzędzia do szybkiego przeglądania ogólnych informacji o DataFrame, a także pierwszych i ostatnich kilku wierszy.
Aby zbadać tę funkcjonalność, zaimportujemy bibliotekę Python scikit-learn i użyjemy ikonicznego zestawu danych: Iris data set.
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
długość działki (cm) | szerokość działki (cm) | długość płatka (cm) | szerokość płatka (cm) | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
- DataFrame.info: Na początek metoda
info()
służy do wyświetlenia podsumowania zawartości obecnej wDataFrame
. Spójrzmy na ten zestaw danych, aby zobaczyć, co mamy:
iris_df.info()
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal length (cm) 150 non-null float64
1 sepal width (cm) 150 non-null float64
2 petal length (cm) 150 non-null float64
3 petal width (cm) 150 non-null float64
dtypes: float64(4)
memory usage: 4.8 KB
Z tego dowiadujemy się, że zestaw danych Iris ma 150 wpisów w czterech kolumnach bez brakujących wartości. Wszystkie dane są przechowywane jako liczby zmiennoprzecinkowe 64-bitowe.
- DataFrame.head(): Następnie, aby sprawdzić rzeczywistą zawartość
DataFrame
, używamy metodyhead()
. Zobaczmy, jak wyglądają pierwsze kilka wierszy naszegoiris_df
:
iris_df.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
- DataFrame.tail(): Z kolei, aby sprawdzić ostatnie kilka wierszy
DataFrame
, używamy metodytail()
:
iris_df.tail()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
Wniosek: Nawet patrząc tylko na metadane o informacji w DataFrame lub na pierwsze i ostatnie kilka wartości, możesz od razu uzyskać wyobrażenie o rozmiarze, kształcie i zawartości danych, z którymi pracujesz.
Radzenie sobie z brakującymi danymi
Cel nauki: Po zakończeniu tej części powinieneś wiedzieć, jak zastępować lub usuwać brakujące wartości z DataFrame.
Większość zestawów danych, które chcesz (lub musisz) używać, zawiera brakujące wartości. Sposób, w jaki radzisz sobie z brakującymi danymi, niesie ze sobą subtelne kompromisy, które mogą wpłynąć na Twoją ostateczną analizę i wyniki w rzeczywistym świecie.
Pandas obsługuje brakujące wartości na dwa sposoby. Pierwszy, który widziałeś wcześniej w poprzednich sekcjach, to NaN
, czyli Not a Number. Jest to specjalna wartość będąca częścią specyfikacji IEEE dla liczb zmiennoprzecinkowych i jest używana wyłącznie do wskazywania brakujących wartości zmiennoprzecinkowych.
Dla brakujących wartości innych niż liczby zmiennoprzecinkowe, Pandas używa obiektu Python None
. Chociaż może się wydawać mylące, że napotkasz dwa różne rodzaje wartości oznaczających zasadniczo to samo, istnieją solidne programistyczne powody dla takiego wyboru projektowego, a w praktyce takie podejście umożliwia Pandas dostarczenie dobrego kompromisu w zdecydowanej większości przypadków. Niemniej jednak zarówno None
, jak i NaN
mają ograniczenia, które należy mieć na uwadze w kontekście ich użycia.
Więcej o NaN
i None
znajdziesz w notatniku!
- Wykrywanie brakujących wartości: W
Pandas
metodyisnull()
inotnull()
są głównymi narzędziami do wykrywania brakujących danych. Obie zwracają maski logiczne dla Twoich danych. Będziemy używaćnumpy
dla wartościNaN
:
import numpy as np
example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
0 False
1 True
2 False
3 True
dtype: bool
Przyjrzyj się uważnie wynikom. Czy coś Cię zaskoczyło? Chociaż 0
jest arytmetycznym zerem, jest to jednak całkowicie poprawna liczba całkowita i Pandas traktuje ją jako taką. ''
jest nieco bardziej subtelne. Chociaż używaliśmy go w Sekcji 1 do reprezentowania pustej wartości tekstowej, jest to jednak obiekt tekstowy, a nie reprezentacja null w rozumieniu Pandas.
Teraz odwróćmy sytuację i użyjmy tych metod w sposób bardziej zbliżony do praktycznego zastosowania. Maski logiczne można używać bezpośrednio jako indeksy Series
lub DataFrame
, co jest przydatne przy pracy z izolowanymi brakującymi (lub obecnymi) wartościami.
Wniosek: Zarówno metody
isnull()
jak inotnull()
dają podobne wyniki, gdy używasz ich wDataFrame
: pokazują wyniki oraz indeks tych wyników, co będzie niezwykle pomocne podczas pracy z danymi.
- Usuwanie brakujących wartości: Oprócz identyfikacji brakujących wartości, Pandas oferuje wygodny sposób usuwania wartości null z
Series
iDataFrame
. (Szczególnie w przypadku dużych zestawów danych, często bardziej wskazane jest po prostu usunięcie brakujących wartości [NA] z analizy niż radzenie sobie z nimi w inny sposób). Aby zobaczyć to w praktyce, wróćmy doexample1
:
example1 = example1.dropna()
example1
0 0
2
dtype: object
Zauważ, że powinno to wyglądać jak wynik example3[example3.notnull()]
. Różnica polega na tym, że zamiast indeksowania na podstawie zamaskowanych wartości, dropna
usunęło te brakujące wartości z Series
example1
.
Ponieważ DataFrame
ma dwa wymiary, oferuje więcej opcji usuwania danych.
example2 = pd.DataFrame([[1, np.nan, 7],
[2, 5, 8],
[np.nan, 6, 9]])
example2
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | NaN | 7 |
1 | 2.0 | 5.0 | 8 |
2 | NaN | 6.0 | 9 |
(Zauważyłeś, że Pandas przekonwertował dwie kolumny na liczby zmiennoprzecinkowe, aby uwzględnić NaN
?)
Nie możesz usunąć pojedynczej wartości z DataFrame
, więc musisz usunąć całe wiersze lub kolumny. W zależności od tego, co robisz, możesz chcieć zrobić jedno lub drugie, dlatego Pandas daje opcje dla obu. Ponieważ w nauce o danych kolumny zazwyczaj reprezentują zmienne, a wiersze obserwacje, częściej usuwa się wiersze danych; domyślne ustawienie dla dropna()
to usunięcie wszystkich wierszy zawierających jakiekolwiek wartości null:
example2.dropna()
0 1 2
1 2.0 5.0 8
Jeśli to konieczne, możesz usunąć wartości NA z kolumn. Użyj axis=1
, aby to zrobić:
example2.dropna(axis='columns')
2
0 7
1 8
2 9
Zauważ, że może to usunąć wiele danych, które chciałbyś zachować, szczególnie w mniejszych zestawach danych. Co jeśli chcesz usunąć tylko wiersze lub kolumny zawierające kilka lub nawet wszystkie wartości null? Możesz określić te ustawienia w dropna
za pomocą parametrów how
i thresh
.
Domyślnie how='any'
(jeśli chcesz sprawdzić samodzielnie lub zobaczyć, jakie inne parametry ma metoda, uruchom example4.dropna?
w komórce kodu). Możesz alternatywnie określić how='all'
, aby usunąć tylko wiersze lub kolumny zawierające wszystkie wartości null. Rozszerzmy nasz przykład DataFrame
, aby zobaczyć to w praktyce.
example2[3] = np.nan
example2
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 1.0 | NaN | 7 | NaN |
1 | 2.0 | 5.0 | 8 | NaN |
2 | NaN | 6.0 | 9 | NaN |
Parametr thresh
daje bardziej precyzyjną kontrolę: ustawiasz liczbę nie-nullowych wartości, które wiersz lub kolumna musi mieć, aby zostały zachowane:
example2.dropna(axis='rows', thresh=3)
0 1 2 3
1 2.0 5.0 8 NaN
Tutaj pierwszy i ostatni wiersz zostały usunięte, ponieważ zawierają tylko dwie nie-nullowe wartości.
- Uzupełnianie brakujących wartości: W zależności od zestawu danych, czasami bardziej sensowne jest uzupełnienie brakujących wartości niż ich usunięcie. Możesz użyć
isnull
, aby zrobić to bezpośrednio, ale może to być pracochłonne, szczególnie jeśli masz wiele wartości do uzupełnienia. Ponieważ jest to tak częste zadanie w nauce o danych, Pandas oferujefillna
, który zwraca kopięSeries
lubDataFrame
z brakującymi wartościami zastąpionymi wybraną przez Ciebie wartością. Stwórzmy kolejny przykładSeries
, aby zobaczyć, jak to działa w praktyce.
example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
example3
a 1.0
b NaN
c 2.0
d NaN
e 3.0
dtype: float64
Możesz uzupełnić wszystkie brakujące wpisy jedną wartością, na przykład 0
:
example3.fillna(0)
a 1.0
b 0.0
c 2.0
d 0.0
e 3.0
dtype: float64
Możesz uzupełnić w przód brakujące wartości, używając ostatniej poprawnej wartości do uzupełnienia null:
example3.fillna(method='ffill')
a 1.0
b 1.0
c 2.0
d 2.0
e 3.0
dtype: float64
Możesz również uzupełnić w tył, propagując następną poprawną wartość wstecz, aby uzupełnić null:
example3.fillna(method='bfill')
a 1.0
b 2.0
c 2.0
d 3.0
e 3.0
dtype: float64
Jak się domyślasz, działa to tak samo z DataFrame
, ale możesz również określić axis
, wzdłuż którego uzupełniasz brakujące wartości. Korzystając ponownie z wcześniej używanego example2
:
example2.fillna(method='ffill', axis=1)
0 1 2 3
0 1.0 1.0 7.0 7.0
1 2.0 5.0 8.0 8.0
2 NaN 6.0 9.0 9.0
Zauważ, że gdy poprzednia wartość nie jest dostępna do uzupełnienia w przód, wartość null pozostaje.
Wniosek: Istnieje wiele sposobów radzenia sobie z brakującymi wartościami w zbiorach danych. Konkretna strategia, którą zastosujesz (usuwanie, zastępowanie lub sposób zastępowania), powinna być uzależniona od specyfiki danych. Im więcej będziesz pracować z danymi, tym lepiej zrozumiesz, jak radzić sobie z brakującymi wartościami.
Usuwanie zduplikowanych danych
Cel nauki: Po zakończeniu tej sekcji powinieneś swobodnie identyfikować i usuwać zduplikowane wartości z DataFrame.
Oprócz brakujących danych, w rzeczywistych zbiorach danych często spotkasz się z duplikatami. Na szczęście pandas
oferuje prosty sposób wykrywania i usuwania zduplikowanych wpisów.
- Identyfikowanie duplikatów:
duplicated
: Możesz łatwo wykryć zduplikowane wartości za pomocą metodyduplicated
w pandas, która zwraca maskę logiczną wskazującą, czy wpis wDataFrame
jest duplikatem wcześniejszego. Stwórzmy kolejny przykładDataFrame
, aby zobaczyć to w praktyce.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
'numbers': [1, 2, 1, 3, 3]})
example4
letters | numbers | |
---|---|---|
0 | A | 1 |
1 | B | 2 |
2 | A | 1 |
3 | B | 3 |
4 | B | 3 |
example4.duplicated()
0 False
1 False
2 True
3 False
4 True
dtype: bool
- Usuwanie duplikatów:
drop_duplicates
: zwraca po prostu kopię danych, w której wszystkie wartości oznaczone jakoduplicated
sąFalse
:
example4.drop_duplicates()
letters numbers
0 A 1
1 B 2
3 B 3
Zarówno duplicated
, jak i drop_duplicates
domyślnie uwzględniają wszystkie kolumny, ale możesz określić, aby analizowały tylko podzbiór kolumn w Twoim DataFrame
:
example4.drop_duplicates(['letters'])
letters numbers
0 A 1
1 B 2
Wniosek: Usuwanie zduplikowanych danych to kluczowy element prawie każdego projektu związanego z analizą danych. Duplikaty mogą zmieniać wyniki analiz i prowadzić do błędnych wniosków!
🚀 Wyzwanie
Wszystkie omawiane materiały są dostępne w formie Jupyter Notebook. Dodatkowo, po każdej sekcji znajdują się ćwiczenia – spróbuj swoich sił!
Quiz po wykładzie
Przegląd i samodzielna nauka
Istnieje wiele sposobów na odkrywanie i przygotowywanie danych do analizy i modelowania, a ich czyszczenie to ważny krok, który wymaga praktyki. Spróbuj tych wyzwań z Kaggle, aby poznać techniki, które nie zostały omówione w tej lekcji.
Zadanie
Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż staramy się zapewnić dokładność, prosimy mieć na uwadze, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.