项目10 综合项目与期末考查
综合实战项目:超市经营数据分析
本项目是一个综合实战大项目,要求你运用前面学到的所有技能,完成一份完整的超市经营数据分析报告。
项目要求:
- 数据读取与清洗(处理缺失值、重复值、类型转换)
- 描述性统计分析(均值、中位数、标准差等)
- 数据透视表分析(按地区、品类、时间多维度汇总)
- 时间序列分析(月度趋势、同比环比)
- 数据可视化(至少3种不同类型的图表)
- 撰写分析结论与建议
综合项目数据集与参考代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# ========== 1. 创建综合超市数据集 ==========
np.random.seed(2024)
n = 2000
df = pd.DataFrame({
'订单号': [f'SA{i:06d}' for i in range(1, n+1)],
'日期': pd.date_range('2023-01-01', '2024-06-30', periods=n),
'客户ID': np.random.choice([f'V{i:04d}' for i in range(1, 501)], n),
'地区': np.random.choice(['华东', '华南', '华北', '西南', '西北'], n,
p=[0.30, 0.25, 0.20, 0.15, 0.10]),
'城市': np.random.choice(['上海', '广州', '北京', '成都', '西安', '杭州', '深圳', '武汉'], n),
'品类': np.random.choice(['生鲜', '食品', '饮料', '日用品', '家电', '服装'], n),
'销售额': np.random.randint(20, 3000, n),
'成本': np.random.randint(10, 2000, n),
'数量': np.random.randint(1, 15, n),
'支付方式': np.random.choice(['现金', '微信', '支付宝', '刷卡'], n)
})
# 引入一些缺失值和异常值用于清洗练习
df.loc[np.random.choice(df.index, 20, replace=False), '销售额'] = np.nan
df.loc[np.random.choice(df.index, 5, replace=False), '销售额'] = -100
df.loc[np.random.choice(df.index, 10, replace=False), '品类'] = np.nan
print("原始数据预览:")
print(df.head())
print(f"\n数据形状:{df.shape}")
# ========== 2. 数据清洗 ==========
print("\n【数据清洗】")
print(f"清洗前缺失值:\n{df.isnull().sum()}")
# 删除品类缺失的行
df = df.dropna(subset=['品类'])
# 销售额缺失用中位数填充
df['销售额'] = df['销售额'].fillna(df['销售额'].median())
# 销售额为负数的视为异常值,用中位数替换
df.loc[df['销售额'] < 0, '销售额'] = df['销售额'].median()
print(f"\n清洗后缺失值:\n{df.isnull().sum()}")
print(f"清洗后数据量:{len(df)}")
# 添加利润列
df['利润'] = df['销售额'] - df['成本']
df['利润率'] = (df['利润'] / df['销售额'] * 100).round(2)
# 日期解析
df['日期'] = pd.to_datetime(df['日期'])
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
df['年月'] = df['日期'].dt.strftime('%Y-%m')
# ========== 3. 描述性统计 ==========
print("\n【描述性统计】")
print(df[['销售额', '成本', '利润', '数量']].describe().round(2))
# ========== 4. 透视表分析 ==========
print("\n【地区 × 品类 销售额透视表】")
pt = df.pivot_table(values='销售额', index='地区', columns='品类',
aggfunc='sum', margins=True, fill_value=0)
print(pt)
# ========== 5. 时间序列分析 ==========
print("\n【月度销售趋势】")
monthly = df.groupby('年月')['销售额'].sum()
print(monthly.tail(10))
# ========== 6. 可视化 ==========
# 月度趋势图
plt.figure(figsize=(12, 5))
monthly.plot(kind='line', marker='o', color='#2563eb')
plt.title('月度销售额趋势', fontsize=14, fontweight='bold')
plt.ylabel('销售额(元)')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 品类销售额柱状图
cat_sales = df.groupby('品类')['销售额'].sum().sort_values(ascending=False)
plt.figure(figsize=(10, 5))
cat_sales.plot(kind='bar', color=['#2563eb', '#0ea5e9', '#8b5cf6', '#f59e0b', '#ef4444', '#10b981'])
plt.title('各品类销售额对比', fontsize=14, fontweight='bold')
plt.ylabel('销售额(元)')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
# 地区饼图
region_sales = df.groupby('地区')['销售额'].sum()
plt.figure(figsize=(8, 8))
plt.pie(region_sales, labels=region_sales.index, autopct='%1.1f%%', startangle=90)
plt.title('各地区销售额占比', fontsize=14, fontweight='bold')
plt.show()
期末考查说明
本试卷满分 100 分,其中理论题 40 分,实操题 60 分。请认真作答,全部完成后点击"提交试卷"按钮。
考查范围:数据读取与清洗、索引与选择、数据清洗、分组聚合、透视表、时间序列、数据可视化、综合应用。
练习1:RFM模型计算
基于超市经营数据,计算每个客户的 RFM 指标:R(Recency,最近一次购买距今天数)、F(Frequency,购买频次)、M(Monetary,累计消费金额)。使用 groupby() + agg() 一次性计算三个指标。
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案
练习2:客户分层
在 RFM 指标基础上,使用 pd.qcut() 给每个维度打 1-5 分,然后根据 R、F、M 的得分组合进行客户分层:重要价值客户、重要保持客户、新客户、重要挽留客户、一般客户,并为每类客户制定运营策略。
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案
练习3:输出分析结论
综合所有分析结果,输出一份完整的超市经营数据分析报告,包含数据概况、品类分析(找出明星和问题品类)、地区分析、客户价值分析(各层客户数量和贡献),以及核心结论与运营建议。
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案
参考答案汇总
一、选择题
1. B 2. B 3. B 4. B 5. C
二、判断题
6. 正确 7. 错误 8. 错误
三、填空题
9. mean 10. Q
四、实操题
详见各题提交后显示的参考答案。
项目小结
恭喜你完成了 Pandas 数据分析实战训练营的全部 10 个项目!
通过本课程,你掌握了以下核心技能:
- 数据读取与清洗(CSV/Excel、缺失值、重复值、异常值)
- 数据选择与过滤(索引、切片、条件筛选)
- 数据转换(新增列、类型转换、字符串处理)
- 分组聚合与透视表(groupby、pivot_table、crosstab)
- 时间序列分析(resample、rolling、同比环比)
- 数据可视化(Matplotlib、Seaborn、pandas 内置绘图)
- 综合实战(RFM 客户分析、电商销售分析、超市经营分析)
数据分析是一项需要不断实践的技能,希望你能在今后的学习和工作中多加练习,真正让数据为你所用!