Pandas 数据统计与汇总分析
在数据分析的早期阶段,我们往往需要快速了解数据的整体特征,例如:均值、方差、频次分布、变量之间的相关性等。
Pandas 提供了丰富而高效的统计与汇总分析函数,可以帮助我们从原始数据中提炼出核心信息,为后续的建模与决策提供依据。本文将系统讲解这些方法的使用与意义。
1. 常用统计函数
Pandas 的统计函数可以直接作用于 Series
或 DataFrame
,帮助我们高效地计算各类统计指标。
import pandas as pd
data = {
"姓名": ["张三", "李四", "王五", "赵六", "孙七"],
"年龄": [23, 34, 29, 40, 34],
"销售额": [100, 150, 200, 130, 160]
}
df = pd.DataFrame(data)
print(df)
姓名 年龄 销售额
0 张三 23 100
1 李四 34 150
2 王五 29 200
3 赵六 40 130
4 孙七 34 160
1.1 基本统计
Pandas 提供的常见统计方法包括:
- 均值(mean):衡量数据集中趋势;
- 最大值 / 最小值(max / min):反映取值范围;
- 总和(sum):适合计算总销售额、总收入等指标。
print("平均值:\n", df[['年龄','销售额']].mean())
print("最大值:\n", df[['年龄','销售额']].max())
print("最小值:\n", df[['年龄','销售额']].min())
print("总和:\n", df[['年龄','销售额']].sum())
平均值:
年龄 32.0
销售额 148.0
dtype: float64
最大值:
年龄 40
销售额 200
dtype: int64
最小值:
年龄 23
销售额 100
dtype: int64
总和:
年龄 160
销售额 740
dtype: int64
这些函数都能一次性对多个列执行操作,输出结果为一个 Series
对象。
1.2 描述性统计
describe()
函数可以一键生成完整的统计摘要,包括:
样本数量(count)、均值(mean)、标准差(std)、四分位数(25%、50%、75%)等。
print("描述性统计:\n", df[['年龄','销售额']].describe())
描述性统计:
年龄 销售额
count 5.000000 5.000000
mean 32.000000 148.000000
std 6.363961 37.013511
min 23.000000 100.000000
25% 29.000000 130.000000
50% 34.000000 150.000000
75% 34.000000 160.000000
max 40.000000 200.000000
通过该函数,用户可以快速了解数据的分布与离散程度。若希望同时查看非数值字段的统计信息(如分类数量、最频繁值等),可在参数中加入 include='all'
。
2. 频次统计
在探索离散型变量(如性别、地区、等级)时,频次统计可以帮助我们理解类别的分布特征。
# 查看年龄频次
print(df['年龄'].value_counts())
# 查看唯一值数量
print("唯一年龄数量:", df['年龄'].nunique())
print("唯一年龄列表:", df['年龄'].unique())
年龄
34 2
23 1
29 1
40 1
Name: count, dtype: int64
唯一年龄数量: 4
唯一年龄列表: [23 34 29 40]
value_counts()
默认按频次降序排列,支持参数 normalize=True
查看比例分布;
unique()
和 nunique()
可帮助识别重复值与分类数量,是数据清洗和特征工程中常用工具。
3. 相关性与协方差
在多变量数据分析中,研究不同变量之间的关系是非常关键的一步。相关性(correlation)用于衡量两个变量之间的线性关系强度和方向,而协方差(covariance)则反映它们是否存在同向或反向变化的趋势。
3.1 相关性分析
Pandas 提供了多种计算相关系数的方法,其中最常用的是皮尔逊(Pearson)相关系数,它适用于线性关系数据;斯皮尔曼(Spearman)相关系数则更稳健,适用于非线性关系或含异常值的数据。
# 皮尔逊相关系数(默认)
print("相关性矩阵:\n", df[['年龄','销售额']].corr())
# 斯皮尔曼相关系数
print("斯皮尔曼相关性:\n", df[['年龄','销售额']].corr(method='spearman'))
相关性矩阵:
年龄 销售额
年龄 1.000000 0.169813
销售额 0.169813 1.000000
斯皮尔曼相关性:
年龄 销售额
年龄 1.000000 0.051299
销售额 0.051299 1.000000
相关系数的取值范围在 -1 到 1 之间,越接近 ±1,线性关系越强;值接近 0 则说明两者关系较弱。
3.2 计算协方差
协方差用于判断两个变量是否存在同向或反向变化的趋势。若协方差为正,说明变量总体呈同向变化;若为负,则呈反向变化。不同于相关系数,协方差的数值依赖于变量的量纲,因此不便于直接比较。
print("协方差矩阵:\n", df[['年龄','销售额']].cov())
协方差矩阵:
年龄 销售额
年龄 40.5 40.0
销售额 40.0 1370.0
通过比较可知,相关系数是对协方差的标准化形式,更直观地揭示了变量之间的线性依赖关系。
4. 分组统计
在实际分析中,我们常常需要根据某个分类字段对数据进行分组统计,例如按年龄段计算销售额总和或平均值。此时可以使用 groupby
方法。以下示例展示了按年龄分组后的销售额汇总:
grouped = df.groupby('年龄')['销售额'].sum()
print(grouped)
年龄
23 100
29 200
34 310
40 130
Name: 销售额, dtype: int64
groupby
不仅可以实现单一统计指标的计算,还支持通过 agg()
方法对多个指标进行聚合。例如:
gr_agg = df.groupby('年龄').agg({'销售额':['mean','sum','count']})
print(gr_agg)
销售额
mean sum count
年龄
23 100.0 100 1
29 200.0 200 1
34 155.0 310 2
40 130.0 130 1
这种方式非常灵活,可同时计算多个统计指标,也可以实现多字段分组分析,如 groupby(['地区', '性别'])
。
5. 小结
- 基础统计:
mean
、sum
、max
、min
、describe
等帮助快速了解数据特征; - 频次与唯一值:
value_counts
、unique
、nunique
分析分类分布; - 变量关系分析:
corr
、cov
揭示数据之间的关联结构; - 分组聚合:
groupby
提供灵活的分层统计方式,是构建特征与业务指标的核心工具。
熟练运用这些方法,可以让我们在面对复杂的数据集时迅速发现规律、识别异常,并为后续的可视化、建模与预测提供坚实的分析支撑。