數(shù)據(jù)分析基礎(chǔ) | Python數(shù)據(jù)交叉表,你學(xué)會(huì)了嗎?
1.引言
數(shù)據(jù)交叉表(也稱為列聯(lián)表或交叉表)是一種統(tǒng)計(jì)方法,用于分析和展示兩個(gè)或多個(gè)分類變量之間的關(guān)系。在 Python 中,我們可以使用 Pandas 庫(kù)中的crosstab函數(shù)來(lái)創(chuàng)建兩個(gè)或多個(gè)因子的交叉表,相比Excel,Python可以更多更快的處理數(shù)據(jù),首先,引入幾個(gè)重要的包:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False2.數(shù)據(jù)
使用武漢市某超市過去一個(gè)月的銷售數(shù)據(jù)(如有需要可聯(lián)系作者獲?。?,創(chuàng)建一個(gè)DataFrame對(duì)象,作為數(shù)據(jù)源,并通過可視化各商品的銷售情況,找出最熱賣的十樣商品,代碼如下:
data = pd.read_excel('3.1-3.31商品銷售流水.xls')
# 計(jì)算每個(gè)商品的出現(xiàn)次數(shù)
product_counts = data['品名'].value_counts()
# 轉(zhuǎn)換成DataFrame形式
product_counts = pd.DataFrame({'商品名稱': product_counts.index, '出現(xiàn)次數(shù)': product_counts.values})
# 去掉袋子
product_counts = product_counts.drop([0, 3])
# 可視化銷售情況
top_10 = product_counts.head(10)
ax = top_10.plot(kind='bar', x='商品名稱', y='出現(xiàn)次數(shù)', figsize=(10, 6), color='skyblue')
plt.title('Top 10 Most Frequent Products in March')
plt.xlabel('Product')
plt.ylabel('Frequency')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
# 在柱子上方顯示數(shù)值
for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 5), textcoords='offset points')
plt.show()結(jié)果如下:
圖片
3.crosstab 函數(shù)
首先,介紹一下crosstab 函數(shù):
函數(shù):
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc='default', margins=False, margins_name='All', dropna=True)看一下參數(shù)主要的作用:
index:必選參數(shù),行索引,這是創(chuàng)建交叉表時(shí)必須指定的參數(shù),用于定義交叉表的行索引??梢栽O(shè)置為DataFrame中的一個(gè)或多個(gè)列,以創(chuàng)建多層索引。
columns:必選參數(shù),列索引,這是創(chuàng)建交叉表時(shí)必須指定的參數(shù),用于定義交叉表的列索引。通常用于展示分類數(shù)據(jù)。
values:非必選參數(shù),被計(jì)算的數(shù)據(jù)項(xiàng),這是一個(gè)可選參數(shù),指定需要在交叉表中進(jìn)行聚合操作的列。如果沒有提供,交叉表將只計(jì)算行和列的組合數(shù)量。
rownames:非必選參數(shù),行索引的名稱,這是一個(gè)可選參數(shù),用于指定行索引的名稱。如果未指定,將使用 index參數(shù)中的名稱。
colnames:非必選參數(shù),列索引的名稱,這是一個(gè)可選參數(shù),用于指定列索引的名稱。如果未指定,將使用 columns參數(shù)中的名稱。
aggfunc:非必選參數(shù),聚合函數(shù),這是用于對(duì)交叉表中的數(shù)據(jù)進(jìn)行聚合計(jì)算的函數(shù),默認(rèn)為 'default',表示使用 numpy 的 sum函數(shù)。可以根據(jù)需要選擇其他聚合函數(shù)。
fill_values:非必選參數(shù),填充NA值,這是一個(gè)可選參數(shù),用于指定在交叉表中缺失值的填充值。如果未指定,缺失值將保留為 NaN。
margins:非必選參數(shù),添加行列的總計(jì),這是一個(gè)布爾值參數(shù),默認(rèn)為 False,表示不顯示行列的總計(jì)。如果設(shè)置為 True,則會(huì)在交叉表的行和列末尾添加總計(jì)。
margins_name:非必選參數(shù),邊緣名稱,當(dāng) margins=True時(shí),此參數(shù)用于設(shè)置邊緣行或列的名稱,默認(rèn)值為 'All'。
dropna:非必選參數(shù),是否丟棄NA值,這是一個(gè)布爾值參數(shù),默認(rèn)為 True,表示如果整行或整列都是NA值,則這些行或列將被丟棄。如果設(shè)置為 False,則這些行或列將被保留。
根據(jù)上述函數(shù)參數(shù)介紹,通過下面一個(gè)例子進(jìn)行示例,假設(shè)我們有一個(gè)包含性別(Gender)、就業(yè)狀態(tài)(Employment Status)和年齡組(Age Group)的數(shù)據(jù)集,我們想要?jiǎng)?chuàng)建一個(gè)交叉表來(lái)分析不同性別和就業(yè)狀態(tài)的分布情況,并計(jì)算每個(gè)組合的人數(shù)。代碼如下:
import pandas as pd
# 示例數(shù)據(jù)
data2 = pd.DataFrame({
'Gender': ['Male', 'Female', 'Female', 'Male', 'Female', 'Male'],
'Employment Status': ['Employed', 'Unemployed', 'Employed', 'Employed', 'Unemployed', 'Employed'],
'Age Group': ['20-30', '20-30', '30-40', '30-40', '20-30', '40-50']
})
# 創(chuàng)建交叉表
cross_table = pd.crosstab(
index=data2['Gender'],
columns=data2['Employment Status'],
margins=True,
margins_name='Total'
)
print(cross_table)結(jié)果如下:
圖片
4.熱力圖可視化交叉表
根據(jù)前文crosstab 函數(shù)用法介紹,對(duì)本文使用的銷售數(shù)據(jù)創(chuàng)建交叉表,使用熱力圖可視化交叉表,對(duì)“讓利類型”和“top_10”創(chuàng)建數(shù)據(jù)交叉,代碼如下:
# 使用 crosstab 創(chuàng)建交叉表
cross_tab = pd.crosstab(data['讓利類型'],['top_10'] )
cross_tab
# 使用熱力圖可視化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()結(jié)果如下:
圖片
同理,對(duì)“原價(jià)”和“top_10”創(chuàng)建數(shù)據(jù)交叉,代碼如下:
# 使用 crosstab 創(chuàng)建交叉表
cross_tab = pd.crosstab(data['原價(jià)'],['top_10'] )
cross_tab
# 使用熱力圖可視化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()結(jié)果如下:
圖片
同理,對(duì)“類別名稱”和“top_10”創(chuàng)建數(shù)據(jù)交叉,代碼如下:
# 使用 crosstab 創(chuàng)建交叉表
cross_tab = pd.crosstab(data['類別名稱'], ['top_10'])
cross_tab
# 使用熱力圖可視化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()結(jié)果如下:
圖片
同理,對(duì)“品名”和“top_10”創(chuàng)建數(shù)據(jù)交叉,代碼如下:
# 使用 crosstab 創(chuàng)建交叉表
cross_tab = pd.crosstab(data['品名'],['top_10'] )
cross_tab
# 使用熱力圖可視化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()結(jié)果如下:
圖片
以上就是用Python構(gòu)造數(shù)據(jù)交叉表的內(nèi)容介紹。數(shù)據(jù)交叉表是數(shù)據(jù)分析中非常重要的工具,掌握它可以讓你更加高效地進(jìn)行數(shù)據(jù)處理和可視化呈現(xiàn)。






































