Статья выбрана в направлении datascience, автор: Джордж Сейф, составлена сердцем машины. Визуализация данных — важная часть работы специалиста по данным. На ранних стадиях проекта нам часто необходимо выполнить исследовательский анализ данных, чтобы получить представление о данных. Визуализация данных может сделать этот процесс более четким и понятным, особенно при работе с крупномасштабными многомерными наборами данных. В этой статье мы представили самые основные 5 видов диаграмм визуализации данных, и после демонстрации их преимуществ и недостатков мы также предоставили код Matplotlib для рисования соответствующих диаграмм.
Matplotlib — это популярная библиотека Python, которая помогает быстро и легко создавать диаграммы для визуализации данных. Однако необходимость сбрасывать данные, параметры, графики и графики каждый раз, когда вы начинаете новый проект, утомительна. В этой статье будут представлены 5 методов визуализации данных и написаны несколько быстрых и простых функций визуализации на Python и Matplotlib. На рисунке ниже показано руководство по выбору правильного метода визуализации.
График рассеяния
Диаграммы рассеяния полезны для отображения взаимосвязи между двумя переменными, поскольку вы можете напрямую увидеть распределение необработанных данных. Вы также можете наблюдать взаимосвязь между различными группами данных, группируя данные по цвету, как показано на изображении ниже. Вы также можете добавить еще один параметр, например радиус точек данных, для кодирования третьей переменной, чтобы визуализировать взаимосвязь между тремя переменными, как показано на втором графике ниже.
Далее идет кодовая часть. Сначала мы импортируем pyplot Matplotlib как plt и вызываем функцию plt.subplots() для создания нового графика. Мы передаем этой функции данные по оси X и оси Y, которые затем передаются в ax.scatter() для построения графика рассеяния. Мы также можем установить радиус точки, цвет точки и альфа-прозрачность, даже установить логарифмический размер оси Y и, наконец, дать графику заголовок и метки оси.
import matplotlib.pyplot as plt
import numpy as np
def scatterplot(x_data, y_data, x_label="", y_label="", title="", color = "r", yscale_log=False):
# Create the plot object
_, ax = plt.subplots()
# Plot the data, set the size (s), color and transparency (alpha)
# of the points
ax.scatter(x_data, y_data, s = 10, color = color, alpha = 0.75)
if yscale_log == True:
ax.set_yscale('log')
# Label the axes and provide a title
ax.set_title(title)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
линейный график
Линейные графики хорошо работают, когда одна переменная сильно отличается от другой переменной, то есть они имеют высокую ковариацию. Как показано на графике ниже, мы видим, что относительные проценты для всех программ специализации сильно различаются с течением времени. Нанесение этих данных на точечный график было бы очень загроможденным, и было бы трудно понять, что это такое. Для этого отлично подходит линейный график, поскольку он быстро суммирует ковариацию двух переменных. Здесь мы также можем сгруппировать данные по цвету.
Ниже приведен код реализации линейной диаграммы, который очень похож на структуру кода точечной диаграммы, с небольшими изменениями в настройках переменных.
def lineplot(x_data, y_data, x_label="", y_label="", title=""):
# Create the plot object
_, ax = plt.subplots()
# Plot the best fit line, set the linewidth (lw), color and
# transparency (alpha) of the line
ax.plot(x_data, y_data, lw = 2, color = '#539caf', alpha = 1)
# Label the axes and provide a title
ax.set_title(title)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
Гистограмма
Гистограммы полезны для просмотра или реального понимания распределения точек данных. Ниже приведена гистограмма частоты и IQ, которую мы нарисовали.Мы можем интуитивно понять концентрацию (дисперсию) и медиану распределения, а также мы можем понять, что форма распределения приблизительно подчиняется распределению Гаусса. Использование такого столбца (а не точечной диаграммы и т. д.) позволяет четко визуализировать изменение частоты между каждым бином (равномерный интервал на оси x). Использование бинов (дискретизация) действительно помогает нам наблюдать «более полную картину», так как использование всех точек данных без дискретизации не позволит наблюдать приблизительное распределение данных, в визуализации может быть много шума, что делает ее только может аппроксимировать, но не описывать истинное распределение данных.
Код для построения гистограммы в Matplotlib показан ниже. Здесь следует отметить два шага: во-первых, параметр n_bins управляет количеством интервалов или степенью дискретизации гистограммы. Больше ящиков или цилиндров дает нам больше информации, но также вносит шум и делает наше наблюдаемое глобальное распределение менее регулярным. Хотя меньшее количество ячеек даст нам более глобальную информацию, мы можем наблюдать за формой общего распределения в отсутствие подробной информации. Во-вторых, кумулятивный параметр — это логическое значение, которое позволяет нам выбрать, является ли гистограмма кумулятивной, то есть выбрать функцию плотности вероятности (PDF) или функцию кумулятивной плотности (CDF).
def histogram(data, n_bins, cumulative=False, x_label = "", y_label = "", title = ""):
_, ax = plt.subplots()
ax.hist(data, n_bins = n_bins, cumulative = cumulative, color = '#539caf')
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
Если мы хотим сравнить распределения двух переменных в наших данных, можно подумать, что нам нужно сделать две отдельные гистограммы и сшить их вместе для сравнения. Но на самом деле у Matplotlib есть лучший способ: мы можем накладывать несколько гистограмм с разной прозрачностью. Как вы можете видеть на изображении ниже, равномерное распределение имеет непрозрачность 0,5, поэтому мы можем наложить его на распределение Гаусса, что позволяет пользователю отображать и сравнивать оба распределения на одном графике.
В коде для укладки гистограмм нам нужно обратить внимание на несколько моментов. Во-первых, заданный нами горизонтальный интервал должен удовлетворять распределению обеих переменных одновременно. Основываясь на диапазоне горизонтального интервала и количестве бинов, мы можем рассчитать ширину каждого бина. Во-вторых, мы рисуем две гистограммы на одном графике, и нам нужно добиться большей прозрачности одной гистограммы.
# Overlay 2 histograms to compare them
def overlaid_histogram(data1, data2, n_bins = 0, data1_name="", data1_color="#539caf", data2_name="", data2_color="#7663b0", x_label="", y_label="", title=""):
# Set the bounds for the bins so that the two distributions are fairly compared
max_nbins = 10
data_range = [min(min(data1), min(data2)), max(max(data1), max(data2))]
binwidth = (data_range[1] - data_range[0]) / max_nbins
if n_bins == 0
bins = np.arange(data_range[0], data_range[1] + binwidth, binwidth)
else:
bins = n_bins
# Create the plot
_, ax = plt.subplots()
ax.hist(data1, bins = bins, color = data1_color, alpha = 1, label = data1_name)
ax.hist(data2, bins = bins, color = data2_color, alpha = 0.75, label = data2_name)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'best')
гистограмма
Гистограммы наиболее эффективны при визуализации категорийных данных с небольшим количеством категорий (
Обычная гистограмма показана на рисунке 1. В функции barplot() x_data представляет различные категории по оси x, а y_data представляет высоту столбца по оси y. Столбики погрешностей — это дополнительные линии, добавленные в центр каждого столбца, которые можно использовать для представления стандартного отклонения.
Сгруппированные гистограммы позволяют нам сравнивать несколько категориальных переменных. Как показано ниже, наша первая переменная варьируется в зависимости от разных групп (G1, G2 и т. д.), и мы сравниваем представителей разных полов в каждой группе. Как видно из кода, переменная y_data_list теперь представляет собой набор списков, где каждый подсписок представляет отдельный набор. Затем мы перебираем каждую группу и наносим столбцы и соответствующие значения на ось x, при этом разные категории для каждой группы представлены разными цветами.
Столбчатые гистограммы отлично подходят для визуализации категориального состава различных переменных. На гистограмме с накоплением ниже мы сравниваем загрузку серверов в будние дни. Используя квадраты разного цвета, расположенные на одной панели, мы можем легко увидеть и понять, какой сервер работает наиболее эффективно каждый день, и насколько один и тот же сервер загружен в разные дни. Код для рисования этого графика выполнен в том же стиле, что и сгруппированная гистограмма, мы перебираем каждую группу, но на этот раз мы рисуем новый столбец поверх старого столбца, а не рядом с ним.
def barplot(x_data, y_data, error_data, x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw bars, position them in the center of the tick mark on the x-axis
ax.bar(x_data, y_data, color = '#539caf', align = 'center')
# Draw error bars to show standard deviation, set ls to 'none'
# to remove line between points
ax.errorbar(x_data, y_data, yerr = error_data, color = '#297083', ls = 'none', lw = 2, capthick = 2)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
def stackedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw bars, one category at a time
for i in range(0, len(y_data_list)):
if i == 0:
ax.bar(x_data, y_data_list[i], color = colors[i], align = 'center', label = y_data_names[i])
else:
# For each category after the first, the bottom of the
# bar will be the top of the last category
ax.bar(x_data, y_data_list[i], color = colors[i], bottom = y_data_list[i - 1], align = 'center', label = y_data_names[i])
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'upper right')
def groupedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Total width for all bars at one x location
total_width = 0.8
# Width of each individual bar
ind_width = total_width / len(y_data_list)
# This centers each cluster of bars about the x tick mark
alteration = np.arange(-(total_width/2), total_width/2, ind_width)
# Draw bars, one category at a time
for i in range(0, len(y_data_list)):
# Move the bar to the right on the x-axis so it doesn't
# overlap with previously drawn ones
ax.bar(x_data + alteration[i], y_data_list[i], color = colors[i], label = y_data_names[i], width = ind_width)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'upper right')
коробочный сюжет
Приведенная выше гистограмма очень полезна для визуализации распределения переменных, но что, если нам нужно больше информации? Возможно, нам потребуется четко визуализировать стандартное отклонение, или могут быть случаи, когда медиана и среднее сильно различаются (с большим количеством выбросов), поэтому требуется более подробная информация. Также могут быть случаи, когда распределение данных очень неравномерно и так далее.
Коробчатая диаграмма может дать нам всю необходимую информацию выше. Нижняя часть прямоугольника со сплошной линией представляет первый квартиль, верхняя часть представляет собой третий квартиль, а линия внутри прямоугольника представляет второй квартиль (медиану). Пунктирная линия указывает диапазон распределения данных.
Поскольку ящичковая диаграмма представляет собой визуализацию одной переменной, ее настройка проста. x_data — это список переменных. Функция boxplot() в Matplotlib рисует коробчатую диаграмму для каждого столбца y_data или для каждого вектора в ряду y_data, поэтому каждое значение в x_data соответствует столбцу/вектору в y_data .
def boxplot(x_data, y_data, base_color="#539caf", median_color="#297083", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw boxplots, specifying desired style
ax.boxplot(y_data
# patch_artist must be True to control box fill
, patch_artist = True
# Properties of median line
, medianprops = {'color': median_color}
# Properties of box
, boxprops = {'color': base_color, 'facecolor': base_color}
# Properties of whiskers
, whiskerprops = {'color': base_color}
# Properties of whisker caps
, capprops = {'color': base_color})
# By default, the tick label starts at 1 and increments by 1 for
# each box drawn. This sets the labels to the ones we want
ax.set_xticklabels(x_data)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
в заключении
В этой статье представлены 5 простых в использовании методов визуализации данных Matplotlib. Абстрагирование процесса визуализации в функции упрощает чтение и использование кода. Надеюсь тебе понравилось!
Оригинальный адрес: