- Влияние ошибок в данных на результаты анализа
- Сравнительный анализ показателей
- Статистический анализ
- Интегральные показатели
- Поиск зависимостей в данных
- Выводы
При анализе информации и данных часто нужно строить графики, диаграммы и гистограммы. Визуализация помогает оценивать масштабы значений, сравнивать показатели, понимать тренды и многое другое.
В библиотеке Pandas есть встроенный функционал для большинства типов графиков. Эти методы построены на базе библиотеки Matplotlib — одного из популярных среди аналитиков решений для визуализации на Python. В этом уроке мы познакомимся с часто используемыми в анализе данных инструментами визуализации библиотеки Pandas и научимся применять их на практике.
Работать будем на датасете кликов с сайтов четырех магазинов одной сети:
import pandas as pd
df_clicks = pd.read_csv('./data/Cite_clicks_outliers.csv', index_col=0)
print(df_clicks.head())
# => SHOP1 SHOP2 SHOP3 SHOP4
# day
# 1 319.0 -265.0 319.0 328.0
# 2 292.0 4.0 292.0 301.0
# 3 283.0 301.0 274.0 283.0
# 4 328.0 364.0 328.0 NaN
# 5 391.0 355.0 373.0 337.0
В данных есть ошибки: пропущенные, отрицательные и сильно завышенные значения кликов.
Влияние ошибок в данных на результаты анализа
Чтобы построить линейный график, используем метод plot()
:
# plot_1
df_clicks.plot()
На графике видны разрывы, завышенные и отрицательные значения — это говорит о наличии ошибок.
Важно отметить техническую деталь при отрисовке графиков. Если использовать Jupyter Notebook, то для вывода графика достаточно выполнить код выше. Если писать код в виде обычного Python скрипта и выполнять его в терминале, то код необходимо дополнить методом отрисовки plt.show()
из библиотеки matplotlib следующим образом:
import matplotlib.pyplot as plt
# plot_1
df_clicks.plot()
plt.show()
Далее по тексту будем придерживаться способа для Jupyter Notebook.
Чтобы построить график конкретного магазина, необходимо указать его метку в качестве индекса и применить тот же метод plot()
:
# plot_2
df_clicks['SHOP1'].plot()
Разрывы стали еще более наглядными. Есть пропуски для данного магазина.
Начнем подготовку данных. Заполним пропуски средним значением для кликов по всем магазинам:
df_clicks = df_clicks.fillna(df_clicks.mean().mean())
print(df_clicks.head())
# => SHOP1 SHOP2 SHOP3 SHOP4
# day
# 1 319.0 -265.0 319.0 328.000000
# 2 292.0 4.0 292.0 301.000000
# 3 283.0 301.0 274.0 283.000000
# 4 328.0 364.0 328.0 377.342796
# 5 391.0 355.0 373.0 337.000000
Избавимся от отрицательных и слишком больших значений следующим методом. Найдем среднее и стандартное отклонение от него. Порядка 70% всех значений будет укладываться в интервал, указанный ниже:
# Среднее и стандартное отклонение
mean_val = df_clicks.values.mean()
std_val = df_clicks.values.std()
print(f'({mean_val:.2f} - {std_val:.2f}, {mean_val:.2f} + {std_val:.2f})')
# => (375.68 - 415.10, 375.68 + 415.10)
Зададим маску, с помощью верхней границы данного интервала и значения в десять кликов в качестве минимального ограничения:
# Маска для фильтрации значений
standard_mask = (df_clicks >= 10) & (df_clicks < mean_val + std_val)
Применим данную маску для фильтрации:
df_clicks = df_clicks.where(standard_mask, mean_val)
print(df_clicks.head())
# => SHOP1 SHOP2 SHOP3 SHOP4
# day
# 1 319.0 375.684946 319.0 328.000000
# 2 292.0 375.684946 292.0 301.000000
# 3 283.0 301.000000 274.0 283.000000
# 4 328.0 364.000000 328.0 377.342796
# 5 391.0 355.000000 373.0 337.000000
Посмотрим, как изменился график кликов первого магазина:
# plot_3
df_clicks['SHOP1'].plot()
Временная шкала не поменялась, при этом визуально график сильно разнится с предыдущим. На таком графике уже прослеживаются особенности и закономерности в изменении значений со временем.
Также посмотрим на всю сеть:
# plot_4
df_clicks.plot()
Эти графики показывают, как наличие ошибок в данных влияет на качество их анализа. После обработки на всех магазинах стала прослеживаться сезонность — волны кликов по выходным дням.
Кроме визуального анализа и построения гипотез о закономерностях в данных используют продвинутые алгоритмы машинного обучения. Указанным алгоритмам непросто выучить закономерности в данных при наличии в них ошибок. Аналитику необходимо перед анализом всегда готовить данные.
Сравнительный анализ показателей
Типы графиков могут быть разными. Задается тип с использованием параметра kind
. На примере ниже показаны столбчатые диаграммы для первых семь дней. С их помощью можно производить анализ динамики изменений кликов по всей сети или же сравнивать значения в разрезе дней:
# plot_5
df_clicks[:7].plot(y=['SHOP1', 'SHOP2', 'SHOP3', 'SHOP4'], kind="bar")
По данной столбчатой диаграмме можно сказать, что кликов на сайте магазина SHOP2
в начале недели было больше, чем во всех остальных по сети — первые три столбца слева. Также возрастает тренд в кликах ближе к выходным дням — размер столбцов увеличивается слева направо.
Статистический анализ
Анализировать статистические показатели можно с помощью визуализации плотности распределения кликов. Чтобы получить ее, нужно построить гистограмму, которая также задается через параметр kind
:
# plot_6
df_clicks['SHOP1'].plot(kind='hist')
Для первого магазина количество кликов смещено к значениям 300-350.
Для второго магазина наиболее типичным являются случаи кликов в интервале 350-400 в день:
# plot_7
df_clicks['SHOP2'].plot(kind='hist')
Интегральные показатели
Чтобы сравнить интегральные показатели, можно использовать горизонтальные столбчатые диаграммы. В примере ниже задействован параметр fontsize
, который отвечает за размер шрифта:
# plot_8
df_clicks.sum().plot(kind="barh", fontsize=10)
Одним из часто встречаемых в презентациях типов диаграмм является представление интегральных данных в виде пирога — круговые диаграммы:
# plot_9
df_clicks.sum().plot(kind="pie", ylabel='Total clicks', fontsize=8)
Обе из диаграмм выше показывают, что в целом показатели кликов по магазинам практически совпадают.
Поиск зависимостей в данных
Чтобы найти зависимости в данных, используются различные подходы. Одним из них — корреляционный анализ. Чтобы найти в данных линейные закономерности, используют корреляцию Пирсона. При этом такой характер зависимости величин можно увидеть и на точечном графике.
Параметр scatter
позволяет построить точки с координатами (x, y)
. В качестве значений координат возьмем подневные значения двух магазинов:
# plot_10
df_clicks.plot(x="SHOP1", y="SHOP2", kind="scatter")
На примере выше показано, как расположились точки для 1 и 2 магазина. При этом зависимость здесь не усматривается. Но если посмотреть на пару 1 и 3 магазина, то ситуация меняется:
# plot_11
df_clicks.plot(x="SHOP1", y="SHOP3", kind="scatter")
Несмотря на отклонения, точки расположились вдоль прямой — прослеживается линейная зависимость.
Выводы
В этом уроке мы рассмотрели различные типы графиков, которые доступны в Pandas для визуализации данных. С их помощью на практических примерах были продемонстрированы:
- Эффекты ошибок данных на результаты анализа
- Способы интегральной оценки показателей
- Подходы к визуализации зависимостей в данных
Визуализация данных упрощает:
- Поиск выбросов и пропущенных значений
- Анализ статистических и интегральных характеристик
- Формулирование гипотез о закономерностях
Для аналитика визуализация является необходимым инструментом. Выполнение указанных выше операций может быть невозможным при работе с большими объемами данных.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.