数学原理:
交叉表是一种在二维数据表格中统计频数的方法。它将数据按照指定的行和列进行分组,然后计算每个组合的频数。交叉表的数学原理可以用以下步骤来描述:
1. 数据分组: 首先,根据交叉表的行和列索引,将数据进行分组。
2. 频数统计: 对于每个分组,统计该分组内的观测值数量(频数)。
3. 填充表格: 将统计得到的频数填充到交叉表的相应位置上。
交叉表的优势在于它可以快速地提供多个变量之间的关系,尤其是在分类变量之间的分析上特别有用。
透视表是一种根据一个或多个键对数据进行聚合的方法,然后在行和列上对数据进行分组。它提供了更灵活的方式来汇总和分析数据。透视表的数学原理可以用以下步骤来描述:
1. 数据聚合: 根据透视表的行和列索引,对原始数据进行分组和聚合。这通常涉及到某种形式的数据聚合操作,如求和、平均值等。
2. 行列分组: 将聚合后的数据根据透视表的行和列索引进行进一步的分组,以形成透视表格。
3. 填充表格: 将聚合后的数据填充到透视表的相应位置上。
透视表相比于交叉表更加灵活,因为它允许我们在生成表格时进行更多的定制,如使用不同的聚合函数、添加行/列边距汇总等。总的来说,交叉表和透视表都是用于汇总和分析数据的工具,它们的数学原理都涉及到数据的分组、聚合和填充,但透视表相比于交叉表在功能上更加灵活。
表格总结:
让我们以表格的形式呈现交叉表和透视表的数学原理的相同点和不同点:
方面 |
交叉表 |
透视表 |
数据处理方式 |
对数据进行频数统计和汇总 |
对数据进行分组、聚合和填充 |
数据处理步骤 |
1. 数据分组 2. 频数统计 3. 填充表格 |
1. 数据聚合 2. 行列分组 3. 填充表格 |
行列索引的使用 |
使用指定的行和列索引对数据进行分组 |
使用指定的行和列索引对数据进行分组 |
聚合函数的使用 |
不常用,通常是简单的频数统计 |
可以使用各种聚合函数,如求和、平均值等 |
灵活性 |
较低,功能相对简单 |
较高,可以进行更多的定制,如添加边距汇总、使用不同的聚合函数等 |
用途 |
用于统计频数、探索分类变量之间的关系 |
用于数据的汇总、分析和可视化 |
这个表格简明地总结了交叉表和透视表在数学原理上的相同点和不同点。虽然它们都用于数据的汇总和分析,但在处理方式、步骤、灵活性和用途等方面有所不同。
数据交叉表分析
pd.crosstab()分析
数据交叉表分析是一种统计方法,用于汇总和分析两个或多个变量之间的关系。在 Pandas 中,可以使用 pd.crosstab() 函数来进行数据交叉表分析。让我们以一个示例来说明其用法:
具体参数:
index: 想要作为行索引的列名或者数组,可选参数。
columns: 想要作为列索引的列名或者数组,可选参数。
values: 可选参数,用于指定要聚合的数值列名或者数组。
aggfunc: 可选参数,指定聚合函数,例如 sum、mean、count 等,默认为 count。
rownames: 可选参数,用于设置行索引的名称。
colnames: 可选参数,用于设置列索引的名称。
margins: 可选参数,布尔值,默认为 False,表示是否添加行/列边距汇总。
normalize: 可选参数,参数用于控制交叉表的归一化方式。归一化是将数据转换为相对值的过程,通常通过除以总和来实现。normalize 参数可以设置为不同的值,具体含义如下 normalize:默认为False,是否要进行规范化。
如果传入为‘all’或者是True,将所有的值进行归一化。
如果传入为‘index’,根据每行进行归一化。
如果传入为‘columns’,根据每列进行归一化。
如果margins为True,小计列和行也会进行归一化。
代码示例
import pandas as pd
# 创建示例数据
data = {
'Salesperson': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'],
'Product': ['A', 'B', 'A', 'B', 'A', 'B'],
'Month': [1, 1, 2, 2, 3, 3],
'Amount': [100, 200, 150, 250, 180, 220]
}
df = pd.DataFrame(data)
# 创建交叉表1:统计销售人员和产品类型的数量
cross_table1 = pd.crosstab(df['Salesperson'], df['Product'])
print("Cross Table 1:")
print(cross_table1)
# 创建交叉表2:统计每个销售人员在每个月份的销售总额
cross_table2 = pd.crosstab(df['Salesperson'], df['Month'], values=df['Amount'], aggfunc='sum')
print("\nCross Table 2:")
print(cross_table2)
# 创建交叉表3:包含行/列边距汇总
cross_table3 = pd.crosstab(df['Salesperson'], df['Product'], margins=True)
print("\nCross Table 3:")
print(cross_table3)
# 创建交叉表4:归一化,将每个值除以每行的总和
cross_table4 = pd.crosstab(df['Salesperson'], df['Product'], normalize='index')
print("\nCross Table 4:")
print(cross_table4)
不同 normalize 参数值的效果:
import pandas as pd
data = {
'Salesperson': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'],
'Product': ['A', 'B', 'A', 'B', 'A', 'B'],
'Amount': [100, 200, 150, 250, 180, 220]
}
df = pd.DataFrame(data)
# 不进行归一化
cross_table_false = pd.crosstab(df['Salesperson'], df['Product'], normalize=False)
print("Without normalization:")
print(cross_table_false)
# 对每个行进行归一化
cross_table_row = pd.crosstab(df['Salesperson'], df['Product'], normalize='index')
print("\nNormalized by row:")
print(cross_table_row)
# 每个列进行归一化
cross_table_col = pd.crosstab(df['Salesperson'], df['Product'], normalize='columns')
print("\nNormalized by column:")
print(cross_table_col)
# 对整个表进行归一化
cross_table_all = pd.crosstab(df['Salesperson'], df['Product'], normalize='all')
print("\nNormalized by all:")
print(cross_table_all)
数据透视表分析
pd.pivot_table()分析
透视表是一种数据汇总工具,允许你根据一个或多个键对数据进行聚合,然后在行和列上对数据进行分组。这使得你可以更轻松地理解数据的结构和关系,并从中提取有价值的信息。
pd.pivot_table() 函数可以将原始数据转换为透视表格式,它提供了灵活的参数设置,使得你可以根据自己的需求定制透视表的形式。
参数介绍:
data: DataFrame,表示要进行透视操作的原始数据。
values: 需要聚合的列名,可以是单个列名或者包含多个列名的列表。
index: 透视表的行索引,可以是单个列名或者包含多个列名的列表。
columns: 透视表的列索引,可以是单个列名或者包含多个列名的列表。
aggfunc: 聚合函数,用于对值进行聚合,默认为 'mean'。
fill_value: 在透视表中替换缺失值的值,默认为 None。
margins: 是否添加行/列边距汇总,默认为 False。
margins_name: 边距汇总的名称,默认为 'All'。
dropna: 是否删除包含缺失值的行/列,默认为 True。
代码示例
import pandas as pd
data = {
'Salesperson': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'],
'Product': ['A', 'B', 'A', 'B', 'A', 'B'],
'Amount': [100, 200, 150, 250, 180, 220]
}
df = pd.DataFrame(data)
# 创建透视表
pivot_table_basic = pd.pivot_table(df, values='Amount', index='Salesperson', columns='Product', aggfunc='sum', fill_value=0)
print("Basic Pivot Table:")
print(pivot_table_basic)
添加行/列边距汇总
# 创建透视表并添加行/列边距汇总
pivot_table_with_margins = pd.pivot_table(df, values='Amount', index='Salesperson', columns='Product', aggfunc='sum', fill_value=0, margins=True)
print("\nPivot Table with Margins:")
print(pivot_table_with_margins)
# 创建透视表并使用不同的聚合函数
pivot_table_aggfunc = pd.pivot_table(df, values='Amount', index='Salesperson', columns='Product', aggfunc='mean', fill_value=0)
print("\nPivot Table with Different Aggregation Function (mean):")
print(pivot_table_aggfunc)
# 创建透视表并填充缺失值
pivot_table_fill_value = pd.pivot_table(df, values='Amount', index='Salesperson', columns='Product', aggfunc='sum', fill_value='No Sales')
print("\nPivot Table with Fill Value for Missing Data:")
print(pivot_table_fill_value)
# 创建透视表并使用多个行索引和列索引
df['Year'] = pd.to_datetime('today').year
pivot_table_multi_index = pd.pivot_table(df, values='Amount', index=['Salesperson', 'Year'], columns=['Product'], aggfunc='sum', fill_value=0)
print("\nPivot Table with Multiple Index and Columns:")
print(pivot_table_multi_index)