项目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 分。请认真作答,全部完成后点击"提交试卷"按钮。
考查范围:数据读取与清洗、索引与选择、数据清洗、分组聚合、透视表、时间序列、数据可视化、综合应用。
Pandas数据分析实战训练营 · 期末考查
满分 100 分
理论 40 分 + 实操 60 分
时间 90 分钟
一、选择题(每题 4 分,共 20 分)
第1题
选择题
以下哪个方法可以读取 Excel 文件?
答案解析
pd.read_excel() 专门用于读取 Excel 文件。
第2题
选择题
df.groupby('品类')['销售额'].sum() 的作用是?答案解析
groupby 按品类分组,然后对每组的销售额求和。
第3题
选择题
在透视表中,添加总计行和总计列的参数是?
答案解析
margins=True 会在透视表底部和右侧添加总计。
第4题
选择题
计算环比增长率应该使用哪个方法?
答案解析
pct_change() 计算当前值相对前一个值的变化百分比。
第5题
选择题
以下哪种图表最适合展示数据随时间的变化趋势?
答案解析
折线图最适合展示数据随时间变化的趋势。
二、判断题(每题 4 分,共 12 分)
第6题
判断题
df.dropna() 默认会删除包含任何缺失值的行。答案解析
dropna() 默认删除包含任何 NaN 的行,可以用 how='all' 改为只删除全空的行。
第7题
判断题
pd.crosstab() 默认的聚合方式是求和(sum)。答案解析
crosstab 默认统计频次(count),不是 sum。
第8题
判断题
在 RFM 模型中,R 值越大代表客户最近刚购买过,价值越高。
答案解析
R 是距今天数,越小越好。R 越大说明越久没购买。
三、填空题(每题 4 分,共 8 分)
第9题
填空题
在 pandas 中,
df['销售额'].______() 可以计算平均值。答案解析
mean() 是计算平均值的方法。
第10题
填空题
resample('______') 表示按季度进行重采样。答案解析
Q 代表 Quarter,按季度进行重采样。
四、实操题(每题 20 分,共 60 分)
第11题
实操题
数据清洗(20分)
给定以下 DataFrame,请写出代码完成以下操作:
1. 删除"品类"为空的行(5分)
2. 用中位数填充"销售额"的缺失值(5分)
3. 将"销售额"列中的负数替换为中位数(5分)
4. 将"日期"列转换为 datetime 类型(5分)
给定以下 DataFrame,请写出代码完成以下操作:
1. 删除"品类"为空的行(5分)
2. 用中位数填充"销售额"的缺失值(5分)
3. 将"销售额"列中的负数替换为中位数(5分)
4. 将"日期"列转换为 datetime 类型(5分)
参考答案
第12题
实操题
分组聚合与透视表(20分)
请写出代码完成以下操作:
1. 按"地区"分组,计算每个地区的销售额总和和平均利润(8分)
2. 创建一个透视表:index='地区',columns='品类',values='销售额',aggfunc='sum',并添加总计(12分)
请写出代码完成以下操作:
1. 按"地区"分组,计算每个地区的销售额总和和平均利润(8分)
2. 创建一个透视表:index='地区',columns='品类',values='销售额',aggfunc='sum',并添加总计(12分)
参考答案
第13题
实操题
时间序列与可视化(20分)
假设 df 已包含"日期"(datetime类型)和"销售额"列,请写出代码:
1. 按月汇总销售额,并计算月度环比增长率(10分)
2. 绘制月度销售额折线图(标题、坐标轴标签、网格线)(10分)
假设 df 已包含"日期"(datetime类型)和"销售额"列,请写出代码:
1. 按月汇总销售额,并计算月度环比增长率(10分)
2. 绘制月度销售额折线图(标题、坐标轴标签、网格线)(10分)
参考答案
0/100
参考答案汇总
一、选择题
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 客户分析、电商销售分析、超市经营分析)
数据分析是一项需要不断实践的技能,希望你能在今后的学习和工作中多加练习,真正让数据为你所用!