完整代码示例
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:整理分析结论,撰写一份简短的电商数据分析报告。