Обрабатываемые структуры данных

Большинство функций Seaborn могут принимать данные в самых разных форматах: списки и кортежи Python, массивы NumPy, серии и датафреймы Pandas. В то же время Seaborn ориентирована на быструю "разведку" данных, которые чаще всего хранятся в объектах DataFrame Pandas. Поэтому, сейчас мы уделим особое внимание работе с данными именно в этом формате.

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

Прежде чем двигаться дальше, выполним все необходимые импорты:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

И зададим стиль для всех графиков:

sns.set()

"Длинные" данные

Хорошим примером длинных данных является набор flights, который содержит информацию о месячном объеме пассажироперевозок в период с 1945 по 1960 год. Данный набор является частью библиотеки Seaborn и одним из многих наборов, которые специально сделаны для облегчения документирования и изучения данной библиотеки. Давайте загрузим этот набор:

flights = sns.load_dataset("flights")

И взглянем на несколько первых строк:

flights.head()
year month passengers
0 1949 Jan 112
1 1949 Feb 118
2 1949 Mar 132
3 1949 Apr 129
4 1949 May 121

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

  • data - в этом аргументе указывается переменная с данными;
  • x - указывается имя столбца, значения которого будут расположены вдоль оси x;
  • y - имя столбца, значения которого будут откладываться по оси y.
sns.relplot(data=flights,
            x='year',
            y='passengers',
            kind='line');

График длинных данных в Seaborn.

Вот так просто появился график, который показывает среднее значение количества перевезенных пассажиров в каждом году и 95%-й доверительный интервал вокруг этого значения. С другой стороны, мы можем захотеть посмотреть динамику изменения по месяцам. В этом случае, столбец month может рассматриваться как отдельная переменная и может быть передан параметру hue:

sns.relplot(data=flights,
            x='year',
            y='passengers',
            hue='month',
            kind='line');

График длинных данных с добавление еще одной переменной в Seaborn.

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

sns.relplot(data=flights,
            x='month',
            y='passengers',
            hue='year',
            kind='line');

Еще один график длинных данных с добавлением еще одной переменной в Seaborn.

Данные в длинной форме очень удобны, так как позволяют легко строить графики для разных переменных и их подмножеств. Например могут быть построены не только линейные графики, но и многие другие их типы:

sns.catplot(data=flights,
            x='month',
            y='passengers',
            kind='box');

График boxplot для длинных данных в Seaborn.


"Широкие" данные

Что бы взглянуть на широкие данные, преобразуем нашу таблицу flights следующим образом:

flights_wide_data = flights.pivot(index="month", columns="year", values="passengers")
flights_wide_data
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
Jan 112 115 145 171 196 204 242 284 315 340 360 417
Feb 118 126 150 180 196 188 233 277 301 318 342 391
Mar 132 141 178 193 236 235 267 317 356 362 406 419
Apr 129 135 163 181 235 227 269 313 348 348 396 461
May 121 125 172 183 229 234 270 318 355 363 420 472
Jun 135 149 178 218 243 264 315 374 422 435 472 535
Jul 148 170 199 230 264 302 364 413 465 491 548 622
Aug 148 170 199 242 272 293 347 405 467 505 559 606
Sep 136 158 184 209 237 259 312 355 404 404 463 508
Oct 119 133 162 191 211 229 274 306 347 359 407 461
Nov 104 114 146 172 180 203 237 271 305 310 362 390
Dec 118 140 166 194 201 229 278 306 336 337 405 432

Это те же самые данные, но теперь строки и столбцы являются переменными, а на их пересечении расположены наблюдения. Теперь мы не можем назначить аргументам x и y какие-то имена столбцов, но тем не менее Seaborn может построить график:

sns.relplot(data=flights_wide_data, kind='line');

График для широких данных в Seaborn.

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

sns.catplot(data=flights_wide_data, kind='box');

График boxplot для широких данных в Seaborn.

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