Рубрики
Без рубрики

Введение в визуализацию данных в Python с пандами

В этом руководстве мы рассмотрим все, что вам нужно знать для визуализации данных в Python с помощью Pandas – гистограммы, Гистограммы, Диаграммы площадей, Круговые диаграммы, Графики плотности и Матрицы рассеяния.

Автор оригинала: Kristina Popovic.

Вступление

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

Люди в магазинах склонны покупать подгузники и пиво в связке!

Или даже если вы, как специалист по обработке данных, действительно можете читать необработанные данные, ваш инвестор или босс, скорее всего, не сможет.

Для того чтобы мы могли правильно анализировать наши данные, мы должны представлять их осязаемым, всеобъемлющим образом. Именно поэтому мы используем визуализацию данных!

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

Импорт Данных

Во-первых, нам понадобится небольшой набор данных для работы и тестирования.

Я буду использовать набор данных индийской кухни, так как, честно говоря, индийская еда очень вкусная. Вы можете скачать его бесплатно с Kaggle.com . Чтобы импортировать его, мы будем использовать метод read_csv () , который возвращает DataFrame . Вот небольшой фрагмент кода, который выводит первые пять и последние пять записей в нашем наборе данных. Давайте попробуем:

import pandas as pd
menu = pd.read_csv('indian_food.csv')
print(menu)

Запуск этого кода приведет к выходу:

               name            state      region ...  course
0        Balu shahi      West Bengal        East ... dessert
1            Boondi        Rajasthan        West ... dessert
2    Gajar ka halwa           Punjab       North ... dessert
3            Ghevar        Rajasthan        West ... dessert
4       Gulab jamun      West Bengal        East ... dessert
..              ...              ...         ... ...     ...
250       Til Pitha            Assam  North East ... dessert
251         Bebinca              Goa        West ... dessert
252          Shufta  Jammu & Kashmir       North ... dessert
253       Mawa Bati   Madhya Pradesh     Central ... dessert
254          Pinaca              Goa        West ... dessert

Если вы хотите загрузить данные из другого формата файла, pandas предлагает аналогичные методы чтения, такие как read_json() . Представление немного усечено из-за длинной формы переменной ingredients .

Чтобы извлечь только несколько выбранных столбцов, мы можем подмножествовать набор данных с помощью квадратных скобок и перечислить имена столбцов, на которых мы хотели бы сосредоточиться:

import pandas as pd

menu = pd.read_csv('indian_food.csv')
recepies = menu[['name', 'ingredients']]
print(recepies)

Это дает:

               name                                        ingredients
0        Balu shahi                    Maida flour, yogurt, oil, sugar
1            Boondi                            Gram flour, ghee, sugar
2    Gajar ka halwa       Carrots, milk, sugar, ghee, cashews, raisins
3            Ghevar  Flour, ghee, kewra, milk, clarified butter, su...
4       Gulab jamun  Milk powder, plain flour, baking powder, ghee,...
..              ...                                                ...
250       Til Pitha            Glutinous rice, black sesame seeds, gur
251         Bebinca  Coconut milk, egg yolks, clarified butter, all...
252          Shufta  Cottage cheese, dry dates, dried rose petals, ...
253       Mawa Bati  Milk powder, dry fruits, arrowroot powder, all...
254          Pinaca  Brown rice, fennel seeds, grated coconut, blac...

[255 rows x 2 columns]

Построение гистограмм с Панд

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

Pandas использует движок Matplotlib для отображения сгенерированных графиков. Поэтому нам придется импортировать модуль Matplotlib PyPlot для вызова plt.show() после создания графиков.

Во-первых, давайте импортируем наши данные. В нашем наборе данных очень много блюд – 255, если быть точным. Это не будет действительно вписываться в одну цифру, оставаясь читаемым.

Мы будем использовать метод head() для извлечения первых 10 блюд и извлечения переменных, имеющих отношение к нашему сюжету. А именно, мы хотим извлечь name и cook_time для каждого блюда в новый фрейм данных с именем name_and_time и усечь его до первых 10 блюд:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')

name_and_time = menu[['name','cook_time']].head(10)

Теперь мы будем использовать метод bar() для построения наших данных:

DataFrame.plot.bar(x=None, y=None, **kwargs)
  • Параметры x и y соответствуют осям X и Y
  • kwargs соответствует дополнительным аргументам ключевого слова, которые задокументированы в DataFrame.plot() .

Для дальнейшей настройки графика можно передать множество дополнительных параметров, таких как rot для поворота метки, legend для добавления легенды, style и т. Д…

Многие из этих аргументов имеют значения по умолчанию, большинство из которых отключены. Поскольку аргумент rot по умолчанию имеет значение 90 , наши ярлыки будут повернуты на 90 градусов. Давайте изменим это значение на 30 при построении сюжета:

name_and_time.plot.bar(x='name',y='cook_time', rot=30)

И, наконец, мы вызовем метод show() из экземпляра PyPlot для отображения нашего графика:

plt.show()

Это выведет желаемую гистограмму:

гистограмма панд

Построение нескольких столбцов на оси X гистограммы в Панд

Часто мы можем захотеть сравнить две переменные в гистограмме, такие как cook_time и prep_time . Это обе переменные, соответствующие каждому блюду и непосредственно сопоставимые.

Давайте изменим фрейм данных name_and_time , чтобы он также включал prep_time :

name_and_time = menu[['name','prep_time','cook_time']].head(10)
name_and_time.plot.bar(x='name', rot=30)

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

Если вам нужно явно определить, какие другие переменные должны быть нанесены на график, вы можете просто передать список:

name_and_time.plot.bar(x='name', y=['prep_time','cook_time'], rot=30)

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

несколько барных участков панд

Построение штабелированных гистограмм с Пандами

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

Для этого мы установим параметр stacked в значение Правда :

name_and_time.plot.bar(x='name', stacked=True)
штабелированные гистограммы с пандами

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

Настройка Барных участков в Панд

Если мы хотим, чтобы графики выглядели немного лучше, мы можем передать некоторые дополнительные аргументы методу bar () , например:

  • color – Который определяет цвет для каждого из атрибутов фрейма данных . Это может быть строка типа ‘orange’ , rgb или rgb-код типа #faa005 . title
  • - Строка или список, обозначающий название сюжета . grid
  • - логическое значение, указывающее, видны ли линии сетки. figsize
  • - Кортеж, который указывает размер участка в дюймах . legend
  • - Логическое значение, указывающее, отображается ли легенда.

Если нам нужна горизонтальная гистограмма, мы можем использовать метод bath () , который принимает те же аргументы.

Например, давайте построим горизонтальную оранжево-зеленую полосу с заголовком "Блюда" , с сеткой размером 5 на 6 дюймов и легендой:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
name_and_time = menu[['name','cook_time','prep_time']].head()

name_and_time.plot.barh(x='name',color =['orange','green'], title = "Dishes", grid = True, figsize=(5,6), legend = True)
plt.show()
настройка барных участков в панд

Построение гистограмм с Панд

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

Чтобы получить представление о распределении, которое дает нам много информации о времени приготовления, мы хотим построить график гистограммы.

С помощью Pandas мы можем вызвать функцию hist() на фрейме данных, чтобы сгенерировать его гистограмму:

DataFrame.hist(column=None, by=None, grid=True, xlabelsize=None, xrot=None, ylabelsize=None, yrot=None, ax=None, sharex=False, sharey=False, fcigsize=None, layout=None, bins=10, backend=None, legend=False,**kwargs)

Параметр bins указывает количество используемых ячеек.

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

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

Давайте отфильтруем недопустимые значения и построим гистограмму с 50 ячейками на оси X:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
menu = menu[menu.cook_time != -1] # Filtering
cook_time = menu['cook_time']

cook_time.plot.hist(bins = 50)

plt.legend()
plt.show()

Это приводит к:

гистограмма графика панд

По оси Y мы можем видеть частоту блюд, а по оси X-сколько времени они готовятся.

Чем выше планка, тем выше частота. Согласно этой гистограмме, приготовление большинства блюд занимает от 0..80 минут. Самое большое их количество находится в действительно высоком баре, хотя мы не можем точно определить, какое именно число это именно потому, что частота наших тиков низкая (по одному каждые 100 минут).

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

Подчеркивание данных с помощью размеров ячеек

Давайте попробуем построить эту гистограмму с помощью 10 вместо этого бункеры:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
menu = menu[menu.cook_time != -1] # Filtering
cook_time = menu['cook_time']

cook_time.plot.hist(bins = 10)

plt.legend()
plt.show()
изменение бункеров в панд гистограммы

Теперь у нас есть 10 бункеров по всей оси X. Обратите внимание, что только 3 ячейки имеют некоторую частоту данных, в то время как остальные пусты.

А теперь давайте, пожалуй, увеличим количество бункеров:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
menu = menu[menu.cook_time != -1] # Filtering
cook_time = menu['cook_time']

cook_time.plot.hist(bins = 100)

plt.legend()
plt.show()
гистограмма бункеров панд

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

Настройки по умолчанию (номер ячейки по умолчанию равен 10) в этом случае привели бы к нечетному номеру ячейки.

Изменение частоты тиков для гистограммы Панд

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

Поскольку наши тики по оси X немного редки, мы сделаем массив целых чисел с шагом в 20 шагов между ними. 0 и cook_time.max() , который возвращает запись с наибольшим числом.

Кроме того, поскольку у нас будет много клещей на нашем участке, мы повернем их на 45 градусов, чтобы убедиться, что они хорошо подходят:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Clean data and extract what we're looking for
menu = pd.read_csv('indian_food.csv')
menu = menu[menu.cook_time != -1] # Filtering
cook_time = menu['cook_time']

# Construct histogram plot with 50 bins
cook_time.plot.hist(bins=50)

# Modify X-Axis ticks
plt.xticks(np.arange(0, cook_time.max(), 20))
plt.xticks(rotation = 45) 

plt.legend()
plt.show()

Это приводит к:

изменение частоты тика панд

Построение Нескольких Гистограмм

Теперь давайте добавим время приготовления в смесь. Чтобы добавить эту гистограмму, мы построим ее как отдельную гистограмму с непрозрачностью 60%.

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

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Filtering and cleaning
menu = pd.read_csv('indian_food.csv')
menu = menu[(menu.cook_time!=-1) & (menu.prep_time!=-1)] 

# Extracting relevant data
cook_time = menu['cook_time']
prep_time = menu['prep_time']

# Alpha indicates the opacity from 0..1
prep_time.plot.hist(alpha = 0.6 , bins = 50) 
cook_time.plot.hist(alpha = 0.6, bins = 50)

plt.xticks(np.arange(0, cook_time.max(), 20))
plt.xticks(rotation = 45) 
plt.legend()
plt.show()

Это приводит к:

построение нескольких гистограмм панд

Мы можем сделать вывод, что большинство блюд можно приготовить менее чем за час или примерно за час. Тем не менее, есть несколько, которые занимают пару дней, чтобы подготовиться, с 10-часовым временем подготовки и длительным временем приготовления.

Настройка Графиков Гистограмм

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

Например, давайте сделаем зеленую и красную гистограмму, с заголовком, сеткой, легендой – размером 7х7 дюймов:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

menu = pd.read_csv('indian_food.csv')
menu = menu[(menu.cook_time!=-1) & (menu.prep_time!=-1)] #filltering

cook_time = menu['cook_time']
prep_time = menu['prep_time']

prep_time.plot.hist(alpha = 0.6 , color = 'green', title = 'Cooking time', grid = True, bins = 50)
cook_time.plot.hist(alpha = 0.6, color = 'red', figsize = (7,7), grid = True, bins = 50)

plt.xticks(np.arange(0, cook_time.max(), 20))
plt.xticks(rotation = 45) 

plt.legend()
plt.show()

А вот и наша рождественская гистограмма:

настройка гистограммы панд

Построение участка Участка с Пандами

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

Чтобы проверить это, мы построим эту зависимость с помощью функции area() :

DataFrame.plot.area(x=None, y=None, **kwargs)

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

time = menu.groupby('prep_time').mean() 

Это приводит к появлению нового фрейма данных:

prep_time
5           20.937500
10          40.918367
12          40.000000
15          36.909091
20          36.500000
...
495         40.000000
500        120.000000

Теперь мы построим график площади с результирующим кадром данных time :

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
menu = menu[(menu.cook_time!=-1) & (menu.prep_time!=-1)]

# Simplifying the graph
time = menu.groupby('prep_time').mean() 
time.plot.area()

plt.legend()
plt.show()
площадь участка панды

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

Это отличная причина не придерживаться только одного типа графика, а скорее исследовать свой набор данных с помощью нескольких подходов.

Построение Графиков Сложенных Площадей

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

  • stacked – Логическое значение, указывающее, будут ли сложены два или более участков или нет

Давайте наметим время приготовления и приготовления пищи так, чтобы они были сложены в стопку, розовые и фиолетовые, с сеткой размером 8×9 дюймов, с легендой:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
menu = menu[(menu.cook_time!=-1) & (menu.prep_time!=-1)]

menu.plot.area()

plt.legend()
plt.show()
штабелированная площадь участка панды

Построение круговых диаграмм с Пандами

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

Для построения круговых диаграмм мы будем использовать функцию pie () , которая имеет следующий синтаксис:

DataFrame.plot.pie(**kwargs)

Построение вкусовых профилей:

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')

flavors = menu[menu.flavor_profile != '-1']
flavors['flavor_profile'].value_counts().plot.pie()

plt.legend()
plt.show()

Это приводит к:

круговая диаграмма панды

Безусловно, большинство блюд острые и сладкие.

Настройка Круговых диаграмм

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

  • shadow – Логическое значение, указывающее, имеют ли срезы круговой диаграммы тень
  • startangle – Начальный угол круговой диаграммы

Чтобы показать, как это работает, давайте построим регионы, из которых происходят блюда. Мы будем использовать head () , чтобы взять только первый 10 , чтобы не было слишком много ломтиков.

Давайте сделаем пирог розовым, с названием “Штаты”, дадим ему тень и легенду и сделаем так, чтобы он начинался под углом 15 :

import pandas as pd
import matplotlib.pyplot as plt

menu = pd.read_csv('indian_food.csv')
states = (menu[menu.state != '-1'])['state'].value_counts().head(10)

# Colors to circle through
colors = ['lightpink','pink','fuchsia','mistyrose','hotpink','deeppink','magenta']

states.plot.pie(colors = colors, shadow = True, startangle = 15, title = "States")

plt.show()
настройка круговой диаграммы панд

Построение графиков плотности с Пандами

Если у вас есть опыт работы со статистикой, вы, вероятно, видели график плотности. Графики плотности-это визуальное представление плотности вероятности в диапазоне значений.

Гистограмма-это график плотности, который объединяет точки данных в категории. Второй по популярности график плотности – это график KDE (Kernel Density Estimation) – проще говоря, это как очень гладкая гистограмма с бесконечным числом ячеек.

Чтобы построить один из них, мы будем использовать функцию kde() :

DataFrame.plot.kde(bw_method=None, ind=None, **kwargs)

Например, мы построим график времени приготовления:

import pandas as pd
import matplotlib.pyplot as plt
import scipy

menu = pd.read_csv('indian_food.csv')

time = (menu[menu.cook_time != -1])['cook_time']
time.value_counts().plot.kde()
plt.show()

Это распределение выглядит следующим образом:

плотностные графики с пандами

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

С помощью графиков KDE мы получаем преимущество эффективного использования бесконечного числа бункеров. Таким образом, никакие данные не усекаются и не теряются.

Построение матрицы рассеяния (Парный график) в Панд

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

Чтобы построить матрицу рассеяния, нам нужно импортировать функцию scatter_matrix() из модуля pandas.plotting .

Синтаксис функции scatter_matrix() таков:

pandas.plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwargs)

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

Параметр diagonal может быть либо 'kde' , либо 'hist ‘ для оценки плотности ядра или гистограмм.

Давайте построим график матрицы рассеяния:

import pandas as pd 
import matplotlib.pyplot as plt
import scipy
from pandas.plotting import scatter_matrix

menu = pd.read_csv('indian_food.csv')

scatter_matrix(menu,diagonal='kde')

plt.show()

Сюжет должен выглядеть так:

разброс матриц панд

Построение бутстрап-сюжета в Панд

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

Использовать его так же просто, как импортировать метод bootstrap_plot() из модуля pandas.plotting . Синтаксис bootstrap_plot() :

pandas.plotting.bootstrap_plot(series, fig=None, size=50, samples=500, **kwds)

И, наконец, давайте построим бутстрап-сюжет:

import pandas as pd
import matplotlib.pyplot as plt
import scipy
from pandas.plotting import bootstrap_plot

menu = pd.read_csv('indian_food.csv')

bootstrap_plot(menu['cook_time'])
plt.show()

Сюжет bootstrap будет выглядеть примерно так:

бутстрап-сюжеты в панд

Вывод

В этом руководстве мы рассмотрели введение в Визуализацию данных в Python с помощью Pandas . Мы рассмотрели основные графики, такие как круговые диаграммы, столбчатые графики, перешли к плотностным диаграммам, таким как гистограммы и графики KDE.

Наконец, мы рассмотрели Матрицы рассеяния и бутстрэп-графики.

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

Визуализация данных в Python , книга для начинающих и промежуточных разработчиков Python, проведет вас через простые манипуляции с данными с Пандами, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет вам, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair.