Продолжаем осваивать знания на курсах Kaggle, на этот раз курс по визуализации данных. Работать будем со своими наборами данных. Первый представляет данные по месячной длине чека 20 розничных магазинов одежды с января 2012 по декабрь 2019. Под длиной чека понимаем месячное количество покупок деленное на месячное количество чеков.
В начале, как обычно, загружаем необходимые библиотеки и делаем необходимые настройки рабочей среды (работаем в IPython notebook)
# конвертеры, которые позволяют использовать типы pandas в matplotlib
pd.plotting.register_matplotlib_converters()
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
pd.set_option("display.max_rows", 5)
pd.set_option("display.precision", 3)
large = 16; med = 12; small = 10
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (12, 8),
'axes.labelsize': med,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
Sh1 | Sh2 | Sh3 | Sh4 | Sh5 | Sh6 | Sh7 | Sh8 | Sh9 | Sh10 | Sh11 | Sh12 | Sh13 | Sh14 | Sh15 | Sh16 | Sh17 | Sh18 | Sh19 | Sh20 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
date | ||||||||||||||||||||
2012-01-01 | 1.901 | 1.875 | 1.900 | 2.065 | 1.872 | 1.833 | 2.208 | 2.002 | 1.990 | 2.111 | 1.916 | 1.858 | 2.267 | 2.028 | 2.010 | 1.910 | 2.015 | 2.084 | 2.052 | 1.996 |
2012-02-01 | 1.440 | 1.367 | 1.428 | 1.556 | 1.423 | 1.367 | 1.822 | 1.458 | 1.526 | 1.427 | 1.431 | 1.322 | 1.661 | 1.457 | 1.396 | 1.312 | 1.506 | 1.415 | 1.475 | 1.474 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2019-11-01 | 2.240 | 3.942 | 3.161 | 2.586 | 2.959 | 2.735 | 2.468 | 3.203 | 3.058 | 2.691 | 2.459 | 2.794 | 2.177 | 3.034 | 2.569 | 2.845 | 2.201 | 2.716 | 2.275 | 2.744 |
2019-12-01 | 2.580 | 3.788 | 3.071 | 2.928 | 3.391 | 2.650 | 2.572 | 2.899 | 2.919 | 3.082 | 2.478 | 2.969 | 2.552 | 3.033 | 2.849 | 2.901 | 2.456 | 2.963 | 2.399 | 2.879 |
96 rows × 20 columns
Курс построен на изучении библиотеки seaborn.
Seaborn — это библиотека для решения задач визуализации с ориентацией на работу в области статистики. Базой seaborn является библиотека Matplotlib.
Seaborn предоставляет:
• удобный API для изучения связей в наборах данных;
• автоматический расчёт и отображение моделей линейной регрессии;
• инструменты для исследования внутренней структуры данных;
• инструменты для управления расположением графиков разных типов на одном поле;
• темы оформления графиков.
Инструменты для визуализации данных, которые предоставляет seaborn можно разделить на пять групп:
• визуализация отношений в данных;
• визуализация категориальных данных;
• визуализация распределений;
• визуализация линейной регрессии;
• визуализация матричных наборов данных.
Начнём с построения простой зависимости одной переменной от другой помощью функции lineplot().
Если необходимо отобразить все элементы из DataFrame набора, то можно его передать в lineplot() через параметр data, при этом не задавая x и y:
plt.figure(figsize=(16,6))
#Линейная диаграмма, показывающая, как длина чека меняется с течением #времени
sns.lineplot(data=df)
Каждый из этих параметров может быть легко установлен с помощью одной строки кода.
#Установим ширину и высоту графика
plt.figure(figsize=(14,6))
# Добавим заголовок
plt.title("Месячная длина чека в 20 розничных магазинов одежды 2015-2019")
#Линейная диаграмма, показывающая, как длина чека меняется с течением #времени
sns.lineplot(data=df)
Первая строка кода устанавливает размер фигуры 14 дюймов (в ширину) на 6 дюймов (в высоту). Чтобы установить размер любой фигуры, нужно всего лишь скопировать эту же строку кода.
Вторая строка кода задает заголовок рисунка. Обратите внимание, что заголовок всегда должен быть заключен в кавычки ("...")!
Итак, мы узнали, как построить линию для каждого столбца в наборе данных. Далее узнаем, как построить подмножество столбцов.
Мы начнем с печати имен всех столбцов.
df.columns
Index(['Sh1', 'Sh2', 'Sh3', 'Sh4', 'Sh5', 'Sh6', 'Sh7', 'Sh8', 'Sh9', 'Sh10', 'Sh11', 'Sh12', 'Sh13', 'Sh14', 'Sh15', 'Sh16', 'Sh17', 'Sh18', 'Sh19', 'Sh20'], dtype='object')
#Наносим линии, соответствующие первым двум столбцам в наборе данных.
plt.figure(figsize=(14,6))
# Добавить заголовок
plt.title("Месячная длина чека в двух розничных магазинов одежды 2015-2019")
# Линейная диаграмма, показывающая месячную длину чека в магазине Sh1
sns.lineplot(data=df['Sh1'], label="Магазин Sh1")
# Линейная диаграмма, показывающая месячную длину чека в магазине Sh2
sns.lineplot(data=df['Sh2'], label="Магазин Sh2")
# Добавить метку для горизонтальной оси
plt.xlabel("Date")
Первые две строки кода задают заголовок и размер рисунка.
Каждая из следующих двух строк добавляет линию к линейной диаграмме. Например, рассмотрим первый, который добавляет строку «Магазин Sh1»:
Вместо установки data=df мы устанавливаем data=df['Sh1']. Как правило, для отображения только одного столбца мы используем этот формат, заключая имя столбца в одинарные кавычки и заключая его в квадратные скобки. (Чтобы убедиться, что вы правильно указали имя столбца, вы можете распечатать список всех имен столбцов, используя команду, которую вы узнали выше.) Мы также добавляем label="Магазин Sh1", чтобы линия отображалась в легенде, и устанавливаем соответствующую ей метку. Последняя строка кода изменяет метку горизонтальной оси (или оси X), где нужная метка помещается в кавычки ("...").
Есть более короткий вариант вывода нескольких графиков
plt.title("Месячная длина чека в трех розничных магазинов одежды 2015-2019")
# Выберем данные для трех магазинов
sns.lineplot(data=df.loc[:,['Sh1','Sh5','Sh20']])
# Добавить метку для горизонтальной оси
plt.xlabel("Date")
month | shop | reg | rev | rent | |
---|---|---|---|---|---|
0 | 2021-09-01 | Sh1 | 1 | 125585 | 25174 |
1 | 2021-10-01 | Sh1 | 1 | 143472 | 25174 |
... | ... | ... | ... | ... | ... |
586 | 2022-01-01 | Sh98 | 2 | 49889 | 12856 |
587 | 2022-02-01 | Sh98 | 2 | 28426 | 12856 |
588 rows × 5 columns
Работаем с 98 магазинами с сентября 2021 по февраль 2022
print(df_rent.shop.unique(),'\n',len(df_rent.shop.unique()))
['Sh1' 'Sh10' 'Sh11' 'Sh12' 'Sh13' 'Sh14' 'Sh15' 'Sh16' 'Sh17' 'Sh18' 'Sh19' 'Sh2' 'Sh20' 'Sh21' 'Sh22' 'Sh23' 'Sh24' 'Sh25' 'Sh26' 'Sh27' 'Sh28' 'Sh29' 'Sh3' 'Sh30' 'Sh31' 'Sh32' 'Sh33' 'Sh34' 'Sh35' 'Sh36' 'Sh37' 'Sh38' 'Sh39' 'Sh4' 'Sh40' 'Sh41' 'Sh42' 'Sh43' 'Sh44' 'Sh45' 'Sh46' 'Sh47' 'Sh48' 'Sh49' 'Sh5' 'Sh50' 'Sh51' 'Sh52' 'Sh53' 'Sh54' 'Sh55' 'Sh56' 'Sh57' 'Sh58' 'Sh59' 'Sh6' 'Sh60' 'Sh61' 'Sh62' 'Sh7' 'Sh8' 'Sh9' 'Sh63' 'Sh64' 'Sh65' 'Sh66' 'Sh67' 'Sh68' 'Sh69' 'Sh70' 'Sh71' 'Sh72' 'Sh73' 'Sh74' 'Sh75' 'Sh76' 'Sh77' 'Sh78' 'Sh79' 'Sh80' 'Sh81' 'Sh82' 'Sh83' 'Sh84' 'Sh85' 'Sh86' 'Sh87' 'Sh88' 'Sh89' 'Sh90' 'Sh91' 'Sh92' 'Sh93' 'Sh94' 'Sh95' 'Sh96' 'Sh97' 'Sh98'] 98
Чтобы создать простую точечную диаграмму, используем команду sns.scatterplot
и указываем значения для горизонтальной оси (x='rev'), для вертикальной оси (y='rent') из df_rent.
#Ширина и высота графика
plt.figure(figsize=(10,6))
#Добавим заголовок
plt.title("Выручка и аренда с сентября 2021 по февраль 2022 в 98-ми магазинах")
#График рассеяния
sns.scatterplot(x='rev', y='rent',data=df_rent)
#Добавим метку для горизонтальной оси
plt.xlabel("Выручка")
#Добавим метку для вертикальной оси
plt.ylabel("Аренда")
Приведенная выше диаграмма рассеяния показывает, выручка и аренда магазинов положительно коррелируют, т.к за хороший магазин с хорошей выручкой арендодатель всегда потребует большую аренду. (Этот паттерн имеет смысл, поскольку высокие выручки всегда связаны с более высокими ставками за площадь.)
Чтобы еще раз проверить силу этой связи, мы можем добавить линию регрессии или линию, которая лучше всего соответствует данным. Мы делаем это, изменяя команду на sns.regplot.
plt.figure(figsize=(10,6))
#Добавим заголовок
plt.title("Выручка и аренда с сентября 2021 по февраль 2022 в 98-ми магазинах с линией регрессии")
#График рассеяния
sns.regplot(x='rev', y='rent',data=df_rent)
#Добавим метку для горизонтальной оси
plt.xlabel("Выручка")
#Добавим метку для вертикальной оси
plt.ylabel("Аренда")
Еще один очень полезный вид графиков - boxplot() — строит диаграмму типа "ящик с усами", иногда её называют через транскрипцию: боксплот, на ней отображаются медианное значение, квартили и выбросы
Графики плотности
Следующий тип графика — это график оценки плотности ядра (KDE). Если вы не знакомы с графиками KDE, вы можете думать о них как о сглаженной гистограмме.
Чтобы построить график KDE, мы используем команду sns.kdeplot. Установка Shade=True окрашивает область под кривой (и data= выбирает столбец, который мы хотели бы построить).
plt.tight_layout()
Мы можем создать четыре разные гистограммы (по одной для каждого вида) , используя команду sns.histplot.
data= предоставляет имя переменной, которую мы использовали для чтения в данных x= устанавливает имя столбца с данными, которые мы хотим построить hue= устанавливает столбец, который мы будем использовать для разделения данных на разные гистограммы,palette задает цвета.
Поскольку не всегда легко решить, как лучше всего графически представить наши данные, разобъем типы диаграмм на три широкие категории
Тенденции.
Тенденция определяется как модель изменений.
sns.lineplot — линейные диаграммы лучше всего отображают тенденции за определенный период времени, а несколько линий можно использовать для отображения тенденций более чем в одной группе.
Отношения.
Существует множество различных типов диаграмм, которые можно использовать для понимания взаимосвязей между переменными в ваших данных :
sns.barplot — гистограммы полезны для сравнения величин, соответствующих разным группам.
sns.heatmap — тепловые карты можно использовать для поиска шаблонов с цветовой кодировкой в таблицах чисел.
sns.scatterplot — диаграммы рассеяния показывают взаимосвязь между двумя непрерывными переменными; если закодировано цветом, мы также можем показать связь с третьей категориальной переменной.
sns.regplot — включение линии регрессии в точечную диаграмму облегчает просмотр любых линейных отношений между двумя переменными.
sns.lmplot — эта команда полезна для рисования нескольких линий регрессии, если точечная диаграмма содержит несколько групп с цветовой кодировкой.
sns.swarmplot — категориальные диаграммы рассеяния показывают взаимосвязь между непрерывной переменной и категориальной переменной.
Распределение.
Мы визуализируем распределения, чтобы показать возможные значения, которые мы можем ожидать увидеть в переменной, а также их вероятность.
sns.histplot — гистограммы показывают распределение одной числовой переменной.
sns.kdeplot — графики KDE (или 2D-графики KDE) показывают предполагаемое гладкое распределение одной числовой переменной (или двух числовых переменных).
sns.jointplot — эта команда полезна для одновременного отображения двухмерного графика KDE с соответствующими графиками KDE для каждой отдельной переменной.
Комментариев нет:
Отправить комментарий