Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas

Pierwszym krokiem przy rozpoczęciu pracy z nowym zbiorem danych jest jego zrozumienie. Aby to zrobić trzeba np. poznać zakresy wartości akceptowanych przez zmienne, ich typy, a także dowiedzieć się o liczbie brakujących wartości.

Biblioteka pandas dostarcza nam wielu przydatnych narzędzi do przeprowadzania eksploracyjnej analizy danych (EDA). Ale zanim ich użyjesz, zwykle musisz zacząć od bardziej ogólnych funkcji, takich jak df.describe(). Należy jednak zaznaczyć, że możliwości jakie dają takie funkcje są ograniczone, a początkowe etapy pracy z dowolnymi zbiorami danych podczas wykonywania EDA bardzo często są do siebie bardzo podobne.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas

Autor materiału, który dziś publikujemy, twierdzi, że nie jest fanem wykonywania powtarzalnych czynności. W rezultacie, poszukując narzędzi pozwalających szybko i sprawnie przeprowadzić eksploracyjną analizę danych, trafił do biblioteki profilowanie pand. Wyniki jego pracy wyrażane są nie w postaci pewnych indywidualnych wskaźników, ale w formie dość szczegółowego raportu HTML zawierającego większość informacji o analizowanych danych, które być może będziesz musiał znać, zanim zaczniesz z nimi bliżej pracować.

Tutaj przyjrzymy się funkcjom korzystania z biblioteki profilowania pand na przykładzie zestawu danych Titanica.

Eksploracyjna analiza danych przy użyciu pand

Postanowiłem poeksperymentować z profilowaniem pand na zbiorze danych Titanica ze względu na różne typy danych, które zawiera oraz obecność w nim brakujących wartości. Uważam, że biblioteka do profilowania pand jest szczególnie interesująca w przypadkach, gdy dane nie zostały jeszcze wyczyszczone i wymagają dalszego przetwarzania w zależności od ich charakterystyki. Aby skutecznie przeprowadzić taką obróbkę, trzeba wiedzieć od czego zacząć i na co zwrócić uwagę. Tutaj przydadzą się możliwości profilowania pand.

Najpierw importujemy dane i za pomocą pand uzyskujemy statystyki opisowe:

# импорт необходимых пакетов
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 otrzymasz efekt pokazany na poniższym rysunku.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Statystyki opisowe uzyskane przy użyciu standardowych narzędzi pand

Choć znajduje się tu wiele przydatnych informacji, nie zawiera ono wszystkiego, co warto wiedzieć na temat badanych danych. Można na przykład założyć, że w ramce danych, w strukturze DataFrame, jest 891 linii. Jeśli trzeba to sprawdzić, potrzebna jest kolejna linia kodu w celu określenia rozmiaru ramki. Chociaż obliczenia te nie wymagają szczególnie dużych zasobów, powtarzanie ich przez cały czas z pewnością spowoduje stratę czasu, który prawdopodobnie można by lepiej przeznaczyć na czyszczenie danych.

Eksploracyjna analiza danych przy użyciu profilowania pand

Teraz zróbmy to samo, używając profilowania pand:

pandas_profiling.ProfileReport(df)

Wykonanie powyższej linii kodu wygeneruje raport ze wskaźnikami eksploracyjnej analizy danych. Kod pokazany powyżej wyświetli znalezione dane, ale możesz sprawić, że wygeneruje plik HTML, który możesz na przykład pokazać komuś.

Pierwsza część raportu będzie zawierała sekcję Przegląd, zawierającą podstawowe informacje o danych (liczba obserwacji, liczba zmiennych itp.). Będzie zawierał także listę alertów, powiadamiających analityka o rzeczach, na które należy zwrócić szczególną uwagę. Alerty te mogą dostarczyć wskazówek, na czym można skoncentrować wysiłki związane z czyszczeniem danych.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Sekcja raportu ogólnego

Eksploracyjna analiza zmiennych

Poniżej sekcji Przegląd raportu znajdują się przydatne informacje na temat każdej zmiennej. Zawierają między innymi małe wykresy opisujące rozkład poszczególnych zmiennych.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Informacje o zmiennej numerycznej wieku

Jak widać z poprzedniego przykładu, profilowanie pand daje nam kilka przydatnych wskaźników, takich jak procent i liczba brakujących wartości, a także opisowe miary statystyczne, które już widzieliśmy. Ponieważ Age jest zmienną numeryczną, wizualizacja jej rozkładu w postaci histogramu pozwala stwierdzić, że mamy rozkład skośny w prawo.

Rozważając zmienną kategoryczną, wyniki wyjściowe różnią się nieco od wyników uzyskanych dla zmiennej numerycznej.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Informacje o zmiennej kategorycznej Płeć

Mianowicie zamiast znajdować średnią, minimum i maksimum, biblioteka profilowania pand znalazła liczbę klas. Ponieważ Sex — zmienna binarna, jej wartości są reprezentowane przez dwie klasy.

Jeśli tak jak ja lubisz sprawdzać kod, być może zainteresuje Cię, w jaki sposób biblioteka profilowania pand oblicza te metryki. Dowiedzenie się o tym, biorąc pod uwagę, że kod biblioteki jest otwarty i dostępny na GitHubie, nie jest takie trudne. Ponieważ nie jestem wielkim fanem używania czarnych skrzynek w moich projektach, rzuciłem okiem na kod źródłowy biblioteki. Tak na przykład wygląda mechanizm przetwarzania zmiennych numerycznych reprezentowany przez funkcję opisz_numerycznie_1d:

def describe_numeric_1d(series, **kwargs):
    """Compute summary statistics of a numerical (`TYPE_NUM`) variable (a Series).
    Also create histograms (mini an full) of its distribution.
    Parameters
    ----------
    series : Series
        The variable to describe.
    Returns
    -------
    Series
        The description of the variable as a Series with index being stats keys.
    """
    # Format a number as a percentage. For example 0.25 will be turned to 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']
    # To avoid to compute it several times
    _series_no_na = series.dropna()
    for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
        # The dropna() is a workaround for 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)
    # Histograms
    stats['histogram'] = histogram(series, **kwargs)
    stats['mini_histogram'] = mini_histogram(series, **kwargs)
    return pd.Series(stats, name=series.name)

Chociaż ten fragment kodu może wydawać się dość duży i skomplikowany, w rzeczywistości jest bardzo prosty do zrozumienia. Chodzi o to, że w kodzie źródłowym biblioteki znajduje się funkcja określająca typy zmiennych. Jeśli okaże się, że biblioteka natrafiła na zmienną numeryczną, powyższa funkcja znajdzie metryki, na które patrzyliśmy. Ta funkcja wykorzystuje standardowe operacje pandy do pracy z obiektami typu Series, tak jak series.mean(). Wyniki obliczeń zapisywane są w słowniku stats. Histogramy generowane są przy użyciu dostosowanej wersji funkcji matplotlib.pyplot.hist. Adaptacja ma na celu zapewnienie, aby funkcja mogła współpracować z różnymi typami zbiorów danych.

Zbadano wskaźniki korelacji i przykładowe dane

Po wynikach analizy zmiennych, pandas-profiling w sekcji Korelacje wyświetli macierze korelacji Pearsona i Spearmana.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Macierz korelacji Pearsona

Jeśli zajdzie taka potrzeba, możesz w linii kodu uruchamiającej generację raportu ustawić wskaźniki wartości progowych stosowanych przy obliczaniu korelacji. W ten sposób możesz określić, jaka siła korelacji jest uważana za ważną dla Twojej analizy.

Na koniec raport profilowania pand w sekcji Próbka wyświetla jako przykład fragment danych pobranych z początku zbioru danych. Takie podejście może prowadzić do przykrych niespodzianek, ponieważ kilka pierwszych obserwacji może reprezentować próbkę, która nie odzwierciedla cech całego zbioru danych.

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas
Sekcja zawierająca badane przykładowe dane

W rezultacie nie polecam zwracać uwagi na tę ostatnią sekcję. Zamiast tego lepiej użyć polecenia df.sample(5), który losowo wybierze 5 obserwacji ze zbioru danych.

Wyniki

Podsumowując, biblioteka pandas-profiling daje analitykowi przydatne możliwości, które przydadzą się w przypadkach, gdy trzeba szybko uzyskać ogólny pogląd na dane lub przekazać komuś raport z analizy wywiadowczej. Jednocześnie rzeczywista praca z danymi, biorąc pod uwagę ich funkcje, wykonywana jest ręcznie, bez stosowania profilowania pand.

Jeśli chcesz rzucić okiem jak wygląda cała analiza danych wywiadowczych w jednym notatniku Jupytera, zajrzyj do to mój projekt stworzony przy użyciu nbviewer. I w to Odpowiedni kod można znaleźć w repozytoriach GitHub.

Drodzy Czytelnicy! Od czego zaczynasz analizę nowych zbiorów danych?

Przyspiesz eksploracyjną analizę danych za pomocą biblioteki profilowania Pandas

Źródło: www.habr.com

Dodaj komentarz