1 实验环境
可自主选择开发工具
2 实验说明
实验:超市数据分析
2.1 实验目的
- 能够使用pandas分析数据
- 能够使用matplotlib制作统计图表
2.2 实验要求
2.2.1 按年份汇总各地区的销售量和利润总额; 绘制柱形图
结果样例:
2.2.2 统计各地区退货率,以柱形图展示
- 结果样例
2.2.3 用饼图汇总退货订单
- 结果样例:
2.3 实验报告
按照指定实验报告模版写
2.3.1 Word文档
- 文件命名格式: 内容_实验报告_姓名学号, 例如: 超市订单分析_实验报告_张三001
3 实验步骤
3.1 读取数据
In [1]:
3.2 预览数据
In [2]:
Out[2]:
ID | 订单 ID | 订单日期 | 发货日期 | 邮寄方式 | 客户 ID | 客户名称 | 细分 | 城市 | 省/自治区 | 地区 | 产品 ID | 类别 | 子类别 | 产品名称 | 销售额 | 数量 | 折扣 | 利润 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | US-2014-1357144 | 2014-04-28 | 2014-04-30 | 二级 | 曾惠-14485 | 曾惠 | 公司 | 杭州 | 浙江 | 华东 | 办公用-用品-10002717 | 办公用品 | 用品 | Fiskars 剪刀, 蓝色 | 129.696 | 2 | 0.4 | -60.704 |
1 | 2 | CN-2014-1973789 | 2014-06-16 | 2014-06-20 | 标准级 | 许安-10165 | 许安 | 消费者 | 内江 | 四川 | 西南 | 办公用-信封-10004832 | 办公用品 | 信封 | GlobeWeis 搭扣信封, 红色 | 125.440 | 2 | 0.0 | 42.560 |
In [3]:
Out[3]:
订单 ID | 退回 | |
---|---|---|
0 | CN-2012-1196810 | 是 |
1 | US-2012-3964185 | 是 |
In [4]:
Out[4]:
地区 | 地区经理 | |
---|---|---|
0 | 东北 | 楚杰 |
1 | 中南 | 范彩 |
3.3 任务一:按年份汇总各地区的销售量和利润总额; 绘制柱形图
由于订单日期是以日为单位的,所以处理以年汇总需要处理订单日期
3.3.1 处理订单日期
- 需要将订单日期处理只保留年份
- 使用apply()函数可以批量处理
3.3.2 按年份总汇销售额和利润
- groupby()函数按订单年份和地区分组
- sum()函数对销售额和利润求和
- unstack()函数生成交叉表
3.3.3 绘柱形图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定使用中文字符的字体,这里以“SimHei”为例
df = pd.read_excel('data/商品订单数据.xls','订单')#文件地址记得修改成自己的
df['订单日期'] = pd.to_datetime(df['订单日期'])
df['年'] = df['订单日期'].dt.year
sales_by_region = df.groupby(['年', '地区'])['利润'].sum()
sales_pivot = sales_by_region.reset_index().pivot(index='年', columns='地区', values='利润')
sales_pivot = sales_pivot[['东北', '中南', '华东', '华北', '西北', '西南']] # 地区名称按实际数据修改
sales_pivot = sales_pivot.sort_values('年')
# 设置颜色图例
colors = ['#FFA07A', '#87CEFA', '#98FB98', '#FFD700', '#9370DB', '#FFC0CB'] # 每个地区的颜色
ax = sales_pivot.plot(kind='bar', color=colors)
ax.legend(loc='upper left')
plt.show()
mport pandas as pd
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定使用中文字符的字体,这里以“SimHei”为例
df = pd.read_excel('data/商品订单数据.xls','订单')
df['订单日期'] = pd.to_datetime(df['订单日期'])
df['年'] = df['订单日期'].dt.year
sales_by_region = df.groupby(['年', '地区'])['销售额'].sum()
sales_pivot = sales_by_region.reset_index().pivot(index='年', columns='地区', values='销售额')
sales_pivot = sales_pivot[['东北', '中南', '华东', '华北', '西北', '西南']] # 地区名称按实际数据修改
sales_pivot = sales_pivot.sort_values('年')
# 设置颜色图例
colors = ['#FFA07A', '#87CEFA', '#98FB98', '#FFD700', '#9370DB', '#FFC0CB'] # 每个地区的颜色
ax = sales_pivot.plot(kind='bar', color=colors)
ax.legend(loc='upper left')
plt.show()
链接:https://pan.baidu.com/s/14IijPVkea8WfkcIZtylfcw?pwd=78dd
提取码:78dd
!!测试的数据!!
3.4 任务二: 统计各地区退货率,并绘图展示
3.4.1 将订单表的地区信息与退货表融合
注意:记录对应的是商品,所以要去除同一地区重复的订单ID
- drop_duplicates()函数可以去除重复数据
- merge()函数融合数据
3.4.2 汇总各地区的退货订单数量
- 按地区分组
- 根据订单ID统计退货订单数量 (count()函数可以统计)
- 对count()之后的数据处理为新的DataFrame(可以组装成字典再转DataFrame)会更好一些
3.4.3 按地区分组统计订单数
- 按地区分组
- 根据订单ID统计订单数量
3.4.4 计算退货率
- 各地区的退货订单数据除于订单总数
3.4.5 将销售人员表中的地区经理融合
3.4.6 绘图(柱形图和饼图)
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定使用中文字符的字体,这里以“SimHei”为例
# 读取订单、退货和销售人员附表
orders = pd.read_excel('data/商品订单数据.xls', sheet_name='订单')
returns = pd.read_excel('data/商品订单数据.xls', sheet_name='退货')
sales = pd.read_excel('data/商品订单数据.xls', sheet_name='销售人员')
# 统计每个地区对应的订单数量
order_counts = orders.groupby('地区')['订单ID'].nunique()
# 筛选出在退货表中出现的订单ID,并按地区分类汇总
return_orders = orders[orders['订单ID'].isin(returns['订单ID'])]
return_counts = return_orders.groupby('地区')['订单ID'].nunique()
# 计算每个地区的退货率,并将结果保存到一个新的 DataFrame 中
ratios = pd.DataFrame({'订单数': order_counts, '退货数': return_counts})
ratios['退货率'] = ratios['退货数'] / ratios['订单数']
# 根据销售人员中地区对应的销售人员进行互补配对
region_to_manager = sales.set_index('地区')['地区经理'].to_dict()
ratios['地区经理'] = ratios.index.map(region_to_manager)
# 将地区经理设置为索引,以便将其用作标签
ratios = ratios.set_index('地区经理')
# 绘制柱状图
ax = ratios.plot(kind='bar', y='退货率', legend=False)
plt.ylabel('退货率')
plt.title('各地区退货率统计')
# 修改纵坐标标签为销售经理
ax.set_xticklabels(ratios.index, rotation=0)
# 在每个柱形上显示数值
ax.yaxis.set_major_locator(MaxNLocator(integer=True))
for i, val in enumerate(ratios['退货率']):
ax.text(i, val, f'{val:.3f}', horizontalalignment='center', fontsize=8)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# 读取订单和退货表
orders = pd.read_excel('data/商品订单数据.xls', sheet_name='订单')
returns = pd.read_excel('data/商品订单数据.xls', sheet_name='退货')
sales = pd.read_excel('data/商品订单数据.xls', sheet_name='销售人员')
# 将销售人员表中地区对应的销售人员进行互补配对
region_to_manager = sales.set_index('地区')['地区经理'].to_dict()
# 筛选出在退货表中出现的订单ID,并按地区分类汇总
return_orders = orders[orders['订单ID'].isin(returns['订单ID'])]
return_counts = return_orders.groupby('地区')['订单ID'].nunique()
# 将地区名字替换为地区经理的名字
return_counts.index = return_counts.index.map(region_to_manager)
# 绘制饼图
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定使用中文字符的字体,这里以“SimHei”为例
plt.figure(figsize=(8, 8))
plt.pie(return_counts, labels=return_counts.index, autopct='%1.1f%%', startangle=90, counterclock=False)
# 设置标题
plt.title('汇总退货订单')
plt.show()