Автор оригинала: 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.