Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Визуализация данных Python: Pandas

При анализе информации и данных часто нужно строить графики, диаграммы и гистограммы. Визуализация помогает оценивать масштабы значений, сравнивать показатели, понимать тренды и многое другое.

В библиотеке 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()

plot_1

На графике видны разрывы, завышенные и отрицательные значения — это говорит о наличии ошибок.

Важно отметить техническую деталь при отрисовке графиков. Если использовать 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()

plot_2

Разрывы стали еще более наглядными. Есть пропуски для данного магазина.

Начнем подготовку данных. Заполним пропуски средним значением для кликов по всем магазинам:

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_3

Временная шкала не поменялась, при этом визуально график сильно разнится с предыдущим. На таком графике уже прослеживаются особенности и закономерности в изменении значений со временем.

Также посмотрим на всю сеть:

# plot_4
df_clicks.plot()

plot_4

Эти графики показывают, как наличие ошибок в данных влияет на качество их анализа. После обработки на всех магазинах стала прослеживаться сезонность — волны кликов по выходным дням.

Кроме визуального анализа и построения гипотез о закономерностях в данных используют продвинутые алгоритмы машинного обучения. Указанным алгоритмам непросто выучить закономерности в данных при наличии в них ошибок. Аналитику необходимо перед анализом всегда готовить данные.

Сравнительный анализ показателей

Типы графиков могут быть разными. Задается тип с использованием параметра kind. На примере ниже показаны столбчатые диаграммы для первых семь дней. С их помощью можно производить анализ динамики изменений кликов по всей сети или же сравнивать значения в разрезе дней:

# plot_5
df_clicks[:7].plot(y=['SHOP1', 'SHOP2', 'SHOP3', 'SHOP4'], kind="bar")

plot_5

По данной столбчатой диаграмме можно сказать, что кликов на сайте магазина SHOP2 в начале недели было больше, чем во всех остальных по сети — первые три столбца слева. Также возрастает тренд в кликах ближе к выходным дням — размер столбцов увеличивается слева направо.

Статистический анализ

Анализировать статистические показатели можно с помощью визуализации плотности распределения кликов. Чтобы получить ее, нужно построить гистограмму, которая также задается через параметр kind:

# plot_6
df_clicks['SHOP1'].plot(kind='hist')

plot_6

Для первого магазина количество кликов смещено к значениям 300-350.

Для второго магазина наиболее типичным являются случаи кликов в интервале 350-400 в день:

# plot_7
df_clicks['SHOP2'].plot(kind='hist')

plot_7

Интегральные показатели

Чтобы сравнить интегральные показатели, можно использовать горизонтальные столбчатые диаграммы. В примере ниже задействован параметр fontsize, который отвечает за размер шрифта:

# plot_8
df_clicks.sum().plot(kind="barh", fontsize=10)

plot_8

Одним из часто встречаемых в презентациях типов диаграмм является представление интегральных данных в виде пирога — круговые диаграммы:

# plot_9
df_clicks.sum().plot(kind="pie", ylabel='Total clicks', fontsize=8)

plot_9

Обе из диаграмм выше показывают, что в целом показатели кликов по магазинам практически совпадают.

Поиск зависимостей в данных

Чтобы найти зависимости в данных, используются различные подходы. Одним из них — корреляционный анализ. Чтобы найти в данных линейные закономерности, используют корреляцию Пирсона. При этом такой характер зависимости величин можно увидеть и на точечном графике.

Параметр scatter позволяет построить точки с координатами (x, y). В качестве значений координат возьмем подневные значения двух магазинов:

# plot_10
df_clicks.plot(x="SHOP1", y="SHOP2", kind="scatter")

plot_10

На примере выше показано, как расположились точки для 1 и 2 магазина. При этом зависимость здесь не усматривается. Но если посмотреть на пару 1 и 3 магазина, то ситуация меняется:

# plot_11
df_clicks.plot(x="SHOP1", y="SHOP3", kind="scatter")

plot_11

Несмотря на отклонения, точки расположились вдоль прямой — прослеживается линейная зависимость.

Выводы

В этом уроке мы рассмотрели различные типы графиков, которые доступны в Pandas для визуализации данных. С их помощью на практических примерах были продемонстрированы:

  • Эффекты ошибок данных на результаты анализа
  • Способы интегральной оценки показателей
  • Подходы к визуализации зависимостей в данных

Визуализация данных упрощает:

  • Поиск выбросов и пропущенных значений
  • Анализ статистических и интегральных характеристик
  • Формулирование гипотез о закономерностях

Для аналитика визуализация является необходимым инструментом. Выполнение указанных выше операций может быть невозможным при работе с большими объемами данных.


Дополнительные материалы

  1. Визуализация данных Python для начинающих

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 9 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»