Обзор пакетов для визуализации данных на Python

python data visualization

Есть много способов построения графиков на Python, но какой из них лучше? Когда вы делаете визуализацию, важно задать несколько вопросов о цели построения графика: пытаетесь ли вы создать первичное представление ваших данных для дальнейшего анализа, или пытаетесь произвести впечатление на презентации?

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

Перевод статьи «Reviewing Python Visualization Packages», автор — Aaron Frederick, ссылка на оригинал — в подвале статьи.

Matplotlib, Seaborn и Pandas

Я собираюсь включить их в одну группу по нескольким причинам. Во-первых, из-за того, что графики Seaborn и Pandas были построены на основе Matplotlib — когда вы используете Seaborn или df.plot() в Pandas, вы фактически используете код, который использует для построения Matplotlib. Таким образом, эстетика для них схожа, и настройка ваших графиков будет выглядеть очень похожим образом.

Когда я думаю об этих инструментах визуализации, я думаю о трех словах: исследовательский анализ данных. Эти пакеты отлично подходят для первого взгляда на ваши данные, но их не хватает, когда дело доходит до презентации. Matplotlib — это низкоуровневая библиотека, которая обеспечивает невероятные уровни настройки (так что не стоит исключать ее как вариант для презентации!), Но есть много других инструментов, которые делают великолепную графику, достойную презентации, намного проще. Matplotlib также имеет набор стилей, которые по внешнему стилю имитируют другие популярные пакеты, такие как ggplot2 и xkcd. Ниже приведены некоторые примеры графиков, созданных с использованием Matplotlib и его двоюродных братьев.

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

import seaborn as sns
import matplotlib.pyplot as plt

color_order = ['xkcd:cerulean', 'xkcd:ocean',
'xkcd:black','xkcd:royal purple',
'xkcd:royal purple', 'xkcd:navy blue',
'xkcd:powder blue', 'xkcd:light maroon',
'xkcd:lightish blue','xkcd:navy']

sns.barplot(x=top10.Team,
y=top10.Salary,
Простая гистограмма в matplotlib
Простая гистограмма в matplotlib

Этот второй график представляет собой график Q-Q остатков регрессионного эксперимента. Основная цель этой визуализации — показать, сколько строк необходимо для создания полезной визуализации, даже если эстетика не сногсшибательна.

import matplotlib.pyplot as plt
import scipy.stats as stats

#model2 is a regression model
log_resid = model2.predict(X_test)-y_test
stats.probplot(log_resid, dist="norm", plot=plt)
plt.title("Normal Q-Q plot")
plt.show()

Q-Q график на matplotlib

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

ggplot (2)

«Почему ты говоришь о ggplot, самом популярном пакете визуализации R? Разве это не обзор пакетов для Python? »- спросите вы. Люди реализовали ggplot2 в Python, копируя все от эстетики до синтаксиса. Он выглядит и ощущается как ggplot2, но с дополнительным бонусом наличия зависимости от уже устаревшей версии пакета Pandas. Если вы хотите использовать НАСТОЯЩИЙ ggplot в R (который имеет такой же синтаксис и внешний вид, но без зависимостей), я расскажу о некоторых его преимуществах здесь! Тем не менее, если вы действительно хотите использовать ggplot в Python, вы должны установить Pandas версии 0.19.2, но я бы предостерег вас от понижения версии вашего Pandas.

В чем ggplot2 (и, я думаю, ggplot для Python) меняет правила игры, так это то, что он использует «Грамматику графики» для построения фигуры. Основная предпосылка заключается в том, что вы можете создать экземпляр своего графика, а затем отдельно добавить к нему различные функции, т.е. Заголовок, оси, точки данных и линия тренда добавляются по отдельности со своими собственными эстетическими свойствами. Ниже приведен простой пример кода ggplot на R. Сначала мы создаем наш рисунок с помощью ggplot, устанавливаем наше оформление и данные, затем добавляем точки, тему и метки оси/заголовка.

#All Salaries
ggplot(data=df, aes(x=season_start, y=salary, colour=team)) +
geom_point() +
theme(legend.position="none") +
labs(title = 'Salary Over Time', x='Year', y='Salary ($)')

График в ggplot

Bokeh

Bokeh это красиво. Концептуально похож на ggplot в том,что он тоже использует грамматику графики для структурирования своих фигур. Bokeh имеет простой в использовании интерфейс, который создает очень профессиональные графики и информационные панели. Чтобы проиллюстрировать мою точку зрения (извините!), Ниже приведен пример кода для создания гистограммы из набора данных 538 Masculinity Survey.

import pandas as pd
from bokeh.plotting import figure
from bokeh.io import show

# is_masc is a one-hot encoded dataframe of responses to the question:
# "Do you identify as masculine?"

#Dataframe Prep
counts = is_masc.sum()
resps = is_masc.columns

#Bokeh
p2 = figure(title='Do You View Yourself As Masculine?',
          x_axis_label='Response',
          y_axis_label='Count',
          x_range=list(resps))
p2.vbar(x=resps, top=counts, width=0.6, fill_color='red', line_color='black')
show(p2)

#Pandas
counts.plot(kind='bar')

Гистограмма в Bokeh
Гистограмма в Bokeh

Гистограмма показывает ответы на вопрос «Вы идентифицируете себя как мужского пола?», как было задано в недавнем опросе (538 Masculinity Survey). Код Bokeh создает элегантную и профессиональную гистограмму подсчета ответов с разумным размером шрифта, засечками по осям и форматированием. Большая часть кода, который я написал, была посвящена маркировке осей и заголовков, а также приданию столбцам цвета и границы. Делая красивые, презентабельные фигуры, я очень сильно склоняюсь к Bokeh — много эстетической работы уже сделано для нас!

Гистограмма по умолчанию в Pandas
Та же гистограмма по умолчанию в Pandas

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

На приведенном ниже графике показано несколько случайных трендов с использованием нескольких дополнительных настроек с легендами и различными типами линий и цветами:

Тренды с легендой в Bokeh
Тренды с легендой в Bokeh

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

Plotly

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

  • Требуется ключ API и регистрация, а не просто установка через pip
  • Он строит графики данных/слоев (layouts), которые являются уникальными для Plotly и не являются интуитивно понятными
  • Слой на графике у меня не сработал (40 строк кода буквально ничего!)

Однако для всех его недостатков настройки есть свои плюсы и обходные пути:

  • Вы можете редактировать графики на веб-сайте Plotly, а также в среде Python.
  • Много функционала поддержки интерактивных графиков/панелей
  • Plotly сотрудничает с Mapbox, что позволяет создавать индивидуальные карты
  • Потрясающий потенциал для отличной графики

Для меня было бы несправедливо просто высказать свои претензии к Plotly, не показывая какой-то код и то, что я смог достичь по сравнению с тем, что сделали люди, более способные с этим пакетом.

#plot 1 - barplot
# **note** - the layout lines do nothing and trip no errors
data = [go.Bar(x=team_ave_df.team,
  y=team_ave_df.turnovers_per_mp)]

layout = go.Layout(

title=go.layout.Title(
  text='Turnovers per Minute by Team',
  xref='paper',
  x=0
),

xaxis=go.layout.XAxis(
  title = go.layout.xaxis.Title(
    text='Team',
    font=dict(
      family='Courier New, monospace',
      size=18,
      color='#7f7f7f'
    )
  )
),

yaxis=go.layout.YAxis(
  title = go.layout.yaxis.Title(
    text='Average Turnovers/Minute',
    font=dict(
      family='Courier New, monospace',
      size=18,
      color='#7f7f7f'
    )
  )
),

autosize=True,
hovermode='closest')

py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot', sharing='public', fileopt='overwrite')

#plot 2 - attempt at a scatterplot
data = [go.Scatter(x=player_year.minutes_played,
y=player_year.salary,
marker=go.scatter.Marker(color='red',
size=3))]

layout = go.Layout(title="test",
xaxis=dict(title='why'),
yaxis=dict(title='plotly'))

py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot2', sharing='public')
Гистограмма в Plotly
Гистограмма, представляющая среднее количество оборотов в минуту у различных баскетбольных команд
Попытка создания диаграммы рассеивания в Plotly
Попытка создания диаграммы рассеяния, представляющей зарплату как функцию от времени игры в баскетбол

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

Потенциал графиков в Plotly
Потенциал графиков в Plotly

Pygal

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

  1. Инициализация холста
  2. Форматирование объектов рисунка с использованием атрибутов
  3. Добавление данных к своей фигуре, используя figure.add()

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

График в Pygal

Networkx

Networkx — отличное решение для анализа и визуализации графов, хотя визуально оно основано на matplotlib. Графы и сети — это не моя предметная область, но Networkx позволяет быстро и легко графически представлять подключенные сети. Ниже приведены несколько различных представлений простого графа, который я построил, и код, начинающий строить небольшую сеть Facebook, загруженную из SNAP в Стэнфорде.

Граф в Networkx

Код, который я использовал для цветового кодирования каждого узла по его номеру (1–10), приведен ниже:

options = {
'node_color' : range(len(G)),
'node_size' : 300,
'width' : 1,
'with_labels' : False,
'cmap' : plt.cm.coolwarm
}
nx.draw(G, **options)

Разноцветные вершины графа в Networkx

Ниже приведен код, который я написал для визуализации разреженного графа Facebook, упомянутого выше:

import itertools
import networkx as nx
import matplotlib.pyplot as plt

f = open('data/facebook/1684.circles', 'r')
circles = [line.split() for line in f]
f.close()

network = []
for circ in circles:
cleaned = [int(val) for val in circ[1:]]
network.append(cleaned)

G = nx.Graph()
for v in network:
G.add_nodes_from(v)

edges = [itertools.combinations(net,2) for net in network]

for edge_group in edges:
G.add_edges_from(edge_group)

options = {
'node_color' : 'lime',
'node_size' : 3,
'width' : 1,
'with_labels' : False,
}
nx.draw(G, **options)
Разреженный граф в Networkx
Это разреженный граф. Networkx показывает это, давая каждому кластеру максимальное разделение

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

gan python keras tutorial

Туториал: создание простой GAN на Python с библиотекой Keras

В этом туториале я расскажу о генеративно-состязательных нейронных сетях (GAN) не прибегая к математическим деталям модели. Далее будет показано, как написать собственную простую GAN на Python с Keras, которая сможет генерировать знаки. Перед вам перевод статьи Demystifying Generative Adversarial Nets (GANs), опубликованной на Datacamp,…

Простая нейронная сеть в 9 строчек кода на Python

Из статьи вы узнаете, как написать свою простую нейросеть на python с нуля, не используя никаких библиотек для нейросетей. Если у вас еще нет своей нейронной сети, вот всего лишь 9 строчек кода: Перед вами перевод поста How to build a simple neural network in…
вакансию data scientist - как проходит собеседование

Вакансия Data scientist: вопросы и задачи на собеседовании

Предложение вакансии Data scientist на рынке труда постоянно растет, количество соискателей тоже. Возможностей для входа в эту профессию много — курсы по специальности помогут получить необходимые знания. Блог Acing AI публикует посты о том, как проходили интервью разработчиков Data science в крупнейших мировых компаниях.…

16 бесплатных онлайн-курсов по машинному обучению

Популярная тенденция в сфере онлайн-образования — массовые открытые онлайн-курсы (Massive open online-courses, MOOC). Появились бесплатные курсы по машинному обучению и data science. Они доступны каждому и основаны на образовательных программах от ведущих университетов, например, МФТИ. Большинство MOOC по машинному обучению доступны на английском языке…
EmoPy распознавание эмоций

Предобученные модели распознавания эмоций EmoPy выложили в открытый доступ

EmoPy — набор инструментов для распознавания эмоций на Python, который содержит несколько моделей с открытым исходным кодом, показывающих точность до 92% для трех эмоций и 68% для семи. Модели предлагается использовать в качестве предобученных и повышать точность для конкретного датасета.  По словам разработчиков, цель…

Обучение Inception-v3 распознаванию собственных изображений

В моем предыдущем посте мы увидели, как выполнять распознавание изображений с помощью TensorFlow с использованием API Python на CPU без какого-либо обучения. Мы использовали предобученную модель Inception-v3, которую Google уже обучил на тысяче классов, но что, если мы хотим сделать то же самое, но…

Нейросеть Pet Detector присылает SMS, если кот хочет домой. Код доступен на Github

Что делать, если ваш кот не выражает свое желание выйти за дверь громким мяуканьем и часами ждет под дверью, пока вы его не заметите? Для решения этой проблемы разработчик EdgeElectronics создал Pet Detector — нейронную сеть, которая присылает уведомление хозяину на смартфон, если кот находится…
туториал распознавание изображений tensorflow

Распознавание изображений предобученной моделью Inception-v3 c Python API на CPU

Это самый быстрый и простой способ реализовать распознавание изображений на ноутбуке или стационарном ПК без какого-либо графического процессора, потому что это можно сделать лишь с помощью API, и ваш компьютер отлично справится с этой задачей. Перед вами перевод статьи TensorFlow Image Recognition Python API Tutorial,…
выбор признаков нейронной сети питон

Open source инструмент на Python для выбора признаков нейронной сети

Поиск и выбор наиболее полезных признаков в датасете — одна из наиболее важных частей машинного обучения. Ненужные признаки уменьшают скорость обучения, ухудшают возможности интерпретации результатов и, что самое важное, уменьшают производительность работы.  Перевод статьи «A Feature Selection Tool for Machine Learning in Python» by William…
transfer-learning-keras

Реализация Transfer learning с библиотекой Keras

Для большинства задач компьютерного зрения не существует больших датасетов (около 50 000 изображений). Даже при экстремальных стратегиях аугментации данных трудно добиться высокой точности. Обучение таких сетей с миллионами параметров обычно имеет тенденцию перегружать модель. В этом случае Transfer learning готов прийти на помощь. Что…
дерево решений

Дерево решений: метод «белого ящика» в машинном обучении

Дерево решений — логическая схема, позволяющие получить окончательное решение о классификации объекта после ответов на иерархически организованную систему вопросов. Стоит сказать, большинство высоко результативных решений на Kaggle — комбинация XGboost-ов, одного из вариантов деревьев решений, и очень качественного фичер-инжиниринга. Один уровень Стоящая за деревьями…
градиентный спуск метод

Градиентный спуск: всё, что нужно знать

Градиентный спуск — самый используемый алгоритм обучения, он применяется почти в каждой модели машинного обучения. Градиентный спуск — это, по сути, и есть то, как обучаются модели. Без ГС машинное обучение не было бы там, где сейчас. Метод градиентного спуска с некоторой модификацией широко используется для обучения…

FaceNet — пример простой системы распознавания лиц с открытым кодом Github

Распознавание лица — последний тренд в авторизации пользователя. Apple использует Face ID, OnePlus — технологию Face Unlock. Baidu использует распознавание лица вместо ID-карт для обеспечения доступа в офис, а при повторном пересечении границы в ОАЭ вам нужно только посмотреть в камеру. В статье разбираемся,…
pytorch bigraph

Сверточная нейронная сеть на PyTorch: пошаговое руководство

В предыдущем вводном туториале по нейронным сетям была создана трехслойная архитектура для классификации рукописных символов датасета MNIST. В конце туториала была показана точность приблизительно 86%. Для простого датасета, как MNIST, это плохое качество. Дальнейшая оптимизация смогла улучшить результат плотно соединенной сети до 97-98% точности.…
pytorch туториал

Туториал по PyTorch: от установки до готовой нейронной сети

Если вы уже пробовали создавать собственные глубокие нейронные сети с помощью TensorFlow и Keras, то, вероятно, знакомы с чувством разочарования при отлаживании этих библиотек. Хотя они имеют API на Python, всё еще трудно выяснить, что именно пошло не так при ошибке. Они также плохо…
keras нейронаня сеть на python

Туториал: создание нейросети для анализа настроений в комментариях c Keras

Keras — популярная библиотека глубокого обучения, которая внесла большой вклад в коммерциализацию глубокого обучения. Библиотека Keras проста в использовании и позволяет создавать нейронные сети с помощью лишь нескольких строк кода Python. Из статьи вы узнаете, как с помощью Keras создать нейронную сеть, предсказывающую оценку…
как создать чат бота на python

Как создать чат-бота с нуля на Python: подробная инструкция

Аналитики Gartner утверждают, что к 2020 году 85% взаимодействий клиентов с сервисами сведется к общению с чат-ботами. В 2018 году они уже обрабатывают около 30% операций. В этой статье мы расскажем, как создать своего чат-бота на Python. Возможно, вы слышали о Duolingo: популярном приложении для изучения иностранных языков, в…
tensorflow анализ и работа с данными

TensorFlow туториал. Часть 3: работа с данными

Пора переходить к работе с реальными данными! Мы будем работать с дорожными знаками Бельгии. Дорожный трафик — понятная тема, но не помешает уточнить, какие данные включены в датасет, перед тем как приступить к программированию. Перед прочтением статьи рекомендуем изучить: TensorFlow туториал. Часть 1: тензоры…
прогнозирование рынка на python

Прогнозирование фондового рынка на Python с помощью Stocker

Прогнозирование фондового рынка — это заманчивый «философский камень» для специалистов по анализу данных, которые мотивированы не столько стремлением к материальной выгоде, сколько самой задачей. Ежедневный рост и падение рынка наводят на мысль, что должны быть закономерности, которым мы или наши модели могут научиться, чтобы…
Stock market prediction python

Анализ данных на Python — построение модели фондового рынка со Stocker

В Data Science легко увлечься разнообразием данных и бесплатными инструментами с открытым исходным кодом. Проведя немного времени с финансовой библиотекой quandl и библиотекой прогнозирования Prophet, я решил попробовать исследовать несколько простых курсов акций. Парочка дней и 1000 строк кода Python привели меня к полноценному…