1. 项目背景与数据准备
电商数据分析是每个运营团队和产品经理必备的核心技能。作为从业多年的数据分析师,我经常需要处理来自不同平台的销售数据。这次我们以某服装电商平台的季度销售数据为例,这个数据集包含了超过10万条交易记录,时间跨度为2022年Q3-Q4。
提示:在实际工作中,电商数据通常以CSV或Excel格式提供,字段可能包含:订单ID、用户ID、商品ID、购买数量、单价、总价、下单时间、支付方式、配送地区等。
数据获取后,第一步永远是数据清洗。我通常会创建一个名为data_cleaning.py的预处理脚本:
python复制import pandas as pd
import numpy as np
# 读取原始数据
df = pd.read_csv('sales_data_raw.csv', encoding='gbk')
# 处理缺失值
df['price'] = df['price'].fillna(df['price'].median())
df['category'] = df['category'].fillna('其他')
# 转换日期格式
df['order_date'] = pd.to_datetime(df['order_date'])
# 删除测试订单
df = df[~df['user_id'].str.startswith('test')]
# 保存清洗后数据
df.to_csv('sales_data_clean.csv', index=False)
这个清洗过程解决了几个常见问题:
- 价格字段存在缺失值,用中位数填充更稳健
- 商品类目缺失的记录归类为"其他"
- 日期格式标准化便于后续时间序列分析
- 过滤测试账号产生的干扰数据
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础销售指标分析
2.1 核心KPI计算
电商分析最基础的三个指标是GMV、订单量和转化率。我们用pandas快速计算这些指标:
python复制# 计算季度GMV
gmv = df['payment'].sum() / 10000 # 转换为万元
print(f"季度GMV: {gmv:.2f}万元")
# 计算订单量
order_count = df['order_id'].nunique()
print(f"总订单量: {order_count}笔")
# 计算客单价
avg_order_value = gmv * 10000 / order_count
print(f"平均客单价: {avg_order_value:.2f}元")
在我的实际分析中,发现周末的客单价会比工作日高出15%-20%。这个洞察促使运营团队调整了周末的促销策略。
2.2 商品维度分析
商品分析需要多维度交叉查看。我常用的分析模板:
python复制# 按商品类目分析
category_analysis = df.groupby('category').agg({
'order_id': 'nunique',
'payment': 'sum',
'product_id': 'count'
}).rename(columns={
'order_id': '订单数',
'payment': '销售额',
'product_id': '销量'
})
# 计算贡献度
category_analysis['销售额占比'] = category_analysis['销售额'] / category_analysis['销售额'].sum()
category_analysis.sort_values('销售额', ascending=False, inplace=True)
# 输出TOP10类目
print(category_analysis.head(10))
这个分析揭示了一个有趣现象:虽然女装类目销售额最高,但配饰类目的转化率却是其2.3倍。这为优化商品展示顺序提供了依据。
3. 用户行为深度分析
3.1 RFM模型实现
RFM是电商用户分群的黄金标准。以下是Python实现:
python复制# 计算RFM指标
now = df['order_date'].max() + pd.Timedelta(days=1)
rfm = df.groupby('user_id').agg({
'order_date': lambda x: (now - x.max()).days, # Recency
'order_id': 'nunique', # Frequency
'payment': 'sum' # Monetary
}).rename(columns={
'order_date': 'R',
'order_id': 'F',
'payment': 'M'
})
# 分箱评分
rfm['R_score'] = pd.qcut(rfm['R'], 5, labels=[5,4,3,2,1])
rfm['F_score'] = pd.qcut(rfm['F'], 5, labels=[1,2,3,4,5])
rfm['M_score'] = pd.qcut(rfm['M'], 5, labels=[1,2,3,4,5])
# 组合RFM分数
rfm['RFM'] = rfm['R_score'].astype(str) + rfm['F_score'].astype(str) + rfm['M_score'].astype(str)
# 定义用户分层
def rfm_segment(row):
if row['RFM'] == '555': return '超级用户'
elif row['R_score'] >=4 and row['F_score'] >=4: return '高价值用户'
elif row['R_score'] <=2: return '流失风险用户'
else: return '普通用户'
rfm['segment'] = rfm.apply(rfm_segment, axis=1)
通过这个分析,我们识别出占总用户数8%的"超级用户"贡献了42%的GMV。针对这部分用户,我们设计了专属的VIP服务方案。
3.2 复购率分析
复购率是衡量用户忠诚度的重要指标:
python复制# 计算用户购买次数分布
user_orders = df.groupby('user_id')['order_id'].nunique().value_counts().sort_index()
# 计算复购率
repeat_rate = 1 - user_orders[1] / user_orders.sum()
# 可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
user_orders.plot(kind='bar')
plt.title('用户购买频次分布')
plt.xlabel('购买次数')
plt.ylabel('用户数')
plt.show()
分析发现,3个月内复购率达到37%,但第二次购买后流失率显著降低。这验证了"新客首单-二次转化-忠实用户"的运营路径有效性。
4. 时间序列与预测模型
4.1 销售趋势分析
使用resample方法可以灵活分析不同时间粒度:
python复制# 按周分析销售趋势
weekly_sales = df.set_index('order_date')['payment'].resample('W').sum()
plt.figure(figsize=(12,6))
weekly_sales.plot()
plt.title('周销售额趋势')
plt.ylabel('销售额(元)')
plt.grid()
plt.show()
这张趋势图清晰显示了11.11当周的销售峰值,以及后续两周的"透支效应"。建议未来大促后应加强留存运营。
4.2 使用Prophet进行销售预测
Facebook的Prophet库非常适合电商预测:
python复制from prophet import Prophet
# 准备数据
forecast_df = weekly_sales.reset_index()
forecast_df.columns = ['ds', 'y']
# 创建模型
model = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
changepoint_prior_scale=0.05
)
model.fit(forecast_df)
# 预测未来12周
future = model.make_future_dataframe(periods=12, freq='W')
forecast = model.predict(future)
# 可视化
fig = model.plot(forecast)
plt.title('未来12周销售预测')
plt.show()
预测结果显示,如果不采取干预措施,Q1销售额可能环比下降18%。基于此,市场部提前策划了春季新品上市计划。
5. 地理分析与可视化
5.1 地区销售热力图
使用pyecharts创建交互式地图:
python复制from pyecharts import options as opts
from pyecharts.charts import Map
# 按省份汇总
province_sales = df.groupby('province')['payment'].sum().sort_values(ascending=False)
# 转换为列表格式
data = [(province, int(sales)) for province, sales in province_sales.items()]
# 创建地图
c = (
Map()
.add("销售额", data, "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="各省销售额分布"),
visualmap_opts=opts.VisualMapOpts(max_=200000)
)
)
c.render("province_sales.html")
地图显示华东地区贡献了62%的销售额,而西北地区渗透率不足。我们据此调整了区域广告投放预算。
5.2 城市层级分析
更细粒度的城市分析:
python复制# 计算各城市指标
city_stats = df.groupby('city').agg({
'user_id': 'nunique',
'payment': ['sum', 'mean']
})
city_stats.columns = ['用户数', '总销售额', '客单价']
# 筛选重点城市
key_cities = city_stats[city_stats['用户数'] > 100].sort_values('总销售额', ascending=False)
发现某些三四线城市的客单价甚至超过一线城市,这与传统认知相悖。深入分析后发现,这些城市的高端消费群体被严重低估。
6. 商品关联分析
6.1 购物篮分析
使用mlxtend库挖掘商品关联规则:
python复制from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
# 准备交易数据
transactions = df.groupby('order_id')['product_name'].apply(list).values.tolist()
# 编码转换
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df_encoded = pd.DataFrame(te_ary, columns=te.columns_)
# 挖掘频繁项集
frequent_itemsets = apriori(df_encoded, min_support=0.01, use_colnames=True)
# 提取关联规则
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.2)
rules.sort_values('confidence', ascending=False, inplace=True)
# 输出强关联规则
print(rules[rules['lift'] > 2].head(10))
发现"衬衫+领带"的组合购买概率是随机购买的4.3倍,于是我们优化了商品详情页的交叉推荐逻辑。
6.2 商品聚类分析
通过K-Means对商品进行分类:
python复制from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 准备商品特征
product_features = df.groupby('product_id').agg({
'price': 'mean',
'order_id': 'nunique',
'user_id': 'nunique'
}).rename(columns={
'order_id': '销量',
'user_id': '购买人数'
})
# 标准化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(product_features)
# 肘部法则确定K值
inertia = []
for k in range(1, 10):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(scaled_features)
inertia.append(kmeans.inertia_)
# 可视化
plt.plot(range(1,10), inertia, marker='o')
plt.xlabel('聚类数量')
plt.ylabel('SSE')
plt.show()
最终将商品分为5个类别:高客单低频、低客单高频、中等均衡型等,为精细化运营提供了基础。
7. 完整分析报告生成
7.1 使用Jupyter Notebook整合分析
我习惯用Jupyter Notebook整合完整分析流程:
python复制# 安装必要扩展
!pip install jupyter_contrib_nbextensions
!jupyter contrib nbextension install --user
# 启用模板功能
from IPython.display import HTML, display
def create_section(title, content):
display(HTML(f"<h2 style='color:#2e86c1'>{title}</h2>"))
display(HTML(f"<div style='margin-left:20px'>{content}</div>"))
# 示例使用
create_section("核心发现", "<li>周末客单价高15-20%</li><li>超级用户贡献42%GMV</li>")
7.2 自动化报告输出
使用Jinja2模板生成PDF报告:
python复制from jinja2 import Environment, FileSystemLoader
import pdfkit
# 准备数据上下文
context = {
'gmv': f"{gmv:.2f}",
'top_products': category_analysis.head(5).to_html(),
'key_insights': [
"配饰类目转化率是女装的2.3倍",
"华东地区贡献62%销售额",
"3个月内复购率37%"
]
}
# 渲染模板
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('report_template.html')
html_out = template.render(context)
# 生成PDF
pdfkit.from_string(html_out, 'sales_report.pdf')
这个自动化流程将分析时间从原来的3天缩短到4小时,极大提升了工作效率。
8. 实际应用中的经验总结
在多个电商数据分析项目中,我总结了几个关键经验:
-
数据质量优先原则:曾有一个项目因未处理测试数据,导致GMV被高估23%。现在我会先用
df.sample(10)随机抽查原始数据。 -
指标口径一致性:不同部门对"活跃用户"的定义可能不同,必须明确定义每个指标的计算逻辑。
-
可视化陷阱:避免使用误导性的坐标轴截断。我曾因纵坐标不从零开始,导致趋势被夸大,误导了决策。
-
模型可解释性:业务团队更信任能解释的简单模型。即使XGBoost准确率更高,我仍经常使用线性回归+特征重要性分析。
-
分析节奏把控:不要陷入"分析瘫痪"。设定明确的阶段性交付目标,比如"先用3天产出核心指标报告"。
这套分析方法已成功应用于多个年GMV过亿的电商项目,帮助客户识别了价值200万以上的运营优化机会。最令我自豪的是,通过RFM分析发现的用户分层策略,使某客户的用户留存率提升了17个百分点。
