首页 > Pandas数据分析实战训练营 > 项目10 综合项目与期末考查

项目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 文件?
A. pd.read_csv()
B. pd.read_excel()
C. pd.read_json()
D. pd.read_html()
答案解析

pd.read_excel() 专门用于读取 Excel 文件。

第2题 选择题
df.groupby('品类')['销售额'].sum() 的作用是?
A. 计算所有销售额的总和
B. 按品类分组后计算每组的销售额总和
C. 计算每个品类的平均销售额
D. 按销售额排序
答案解析

groupby 按品类分组,然后对每组的销售额求和。

第3题 选择题
在透视表中,添加总计行和总计列的参数是?
A. total=True
B. margins=True
C. all=True
D. sum=True
答案解析

margins=True 会在透视表底部和右侧添加总计。

第4题 选择题
计算环比增长率应该使用哪个方法?
A. .diff()
B. .pct_change()
C. .shift(1)
D. .cumsum()
答案解析

pct_change() 计算当前值相对前一个值的变化百分比。

第5题 选择题
以下哪种图表最适合展示数据随时间的变化趋势?
A. 饼图
B. 柱状图
C. 折线图
D. 散点图
答案解析

折线图最适合展示数据随时间变化的趋势。

二、判断题(每题 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分)
参考答案

                    
第12题 实操题
分组聚合与透视表(20分)
请写出代码完成以下操作:
1. 按"地区"分组,计算每个地区的销售额总和和平均利润(8分)
2. 创建一个透视表:index='地区',columns='品类',values='销售额',aggfunc='sum',并添加总计(12分)
参考答案

                    
第13题 实操题
时间序列与可视化(20分)
假设 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 客户分析、电商销售分析、超市经营分析)

数据分析是一项需要不断实践的技能,希望你能在今后的学习和工作中多加练习,真正让数据为你所用!

← 上一项目:综合实战:销售数据分析报告 返回训练营首页 →