Как сделать самый скучный сюжет привлекательным и информативным

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

В этом руководстве мы возьмем стандартную гистограмму matplotlib и улучшим ее эстетически, а также добавим некоторые полезные компоненты. Для этого мы будем следовать трехэтапной процедуре, изложенной в моей статье От аналитика данных к рассказчику данных:

  1. Добавить информацию
  2. Удалить информацию
  3. Подчеркните информацию

Набор данных и первый график

В этой статье мы будем использовать набор данных Цены на авокадо от kaggle. Распределение цен на рынке - полезное приложение для гистограмм.

Для этого нам понадобятся только эти две библиотеки:

import pandas as pd
import matplotlib.pyplot as plt

Поскольку нам нужен только один столбец («AveragePrice»), мы можем читать данные как серию, а не как фрейм данных. Таким образом мы сэкономим время, чтобы указать столбцы позже.

avocado = pd.read_csv("avocado.csv")["AveragePrice"]

Наша первая и самая простая гистрограмма может быть очень легко построена с помощью этого кода:

fig, ax = plt.subplots(figsize = (6,4))
avocado.plot(kind = "hist")
plt.show()

Выполнив три шага этого руководства, мы получим конечный результат:

Давайте начнем!

Шаг 1. Добавьте информацию

Очевидно, что нужно добавить заголовок и метки осей. Если вы сравните два рисунка выше, вы также обнаружите, что гистограмма на втором графике гораздо менее «блочна». Этого можно добиться, увеличив количество интервалов, которое по сути представляет собой количество классов, на которые гистограмма делит данные. Чем больше интервалов, тем более гладкая гистограмма. Наконец, вы, вероятно, поняли, что на второй фигуре есть линия вокруг гистограммы. Эта строка называется Оценка плотности ядра (KDE). KDE пытается вычислить базовое распределение переменной, которое проведет очень плавную линию вокруг гистограммы. Однако KDE будет работать только в том случае, если мы изменим ось Y с абсолютных значений на значения плотности. Обратной стороной этого является то, что значения плотности трудно интерпретировать для большинства людей. Мы исправим эту проблему позже. Во-первых, давайте запрограммируем это!

Мы видим, что визуализация стала более информативной. Однако это не совсем красиво и немного подавляюще. Давайте сократим объем информации, чтобы сюжет стал более чистым.

Шаг 2. Удалите информацию

Часть информации последней цифры раздражает или даже совершенно бесполезна. Например, ось Y больше не интерпретируется для большинства людей. Мы должны удалить метки и метки и снова пометить ось «Частота». Это даст читателю представление о том, что означает ось, и не будет путать его с ненужными числами. Кроме того, KDE оценил плотность для значений ниже 0 $. Очевидно, нам нужно исправить это, изменив масштаб оси x. Наконец, в большинстве случаев вы можете удалить все метки и шипы на графике, не теряя при этом удобочитаемости. Применим все это:

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

Шаг 3. Подчеркните информацию

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

Во-первых, нам нужен другой набор цветов. Комбинация оранжевого и синего на предыдущих графиках выглядит не очень хорошо. Простой способ изменить макет графика - изменить таблицу стилей matplotlib. Лично мне нравится таблица стилей bmh. Однако эта таблица стилей добавляет сетку, которая отвлекает от нашего сюжета. Давайте изменим таблицу стилей на bmh и удалим создаваемую ею сетку.

plt.style.use("bmh")
# Later in the code
ax.grid(False)

Еще одно эстетическое улучшение - уменьшение непрозрачности гистограммы. Это сделает KDE более доминирующим, что произведет на читателя более плавное впечатление.

avocado.plot(kind = "hist", density = True, alpha = 0.65, bins = 15) 

Чтобы заголовок выделялся больше, мы можем увеличить размер шрифта. Аргумент «pad» также позволит нам добавить смещение.

ax.set_title("Avocado Prices in U.S. Markets", size = 17, pad = 10)

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

ax.set_ylabel("")

Если бы мы применили все вышеперечисленное, мы получили бы такой график:

На этом этапе визуализация готова для вашей презентации или отчета. Однако есть еще одна вещь, которую мы могли бы сделать, чтобы сделать сюжет более понятным. В принципе, гистограммы содержат всю информацию, необходимую для отображения процентилей. К сожалению, прочитать информацию прямо с сюжета невозможно. Что, если мы хотим показать нашему боссу, каков 75-й процентиль цен на авокадо, сохраняя при этом всю информацию о распределении? Мы могли бы вычислить некоторые процентили и отобразить их на графике в виде вертикальных линий. Это похоже на то, что делает коробчатая диаграмма, но фактически интегрировано в гистограмму. Давай попробуем!

Сначала мы хотим построить вертикальные линии. Для этого мы вычислим 5-й, 25-й, 50-й, 75-й и 95-й процентили распределения. Один из способов сделать это - сделать каждую вертикальную линию немного длиннее предыдущей, выполняя своего рода ступенчатое движение. Мы также можем сделать внутренние линии более прозрачными, чем внешние.

Для этого мы сохраним квантили, непрозрачность и длину строк в списке списков. Это позволит нам прокручивать этот список и автоматически строить все линии.

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

Теперь мы можем использовать эту гистограмму, чтобы принимать бизнес-решения о том, по какой цене продавать наши авокадо. Может быть, наши авокадо немного лучше среднего авокадо, и наша компания хорошо известна своими авокадо. Может быть, нам стоит назначить цену, которая находится на 75-м процентиле распределения (около 1,65 $)? Эта гистограмма представляет собой своего рода комбинацию гистограммы и прямоугольной диаграммы.

Это весь код финальной гистограммы:

Большое спасибо за чтение этой статьи! Я надеюсь, что вы сочли полезным. Прокомментируйте или напишите мне, если у вас есть какие-либо вопросы или критика.