Будущих студентов курса «Python Developer. Professional» и всех желающих приглашаем принять участие в открытом вебинаре на тему «Фреймворкирование и метаклассы».
А сейчас делимся традиционным переводом полезного материала.
Визуализация данных — это метод, который позволяет специалистам по анализу данных преобразовывать сырые данные в диаграммы и графики, которые несут ценную информацию. Диаграммы уменьшают сложность данных и делают более понятными для любого пользователя.
Есть множество инструментов для визуализации данных, таких как Tableau, Power BI, ChartBlocks и других, которые являются no-code инструментами. Они очень мощные, и у каждого своя аудитория. Однако для работы с сырыми данными, требующими обработки, а также в качестве песочницы, Python подойдет лучше всего.
Несмотря на то, что этот путь сложнее и требует умения программировать, Python позволит вам провести любые манипуляции, преобразования и визуализировать ваши данные. Он идеально подходит для специалистов по анализу данных.
Python — лучший инструмент для data science и этому много причин, но самая важная — это его экосистема библиотек. Для работы с данными в Python есть много замечательных библиотек, таких как numpy
, pandas
, matplotlib
, tensorflow
.
Matplotlib
, вероятно, самая известная библиотека для построения графиков, которая доступна в Python и других языках программирования, таких как R. Именно ее уровень кастомизации и удобства в использовании ставит ее на первое место. Однако с некоторыми действиями и кастомизациями во время ее использования бывает справиться нелегко.
Разработчики создали новую библиотеку на основе matplotlib
, которая называется seaborn
. Seaborn
такая же мощная, как и matplotlib
, но в то же время предоставляет большую абстракцию для упрощения графиков и привносит некоторые уникальные функции.
В этой статье мы сосредоточимся на том, как работать с seaborn
для создания первоклассных графиков. Если хотите, можете создать новый проект и повторить все шаги или просто обратиться к моему руководству по seaborn на GitHub.
Что такое Seaborn?
Seaborn — это библиотека для создания статистических графиков на Python. Она основывается на matplotlib и тесно взаимодействует со структурами данных pandas.
Архитектура Seaborn позволяет вам быстро изучить и понять свои данные. Seaborn захватывает целые фреймы данных или массивы, в которых содержатся все ваши данные, и выполняет все внутренние функции, нужные для семантического маппинга и статистической агрегации для преобразования данных в информативные графики.
Она абстрагирует сложность, позволяя вам проектировать графики в соответствии с вашими нуждами.
Установка Seaborn
Установить seaborn
так же просто, как и любую другую библиотеку, для этого вам понадобится ваш любимый менеджер пакетов Python. Во время установки seaborn
библиотека установит все зависимости, включая matplotlib
, pandas
, numpy
и scipy
.
Давайте уже установим seaborn
и, конечно же, также пакет notebook
, чтобы получить доступ к песочнице с данными.
pipenv install seaborn notebook
Помимо этого, перед началом работы давайте импортируем несколько модулей.
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib
Строим первые графики
Перед тем, как мы начнем строить графики, нам нужны данные. Прелесть seaborn
в том, что он работает непосредственно с объектами dataframe
из pandas
, что делает ее очень удобной. Более того, библиотека поставляется с некоторыми встроенными наборами данных, которые можно использовать прямо из кода, и не загружать файлы вручную.
Давайте посмотрим, как это работает на наборе данных о рейсах самолетов.
flights_data = sns.load_dataset("flights")
flights_data.head()
year | month | passengers | |
---|---|---|---|
0 | 1949 | Jan | 112 |
1 | 1949 | Feb | 118 |
2 | 1949 | Mar | 132 |
3 | 1949 | Apr | 129 |
4 | 1949 | May | 121 |
Вся магия происходит при вызове функции load_dataset
, которая ожидает имя загружаемых данных и возвращает dataframe
. Все эти наборы данных доступны в репозитории на Github.
Диаграмма рассеяния — Scatter Plot
Диаграмма рассеяния — это диаграмма, которая отображает точки на основе двух измерений набора данных. Создать диаграмму рассеяния в seaborn очень просто, ведь для этого нужна всего одна строчка кода.
sns.scatterplot(data=flights_data, x="year", y="passengers")
Легко, не правда ли? Функция scatterplot
принимает в себя набор данных, который нужно визуализировать, и столбцы, которые будут выступать как оси x и y.
Линейный график — Line Plot
Этот график рисует линию, которая представляет собой развитие непрерывных или категориальных данных. Этот вид графиков популярен и известен, и его легко создать. Как и раньше, мы воспользуемся функцией lineplot
с набором данных и столбцами, представляющими оси x и y. Остальное за нас сделает seaborn
.
sns.lineplot(data=flights_data, x="year", y="passengers")
Столбчатая диаграмма — Bar Plot
Наверное, это самый известный тип диаграммы, и, как вы уже догадались, мы можем построить этот тип диаграмм с помощью seaborn
, также, как мы сделали это для линейного графика и диаграммы рассеяния, с помощью функции barplot
.
sns.barplot(data=flights_data, x="year", y="passengers")
Она очень красочная, знаю. Позже мы научимся кастомизировать ее.
Расширение функционала с matplotlib
Seaborn основывается на matplotlib, расширяя ее функциональные возможности и абстрагируя сложность. При этом seaborn не теряет в своей мощности. Любая диаграмма seaborn может быть кастомизирована с помощью функций из библиотеки matplotlib. Эта механика может пригодиться в определенных случаях и позволяет seaborn использовать возможности matplotlib без необходимости переписывать все ее функции.
Допустим, вы хотите построить несколько диаграмм одновременно с помощью seaborn, в этом случае вы можете воспользоваться функцией subplot
из matplotlib.
diamonds_data = sns.load_dataset('diamonds')
plt.subplot(1, 2, 1)
sns.countplot(x='carat', data=diamonds_data)
plt.subplot(1, 2, 2)
sns.countplot(x='depth', data=diamonds_data)
С помощью функции subplot
на одном графике можно построить несколько диаграмм. Функция принимает в себя три параметра: первый – количество строк, второй – количество столбцов, третий – количество диаграмм.
Мы визуализируем по одной диаграмме seaborn на каждой части графика, смешивая функционал matplotlib и seaborn.
Seaborn и Pandas
Мы уже говорили о том, что seaborn любит pandas до такой степени, что все ее функции строятся на структуре dataframe
. До этого момента мы использовали seaborn с предварительно загруженными данными, но что, если мы хотим визуализировать данные, которые уже загрузили с помощью pandas?
drinks_df = pd.read_csv("data/drinks.csv")
sns.barplot(x="country", y="beer_servings", data=drinks_df)
Создание красивых графиков с помощью стилей
Seaborn дает возможность менять интерфейс ваших графиков. Для этого из коробки у нас в распоряжении есть пять стилей: darkgrid, whitegrid, dark, white и ticks.
sns.set_style("darkgrid")
sns.lineplot(data = data, x = "year", y = "passengers")
А вот другой пример.
sns.set_style("whitegrid")
sns.lineplot(data=flights_data, x="year", y="passengers")
Крутые варианты использования
Мы познакомились с основами seaborn, а теперь давайте применим знания на практике и построим несколько диаграмм с одним и тем же набором данных. В нашем случае вы используем набор данных «tips», который можно скачать непосредственно с помощью seaborn.
Сначала загрузим набор данных.
tips_df = sns.load_dataset('tips')
tips_df.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
Мне нравится выводить первые несколько строк набора данных, чтобы получить представление о столбцах и самих данных. Обычно я пользуюсь несколькими функциями pandas, чтобы уладить проблемы с данными, такие как значения null
, или добавить в набор данных информацию, которая может быть полезной. Подробнее об этом вы можете прочитать в руководстве к pandas.
Давайте добавим еще один столбец, в котором будет процентное отношение чаевых ко всему счету.
tips_df["tip_percentage"] = tips_df["tip"] / tips_df["total_bill"]
tips_df.head()
Теперь данные выглядят так:
total_bill | tip | sex | smoker | day | time | size | tip_percentage | |
---|---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 | 0.059447 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 | 0.160542 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 | 0.166587 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 | 0.139780 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 | 0.146808 |
А теперь мы начнем строить графики.
Процент чаевых
Давайте попробуем разобраться с процентным соотношением чаевых и счета. Для этого воспользуемся функцией histplot
, которая сгенерирует гистограмму.
sns.histplot(tips_df["tip_percentage"], binwidth=0.05)
Чтобы все хорошо читалось, нам пришлось настроить свойство binwidth
, зато теперь мы быстрее можем понять и оценить данные. Большинство клиентов оставляют чаевые в размере от 15 до 20% от счета, но есть несколько случаев, когда чаевые превышают 70%. Эти значения называются аномалиями или выбросами, и на них всегда стоит обращать внимание, чтобы понять являются ли эти значения ошибочными.
Также мне было интересно, меняется ли процент чаевых в зависимости от времени дня.
sns.histplot(data=tips_df, x="tip_percentage", binwidth=0.05, hue="time")
На этот раз мы создали диаграмму с помощью всего набора данных, а не одного столбца, и установили свойство hue
на столбец time
. Так в диаграмме будут использоваться разные цвета для каждого значения времени, и к ней добавится легенда.
Общее количество чаевых за определенный день недели
Еще одна интересная метрика — это количество чаевых, которые получает персонал в зависимости от дня недели.
sns.barplot(data=tips_df, x="day", y="tip", estimator=np.sum)
Кажется, пятница — хороший день, чтобы остаться дома.
Влияние размера столика и дня недели на чаевые
Иногда нужно понять, как несколько переменных влияют на конечный результат. Например, как день недели и размер столика влияют на процент чаевых?
Чтобы построить следующую диаграмму, мы объединим функцию pivot
из pandas для предварительной обработки, а затем нарисуем тепловую карту.
pivot = tips_df.pivot_table(
index=["day"],
columns=["size"],
values="tip_percentage",
aggfunc=np.average)
sns.heatmap(pivot)
Заключение
Конечно, есть еще множество штук, которые мы можем сделать с seaborn, про них вы можете узнать в официальной документации.
Надеюсь, вам понравилась эта статья так же, как и мне. Спасибо за прочтение!
Узнать подробнее о курсе «Python Developer. Professional».
Зарегистрироваться на вебинар по теме «Фреймворкирование и метаклассы».
etoropov
Мой опыт с seaborn — использовать ее нужно для понтовых графиков, когда ванильным matplotlib уже сложно сделать. Первый пример в статье например (scatter plot) и matplotlib отлично построит, а дальше уже нет.
Кстати авторы не написали про мой любимый violin plot.