Przede wszystkim, rozpoczynając pracę z nowym zestawem danych, należy go zrozumieć. Aby to zrobić, warto na przykład ustalić zakresy wartości, jakie mogą przyjmować zmienne, ich typy oraz dowiedzieć się o liczbie brakujących wartości.
Biblioteka pandas oferuje wiele przydatnych narzędzi do przeprowadzania analizy eksploracyjnej danych (Exploratory Data Analysis, EDA). Jednak zanim z nich skorzystamy, zazwyczaj musimy zacząć od bardziej ogólnych funkcji, takich jak df.describe(). Warto jednak zauważyć, że możliwości, które oferują takie funkcje, są ograniczone, a początkowe etapy pracy z dowolnymi zestawami danych w EDA są bardzo często podobne.
Autor materiału, który dzisiaj publikujemy, twierdzi, że nie lubi wykonywać powtarzających się czynności. W efekcie, w poszukiwaniu narzędzi, które pozwalałyby szybko i efektywnie przeprowadzić eksploracyjną analizę danych, znalazł bibliotekę . Wyniki tej biblioteki przedstawiane są nie w postaci pojedynczych wskaźników, lecz w formie szczegółowego raportu HTML, zawierającego większość informacji o analizowanych danych, które mogą być potrzebne przed rozpoczęciem intensywniejszej pracy z nimi.
W tej sekcji omówimy szczegóły korzystania z biblioteki pandas-profiling na przykładzie zestawu danych Titanic.
Eksploracyjna analiza danych za pomocą pandas
Postanowiłem wypróbować pandas-profiling na zestawie danych Titanic, ponieważ zawiera dane różnych typów oraz ma brakujące wartości. Uważam, że biblioteka pandas-profiling jest szczególnie interesująca, gdy dane nie są jeszcze oczyszczone i wymagają dalszej obróbki, zależnej od ich charakterystyki. Aby skutecznie przeprowadzić taką obróbkę, trzeba wiedzieć, od czego zacząć i na co zwrócić uwagę. W tym przypadku przydadzą się możliwości pandas-profiling.
Na początek zaimportujmy dane i skorzystajmy z pandas, aby uzyskać wskaźniki statystyki opisowej:
# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np
# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# вычисление показателей описательной статистики
df.describe()Po wykonaniu tego fragmentu kodu uzyskamy to, co pokazano na następnym rysunku.

Wskaźniki statystyki opisowej uzyskane za pomocą standardowych narzędzi pandas.
Chociaż zawiera to wiele przydatnych informacji, brakuje tutaj wszystkiego, co mogłoby być interesujące do poznania danych badawczych. Na przykład, można przypuszczać, że w ramce danych, w strukturze DataFrame, znajduje się 891 wierszy. Jeśli potrzebne jest to sprawdzić, wymagana będzie jeszcze jedna linia kodu, określająca rozmiar ramki. Chociaż te obliczenia nie są szczególnie zasobożerne, ich stałe powtarzanie z pewnością doprowadzi do utraty czasu, który prawdopodobnie lepiej byłoby poświęcić na oczyszczanie danych.
Eksploracyjna analiza danych za pomocą pandas-profiling
Teraz zróbmy to samo z użyciem pandas-profiling:
pandas_profiling.ProfileReport(df)Wykonanie podanej powyżej linii kodu pozwoli na utworzenie raportu z wskaźnikami eksploracyjnej analizy danych. Kod przedstawiony powyżej doprowadzi do wyświetlenia znalezionych informacji o danych, ale można to zrobić tak, aby wynikiem był plik HTML, który można na przykład komuś pokazać.
Pierwsza część raportu będzie zawierać sekcję Overview (Przegląd), dostarczającą podstawowych informacji o danych (liczba obserwacji, liczba zmiennych itd.). Ponadto będzie zawierać listę ostrzeżeń, informujących analityka, na co warto zwrócić szczególną uwagę. Te ostrzeżenia mogą stanowić wskazówkę, na czym skupić wysiłki podczas oczyszczania danych.

Sekcja raportu Overview
Eksploracyjna analiza zmiennych
Za sekcją Overview w raporcie można znaleźć przydatne informacje o każdej zmiennej. Zawierają one między innymi małe wykresy opisujące rozkład każdej zmiennej.

Informacje o zmiennej liczbowej Age
Jak można zobaczyć z poprzedniego przykładu, pandas-profiling dostarcza nam kilka przydatnych wskaźników, takich jak procent i liczba brakujących wartości, a także wskaźniki statystyki opisowej, które już widzieliśmy. Ponieważ Age jest zmienną liczbową, wizualizacja jej rozkładu w postaci histogramu pozwala nam wyciągnąć wniosek, że mamy do czynienia z rozkładem skierowanym w prawo.
W przypadku zmiennej kategorycznej wyświetlane wskaźniki nieco różnią się od tych znalezionych dla zmiennej liczbowej.

Informacje o zmiennej kategorycznej Sex
A mianowicie, zamiast znajdowania średniej, minimum i maksimum, biblioteka pandas-profiling znalazła liczbę klas. Ponieważ Płeć — jest zmienną binarną, a jej wartości reprezentowane są przez dwie klasy.
Jeśli, tak jak ja, lubisz badać kod, może Cię zainteresować, jak dokładnie biblioteka pandas-profiling oblicza te wskaźniki. Dowiedzenie się na ten temat, biorąc pod uwagę, że kod biblioteki jest otwarty i dostępny na GitHubie, nie jest wcale trudne. Ponieważ nie jestem miłośnikiem korzystania z "czarnych skrzynek" w moich projektach, spojrzałem na źródłowy kod biblioteki. Na przykład tak wygląda mechanizm przetwarzania zmiennych numerycznych, przedstawiony w funkcji :
def describe_numeric_1d(series, **kwargs):
"""Oblicza statystyki podsumowujące dla zmiennej numerycznej (`TYPE_NUM`) (Series).
Tworzy również histogramy (mini i pełne) jej rozkładu.
Parametry
----------
series : Series
Zmienna do opisania.
Zwraca
-------
Series
Opis zmiennej jako Series z indeksami będącymi kluczami statystyk.
"""
# Formatuje liczbę jako procent. Na przykład 0.25 zostanie przekształcone w 25%.
_percentile_format = "{:.0%}"
stats = dict()
stats['type'] = base.TYPE_NUM
stats['mean'] = series.mean()
stats['std'] = series.std()
stats['variance'] = series.var()
stats['min'] = series.min()
stats['max'] = series.max()
stats['range'] = stats['max'] - stats['min']
# Aby uniknąć wielokrotnego obliczania
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# Dropna() jest obejściem dla https://github.com/pydata/pandas/issues/13098
stats[_percentile_format.format(percentile)] = _series_no_na.quantile(percentile)
stats['iqr'] = stats['75%'] - stats['25%']
stats['kurtosis'] = series.kurt()
stats['skewness'] = series.skew()
stats['sum'] = series.sum()
stats['mad'] = series.mad()
stats['cv'] = stats['std'] / stats['mean'] if stats['mean'] else np.NaN
stats['n_zeros'] = (len(series) - np.count_nonzero(series))
stats['p_zeros'] = stats['n_zeros'] * 1.0 / len(series)
# Histogramy
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name) Choć ten fragment kodu może wydawać się dość duży i skomplikowany, w rzeczywistości zrozumienie go jest bardzo proste. Mówi się o tym, że w kodzie źródłowym biblioteki znajduje się funkcja, która określa typy zmiennych. Jeśli okaże się, że biblioteka napotkała zmienną numeryczną, powyższa funkcja znajdzie wskaźniki, które omówiliśmy. W tej funkcji wykorzystuje się standardowe operacje pandas do pracy z obiektami typu Series, takie jak series.mean(). Wyniki obliczeń są zapisywane w słowniku stats. Histogramy są tworzone z wykorzystaniem dostosowanej wersji funkcji matplotlib.pyplot.hist. Adaptacja ma na celu umożliwienie funkcji pracy z różnymi typami zbiorów danych.
Wskaźniki korelacji i próbka badanych danych
Po wynikach analizy zmiennych panda-profiling, w sekcji Korelacje, zostaną wyświetlone macierze korelacji Pearsona i Spearmana.

Macierz korelacji Pearsona
Jeśli zajdzie taka potrzeba, można w wierszu kodu, który uruchamia generowanie raportu, określić wskaźniki progowe stosowane przy obliczaniu korelacji. Dzięki temu można wskazać, jaka siła korelacji jest istotna dla Twojej analizy.
Na koniec, w raporcie panda-profiling, w sekcji Próbka, wyświetlany jest, jako przykład, fragment danych wzięty z początku zbioru danych. Taktowanie to może prowadzić do nieprzyjemnych niespodzianek, ponieważ pierwsze kilka obserwacji może stanowić próbkę, która nie odzwierciedla cech całego zbioru danych.

Sekcja zawierająca próbkę badanych danych
W rezultacie nie polecam zwracać uwagi na tę ostatnią sekcję. Lepiej skorzystać z polecenia df.sample(5), które losowo wybierze 5 obserwacji z zestawu danych.
Podsumowanie
Podsumowując powyższe, można stwierdzić, że biblioteka panda-profiling daje analitykom pewne przydatne możliwości, które będą przydatne w przypadkach, gdy trzeba szybko uzyskać ogólne przybliżenie danych lub przekazać komuś raport z eksploracyjnej analizy danych. Rzeczywista praca z danymi, uwzględniająca ich cechy, odbywa się tak jak bez użycia panda-profiling, ręcznie.
Jeśli chcesz zobaczyć, jak wygląda cała eksploracyjna analiza danych w jednym notatniku Jupyter — zobacz mój projekt stworzony za pomocą nbviewer. A w repozytorium GitHub można znaleźć odpowiedni kod.
Drodzy Czytelnicy! Od czego zaczynasz analizę nowych zbiorów danych?
Źródło: habr.com
