как легко группировать значения для улучшения визуализации тепловой карты - PullRequest
1 голос
/ 18 марта 2020

Я делаю тепловую карту. Мне дали фрейм данных, и теперь я сравниваю значения «Age» и «purchase_bike» (которые являются переменными «yes» или «no»). Я хочу очистить этот визуал, так как на тепловой карте в настоящее время отображается так много значений. Поэтому я думаю, что я хотел бы создать большие диапазоны для возрастов, сгруппировав их по бинам / интервалам 11. Как я могу это сделать?

Набор данных: http://www.ishelp.info/data/bikebuyers_original.csv

Текущий код и вывод (через Google Colab):

sns.heatmap(pd.crosstab(df.Age, df.purch_bike), annot=True, fmt='d');
chi1, p_value1, dof1, expected1 = chi2_contingency(pd.crosstab(df['Age'], df['purch_bike']))
print(f'X square:\t\t{round(chi1, 4)}') # this code simply displays the Chi-square stat and p-value
print(f'p-value:\t\t{round(p_value1, 6)}')
plt.show()

enter image description here

1 Ответ

1 голос
/ 18 марта 2020

pd.cut из pandas группируются по диапазону. Его можно использовать для создания нового столбца AgeGroup, который будет использоваться в качестве входных данных для pd.crosstab. Параметр labels в pd.cut может установить соответствующий текст, который будет использоваться в качестве y-тиков. right=False заботится о возрастах, равных границе корзины, помещая их в верхнюю корзину. Пример кода:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv('http://www.ishelp.info/data/bikebuyers_original.csv')
df.rename(columns={"Purchased Bike": "purch_bike"}, inplace=True)

# bins = list(range(0, 80, 10)) + [120]
bins = [20, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 120]
labels = [f'{a0}-{a1 - 1}' for a0, a1 in zip(bins[:-2], bins[1:-1])] + [f'≥{bins[-2]}']
df['AgeGroup'] = pd.cut(df.Age, bins=bins, labels=labels, right=False)

sns.heatmap(pd.crosstab(df.AgeGroup, df.purch_bike), annot=True, fmt='d')
plt.yticks(rotation=0)
plt.show()

sample plot

...