Violin plot что это
Визуализация данных с использованием matplotlib и seaborn на Python
В этой статье мы разберем, что такое визуализация данных и как ее можно использовать для создания графиков с использованием matplotlib и seaborn в Python. Мы также поговорим о различных типах анализа наряду с наиболее распространенными типами графиков, используемых при визуализации данных.
Что такое визуализация данных?
Мы будем реализовывать различные методы визуализации данных в наборе данных ‘iris’.
Различные виды анализа:
Наиболее распространенные типы графиков, используемых при визуализации данных:
Давайте посмотрим на некоторые из этих графиков, используемых при визуализации данных:
Импорт библиотек для визуализации данных
Загрузить файл в dataframe
Scatter, Точечный график
Это один из наиболее часто используемых графиков для простой визуализации данных. Он дает нам представление о том, где присутствуют каждая точка во всем наборе данных относительно любых 2 или 3 объектов (или столбцов). Они доступны как в 2D, так и в 3D.
Pair plot, Парный график
Допустим, у нас есть n объектов в наших данных. Парный график поможет нам создать фигуру (nxn ), где диагональные графики будут гистограммами объектов, соответствующих этой строке, а остальные графики представляют собой комбинацию объектов, — каждая строка по оси y и элемент из каждого столбца по оси x.
Фрагмент кода для парного графика, реализованного в наборе данных Iris:
Box plot, Ящик с усами, диаграмма размаха
Код для построения объектов с использованием Box plots:
Violin plot, Скрипичный график
Скрипичный график тоже из seaborn. Код прост и выглядит следующим образом.
Joint plot, Гибридный график
Есть различные опции которые вы можете выбрать и настроить с использованием параметра kind функции jointplot в seaborn:
Line plot, Strip plot, Линейный график
Линейный график может быть использован сам по себе, но он также является хорошим дополнением к ящику с усами или скрипичному графику в тех случаях, когда вы хотите показать весь анализ вместе с некоторым представлением основного распределения.
Это метод анализа графических данных для суммирования одномерного набора данных. Обычно он используется для небольших наборов данных.
Функция lmplot ( ) в seaborn
Lmplot от Seaborn — это двумерная диаграмма рассеяния с дополнительной наложенной линией регрессии. Логистическая регрессия для двоичной классификации также поддерживается с помощью lmplot. Он предназначен в качестве удобного интерфейса для подгонки регрессионных моделей к условным подмножествам набора данных.
Функция может нарисовать диаграмму рассеяния двух переменных, x и y затем подогнать регрессионную модель y
x и построить результирующую линию регрессии с 95% доверительным интервалом для этой регрессии.
lmplot ( ) имеет data в качестве требуемого параметра и x и y переменные должны быть заданы как строки.
Заключение:
Визуализация данных не только помогает вам лучше анализировать ваши данные, но всякий раз, когда вы обнаруживаете какие-либо идеи, вы можете использовать эти методы, чтобы поделиться своими результатами с другими людьми в простой и интуитивно понятной форме.
Скрипичный участок для анализа данных
Violin Plot — это метод визуализации распределения числовых данных различных переменных. Он аналогичен квадратному графику, но с повернутым графиком на каждой стороне дает больше информации об оценке плотности по оси Y.
Плотность отражается и переворачивается, и результирующая форма заполняется, создавая изображение, напоминающее скрипку. Преимущество сюжета для скрипки заключается в том, что он может отображать нюансы в распределении, которые не заметны в коробочном сюжете. С другой стороны, на графике более четко показаны выбросы в данных.
Сюжеты для скрипки содержат больше информации, чем коробочные сюжеты, они менее популярны. Из-за их непопулярности, их значение может быть труднее понять многим читателям, не знакомым с сюжетом игры на скрипке.
Атрибут Информация о наборе данных:
Загрузка библиотек
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot
Загрузка данных
data = pd.read_csv( «Iris.csv» )
Выход:
Описание
Выход:
Информация
Выход:
Описание параметра SepalLengthCm в наборе данных Iris.
data[ «SepalLengthCm» ].describe()
Выход:
Код № 1: Скрипичный участок для параметра «SepalLengthCm».
sns.violinplot( ax = ax, y = data[ «SepalLengthCm» ] )
Выход:
Как вы можете видеть, мы имеем более высокую плотность между 5 и 6. Это очень важно, потому что, как и в описании SepalLengthCm, среднее значение составляет 5,43.
Код № 2: Скрипичный участок для параметра «SepalLengthWidth».
sns.violinplot(ax = ax, y = data[ «SepalWidthCm» ] )
Выход:
Здесь также, Более высокая плотность в среднем = 3.05
Код № 3: Скрипка, сравнивающая «SepalLengthCm» и «SepalWidthCm».
sns.violinplot(ax = ax, data = data.iloc[:, 1 : 3 ])
Выход:
Код № 4: Участок для скрипки, в котором сравниваются виды SepalLengthCm.
Violin Plots 101: Visualizing Distribution and Probability Density
Joel Carron, Data Scientist at Mode
October 26, 2016 • 5 minute read
Share this article
Sometimes the median and mean aren’t enough to understand a dataset. Are most of the values clustered around the median? Or are they clustered around the minimum and the maximum with nothing in the middle? When you have questions like these, distribution plots are your friends.
The box plot is an old standby for visualizing basic distributions. It’s convenient for comparing summary statistics (such as range and quartiles), but it doesn’t let you see variations in the data. For multimodal distributions (those with multiple peaks) this can be particularly limiting.
But fret not—this is where the violin plot comes in.
What is a violin plot?
A violin plot is a hybrid of a box plot and a kernel density plot, which shows peaks in the data.
How to read the anatomy of a violin plot
Violin plots have many of the same summary statistics as box plots:
On each side of the gray line is a kernel density estimation to show the distribution shape of the data. Wider sections of the violin plot represent a higher probability that members of the population will take on the given value; the skinnier sections represent a lower probability.
Enough of the theoretical. Let’s look at some examples. We’ll be using Seaborn, a Python library purpose-built for making statistical visualizations.
Examples of Violin Plots
About the data
Basic violin plot
Click here to see the complete Python notebook generating this plot.
This violin plot shows the relationship of feed type to chick weight. The box plot elements show the median weight for horsebean-fed chicks is lower than for other feed types. The shape of the distribution (extremely skinny on each end and wide in the middle) indicates the weights of sunflower-fed chicks are highly concentrated around the median.
Horizontal violin plot with observations
Click here to see the complete Python notebook generating this plot.
Like horizontal bar charts, horizontal violin plots are ideal for dealing with many categories. Swapping axes gives the category labels more room to breathe.
You can remove the traditional box plot elements and plot each observation as a point. Points come in handy when your dataset includes observations for an entire population (rather than a select sample). When you have the whole population at your disposal, you don’t need to draw inferences for an unobserved population; you can assess what’s in front of you.
Reducing the kernel bandwidth generates lumpier plots, which can aid in identifying minor clusters, such as the tail of casein-fed chicks.
Grouped violin plot
Violin plots can also illustrate a second-order categorical variable. You can create groups within each category. For instance, you can make a plot that distinguishes between male and female chicks within each feed type group.
Click here to see the complete Python notebook generating this plot.
Grouped violin plot with split violins
Instead of drawing separate plots for each group within a category, you can instead create split violins and replace the box plot with dashed lines representing the quartiles for each group.
Click here to see the complete Python notebook generating this plot.
The split violins should help you compare the distributions of each group. For instance, you might notice that female sunflower-fed chicks have a long-tail distribution below the first quartile, whereas males have a long-tail above the third quartile.
Открытый курс машинного обучения. Тема 2: Визуализация данных c Python
Второе занятие посвящено визуализации данных в Python. Сначала мы посмотрим на основные методы библиотек Seaborn и Plotly, затем поанализируем знакомый нам по первой статье набор данных по оттоку клиентов телеком-оператора и подглядим в n-мерное пространство с помощью алгоритма t-SNE. Есть и видеозапись лекции по мотивам этой статьи в рамках второго запуска открытого курса (сентябрь-ноябрь 2017).
UPD: теперь курс — на английском языке под брендом mlcourse.ai со статьями на Medium, а материалами — на Kaggle (Dataset) и на GitHub.
Сейчас статья уже будет существенно длиннее. Готовы? Поехали!
План этой статьи
Демонстрация основных методов Seaborn и Plotly
В начале как всегда настроим окружение: импортируем все необходимые библиотеки и немного настроим дефолтное отображение картинок.
После этого загрузим в DataFrame данные, с которыми будем работать. Для примеров я выбрала данные о продажах и оценках видео-игр из Kaggle Datasets.
Seaborn
Познакомимся с первым таким «сложным» типом графиков pair plot ( scatter plot matrix ). Эта визуализация поможет нам посмотреть на одной картинке, как связаны между собой различные признаки.
Как можно видеть, на диагонали матрицы графиков расположены гистограммы распределений признака. Остальные же графики — это обычные scatter plots для соответствующих пар признаков.
Для понимания лучше один раз увидеть, поэтому вот еще и картинка с Wikipedia:
Plotly
Прелесть интерактивных графиков заключается в том, что можно посмотреть точное численное значение при наведении мыши, скрыть неинтересные ряды в визуализации, приблизить определенный участок графика и т.д.
Для начала построим line plot с динамикой числа вышедших игр и их продаж по годам.
Параметр show_link отвечает за ссылки на online-платформу plot.ly на графиках. Поскольку обычно это функциональность не нужна, то я предпочитаю скрывать ее для предотвращения случайных нажатий.
Можно сразу сохранить график в виде html-файла.
С помощью plotly можно построить и другие типы визуализаций. Графики получаются достаточно симпатичными с дефолтными настройками. Однако библиотека позволяет и гибко настраивать различные параметры визуализации: цвета, шрифты, подписи, аннотации и многое другое.
Пример визуального анализа данных
Считываем в DataFrame знакомые нам по первой статье данные по оттоку клиентов телеком-оператора.
Проверим, все ли нормально считалось – посмотрим на первые 5 строк (метод head ).
Число строк (клиентов) и столбцов (признаков):
Посмотрим на признаки и убедимся, что пропусков ни в одном из них нет – везде по 3333 записи.
Название | Описание | Тип |
---|---|---|
State | Буквенный код штата | категориальный |
Account length | Как долго клиент обслуживается компанией | количественный |
Area code | Префикс номера телефона | количественный |
International plan | Международный роуминг (подключен/не подключен) | бинарный |
Voice mail plan | Голосовая почта (подключена/не подключена) | бинарный |
Number vmail messages | Количество голосовых сообщений | количественный |
Total day minutes | Общая длительность разговоров днем | количественный |
Total day calls | Общее количество звонков днем | количественный |
Total day charge | Общая сумма оплаты за услуги днем | количественный |
Total eve minutes | Общая длительность разговоров вечером | количественный |
Total eve calls | Общее количество звонков вечером | количественный |
Total eve charge | Общая сумма оплаты за услуги вечером | количественный |
Total night minutes | Общая длительность разговоров ночью | количественный |
Total night calls | Общее количество звонков ночью | количественный |
Total night charge | Общая сумма оплаты за услуги ночью | количественный |
Total intl minutes | Общая длительность международных разговоров | количественный |
Total intl calls | Общее количество международных разговоров | количественный |
Total intl charge | Общая сумма оплаты за международные разговоры | количественный |
Customer service calls | Число обращений в сервисный центр | количественный |
Целевая переменная: Churn – Признак оттока, бинарный (1 – потеря клиента, то есть отток). Потом мы будем строить модели, прогнозирующие этот признак по остальным, поэтому мы и назвали его целевым.
Посмотрим на распределение целевого класса – оттока клиентов.
Выделим следующие группы признаков (среди всех кроме Churn ):
Посмотрим на корреляции количественных признаков. По раскрашенной матрице корреляций видно, что такие признаки как Total day charge считаются по проговоренным минутам (Total day minutes). То есть 4 признака можно выкинуть, они не несут полезной информации.
Теперь посмотрим на распределения всех интересующих нас количественных признаков. На бинарные/категориальные/порядковые признакие будем смотреть отдельно.
Видим, что большинство признаков распределены нормально. Исключения – число звонков в сервисный центр (Customer service calls) (тут больше подходит пуассоновское распределение) и число голосовых сообщений (Number vmail messages, пик в нуле, т.е. это те, у кого голосовая почта не подключена). Также смещено распределение числа международных звонков (Total intl calls).
Еще полезно строить вот такие картинки, где на главной диагонали рисуются распределения признаков, а вне главной диагонали – диаграммы рассеяния для пар признаков. Бывает, что это приводит к каким-то выводам, но в данном случае все примерно понятно, без сюрпризов.
Дальше посмотрим, как признаки связаны с целевым – с оттоком.
Построим boxplot-ы, описывающее статистики распределения количественных признаков в двух группах: среди лояльных и ушедших клиентов.
На глаз наибольшее отличие мы видим для признаков Total day minutes, Customer service calls и Number vmail messages. Впоследствии мы научимся определять важность признаков в задаче классификации с помощью случайного леса (или градиентного бустинга), и окажется, что первые два – действительно очень важные признаки для прогнозирования оттока.
Посмотрим отдельно на картинки с распределением кол-ва проговоренных днем минут среди лояльных/ушедших. Слева — знакомые нам боксплоты, справа – сглаженные гистограммы распределения числового признака в двух группах (скорее просто красивая картинка, все и так понятно по боксплоту).
Интересное наблюдение: в среднем ушедшие клиенты больше пользуются связью. Возможно, они недовольны тарифами, и одной из мер борьбы с оттоком будет понижение тарифных ставок (стоимости мобильной связи). Но это уже компании надо будет проводить дополнительный экономический анализ, действительно ли такие меры будут оправданы.
Теперь посмотрим на связь бинарных признаков International plan и Voice mail plan с оттоком. Наблюдение: когда роуминг подключен, доля оттока намного выше, т.е. наличие международного роуминга – сильный признак. Про голосовую почту такого нельзя сказать.
Наконец, посмотрим, как с оттоком связан категориальный признак State. С ним уже не так приятно работать, поскольку число уникальных штатов довольно велико – 51. Можно в начале построить сводную табличку или посчитать процент оттока для каждого штата. Но данных по каждом штату по отдельности маловато (ушедших клиентов всего от 3 до 17 в каждом штате), поэтому, возможно, признак State впоследствии не стоит добавлять в модели классификации из-за риска переобучения (но мы это будем проверять на кросс-валидации, stay tuned!).
Доли оттока для каждого штата:
Видно, что в Нью-Джерси и Калифорнии доля оттока выше 25%, а на Гавайях и в Аляске меньше 5%. Но эти выводы построены на слишком скромной статистике и возможно, это просто особенности имеющихся данных (тут можно и гипотезы попроверять про корреляции Мэтьюса и Крамера, но это уже за рамками данной статьи).
Подглядывание в n-мерное пространство с t-SNE
Построим t-SNE представление все тех же данных по оттоку. Название метода сложное – t-distributed Stohastic Neighbor Embedding, математика тоже крутая (и вникать в нее не будем, но для желающих – вот оригинальная статья Д. Хинтона и его аспиранта в JMLR), но основная идея проста, как дверь: найдем такое отображение из многомерного признакового пространства на плоскость (или в 3D, но почти всегда выбирают 2D), чтоб точки, которые были далеко друг от друга, на плоскости тоже оказались удаленными, а близкие точки – также отобразились на близкие. То есть neighbor embedding – это своего рода поиск нового представления данных, при котором сохраняется соседство.
Раскрасим полученное t-SNE представление данных по оттоку (синие – лояльные, оранжевые – ушедшие клиенты).
Видим, что ушедшие клиенты преимущественно «кучкуются» в некоторых областях признакового пространства.
Чтоб лучше понять картинку, можно также раскрасить ее по остальным бинарным признакам – по роумингу и голосовой почте. Синие участки соответствуют объектам, обладающим этим бинарным признаком.
Теперь понятно, что, например, много ушедших клиентов кучкуется в левом кластере людей с поключенным роумингом, но без голосовой почты.
Напоследок отметим минусы t-SNE (да, по нему тоже лучше писать отдельную статью):
И еще пара картинок. С помощью t-SNE можно действительно получить хорошее представление о данных (как в случае с рукописными цифрами, вот хорошая статья), а можно просто нарисовать елочную игрушку.
Домашнее задание № 2
Актуальные домашние задания объявляются во время очередной сессии курса, следить можно в группе ВК и в репозитории курса.
В качестве закрепления материала предлагаем выполнить это задание – провести визуальный анализ данных о публикациях на Хабрахабре. Проверить себя можно отправив ответы в веб-форме (там же найдете и решение).
Обзор полезных ресурсов
Статья написана в соавторстве с yorko (Юрием Кашницким).
Seaborn Violin Plot – Учебник и примеры
В этом уроке мы рассмотрим, как строить скрипичные сюжеты с помощью Seaborn. Мы рассмотрим простые и продвинутые индивидуальные скрипичные сюжеты с примерами.
Вступление
Скрипичные графики используются для визуализации распределения данных, отображая диапазон, медиану и распределение данных.
Скрипичные графики показывают ту же сводную статистику, что и коробочные графики, но они также включают оценки плотности ядра, которые представляют форму | распределение данных.
Импорт Данных
Для начала мы хотим выбрать набор данных, который подходит для создания скрипичных сюжетов.
Набор данных должен иметь непрерывные числовые характеристики. Это связано с тем, что скрипичные графики используются для визуализации распределений непрерывных данных. Они отображают диапазон, медиану и распределение данных.
Графики скрипки по существу показывают ту же сводную статистику, что и графики коробки, но они также включают дополнительную информацию. Форма “Скрипки” на графике Скрипки-это оценка плотности ядра, которая представляет форму/распределение данных.
Мы начнем с импорта Seaborn, модуля PyPlot из Matplotlib и Pandas:
Затем нам нужно будет импортировать данные. Мы распечатаем заголовок набора данных, чтобы убедиться, что данные были правильно загружены, и посмотрим на имена столбцов/объектов.
Мы также проверим, чтобы убедиться, что нет никаких недостающих данных:
Мы выберем наши непрерывные функции и сохраним их как переменные для передачи в функции Seaborn:
Построение простого скрипичного сюжета в Сиборне
Теперь, когда мы загрузили данные и выбрали наши функции выбора, мы можем создать скрипичный сюжет.
Чтобы создать скрипичный сюжет, мы просто используем функцию violin plot() в Seaborn.
Мы передаем фрейм данных, а также переменные, которые хотим визуализировать. Мы можем передать только переменную X, и функция автоматически вычислит значения по оси Y:
Кроме того, вам не нужно заранее извлекать функции. Предоставив аргумент data и назначив его вашему фрейму данных, вы можете просто ссылаться на имя переменной, которое затем сопоставляется с набором данных:
Это приводит к точно такому же результату.
Построение скрипичного графика с переменными X и Y
Здесь мы перейдем к категориальной X-переменной и непрерывной Y-переменной, поскольку существует конкретное распределение, которое мы хотели бы видеть сегментированным по типу.
В этом наборе данных у нас есть много стран. Если мы построим их все, их будет слишком много, чтобы практически рассмотреть, и цифра будет слишком переполнена. Мы могли бы подмножествовать набор данных и просто построить график, скажем, 10 стран.
Вместо этого мы могли бы строить заговоры и по континентам.
Настройка Сюжета
Мы можем настроить наш скрипичный сюжет несколькими различными способами.
Измените метки сюжета скрипки с помощью Seaborn
Скажем, мы хотели бы добавить некоторые заголовки и метки к нашему сюжету, чтобы помочь другим в интерпретации данных. Хотя Seaborn автоматически помечает оси X и Y, мы можем захотеть изменить метки.
Чтобы пометить оси, мы используем функцию set() и предоставляем метки аргументам xlabel и ylabel или используем оболочку set_xlabel () /set_ylabel() :
Измените цвет сюжета скрипки с помощью Seaborn
Один из способов, которым мы можем настроить сюжет, – это назначить ему определенные цвета. Мы можем создать список заранее выбранных цветов и передать их в параметр palette :
Наложение сюжета Роя На Сюжет Скрипки в Сиборне
Мы могли бы даже наложить график Роя на график Скрипки, чтобы увидеть распределение и образцы точек, составляющих это распределение. Чтобы сделать это, мы просто создаем один объект figure, а затем создаем два разных графика:
Измените стиль скрипичного сюжета с помощью Seaborn
Мы можем легко изменить стиль и цветовую палитру нашего графика, используя функции set_style() и set_palette() соответственно.
Seaborn поддерживает несколько различных вариантов изменения стиля и палитры рисунка:
Подзаголовок Скрипичных сюжетов с Сиборном
Затем мы просто используем функцию add_subplot() и указываем, где в сетке мы хотим разместить текущий подзаголовок, создавая график, как обычно, используя объект axes.
Группировка скрипичных сюжетов по оттенкам
Поскольку в наборе данных Gapminder нет такого столбца, мы можем сделать его сами. Давайте рассчитаем среднюю продолжительность жизни для подмножества стран. Скажем, мы рассчитываем среднюю продолжительность жизни европейских стран.
Теперь, если мы напечатаем наш набор данных, у нас будет что-то вроде:
Имя переменной усекается до a vle для краткости.
Теперь давайте выберем меньшее подмножество этих стран с помощью europe.head() и построим графики скрипки, сгруппированные по новому столбцу, который мы вставили:
Теперь это приводит к:
Теперь страны с меньшей, чем в среднем, ожидаемой продолжительностью жизни окрашены в оранжевый цвет, в то время как другие страны окрашены в синий. Хотя даже это не говорит нам всего. Может быть, мы хотели бы проверить сколько людей в Турции имеют меньшую, чем в среднем, продолжительность жизни.
Разделение скрипичных сюжетов по оттенкам
В нашем случае одна сторона скрипки будет представлять левую сторону скрипки как записи с ожидаемой продолжительностью жизни выше средней, в то время как правая сторона будет использоваться для построения ожидаемой продолжительности жизни ниже средней:
Вывод
В этом уроке мы рассмотрели несколько способов построения скрипичного сюжета с использованием Seaborn и Python. Мы также рассмотрели, как настроить и изменить метки и цвет, а также наложить роевые диаграммы, подзаголовок нескольких скрипичных графиков и, наконец, как сгруппировать графики по оттенку и создать разделенные скрипичные графики на основе переменной.
Если вы заинтересованы в визуализации данных и не знаете, с чего начать, обязательно ознакомьтесь с нашей связкой книг on :
Визуализация данных в Python с Matplotlib и Pandas – это книга, предназначенная для того, чтобы познакомить абсолютных новичков с Pandas и Matplotlib, обладающих базовыми знаниями Python, и позволить им создать прочную основу для продвинутой работы с библиотеками тезисов- от простых сюжетов до анимированных 3D-сюжетов с интерактивными кнопками.
Он служит углубленным руководством, которое научит вас всему, что вам нужно знать о пандах и Matplotlib, включая то, как создавать типы сюжетов, которые не встроены в саму библиотеку.
Он служит уникальным практическим руководством по визуализации данных, в изобилии инструментов, которые вы могли бы использовать в своей карьере.