首页 > Pandas数据分析实战训练营 > 项目9 电商销售数据分析实战

项目9 电商销售数据分析实战

学习目标

  • 完成从数据读取到分析报告的完整流程
  • 掌握 RFM 客户价值分析模型
  • 学会销售趋势分析和预测思路
  • 掌握品类分析和地区分析的方法
  • 能够撰写一份完整的电商数据分析报告

知识点讲解

1. 什么是 RFM 模型?

RFM 是客户价值分析的经典模型,三个字母分别代表:

  • R(Recency):最近一次购买距今天数,越近越好
  • F(Frequency):购买频次,越多越好
  • M(Monetary):累计消费金额,越多越好

根据 RFM 三个维度给客户打分,可以把客户分成不同群体:重要价值客户、重要保持客户、新客户、流失客户等。

2. 销售趋势分析

通过时间序列分析,观察销售额的月度/季度变化,识别旺季和淡季,为库存和营销决策提供依据。

3. 品类分析

分析各品类的销售额、销量、利润贡献,找出"明星品类"和"问题品类"。

4. 地区分析

按地区汇总销售数据,识别核心市场和潜力市场。

完整代码示例

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(42) n = 1000 # 生成订单数据 orders = pd.DataFrame({ '订单号': [f'ORD{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'C{i:04d}' for i in range(1, 201)], n), '地区': np.random.choice(['华东', '华南', '华北', '西南', '西北'], n), '品类': np.random.choice(['手机', '电脑', '服装', '食品', '家居'], n), '销售额': np.random.randint(50, 5000, n), '数量': np.random.randint(1, 10, n) }) print("数据概览:") print(orders.head(10)) print(f"\n数据形状:{orders.shape}") print(f"\n数据时间范围:{orders['日期'].min()} 至 {orders['日期'].max()}") # ========== 2. 数据清洗 ========== print("\n【数据清洗】") print(f"缺失值数量:{orders.isnull().sum().sum()}") print(f"重复订单数:{orders['订单号'].duplicated().sum()}") # 日期解析 orders['日期'] = pd.to_datetime(orders['日期']) orders['年份'] = orders['日期'].dt.year orders['月份'] = orders['日期'].dt.month orders['年月'] = orders['日期'].dt.strftime('%Y-%m') # ========== 3. 整体销售概况 ========== print("\n【整体销售概况】") print(f"总订单数:{len(orders)}") print(f"总销售额:{orders['销售额'].sum():,.0f} 元") print(f"平均客单价:{orders['销售额'].mean():.2f} 元") print(f"总销量:{orders['数量'].sum()} 件") # ========== 4. 销售趋势分析 ========== print("\n【月度销售趋势】") monthly = orders.groupby('年月')['销售额'].sum() print(monthly.tail(10)) # 画趋势图 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() # ========== 5. 品类分析 ========== print("\n【品类销售分析】") category = orders.groupby('品类').agg({ '销售额': 'sum', '数量': 'sum', '订单号': 'count' }).rename(columns={'订单号': '订单数'}) category['销售额占比'] = (category['销售额'] / category['销售额'].sum() * 100).round(2) category = category.sort_values('销售额', ascending=False) print(category) # 品类柱状图 plt.figure(figsize=(10, 5)) category['销售额'].plot(kind='bar', color=['#2563eb', '#0ea5e9', '#8b5cf6', '#f59e0b', '#ef4444']) plt.title('各品类销售额对比', fontsize=14, fontweight='bold') plt.ylabel('销售额(元)') plt.xticks(rotation=0) plt.tight_layout() plt.show() # ========== 6. 地区分析 ========== print("\n【地区销售分析】") region = orders.groupby('地区')['销售额'].sum().sort_values(ascending=False) print(region) # 地区饼图 plt.figure(figsize=(8, 8)) plt.pie(region, labels=region.index, autopct='%1.1f%%', startangle=90) plt.title('各地区销售额占比', fontsize=14, fontweight='bold') plt.show() # ========== 7. RFM 客户分析 ========== print("\n【RFM 客户价值分析】") # 计算 RFM 指标 analysis_date = orders['日期'].max() + pd.Timedelta(days=1) rfm = orders.groupby('客户ID').agg({ '日期': lambda x: (analysis_date - x.max()).days, # Recency '订单号': 'count', # Frequency '销售额': 'sum' # Monetary }).rename(columns={'日期': 'R', '订单号': 'F', '销售额': 'M'}) print("RFM 指标预览:") print(rfm.head(10)) # RFM 打分(按五分位) rfm['R_score'] = pd.qcut(rfm['R'], 5, labels=[5,4,3,2,1]) # R越小越好,所以倒序 rfm['F_score'] = pd.qcut(rfm['F'].rank(method='first'), 5, labels=[1,2,3,4,5]) rfm['M_score'] = pd.qcut(rfm['M'].rank(method='first'), 5, labels=[1,2,3,4,5]) # 合并 RFM 得分 rfm['RFM_score'] = rfm['R_score'].astype(str) + rfm['F_score'].astype(str) + rfm['M_score'].astype(str) print("\nRFM 打分预览:") print(rfm[['R', 'F', 'M', 'R_score', 'F_score', 'M_score', 'RFM_score']].head(10)) # 客户分层(简化版) def rfm_segment(row): r, f, m = int(row['R_score']), int(row['F_score']), int(row['M_score']) if r >= 4 and f >= 4 and m >= 4: return '重要价值客户' elif r >= 3 and f >= 3 and m >= 3: return '重要保持客户' elif r >= 4 and f <= 2: return '新客户' elif r <= 2 and f >= 3: return '重要挽留客户' else: return '一般客户' rfm['客户类型'] = rfm.apply(rfm_segment, axis=1) print("\n客户分层统计:") print(rfm['客户类型'].value_counts()) # 客户类型饼图 plt.figure(figsize=(8, 8)) rfm['客户类型'].value_counts().plot(kind='pie', autopct='%1.1f%%', startangle=90) plt.title('客户价值分层', fontsize=14, fontweight='bold') plt.ylabel('') plt.show() # ========== 8. 输出分析报告摘要 ========== print("\n" + "="*50) print("【电商销售数据分析报告摘要】") print("="*50) print(f"1. 数据期间:{orders['日期'].min().strftime('%Y-%m-%d')} 至 {orders['日期'].max().strftime('%Y-%m-%d')}") print(f"2. 总销售额:{orders['销售额'].sum():,.0f} 元,订单数:{len(orders)} 单") print(f"3. 最畅销品类:{category.index[0]},销售额 {category.iloc[0]['销售额']:,.0f} 元") print(f"4. 最大市场:{region.index[0]},占比 {region.iloc[0]/region.sum()*100:.1f}%") print(f"5. 客户总数:{rfm.shape[0]} 人") print(f"6. 重要价值客户:{(rfm['客户类型']=='重要价值客户').sum()} 人,是核心维护对象") print("="*50)

实操步骤

步骤1:新建 Notebook,运行数据生成代码,创建 1000 条电商订单数据。

步骤2:进行数据清洗:检查缺失值、重复值,解析日期,提取年份、月份。

步骤3:计算整体销售概况:总销售额、平均客单价、总订单数。

步骤4:按月汇总销售额,画出折线图,观察销售趋势,找出旺季和淡季。

步骤5:按品类分组汇总,计算各品类的销售额、销量、订单数和占比,画出柱状图。

步骤6:按地区分组汇总,画出饼图,观察各地区市场份额。

步骤7:计算每个客户的 R、F、M 指标,用 qcut 打分,进行客户分层。

步骤8:统计各客户类型的数量和占比,画出饼图,识别核心客户群体。

步骤9:整理分析结论,撰写一份简短的电商数据分析报告。

项目9 配套练习
0/7
第1题 选择题
RFM 模型中的 "F" 代表什么?
A. 最近一次购买时间
B. 购买频次
C. 累计消费金额
D. 客户注册时间
答案解析

F = Frequency,代表客户的购买频次。

第2题 选择题
在 RFM 模型中,R 值越小代表什么?
A. 客户越久远没购买
B. 客户最近刚购买过
C. 客户消费金额越少
D. 客户购买频次越低
答案解析

R 是距今天数,越小说明客户最近刚购买过,价值越高。

第3题 选择题
给客户 RFM 打分时,通常使用什么方法把客户分成5档?
A. groupby
B. qcut
C. cut
D. pivot_table
答案解析

qcut 按分位数切分,保证每档客户数量大致相等,是 RFM 打分的标准做法。

第4题 选择题
以下哪个指标可以反映客户的"忠诚度"?
A. R(最近一次购买)
B. F(购买频次)
C. M(消费金额)
D. 客单价
答案解析

购买频次 F 越高,说明客户越频繁地回来购买,忠诚度越高。

第5题 判断题
在 RFM 打分中,R 的分数越高代表客户越有价值。
正确
错误
答案解析

R 是距今天数,数值越小越好。所以打分时要倒序:pd.qcut(rfm['R'], 5, labels=[5,4,3,2,1])。

第6题 填空题
RFM 模型中,M 代表客户的累计 ______ 。
答案解析

M = Monetary,代表客户的累计消费金额。

第7题 判断题
电商数据分析报告中,品类分析可以帮助我们找出哪些产品卖得好、哪些需要优化。
正确
错误
答案解析

品类分析是电商分析的核心内容之一,能指导选品和库存决策。

0/7

项目小结

本项目我们完成了一次完整的电商数据分析实战:

  • 数据清洗:处理缺失值、重复值,解析日期,提取时间特征。
  • 销售趋势:按月汇总,识别旺季淡季,为运营决策提供依据。
  • 品类分析:找出明星品类和问题品类,指导选品策略。
  • 地区分析:识别核心市场和潜力市场,优化区域投放。
  • RFM 分析:通过 R(最近购买)、F(频次)、M(金额)三个维度给客户打分分层。
  • 客户分层:识别重要价值客户、重要保持客户、新客户、流失客户等群体。

一份好的数据分析报告,不仅要有数据,更要有结论和行动建议。记住:数据分析的最终目的是辅助决策!

← 上一项目:数据可视化入门 下一项目:综合实战:客户价值分析 →