5.4 交叉表 (crosstab)


文档摘要

5.4 交叉表 (crosstab) 5.4 Pandas 交叉表 (crosstab) 详解 交叉表是一种用于汇总分类变量之间关系的工具。在 Pandas 中, 函数提供了一种方便的方式来创建交叉表,它可以帮助我们理解两个或多个变量之间的频率分布和关联性。 5.4.1 交叉表的基本概念 交叉表,也称为列联表或双向表,是一种以表格形式展示两个或多个分类变量之间关系的汇总统计。它显示了每个变量组合的频率计数,从而揭示变量之间的潜在模式和依赖关系。 例如,我们可以使用交叉表来分析: 不同性别的人对不同产品的偏好。 不同年龄段的人对不同政治立场的支持。 不同教育水平的人的收入分布。 5.4.2 函数详解 Pandas 的 函数是创建交叉表的核心工具。

5.4 交叉表 (crosstab)

5.4 Pandas 交叉表 (crosstab) 详解

交叉表是一种用于汇总分类变量之间关系的工具。在 Pandas 中,pd.crosstab() 函数提供了一种方便的方式来创建交叉表,它可以帮助我们理解两个或多个变量之间的频率分布和关联性。

5.4.1 交叉表的基本概念

交叉表,也称为列联表或双向表,是一种以表格形式展示两个或多个分类变量之间关系的汇总统计。它显示了每个变量组合的频率计数,从而揭示变量之间的潜在模式和依赖关系。

例如,我们可以使用交叉表来分析:

  • 不同性别的人对不同产品的偏好。

  • 不同年龄段的人对不同政治立场的支持。

  • 不同教育水平的人的收入分布。

5.4.2 pd.crosstab() 函数详解

Pandas 的 pd.crosstab() 函数是创建交叉表的核心工具。其基本语法如下:

pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

参数说明:

  • index: 指定作为交叉表行索引的列名、数组或 Series。

  • columns: 指定作为交叉表列索引的列名、数组或 Series。

  • values: 可选参数,指定用于聚合的值。如果提供了 valuesaggfunc,则交叉表中的单元格将包含聚合值,而不是频率计数。

  • rownames: 可选参数,指定行索引的名称。

  • colnames: 可选参数,指定列索引的名称。

  • aggfunc: 可选参数,指定聚合函数(例如 np.sum, np.mean, len)。 如果提供了,则必须同时提供 values

  • margins: 可选参数,如果为 True,则添加行和列的总计("All" 行/列)。

  • dropna: 可选参数,如果为 True,则忽略所有条目都为 NaN 的列。

  • normalize: 可选参数,用于对结果进行标准化。 可以是 True (标准化所有值), 'index' (按行标准化), 或 'columns' (按列标准化)。

5.4.3 代码实践

首先,我们创建一个示例 DataFrame:

import pandas as pd import numpy as np data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female', 'Male', 'Female'], 'Smoker': ['Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes'], 'City': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Los Angeles', 'Chicago', 'New York', 'Los Angeles'], 'Age': [25, 30, 35, 40, 45, 50, 55, 60], 'Sales': [100, 120, 150, 180, 200, 220, 250, 280]} df = pd.DataFrame(data) print(df)

输出:

Gender Smoker City Age Sales 0 Male Yes New York 25 100 1 Female No Los Angeles 30 120 2 Male Yes New York 35 150 3 Female Yes Chicago 40 180 4 Male No Los Angeles 45 200 5 Female No Chicago 50 220 6 Male No New York 55 250 7 Female Yes Los Angeles 60 280

1. 基本交叉表:性别 vs. 吸烟习惯

cross_table = pd.crosstab(index=df['Gender'], columns=df['Smoker']) print(cross_table)

输出:

Smoker No Yes Gender Female 2 2 Male 2 2

这个交叉表显示了不同性别的人的吸烟习惯分布。

2. 添加 margins 参数:显示总计

cross_table_margins = pd.crosstab(index=df['Gender'], columns=df['Smoker'], margins=True) print(cross_table_margins)

输出:

Smoker No Yes All Gender Female 2 2 4 Male 2 2 4 All 4 4 8

margins=True 添加了 "All" 行和列,显示了行和列的总计。

3. 使用 valuesaggfunc 参数:计算平均年龄

cross_table_age = pd.crosstab(index=df['Gender'], columns=df['Smoker'], values=df['Age'], aggfunc='mean') print(cross_table_age)

输出:

Smoker No Yes Gender Female 40.0 50.0 Male 50.0 30.0

这里,我们使用 values=df['Age']aggfunc='mean' 来计算每个性别和吸烟习惯组合的平均年龄。

4. 使用 normalize 参数:标准化

cross_table_normalized = pd.crosstab(index=df['Gender'], columns=df['Smoker'], normalize=True) print(cross_table_normalized)

输出:

Smoker No Yes Gender Female 0.25 0.25 Male 0.25 0.25

normalize=True 将每个单元格的值除以总数,显示了每个组合的比例。 normalize='index' 按行标准化, normalize='columns' 按列标准化。

5. 多重索引交叉表:性别 + 城市 vs. 吸烟习惯

cross_table_multi = pd.crosstab(index=[df['Gender'], df['City']], columns=df['Smoker']) print(cross_table_multi)

输出:

Smoker No Yes Gender City Female Chicago 1 1 Los Angeles 1 1 Male Los Angeles 1 0 New York 1 2

这里,我们使用多个列作为行索引,创建了一个更复杂的交叉表。

6. 修改行名和列名

cross_table_named = pd.crosstab(index=df['Gender'], columns=df['Smoker'], rownames=['Sex'], colnames=['Smoking Status']) print(cross_table_named)

输出:

Smoking Status No Yes Sex Female 2 2 Male 2 2

5.4.4 交叉表的可视化

交叉表通常与可视化工具结合使用,以更清晰地展示变量之间的关系。 例如,可以使用柱状图或热图来可视化交叉表。

1. 使用柱状图可视化

import matplotlib.pyplot as plt cross_table.plot(kind='bar', stacked=True) plt.title('Gender vs. Smoking Habit') plt.xlabel('Gender') plt.ylabel('Number of People') plt.show()

2. 使用热图可视化

import seaborn as sns sns.heatmap(cross_table, annot=True, cmap='YlGnBu') plt.title('Gender vs. Smoking Habit') plt.show()

5.4.5 交叉表与数据分析流程

交叉表是数据分析流程中的一个重要步骤,它可以帮助我们:

  1. 探索性数据分析 (EDA): 快速了解变量之间的关系。

  2. 特征工程: 创建新的特征,例如基于交叉表的比例或频率。

  3. 假设检验: 验证变量之间是否存在统计显著性关系。

5.4.6 交叉表的工作原理 (Mermaid 图)

以下是一个 Mermaid 图,展示了 pd.crosstab() 函数的基本工作原理:

图解说明:

  1. 从 DataFrame 开始。

  2. 指定 index 列和 columns 列。

  3. 判断是否指定了 valuesaggfunc

    • 如果指定了,则使用指定的 values 列和 aggfunc 进行聚合。

    • 如果没有指定,则计算每个组合的频率。

  4. 根据指定的 indexcolumns 对数据进行分组。

  5. 计算每个组的频率或聚合值。

  6. 生成交叉表。

5.4.7 总结

pd.crosstab() 函数是 Pandas 中一个强大的工具,用于创建交叉表并分析分类变量之间的关系。 通过灵活地使用 indexcolumnsvaluesaggfuncnormalize 等参数,我们可以从数据中提取有价值的信息,并为后续的数据分析和建模提供支持。 结合可视化工具,可以更直观地展示变量之间的关系,从而更好地理解数据。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U