Първата стъпка, когато започнете да работите с нов набор от данни, е да го разберете. За да направите това, трябва например да разберете диапазоните от стойности, приети от променливите, техните типове, както и да разберете за броя на липсващите стойности.
Библиотеката на pandas ни предоставя много полезни инструменти за извършване на проучвателен анализ на данни (EDA). Но преди да ги използвате, обикновено трябва да започнете с по-общи функции като df.describe(). Все пак трябва да се отбележи, че възможностите, предоставени от такива функции, са ограничени и началните етапи на работа с всякакви набори от данни при извършване на EDA много често са много сходни един с друг.
Авторът на материала, който публикуваме днес, споделя, че не е привърженик на извършването на повтарящи се действия. В резултат на това, в търсене на инструменти за бързо и ефективно извършване на проучвателен анализ на данни, той намери библиотеката
Тук ще разгледаме характеристиките на използването на библиотеката за профилиране на pandas, използвайки набора от данни на Титаник като пример.
Проучвателен анализ на данни с помощта на панди
Реших да експериментирам с профилиране на pandas върху набора от данни на Титаник поради различните типове данни, които съдържа, и наличието на липсващи стойности в него. Вярвам, че библиотеката за профилиране на pandas е особено интересна в случаите, когато данните все още не са изчистени и изискват допълнителна обработка в зависимост от характеристиките си. За да извършите успешно такава обработка, трябва да знаете откъде да започнете и на какво да обърнете внимание. Това е мястото, където възможностите за профилиране на pandas идват на помощ.
Първо импортираме данните и използваме панди, за да получим описателна статистика:
# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np
# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# вычисление показателей описательной статистики
df.describe()
След като изпълните тази част от кода, ще получите това, което е показано на следващата фигура.
Описателна статистика, получена с помощта на стандартни инструменти на pandas
Въпреки че тук има много полезна информация, тя не съдържа всичко, което би било интересно да се знае за изследваните данни. Например, може да се предположи, че в рамка от данни, в структура DataFrame
, има 891 реда. Ако това трябва да се провери, тогава е необходим друг ред код, за да се определи размерът на рамката. Въпреки че тези изчисления не са особено ресурсоемки, повтарянето им през цялото време води до загуба на време, което вероятно би било по-добре изразходвано за почистване на данните.
Проучвателен анализ на данни с помощта на pandas-профилиране
Сега нека направим същото с помощта на pandas-profiling:
pandas_profiling.ProfileReport(df)
Изпълнението на горния ред код ще генерира отчет с индикатори за анализ на проучвателни данни. Кодът, показан по-горе, ще изведе намерените данни, но можете да го накарате да изведе HTML файл, който можете да покажете на някого, например.
Първата част на отчета ще съдържа раздел Общ преглед, даващ основна информация за данните (брой наблюдения, брой променливи и т.н.). В допълнение, той ще съдържа списък с предупреждения, уведомяващи анализатора за неща, на които трябва да обърне специално внимание. Тези сигнали могат да предоставят улики за това къде можете да насочите усилията си за почистване на данни.
Секция за преглед на отчета
Проучвателен анализ на променливи
Под раздела Общ преглед на отчета можете да намерите полезна информация за всяка променлива. Те включват, наред с други неща, малки диаграми, описващи разпределението на всяка променлива.
Относно числовата променлива възраст
Както можете да видите от предишния пример, pandas-профилирането ни дава няколко полезни индикатора, като процент и брой липсващи стойности, както и описателни статистически мерки, които вече видяхме. защото Age
е числова променлива, визуализирането на нейното разпределение под формата на хистограма ни позволява да заключим, че имаме разпределение, изкривено надясно.
Когато се разглежда категориална променлива, получените резултати са малко по-различни от тези, открити за числова променлива.
Относно половата категорична променлива
А именно, вместо да намери средната, минималната и максималната стойност, библиотеката за профилиране на pandas намери броя на класовете. защото Sex
— двоична променлива, нейните стойности са представени от два класа.
Ако искате да изследвате кода като мен, може да се интересувате от това как точно библиотеката за профилиране на pandas изчислява тези показатели. Да разберете за това, като се има предвид, че кодът на библиотеката е отворен и достъпен в GitHub, не е толкова трудно. Тъй като не съм голям фен на използването на черни кутии в моите проекти, погледнах изходния код на библиотеката. Например, така изглежда механизмът за обработка на числови променливи, представен от функцията
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)
Въпреки че тази част от кода може да изглежда доста голяма и сложна, всъщност е много проста за разбиране. Въпросът е, че в изходния код на библиотеката има функция, която определя типовете променливи. Ако се окаже, че библиотеката е срещнала числова променлива, горната функция ще намери показателите, които разглеждаме. Тази функция използва стандартни операции на pandas за работа с обекти от тип Series
, като series.mean()
. Резултатите от изчисленията се съхраняват в речник stats
. Хистограмите се генерират с помощта на адаптирана версия на функцията matplotlib.pyplot.hist
. Адаптирането има за цел да гарантира, че функцията може да работи с различни типове набори от данни.
Изследвани корелационни показатели и примерни данни
След резултатите от анализа на променливите, pandas-profiling в секцията Correlations ще покаже корелационните матрици на Pearson и Spearman.
Корелационна матрица на Пиърсън
Ако е необходимо, можете в реда на кода, който задейства генерирането на отчета, да зададете индикаторите на праговите стойности, използвани при изчисляване на корелацията. Като направите това, можете да посочите каква сила на корелация се счита за важна за вашия анализ.
И накрая, отчетът за профилиране на pandas в секцията Пример показва, като пример, част от данните, взети от началото на набора от данни. Този подход може да доведе до неприятни изненади, тъй като първите няколко наблюдения могат да представляват извадка, която не отразява характеристиките на целия набор от данни.
Раздел, съдържащ примерни данни в процес на изследване
В резултат на това не препоръчвам да обръщате внимание на този последен раздел. Вместо това е по-добре да използвате командата df.sample(5)
, който произволно ще избере 5 наблюдения от набора от данни.
Резултати от
За да обобщим, библиотеката за профилиране на pandas дава на анализатора някои полезни възможности, които ще бъдат полезни в случаите, когато трябва бързо да получите груба представа за данните или да предадете на някого доклад за разузнавателен анализ. В същото време реалната работа с данни, като се вземат предвид неговите характеристики, се извършва, без да се използва pandas-профилиране, ръчно.
Ако искате да разгледате как изглежда целият анализ на разузнавателни данни в един бележник на Юпитер, погледнете
Уважаеми читатели! Откъде започвате да анализирате нови набори от данни?
Източник: www.habr.com