Перш за ўсё, прыступаючы да працы з новым наборам дадзеных, трэба зразумець яго. Для таго каб гэта зрабіць, трэба, напрыклад, высветліць дыяпазоны значэнняў, якія прымаюцца зменнымі, іх тыпы, а таксама пазнаць аб колькасці прапушчаных значэнняў.
Бібліятэка pandas дае нам мноства карысных інструментаў для выканання разведачнага аналізу дадзеных (Exploratory Data Analysis, EDA). Але, перш чым скарыстацца імі, звычайна трэба пачаць з функцый больш агульнага плана, такіх як df.describe(). Праўда, трэба адзначыць, што магчымасці, якія прадстаўляюцца падобнымі функцыямі, абмежаваныя, а пачатковыя этапы працы з любымі наборамі дадзеных пры выкананні EDA вельмі часта моцна падобныя сябар на сябра.
Аўтар матэрыялу, які мы сёння публікуем, кажа, што ён - не аматар выканання паўтаральных дзеянняў. У выніку ён, у пошуках сродкаў, якія дазваляюць хутка і эфектыўна выконваць разведачны аналіз даных, знайшоў бібліятэку
Тут будуць разгледжаны асаблівасці выкарыстання бібліятэкі pandas-profiling на прыкладзе набору даных Titanic.
Разведачны аналіз дадзеных сродкамі pandas
Я вырашыў паэксперыментаваць з pandas-profiling на наборы дадзеных Titanic з-за таго, што ў ім ёсць дадзеныя розных тыпаў і з-за наяўнасці ў ім прапушчаных значэнняў. Я мяркую, што бібліятэка pandas-profiling асабліва цікавая ў тых выпадках, калі дадзеныя яшчэ не ачышчаны і патрабуюць далейшай апрацоўкі, якая залежыць ад іх асаблівасцяў. Для таго каб паспяхова выканаць такую апрацоўку, трэба ведаць аб тым, з чаго пачаць, і на што звярнуць увагу. Тут нам і спатрэбяцца магчымасці pandas-profiling.
Для пачатку імпартуем дадзеныя і выкарыстоўваем pandas для атрымання паказчыкаў апісальнай статыстыкі:
# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np
# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# вычисление показателей описательной статистики
df.describe()
Пасля выканання гэтага фрагмента кода атрымаецца тое, што паказана на наступным рысунку.
Паказчыкі апісальнай статыстыкі, атрыманыя з дапамогай стандартных сродкаў.
Хоць тут утрымоўваецца маса карысных звестак, тут няма ўсяго, што было б цікава пазнаць аб доследных дадзеных. Напрыклад, можна меркаваць, што ў фрэйме дадзеных, у структуры DataFrame
, маецца 891 радок. Калі гэта трэба праверыць, тое запатрабуецца яшчэ адзін радок кода, якая вызначае памер фрэйма. Хоць гэтыя вылічэнні і не асабліва рэсурсазатратныя, сталае іх паўтарэнне абавязкова прывядзе да страт часу, якое, верагодна, лепш будзе выдаткаваць на ачыстку дадзеных.
Разведачны аналіз дадзеных сродкамі pandas-profiling
Цяпер зробім тое ж самае з выкарыстаннем pandas-profiling:
pandas_profiling.ProfileReport(df)
Выкананне прадстаўленага вышэй радка кода дазволіць сфарміраваць справаздачу з паказчыкамі разведачнага аналізу дадзеных. Код, паказаны вышэй, прывядзе да высновы знойдзеных звестак аб дадзеных, але можна зрабіць так, каб у выніку атрымаўся б HTML-файл, які, напрыклад, можна камусьці паказаць.
Першая частка справаздачы будзе змяшчаць раздзел Overview (Агляд), які дае асноўныя звесткі аб дадзеных (колькасць назіранняў, колькасць зменных, і гэтак далей). Акрамя таго, ён будзе змяшчаць спіс папярэджанняў, які паведамляе аналітыка аб тым, на што варта звярнуць асаблівую ўвагу. Гэтыя папярэджанні могуць паслужыць падказкай аб тым, на чым можна засяродзіць намаганні пры ачыстцы дадзеных.
Раздзел справаздачы Overview
Разведачны аналіз зменных
За раздзелам Overview у справаздачы можна знайсці карысныя звесткі аб кожнай зменнай. У іх, акрамя іншага, уваходзяць невялікія дыяграмы, якія апісваюць размеркаванне кожнай зменнай.
Звесткі аб лічбавай зменнай Age
Як можна бачыць з папярэдняга прыкладу, pandas-profiling дае нам некалькі карысных індыкатараў, такіх як працэнт і колькасць прапушчаных значэнняў, а таксама паказчыкі апісальнай статыстыкі, якія мы ўжо бачылі. Бо Age
- Гэта лічбавая пераменная, візуалізацыя яе размеркавання ў выглядзе гістаграмы дазваляе нам зрабіць выснову аб тым, што перад намі - скошанае направа размеркаванне.
Пры разглядзе катэгарыяльнай зменнай выводныя паказчыкі крыху адрозніваюцца ад тых, што былі знойдзены для лічбавай зменнай.
Звесткі аб катэгарыяльнай зменнай Sex
А менавіта, замест знаходжання сярэдняга, мінімуму і максімуму, бібліятэка pandas-profiling знайшла колькасць класаў. Бо Sex
- Бінарная пераменная, яе значэння прадстаўлены двума класамі.
Калі вы, як і я, любіце даследаваць код, то вас можа зацікавіць тое, як менавіта бібліятэка pandas-profiling вылічае гэтыя паказчыкі. Даведацца пра гэта, улічваючы тое, што код бібліятэкі адкрыты і даступны на 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, выведзе карэляцыйныя матрыцы Пірсана і Спірмэна.
Карэляцыйная матрыца Пірсана
Калі трэба, то можна, у тым радку кода, які запускае фармаванне справаздачы, задаць паказчыкі парогавых значэнняў, якія ўжываюцца пры разліку карэляцыі. Робячы гэта, вы можаце паказаць тое, якая сіла карэляцыі лічыцца важнай для вашага аналізу.
І нарэшце, у справаздачы pandas-profiling, у падзеле Sample, выводзіцца, у якасці прыкладу, фрагмент дадзеных, узяты з пачатку набору дадзеных. Такі падыход можа прывесці да непрыемных нечаканасцяў, бо першыя некалькі назіранняў могуць уяўляць сабой выбарку, якая не адлюстроўвае асаблівасцяў усяго набору дадзеных.
Раздзел, які змяшчае ўзор доследных дадзеных
У выніку я не рэкамендую зважаць на гэтую апошнюю частку. Замест гэтага лепш скарыстацца камандай df.sample(5)
, Якая, выпадковым чынам, абярэ 5 назіранняў з набору дадзеных.
Вынікі
Падводзячы вынік вышэйпададзенаму, можна адзначыць, што бібліятэка pandas-profiling дае ў распараджэнне аналітыка некаторыя карысныя магчымасці, якія прыйдуцца дарэчы ў тых выпадках, калі трэба хутка атрымаць агульнае прыблізнае ўяўленне аб дадзеных або перадаць каму-небудзь справаздачу аб разведвальным аналізе дадзеных. Пры гэтым сапраўдная праца з дадзенымі, якая ўлічвае іх асаблівасці, выконваецца, як і без выкарыстання pandas-profiling, уручную.
Калі вы жадаеце зірнуць на тое, як выглядае ўвесь выведвальны аналіз дадзеных у адным Jupyter-нататніку - зірніце на
Паважаныя чытачы! З чаго вы пачынаеце аналіз новых набораў даных?
Крыніца: habr.com