Насамперед, приступаючи до роботи з новим набором даних, потрібно зрозуміти його. Щоб це зробити, потрібно, наприклад, з'ясувати діапазони значень, прийнятих змінними, їх типи, і навіть дізнатися про кількість пропущених значень.
Бібліотека 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()
Після виконання цього фрагмента коду вийде те, що показано на малюнку.
Показники описової статистики, одержані за допомогою стандартних засобів pandas
Хоча тут міститься безліч корисних відомостей, тут немає всього, що було б цікаво дізнатися про досліджувані дані. Наприклад, можна припустити, що у кадрі даних, у структурі 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