Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling

Насамперед, приступаючи до роботи з новим набором даних, потрібно зрозуміти його. Щоб це зробити, потрібно, наприклад, з'ясувати діапазони значень, прийнятих змінними, їх типи, і навіть дізнатися про кількість пропущених значень.

Бібліотека pandas надає багато корисних інструментів для виконання розвідувального аналізу даних (Exploratory Data Analysis, EDA). Але, перш ніж скористатися ними, зазвичай потрібно почати з більш загального плану, таких як df.describe(). Правда, слід зазначити, що можливості, що надаються подібними функціями, обмежені, а початкові етапи роботи з будь-якими наборами даних при виконанні EDA дуже часто дуже схожі один на одного.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling

Автор матеріалу, який ми сьогодні публікуємо, каже, що він не любитель виконання повторюваних дій. В результаті він, у пошуках засобів, що дозволяють швидко та ефективно виконувати розвідувальний аналіз даних, знайшов бібліотеку панди-профілювання. Результати її роботи виражаються над вигляді окремих показників, а формі досить докладного HTML-звіту, що містить більшість тих відомостей про аналізованих даних, які може знатися перед тим, як приступати до більш щільної роботи з ними.

Тут будуть розглянуті особливості використання бібліотеки 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-profiling
Показники описової статистики, одержані за допомогою стандартних засобів pandas

Хоча тут міститься безліч корисних відомостей, тут немає всього, що було б цікаво дізнатися про досліджувані дані. Наприклад, можна припустити, що у кадрі даних, у структурі DataFrame, є 891 рядок. Якщо це потрібно перевірити, потрібно ще один рядок коду, що визначає розмір кадру. Хоча ці обчислення і не є особливо ресурсозатратними, постійне їх повторення обов'язково призведе до втрат часу, який, ймовірно, краще витратити на очищення даних.

Розвідувальний аналіз даних засобами pandas-profiling

Тепер зробимо те саме з використанням pandas-profiling:

pandas_profiling.ProfileReport(df)

Виконання представленого вище рядка коду дозволить сформувати звіт із показниками розвідувального аналізу даних. Код, наведений вище, призведе до виведення знайдених відомостей про дані, але можна зробити так, щоб в результаті вийшов би HTML-файл, який, наприклад, можна комусь показати.

Перша частина звіту міститиме розділ Overview (Огляд), що дає основні відомості про дані (кількість спостережень, кількість змінних тощо). Крім того, він міститиме список попереджень, що повідомляє аналітика про те, на що варто звернути особливу увагу. Ці попередження можуть бути підказкою про те, на чому можна зосередити зусилля при очищенні даних.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling
Розділ звіту Overview

Розвідувальний аналіз змінних

За розділом Overview у звіті можна знайти корисні відомості про кожну змінну. Вони, крім іншого, входять невеликі діаграми, що описують розподіл кожної змінної.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling
Відомості про числову змінну Age

Як можна бачити з попереднього прикладу, pandas-profiling дає нам кілька корисних індикаторів, таких як відсоток та кількість пропущених значень, а також показники описової статистики, які ми вже бачили. Так як Age — це числова змінна, візуалізація її розподілу як гістограми дозволяє зробити висновок у тому, що маємо — скошене праворуч розподіл.

При розгляді категоріальної змінної показники, що виводяться, трохи відрізняються від тих, що були знайдені для числової змінної.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling
Відомості про категоріальну змінну Sex

А саме, замість знаходження середнього, мінімуму та максимуму, бібліотека pandas-profiling знайшла кількість класів. Так як Sex - Бінарна змінна, її значення представлені двома класами.

Якщо ви, як і я, любите досліджувати код, то вас може зацікавити, як саме бібліотека pandas-profiling обчислює ці показники. Дізнатися про це, враховуючи те, що код бібліотеки відкритий і доступний на GitHub, не так вже й складно. Так як я не великий любитель використання «чорних ящиків» у моїх проектах, я поглянув на вихідний код бібліотеки. Наприклад, ось як виглядає механізм обробки числових змінних, представлений функцією describe_numeric_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)

Хоча цей фрагмент коду і може здатися досить великим і складним, насправді зрозуміти його дуже просто. Йдеться тому, що у вихідному коді бібліотеки є функція, що визначає типи змінних. Якщо виявилося, що бібліотека зустріла числову змінну, вищенаведена функція знайде показники, які ми розглядали. У цій функції використовуються стандартні операції pandas по роботі з об'єктами типу Series, на кшталт series.mean(). Результати обчислень зберігаються у словнику stats. Гістограми формуються з використанням адаптованої версії функції matplotlib.pyplot.hist. Адаптація спрямована на те, щоб функція могла працювати з різними типами наборів даних.

Показники кореляції та зразок досліджуваних даних

Після результатів аналізу змінних pandas-profiling, у розділі Correlations, виведе кореляційні матриці Пірсона та Спірмена.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling
Кореляційна матриця Пірсона

Якщо потрібно, то можна в тому рядку коду, який запускає формування звіту, задати показники порогових значень, що застосовуються при розрахунку кореляції. Роблячи це, ви можете вказати, яка сила кореляції вважається важливою для вашого аналізу.

І нарешті, у звіті pandas-profiling, у розділі Sample, виводиться, як приклад, фрагмент даних, взятий із початку набору даних. Такий підхід може призвести до неприємних несподіванок, оскільки перші кілька спостережень можуть бути вибіркою, яка не відображає особливостей всього набору даних.

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling
Розділ, що містить зразок досліджуваних даних

В результаті я не рекомендую звертати увагу на цей останній розділ. Натомість краще скористатися командою df.sample(5)яка випадково вибере 5 спостережень з набору даних.

Підсумки

Підсумовуючи вищевикладене, можна відзначити, що бібліотека pandas-profiling дає в розпорядження аналітика деякі корисні можливості, які будуть доречними в тих випадках, коли потрібно швидко отримати загальне приблизне уявлення про дані або передати комусь звіт про розвідувальний аналіз даних. При цьому справжня робота з даними, що враховує їх особливості, виконується, як і без використання pandas-profiling, вручну.

Якщо ви хочете поглянути на те, як виглядає весь розвідувальний аналіз даних в одному Jupyter-блокноті, погляньте на цей мій проект створений за допомогою nbviewer. А в в цьому GitHub-репозиторії можна знайти відповідний код.

Шановні читачі! З чого ви починаєте аналіз нових наборів даних?

Прискорення розвідувального аналізу даних із використанням бібліотеки pandas-profiling

Джерело: habr.com

Додати коментар або відгук