Зачем визуализировать?
При анализе данных очень важна наглядность. Чаще всего недостаточно просто собрать что-то и сгруппировать — данные ещё нужно показать. А ещё лучше отобразить данные так, чтобы одного взгляда было достаточно для принятия решений.
Как это работает?
Для визуализации данных в Python чаще всего используют библиотеки Matplotlib, ggplot, Bokeh, pygal, seaborn. А как их использовать, в каком случае и использовать ли вообще, сейчас разберёмся.
Подключим библиотеки Matplotlib и seaborn к проекту:
from math import pi
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
import seaborn as sns
Сначала нам нужны данные для экспериментов: я нашла несколько вакансий на должность веб-разработчика в разных странах и взяла предлагаемую зарплату. Получились такие словари:
salary_2017 = {
"USA": "1400",
"China": "1100",
"Russia": "1350",
"Germany": "1300",
"Hungary": "1200",
"Ukraine": "1200",
"France": "1400",
"Sweden": "1500",
"UK": "1250",
"Spain": "1300"
}
salary_2018 = {
"USA": 1700,
"China": 1300,
"Russia": 1450,
"Germany": 1400,
"Hungary": 1500,
"Ukraine": 1300,
"France": 1500,
"Sweden": 1600,
"UK": 1500,
"Spain": 1400
}

Теперь нужно решить что именно мы хотим узнать:
- Какие у нас есть страны и заплаты? (столбчатая диаграмма)
- Какая самая распространенная зарплата для веб-разработчика? (гистограмма или тепловая карта)
- Насколько разные зарплаты предлагают? (диаграмма размаха)
- Как стать веб-разработчиком? (радиальная диаграмма)
1. Столбчатая диаграмма
Столбчатая диаграмма — это как таблица, но для презентаций. У нас есть данные по странам за разные годы, выберем нужный словарь и выведем:
d = OrderedDict(sorted(salary_2018.items(), key=lambda x: x[1]))
values = list(d.values())
keys = list(d.keys())
plt.bar(range(len(d)),values,tick_label=keys)
plt.show()

2. Гистограмма
Гистограмма — один из вариантов столбчатой диаграммы для оценки распределения значений. Можно оценить частоту появления одного значения или наложить несколько для сравнения. Посмотрим распределение зарплат:
data = list(salary_2018.values())
plt.hist(data, bins=30)
plt.show(

3. Тепловая карта
Тепловая карта разворачивает гистограмму в другую плоскость. Здесь мы цветом показываем частоту разных значений. Посмотрим количество разработчиков по странам. Точного значения мы не знаем, набросаем случайные числа в csv-файл:
workers.csv:
country,salary,workers
USA,1700,130
China,1300,300
Russia,1450,200
Germany,1400,185
Hungary,1500,75
Ukraine,1300,68
France,1500,54
Sweden,1600,100
UK,1500,89
Spain,1400,45
Тогда код будет выглядеть так:
data = pd.read_csv('workers.csv')
df = data.pivot(index='salary', values='workers', columns='country')
df.head()
heatmap_plot = sns.heatmap(df, center=0, cmap='gist_ncar')
plt.show()


4. Диаграмма размаха
Диаграмма размаха ещё называется «ящик с усами» — смотрим среднее значение и «усами» показываем максимальные отклонения от него. Построим так:
data= np.array(list(salary_2018.values())).astype(np.int)
plt.boxplot(data)
plt.show()

5. Радиальная диаграмма
Радиальная диаграмма удобна, когда мы хотим сравнить параметры у одной сущности. Например, какие скиллы нужны веб-разработчику:
from math import pi
import matplotlib.pyplot as plt
# Вносим данные - какие скиллы хотим видеть в веб-разработчике
cat = ['Speed', 'Laziness', 'Responsibility', 'Teamwork', 'Decency']
values = [70, 20, 80, 70, 65]
N = len(cat)
x_as = [n / float(N) * 2 * pi for n in range(N)]
# Связываем последнее значение с первым чтобы построить радиальный график
values += values[:1]
x_as += x_as[:1]
# Устанавливаем цвет и толщину линий
plt.rc('axes', linewidth=0.5, edgecolor="#888888")
# Создаем диаграмму
ax = plt.subplot(111, polar=True)
# Устанавливаем стили для сетки
ax.xaxis.grid(True, color="#888888", linestyle='solid', linewidth=0.5)
ax.yaxis.grid(True, color="#888888", linestyle='solid', linewidth=0.5)
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
ax.set_rlabel_position(0)
# Убираем стандартные метки
plt.xticks(x_as[:-1], [])
# Выводим шаг значения на график
plt.yticks([30, 60], ["30", "60"])
# Берем данные для диаграммы
ax.plot(x_as, values, linewidth=0, linestyle='solid', zorder=3)
# Заполняем область под значениями
ax.fill(x_as, values, 'b', alpha=0.3)
# Ограничиваем области
plt.ylim(0, 100)
# Отрисовываем все элементы
for i in range(N):
angle_rad = i / float(N) * 2 * pi
if angle_rad == 0:
ha, distance_ax = "center", 10
elif 0 < angle_rad < pi:
ha, distance_ax = "left", 1
elif angle_rad == pi:
ha, distance_ax = "center", 1
else:
ha, distance_ax = "right", 1
ax.text(angle_rad, 100 + distance_ax, cat[i], size=10, horizontalalignment=ha, verticalalignment="center")
# Показываем итоговую диаграмму
plt.show()

Что делать дальше?
Мы рассмотрели самые простые варианты визуализирования данных, но для некоторых задач этого может быть недостаточно, поэтому:
- Читайте документацию библиотек Maptolib, ggplot, Bokeh, pygal, seaborn.
- Следите за новыми разработками для визуализации.
- Записывайтесь на курс по Python для анализа данных от SkillFactory.
Специализация Аналитик Данных
Специализация Data Science
текст: Ушакова Катерина