Наступил 2020 год, пора перестать использовать Matplotlib и Seaborn

Приветствую вас, мои коллеги-практики в области данных, добро пожаловать в ваш еженедельный обзор еще одного эпизода моего путешествия по данным. На этой неделе мы будем говорить о визуализациях данных, о том, насколько они важны, и о библиотеке Python, которую вы должны использовать для их создания. Так что садитесь, расслабьтесь и наслаждайтесь поездкой.

Если вы, как и я, занимаетесь данными, вы бывали в ситуациях, когда вам нужно было объяснить свои данные кому-то другому. Вам нужно рассказать историю, донести свою точку зрения и убедить, возможно, вашего коллегу, руководителя или даже вашего генерального директора. А теперь представьте, что вы пытаетесь объяснить, что менее 20% мужчин пережили набор данных Титаника.
Как бы это выглядело?

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

Визуализации помогают специалистам по обработке данных понять и обнаружить скрытые истории в своих данных. Простая гистограмма может рассказать вам больше о конкретном случае, чем вы пытаетесь вычислить распределение самостоятельно.
Вот распределение тарифов в Titanic Dataset.

Если посмотреть на график прямо, то мы увидим, что большинство тарифов наших клиентов находится ниже отметки в 100 долларов. Это хорошая информация, но она не дает нам всей истории.

Визуализация дает вам ответы на вопросы, о которых вы даже не подозревали.
- Бен Шнайдерман

Электрический ток

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

  • легко использовать
  • быстро
  • хорошо сочетается с пандами

Однако люди, которые использовали его достаточно долго, почувствовали, что это было скучно.
Даже официальная функциональность Matplotlib гласит:

Matplotlib в основном используется для базового построения графиков. - Матплотлиб

Следовательно, специалисты по обработке данных, которым нужна была более интересная библиотека, которая содержала бы больше шаблонов построения графиков, опций и более простой синтаксис, обратились к библиотеке Seaborn. В то время Seaborn был любимым местом для многих.
Вот график Сиборна для только что построенной гистограммы.

Библиотека Seaborn также предоставляет безумное количество сюжетов, от Hexbin Plots до Violin Plots - таких сюжетов, которые вам никогда не казались нужными. Вот краткий обзор предлагаемых ими сюжетов.

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

Графики, которые могут выполнять подобные функции, называются
Интерактивные визуализации.

Интерактивные визуализации популярны благодаря тому, что они добавляют массу информации поверх представляемых вами сюжетов, открывают возможности и заставляют вас выглядеть в 10 раз круче. Сложно выразить словами, давайте визуализируем то, что я пытаюсь вам сказать.
Вот тот же график распределения тарифов в Titanic Dataset еще раз.

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

Библиотека, которая сделала это возможным, называется Plotly.

Сюжетно

Plotly - это библиотека Python для интерактивной визуализации данных. Plotly позволяет строить более качественные интерактивные графики, чем Matplotlib или Seaborn.

Какие типы графиков строятся на графике?

  • Все графики Matplotlib и Seaborn
  • Статистические диаграммы, которые включают, помимо прочего, графики параллельных категорий и деревьев вероятностей.
  • Научные диаграммы, о которых вы даже не догадывались, от сетевых графиков до радарных.
  • Финансовые графики, которые можно использовать для анализа временных рядов, например, свечи, последовательности и маркированные диаграммы.
  • Геологические карты и трехмерные графики, которые позволяют взаимодействовать с ними.

Почему Plotly так популярен?

  • Интерактивные сюжеты
  • Красивее, чем Matplotlib / Seaborn (обсуждаются?)
  • Предлагает более подробную визуализацию, которая помогает исследовать, понимать и передавать ваши данные.
  • Обеспечивает максимальную настройку ваших графиков, включая
    добавление ползунков и фильтров.
  • Гораздо более чистая и понятная кодовая база.
  • При поддержке компании Plotly, которая делает интерактивные веб-визуализации и веб-приложения.

Как установить Plotly?

Установите Python,

pip install plotly
pip install cufflinks

Предпосылки

В этом руководстве мы будем много работать с Pandas.
Следовательно, требуется твердое понимание основ Pandas.
Вот статья, которую я написал о Pandas, чтобы вы быстро освоились.

Независимо от всех преимуществ, которые дает Сюжет, люди склонны избегать его по следующим причинам:

  • Непонятный синтаксис кода
  • Импорт может отпугнуть некоторых людей
  • Множество доступных инструментов (запонки и тире)
  • Отсутствие хорошего руководства по Plotly (именно поэтому я сделал это)

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

Импорт

В этом руководстве мы будем работать с Jupyter Notebook.
Давайте разберемся с этим.

from plotly.offline import init_notebook_mode,iplot
import plotly.graph_objects as go
import cufflinks as cf
init_notebook_mode(connected=True)

Из-за того, как работает Plotly, он сохраняет ваш сюжет в отдельный html-файл и напрямую открывает его в другом окне. Это произойдет, когда вы запустите код в консоли / терминале. Следовательно, мы используем режим plotly.offline, iplot и init_notebook, чтобы построить графики на самом Jupyter Notebook.

В этом руководстве я собираюсь сосредоточиться на исходном синтаксисе plotly, поскольку он обеспечивает максимальную настройку вашего графика. Plotly Express и Cufflinks предоставляют лучшую альтернативу для простого построения кода. , но у них не так много инструментов, как в исходном синтаксисе.

Определение того, что вам нужно для построения

Прежде чем что-либо строить, вам нужно знать, что вы пытаетесь построить.
Задайте себе такие вопросы:

  • Какую информацию вы пытаетесь передать?
  • Вы наносите на график числовые значения или категориальные значения?
  • Сколько переменных вы пытаетесь построить?

Ответив на некоторые из этих вопросов, вы можете приступить к планированию своего участка.

Мы будем использовать классический титанический набор данных, продолжая исследование данных из Руководства по пандам, которое я написал.

Импорт набора данных

df = pd.read_csv(filepath)

Опять же, основная цель этого набора данных - изучить, какие факторы влияют на выживаемость человека на борту «Титаника».

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

Данные, макет и рисунок

В Plotly мы определяем графические объекты, которые будут построены. Три основных параметра, необходимых для построения графика, - это параметры Данные, Макет и Рисунок.
Следовательно, нам нужно определить их ясно и кратко, чтобы кто-то другой смог понять, что мы пытаемся построить.

Поскольку мы строим только столбец Выжившие, наши данные будут

Круговая диаграмма

#labels
lab = df["Survived"].value_counts().keys().tolist()
#values
val = df["Survived"].value_counts().values.tolist()
trace = go.Pie(labels=lab, 
                values=val, 
                marker=dict(colors=['red']), 
                # Seting values to 
                hoverinfo="value"
              )
data = [trace]

Круговая диаграмма Plotly принимает обязательные параметры, которые по умолчанию являются метками и значениями. Следовательно, мы определяем метки как уникальные значения столбца Выжившие, которые в данном случае являются значениями 1 и 0. Параметр значения, которые мы пытаемся отобразить, - это количество этих уникальных значений. Затем мы определяем наши данные как список, содержащий только что определенный объект круговой диаграммы.

Макет
Макет буквально означает то, что он означает, макет вашего участка.
Здесь вы можете определить заголовки графика, заголовки осей x и y, отображать легенды, активировать фильтры / ползунки и многое другое. Поскольку мы строим круговую диаграмму только для одного столбца, давайте не будем делать ее слишком сложной.

layout = go.Layout(title="Survived Distribution")

Мы создаем здесь объект макета , содержащий только параметр title.

Рисунок
Рисунок - это то, что вы пытаетесь построить, по умолчанию он принимает параметры data и layout, которые мы уже определили. .

fig = go.Figure(data = data,layout = layout)

Затем мы можем отобразить этот график, буквально построив его с помощью Plotly.

iplot(fig)

Вуаля, вы успешно построили интерактивный сюжет. Обратите внимание, как мы можем видеть фактические значения при наведении курсора на каждый раздел. Это чрезвычайно полезно при чистом и профессиональном представлении визуализаций. Попробуйте также построить круговую диаграмму для столбцов Пол и Pclass.

Затем давайте рассмотрим некоторые из числовых столбцов, которые являются столбцами Возраст и Стоимость. При построении только числовых столбцов мы думаем о графике распределения. В этом случае я буду использовать гистограмму.

Гистограмма

# defining data
trace = go.Histogram(x=df['Age'],nbinsx=40,histnorm='percent')
data = [trace]
# defining layout
layout = go.Layout(title="Age Distribution")
# defining figure and plotting
fig = go.Figure(data = data,layout = layout)
iplot(fig)

Идеально. Хорошо видно, как здесь распределяется возраст пассажиров.
Обратите внимание, что мы можем настроить 2 полезных параметра для гистограмм, а именно:

  • Histnorm - значение для построения гистограммы, оно было установлено как «процент», чтобы мы отображали процент интервалов, участвующих в распределении. Если оставить поле пустым, по умолчанию отображается количество бункеров.
  • nbinsx - количество ячеек для значений, в которые будут распределяться. Чем больше количество ящиков, тем более детальное распределение.

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

Давайте выясним взаимосвязь между столбцами "Возраст" и "Стоимость проезда". Это было бы полезно для ответа на такие вопросы, как: склонны ли пожилые люди покупать более дорогие билеты?

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

Точечная диаграмма

#defining data
trace = go.Scatter(x = df['Age'],y=df['Fare'],text = df['Survived'],mode='markers')data=[trace]
#defining layout
layout = go.Layout(title='Fare Vs Age Scatter Plot',xaxis=dict(title='Age'),yaxis=dict(title='Fare'),hovermode='closest')
#defining figure and plotting
figure = go.Figure(data=data,layout=layout)
iplot(figure)

Обратите внимание, что я добавил некоторые тонкие особенности в этот график, а именно заголовки осей x и y, а также значение, которое будет отображаться при наведении курсора на точку. Вы можете настроить отображаемое значение, изменив параметр текст в коде.

Наблюдая за графиком, мы действительно не видим линейной связи между столбцами. Цены, как правило, достигают потолка цен ниже 300. Мы также наблюдаем, что пожилые люди также покупают дешевые билеты. Кроме того, мы мало что можем сказать, просто полагаясь только на этот сюжет.

Мы можем дополнительно изучить это, посмотрев на столбец Pclass, в котором указан класс билета для пассажиров. Построив график среднего возраста и стоимости проезда для каждого P-класса, мы можем увидеть, есть ли здесь что-то связанное.

Гистограмма

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

Для простоты я нанесу класс P на ось x, средний возраст на ось y и среднюю стоимость проезда в виде цветовой шкалы на нашей гистограмме. Следовательно, нам нужно сначала вычислить средний возраст и стоимость проезда для каждого P-класса.

y=[]
fare = []
for i in list(df['Pclass'].unique()):
    result = df[df['Pclass']==i]['Age'].mean()
    fares = df[df['Pclass']==i]['Fare'].mean()
    y.append(result)
    fare.append(fares)

После этого мы можем построить наш график.

#defining data
trace = go.Bar(x = list(df['Pclass'].unique()),y=y,marker=dict(color=fare,colorscale='Viridis',showscale=True),text = fare)
data=[trace]
#defining layout
layout = go.Layout(title='Age/Fare vs Pclass Bar Chart',xaxis=dict(title='Pclass'),yaxis=dict(title='Age'),hovermode='closest')
#defining figure and plotting
figure = go.Figure(data=data,layout=layout)
iplot(figure)

Мы добавили сюда два новых параметра:

  • цвет - значения, к которым относится цветовая шкала
  • цветовая шкала - тип цветовой шкалы для отображения величины значений

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

Мы также можем подтвердить это, построив график распределения возраста и тарифа для каждого P-класса. Это даст нам четкое представление о данных для каждого класса P вместо среднего. Мы будем использовать для этого distplot.

Графики распределения

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

import plotly.figure_factory as ff

Построим 2 графика, распределение по возрасту и тарифам
в соответствии с их классом Pclass отдельно.

#defining data
a = df[df['Pclass']==1]['Fare']
b = df[df['Pclass']==2]['Fare']
c = df[df['Pclass']==3]['Fare']
hist_data=[a,b,c]
group_labels=['1','2','3']
#defining fig and plotting
fig = ff.create_distplot(hist_data,group_labels,bin_size=
[1,1,1],show_curve=False)
fig.update_layout(title_text='Distribution for Fares')
iplot(fig)

a = df[df['Pclass']==1]['Age']
b = df[df['Pclass']==2]['Age']
c = df[df['Pclass']==3]['Age']
hist_data=[a,b,c]
group_labels=['1','2','3']
fig = ff.create_distplot(hist_data,group_labels,bin_size=[1,1,1],show_curve=False)
fig.update_layout(title_text='Distribution for Age')
iplot(fig)

Оба графика распределения ясно показывают, что более низкий Pclass
коррелирует с более высоким возрастом и более высокой стоимостью проезда. С точки зрения непрофессионала это означает, что билеты первого класса стоят дороже, и люди старшего возраста, как правило, покупают билеты первого класса.

Сделав это, мы хотим знать, как живучесть соотносится с этими переменными. Мы можем сопоставить выживаемость с ними с помощью пузырьковой диаграммы. Пузырьковые графики позволяют визуализировать до 4 переменных, которые могут помочь нам донести нашу точку зрения здесь.

Пузырьковый график

Пузырьковые диаграммы похожи на точечные диаграммы, но у них есть дополнительный параметр размера, который определяет радиус для каждой точки.

#defining data
data=[
    go.Scatter(x = df['Age'],y=df['Fare'],
               text=df['Pclass'],
                mode='markers',
               marker=dict(size=df['Pclass']*15, color=df['Survived'],showscale=True),
              )]
#defining layout
layout = go.Layout(title='Fare vs Age with Survivability and Pclass',xaxis=dict(title='Age'),yaxis=dict(title='Fare'),hovermode='closest')
#defining figure and plotting
figure = go.Figure(data=data,layout=layout)
iplot(figure)

На пузырьковом графике мы видим, что:

  • Более высокий возраст не приводит к более высоким ценам
  • Все тарифы выше 50 считаются билетами 1-го класса.
  • 1-й класс имеет более высокую живучесть, если все другие переменные постоянны.
  • Более высокий возраст приводит к меньшей выживаемости, если все другие переменные постоянны.

Вот полный код всех визуализаций в этой статье.



Поздравления

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

Прежде чем ты уйдешь

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

В конце я всегда цитирую.

Наступил 2020 год, перестаньте использовать Matplotlib и Seaborn, выровняйте свои визуализации.

Подпишитесь на мою рассылку, чтобы оставаться на связи.

Вы также можете поддержать меня, подписавшись на среднее членство через мою ссылку. Вы сможете прочитать неограниченное количество рассказов от меня и других невероятных писателей!

Я работаю над другими историями, статьями и руководствами в индустрии данных. Вы можете ожидать большего количества подобных сообщений. А пока не стесняйтесь читать мои другие статьи, чтобы временно утолить свой голод по данным.

Спасибо за чтение! Если вы хотите связаться со мной, не стесняйтесь обращаться ко мне по адресу [email protected] или в моем профиле LinkedIn. Вы также можете просмотреть код из предыдущих статей в моем Github.