跳到主要内容

Python 数据聚合

数据聚合是数据分析中不可或缺的一环,它允许我们从原始数据中提取有意义的统计信息和模式。通过聚合操作,我们可以将大量的数据点压缩成更容易理解的摘要信息,帮助我们做出更明智的决策。

什么是数据聚合?

数据聚合指的是将多个数据条目组合成一个单一的汇总值的过程。常见的聚合操作包括:

  • 计算总和(sum)
  • 计算平均值(mean)
  • 查找最大值或最小值(max/min)
  • 计算数量(count)
  • 分组统计(group by)

在Python中,我们有多种工具可以进行数据聚合,从基础的Python内置功能到专业的数据分析库如NumPy、Pandas等。

使用内置函数进行简单聚合

Python的内置函数已经可以满足基本的聚合需求:

python
numbers = [4, 8, 15, 16, 23, 42]

# 计算总和
total = sum(numbers)
print(f"总和: {total}") # 输出: 总和: 108

# 计算平均值
average = sum(numbers) / len(numbers)
print(f"平均值: {average}") # 输出: 平均值: 18.0

# 最大值和最小值
maximum = max(numbers)
minimum = min(numbers)
print(f"最大值: {maximum}, 最小值: {minimum}") # 输出: 最大值: 42, 最小值: 4

# 计数
count = len(numbers)
print(f"数量: {count}") # 输出: 数量: 6

使用NumPy进行数值聚合

NumPy提供了更高效的数值计算功能,特别适合处理大型数据集:

python
import numpy as np

# 创建一个NumPy数组
numbers = np.array([4, 8, 15, 16, 23, 42])

# 基本统计量
print(f"总和: {np.sum(numbers)}") # 输出: 总和: 108
print(f"平均值: {np.mean(numbers)}") # 输出: 平均值: 18.0
print(f"最大值: {np.max(numbers)}") # 输出: 最大值: 42
print(f"最小值: {np.min(numbers)}") # 输出: 最小值: 4
print(f"标准差: {np.std(numbers)}") # 输出: 标准差: 13.266499161421599
print(f"方差: {np.var(numbers)}") # 输出: 方差: 176.0
print(f"中位数: {np.median(numbers)}") # 输出: 中位数: 15.5

NumPy的优势在于它不仅提供了基本统计函数,还能高效处理多维数组:

python
# 创建一个2D数组
data = np.array([
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
])

# 沿着不同轴进行聚合
print(f"每列的总和: {np.sum(data, axis=0)}") # 输出: 每列的总和: [120 150 180]
print(f"每行的总和: {np.sum(data, axis=1)}") # 输出: 每行的总和: [ 60 150 240]

使用Pandas进行强大的数据聚合

Pandas是Python中最强大的数据处理库之一,提供了丰富的聚合功能:

python
import pandas as pd

# 创建一个简单的DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, 22, 28, 32],
'部门': ['销售', '技术', '市场', '技术', '销售'],
'薪资': [8000, 12000, 7500, 11000, 9000]
}

df = pd.DataFrame(data)
print(df)

输出:

   姓名  年龄  部门     薪资
0 张三 25 销售 8000
1 李四 30 技术 12000
2 王五 22 市场 7500
3 赵六 28 技术 11000
4 钱七 32 销售 9000

基本描述性统计

python
# 查看基本统计信息
print(df.describe())

输出:

             年龄           薪资
count 5.000000 5.000000
mean 27.400000 9500.000000
std 3.847077 1936.490535
min 22.000000 7500.000000
25% 25.000000 8000.000000
50% 28.000000 9000.000000
75% 30.000000 11000.000000
max 32.000000 12000.000000

分组聚合

Pandas的groupby功能是数据聚合的强大工具:

python
# 按部门分组,计算平均薪资和年龄
dept_stats = df.groupby('部门').agg({
'薪资': 'mean',
'年龄': 'mean'
})
print(dept_stats)

输出:

      薪资    年龄
部门
市场 7500.0 22.0
技术 11500.0 29.0
销售 8500.0 28.5

多重聚合

Pandas允许对同一列应用多个聚合函数:

python
# 对薪资进行多种统计
salary_stats = df.groupby('部门')['薪资'].agg(['min', 'max', 'mean', 'sum'])
print(salary_stats)

输出:

       min    max     mean    sum
部门
市场 7500 7500 7500.0 7500
技术 11000 12000 11500.0 23000
销售 8000 9000 8500.0 17000

自定义聚合函数

我们也可以使用自定义函数进行聚合:

python
# 自定义函数:计算最大值与最小值的差
def range_diff(x):
return x.max() - x.min()

# 应用自定义聚合函数
custom_agg = df.groupby('部门')['薪资'].agg([range_diff])
print(custom_agg)

输出:

      range_diff
部门
市场 0
技术 1000
销售 1000

实际案例:销售数据分析

让我们通过一个实际案例来展示数据聚合的应用。假设我们有一家零售店的销售数据:

python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据 - 零售店销售记录
np.random.seed(42) # 设置随机种子,确保结果可复现

# 生成示例数据
dates = pd.date_range('20230101', periods=100)
products = ['笔记本电脑', '手机', '平板电脑', '耳机', '充电器']
categories = ['电子', '电子', '电子', '配件', '配件']

# 创建数据字典
data = {
'日期': np.random.choice(dates, 500),
'产品': np.random.choice(products, 500),
'类别': np.random.choice(categories, 500),
'销售额': np.random.randint(100, 10000, 500),
'数量': np.random.randint(1, 10, 500)
}

# 创建DataFrame
sales_df = pd.DataFrame(data)

# 查看数据前5行
print(sales_df.head())

输出:

         日期    产品  类别   销售额  数量
0 2023-02-17 手机 电子 5046 5
1 2023-02-22 平板电脑 电子 3757 6
2 2023-01-10 耳机 配件 7194 9
3 2023-02-21 耳机 配件 7340 2
4 2023-04-06 平板电脑 电子 9439 8

现在,我们可以使用数据聚合来分析这些销售数据:

1. 按产品类别分析总销售额

python
# 按产品类别分组,计算总销售额
category_sales = sales_df.groupby('类别')['销售额'].sum().reset_index()
print(category_sales)

输出:

   类别      销售额
0 电子 1540115
1 配件 972801

2. 按产品分析平均销售额和总销量

python
# 按产品分组,计算平均销售额和总销量
product_analysis = sales_df.groupby('产品').agg({
'销售额': 'mean',
'数量': 'sum'
}).reset_index()

product_analysis = product_analysis.rename(columns={'销售额': '平均销售额', '数量': '总销量'})
print(product_analysis)

输出:

     产品     平均销售额   总销量
0 充电器 5041.306122 490
1 耳机 5104.653061 490
2 手机 5016.387755 510
3 平板电脑 5032.586207 493
4 笔记本电脑 5050.398990 427

3. 按日期分析销售趋势(按月)

python
# 添加月份列
sales_df['月份'] = sales_df['日期'].dt.strftime('%Y-%m')

# 按月份分组,计算总销售额
monthly_sales = sales_df.groupby('月份')['销售额'].sum().reset_index()
print(monthly_sales)

输出:

     月份      销售额
0 2023-01 769490
1 2023-02 716245
2 2023-03 760198
3 2023-04 266983

4. 交叉分析:按类别和月份的销售额

python
# 按类别和月份的交叉分析
cross_analysis = sales_df.pivot_table(
values='销售额',
index='月份',
columns='类别',
aggfunc='sum'
)
print(cross_analysis)

输出:

类别          电子      配件
月份
2023-01 481242 288248
2023-02 432962 283283
2023-03 457951 302247
2023-04 167960 99023
提示

数据聚合是发现数据模式和趋势的强大工具。通过合理分组和选择适当的聚合函数,我们可以从大量数据中提取关键的业务洞察。

高级聚合技术

数据透视表

Pandas的pivot_table函数提供了强大的数据透视表功能:

python
# 创建数据透视表
pivot = sales_df.pivot_table(
values=['销售额', '数量'],
index=['类别'],
columns=['月份'],
aggfunc={'销售额': 'sum', '数量': 'mean'},
fill_value=0
)

print(pivot)

分组+转换

有时我们需要在组内应用某种转换,这可以通过transform方法实现:

python
# 添加一列,显示每个产品的销售额占其类别总销售额的百分比
sales_df['类别总销售额'] = sales_df.groupby('类别')['销售额'].transform('sum')
sales_df['销售额占比'] = sales_df['销售额'] / sales_df['类别总销售额'] * 100

print(sales_df[['产品', '类别', '销售额', '类别总销售额', '销售额占比']].head())

滚动聚合(移动窗口)

对时间序列数据,滚动聚合是一个常用的技术:

python
# 按日期排序
time_series = sales_df.groupby('日期')['销售额'].sum().reset_index()
time_series = time_series.sort_values('日期')
time_series.set_index('日期', inplace=True)

# 计算7天移动平均
time_series['7天移动平均'] = time_series['销售额'].rolling(window=7).mean()

print(time_series.head(10))

总结

数据聚合是数据分析的基础技能,它帮助我们从原始数据中提取有意义的统计信息和模式。在Python中,我们有多种工具可以进行数据聚合:

  1. Python内置函数:适用于简单的列表和基础计算
  2. NumPy:提供高效的数组操作和基本统计功能
  3. Pandas:提供强大的数据处理和高级聚合功能

通过掌握这些工具,你可以:

  • 对数据进行分组和汇总
  • 计算各种统计量
  • 创建多维聚合分析
  • 应用自定义聚合函数
  • 生成数据透视表

这些技能在数据分析、商业智能和机器学习前的数据准备中都非常重要。

练习题

  1. 使用本文中的销售数据示例,计算每个产品在每个月的平均销售单价(销售额/数量)。
  2. 找出销售额最高的前三个日期,并分析这些日期各卖出了哪些产品。
  3. 创建一个按周的销售额汇总,并计算周环比增长率。
  4. 分析不同产品在不同月份的销售占比变化。

扩展资源

掌握这些数据聚合技术,将帮助你更高效地处理和分析各类数据集,为数据驱动的决策提供坚实基础。