November 4, 2021

Как построить графики распределения дискретных величин в Excel, Yandex DataLens и Python

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

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

Но об этом как-нибудь потом. Пока построим разными способами один из частных видов графиков, отражающий частоту встречаемости значений в некотором столбце. Работать будем с датасетом о результатах поединков в рамках лиги UFC следующего вида:

Построим частоту выступлений бойцов из столбца Fighter. Сначала в Excel. Выбираем столбец, затем Вставка->Сводная диаграмма:

После перетаскиваем Fighter из верхнего окна в правое нижнее (Значения) и, дважды кликнув по появившейся строке, выбираем Параметры полей значений и нужную функцию агрегации (у меня по умолчанию сразу появилось Количество):

Затем слева увидите столбцы со значениями и рисунок, при этом в левом нижнем углу графика можно подстроить фильтрацию и сортировку:

Теперь в DataLens. Буду предполагать, что создано подключение и настроен датасет (как рассказывал ранее), осталось кликнуть "Создать чарт" в правом верхнем углу:

После перетаскиваем поле Fighters из области измерений слева чуть правее на ось X и его же на ось Y, после чего будет автоматически задана агрегация, которую можно изменить по клику с левой стороны от надписи:

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

Что касается Python, я неоднократно уже решал похожие задачи (например, здесь). Воспользуемся функцией Seaborn barplot, которая для датафрейма fighter_stat с именами бойцов и частотами (получен с помощью метода value_counts) строит график:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
plt.figure(figsize=(20,5))
sns.barplot(data=fighter_stat, x = 'name', y = 'count')

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