среда, 7 сентября 2022 г.

Data Visualization : курс Kaggle

Продолжаем осваивать знания на курсах Kaggle, на этот раз курс по визуализации данных. Работать будем со своими наборами данных. Первый представляет данные по месячной длине чека 20 розничных магазинов одежды с января 2012 по декабрь 2019. Под длиной чека понимаем месячное количество покупок деленное на месячное количество чеков.


В начале, как обычно, загружаем необходимые библиотеки и делаем необходимые настройки рабочей среды (работаем в IPython notebook)

import pandas as pd
# конвертеры, которые позволяют использовать типы 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')

Загружаем и смотрим на данные

df = pd.read_excel("shops_lch.xlsx", index_col="date", parse_dates=True)
df


Sh1Sh2Sh3Sh4Sh5Sh6Sh7Sh8Sh9Sh10Sh11Sh12Sh13Sh14Sh15Sh16Sh17Sh18Sh19Sh20
date
2012-01-011.9011.8751.9002.0651.8721.8332.2082.0021.9902.1111.9161.8582.2672.0282.0101.9102.0152.0842.0521.996
2012-02-011.4401.3671.4281.5561.4231.3671.8221.4581.5261.4271.4311.3221.6611.4571.3961.3121.5061.4151.4751.474
...............................................................
2019-11-012.2403.9423.1612.5862.9592.7352.4683.2033.0582.6912.4592.7942.1773.0342.5692.8452.2012.7162.2752.744
2019-12-012.5803.7883.0712.9283.3912.6502.5722.8992.9193.0822.4782.9692.5523.0332.8492.9012.4562.9632.3992.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")





Переходим к столбчатым диаграммам и тепловым картам

Столбчатая диаграмма 

Допустим, мы хотим создать столбчатую диаграмму, показывающую как изменялась длина чека по месяцам в 2019 году в первом магазине

#Установим ширину и высоту графика
plt.figure(figsize=(10,6))

#Добавим заголовок
plt.title("Длина чека в 2019 магазин Sh1")
#Отберем данные за один год
df2019=df.query("date>='2019-01-01' and date<='2019-12-01'")
#Гистограмма длины чека по месяцам в магазине Sh1
sns.barplot(x=df2019.index,y=df2019['Sh1'])
#Развернем метки горизонтальной оси на 45 градусов
plt.xticks(rotation=45)
#Добавим метку для горизонтальной оси
plt.xlabel("Месяц")
#Добавим метку для вертикальной оси
plt.ylabel("Длина чека")



Тепловая карта

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

#Установим ширину и высоту графика
plt.figure(figsize=(14,10))
#Добавим заголовок
plt.title("Длина чека в 2019 по месяцам и магазинам")
sns.heatmap(data=df2019, annot=True)



Графики рассеяния 

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

Обозначения :
    month - месяц,
    shop - индекс магазина,
    reg - индекс региона,
    rev - выручка,
    rent - аренда

df_rent = pd.read_excel("shops_rev_rent_month.xlsx",parse_dates=['month'])

monthshopregrevrent
02021-09-01Sh1112558525174
12021-10-01Sh1114347225174
..................
5862022-01-01Sh9824988912856
5872022-02-01Sh9822842612856

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("Аренда")


Диаграммы рассеяния с цветовой кодировкой

Мы можем использовать точечные диаграммы для отображения отношений между не двумя, четырьмя переменными! Один из способов сделать это — раскрасить точки.
Например, чтобы понять, как регион влияет на взаимосвязь между выручкой и арендой, мы можем пометить точки цветом как «reg», так как региона четыре, задаем четырех цветную палитру palette=['b','g','r','y']

#Ширина и высота графика
plt.figure(figsize=(10,6))
#Добавим заголовок
plt.title("Выручка и аренда с сентября 2021 по февраль 2022 в 98-ми магазинах по регионам")
#График рассеяния
sns.scatterplot(x='rev', y='rent',hue="reg",palette=['b','g','r','y'],data=df_rent)
#Добавим метку для горизонтальной оси
plt.xlabel("Выручка")
#Добавим метку для вертикальной оси
plt.ylabel("Аренда")

Для добавления четырех линий регрессии используем команду sns.lmplot. Легко заметить, что линия регрессии для разных регионов имеет разный наклон.

#Ширина и высота графика
plt.figure(figsize=(10,6))
#График рассеяния с линиями регрессии по регионам
sns.lmplot(x="rev", y="rent", hue="reg", palette=['b','g','r','y'],data=df_rent)
#Добавим заголовок
plt.title("Выручка и аренда с сентября 2021 по февраль 2022 в 98-ми магазинах по регионам")
#Добавим метку для горизонтальной оси
plt.xlabel("Выручка")
#Добавим метку для вертикальной оси
plt.ylabel("Аренда")


Категориальным точечным графиком - еще один вариант разделить данные по категориям - регионам, строим его с помощью команды sns.swarmplot. Идея swarmplot() в том, что отображаемые точки на диаграмме не перекрываются, это позволяет
делать выводы о преобладании тех или иных значений в наборах данных по их визуальному распределению.

sns.swarmplot(x='reg',y='rev',data=df_rent)


Еще один очень полезный вид графиков - boxplot() — строит диаграмму типа "ящик с усами", иногда её 
называют через транскрипцию: боксплот, на ней отображаются медианное значение, квартили и выбросы

sns.boxplot(x="reg", y="rev", data=df_rent)



Гистограммы

Скажем, мы хотели бы создать гистограмму, чтобы увидеть, как выручка или аренда варьируется по регионам в декабре 2021 года. Мы можем сделать это с помощью команды sns.histplot.

df_rent_12=df_rent[df_rent['month']=='2021-12-01']
sns.histplot(df_rent_12['rev'])


Графики плотности 

Следующий тип графика — это график оценки плотности ядра (KDE). Если вы не знакомы с графиками KDE, вы можете думать о них как о сглаженной гистограмме.

Чтобы построить график KDE, мы используем команду sns.kdeplot. Установка Shade=True окрашивает область под кривой (и data= выбирает столбец, который мы хотели бы построить).

sns.kdeplot(df_rent_12['rev'],shade=True)
plt.tight_layout()

2D-графики KDE 
Мы не ограничены одним столбцом при создании графика KDE. Мы можем создать двухмерный (2D) график KDE с помощью команды sns.jointplot.
sns.jointplot(data=df_rent_12,x='rev', y='rent', kind="kde")

Мы можем создать четыре разные гистограммы (по одной для каждого вида) , используя команду sns.histplot. 

data= предоставляет имя переменной, которую мы использовали для чтения в данных x= устанавливает имя столбца с данными, которые мы хотим построить hue= устанавливает столбец, который мы будем использовать для разделения данных на разные гистограммы,palette задает цвета.


sns.histplot(data=df_rent_12, x='rev', hue='reg',palette=['b','g','r','y'], multiple="stack")


Мы также можем создать график KDE для каждого вида, используя sns.kdeplot (как указано выше). Функциональность для данных, x и оттенка идентична той, что была при использовании sns.histplot выше. Кроме того, мы устанавливаем Shade=True, чтобы закрасить область под каждой кривой.

sns.kdeplot(data=df_rent_12, x='rev',  hue='reg',palette=['b','g','r','y'],shade=True)


Итоги

Поскольку не всегда легко решить, как лучше всего графически представить наши данные, разобъем типы диаграмм на три широкие категории 

Тенденции. 

Тенденция определяется как модель изменений. 

    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 для каждой отдельной переменной.














Комментариев нет:

Отправить комментарий