手把手教你用Pandas+Sklearn搞定电商广告数据清洗与聚类分析(附完整代码与避坑点)
·
电商广告数据清洗与聚类分析实战:从数据混乱到商业洞察的完整指南
当面对近千条来自不同渠道的广告投放数据时,大多数新手分析师的第一反应往往是手足无措。日均UV、注册率、搜索量、转化率等十几个维度的数据交织在一起,就像一团乱麻。本文将带你用Python的Pandas和Sklearn工具包,一步步完成从原始数据到商业洞察的全过程。这不是一个简单的技术演示,而是一个真实商业场景下的完整解决方案。
1. 数据准备与环境搭建
在开始分析之前,我们需要确保环境配置正确。以下是推荐的基础配置:
# 基础工具包导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 可视化设置
plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
电商广告数据通常包含以下典型字段:
| 字段类型 | 示例字段 | 数据处理方式 |
|---|---|---|
| 数值型 | 日均UV、注册率 | 标准化处理 |
| 类别型 | 广告类型、素材类型 | 独热编码 |
| 文本型 | 广告卖点 | 可能需要特殊处理 |
| 混合型 | 广告尺寸 | 可能需要拆分处理 |
常见踩坑点:
- 未检查Python包版本导致的API不兼容
- 忽略中文字符显示设置
- 未提前规划好项目目录结构
建议在项目开始时创建清晰的目录结构: /data - 存放原始数据 /output - 保存处理结果 /figures - 存储生成的可视化图表
2. 数据审查与质量诊断
加载数据后的第一步不是立即开始分析,而是全面了解数据的健康状况。以下是系统化的数据审查流程:
# 加载数据
raw_data = pd.read_csv('./data/ad_performance.csv')
# 基础审查三板斧
print("数据概览:")
print(raw_data.head(3))
print("\n数据类型分布:")
print(raw_data.info())
print("\n数值描述统计:")
print(raw_data.describe().round(2))
数据质量问题通常表现为以下几种形式:
- 缺失值问题:
missing_values = raw_data.isnull().sum()
print("缺失值统计:")
print(missing_values[missing_values > 0])
- 异常值检测:
# 使用箱线图检测异常值
numeric_cols = ['日均UV', '平均注册率', '订单转化率']
raw_data[numeric_cols].plot(kind='box', subplots=True, layout=(1,3), figsize=(12,4))
plt.tight_layout()
plt.savefig('./figures/boxplot_outliers.png')
- 数据一致性检查:
# 检查类别变量的取值一致性
categorical_cols = ['素材类型', '广告类型', '合作方式']
for col in categorical_cols:
print(f"{col}的唯一值:{raw_data[col].unique()}")
关键决策点:
- 缺失值处理:删除、填充还是保留?
- 异常值处理:修正、删除还是保留?
- 数据转换:是否需要对数变换、分箱等处理?
3. 数据预处理实战技巧
3.1 缺失值处理的五种策略
根据数据特性选择适当的缺失值处理方法:
| 策略 | 适用场景 | 代码实现 |
|---|---|---|
| 删除记录 | 缺失比例低且随机 | data.dropna() |
| 填充固定值 | 业务逻辑明确 | data.fillna(value) |
| 填充统计量 | 数值型变量 | data.fillna(data.mean()) |
| 模型预测 | 复杂缺失模式 | 使用KNN或随机森林预测 |
| 保留缺失 | 缺失本身有意义 | 转换为特殊类别 |
# 示例:多种填充方式组合应用
raw_data['日均UV'] = raw_data['日均UV'].fillna(raw_data['日均UV'].median())
raw_data['广告类型'] = raw_data['广告类型'].fillna('未知')
3.2 类别变量编码的进阶方法
除了基础的独热编码,还有多种处理类别变量的方法:
# 方法1:经典独热编码
ohe = OneHotEncoder(sparse=False)
type_encoded = ohe.fit_transform(raw_data[['广告类型']])
# 方法2:Pandas的get_dummies
type_dummies = pd.get_dummies(raw_data['广告类型'], prefix='type')
# 方法3:目标编码(适用于有监督学习)
# 需要先计算每个类别的目标变量均值
类别变量处理的黄金法则:
- 低基数变量(<10个类别):优先考虑独热编码
- 高基数变量:考虑目标编码或频率编码
- 有序类别:使用数值映射保留顺序信息
3.3 数据标准化的选择与实现
不同标准化方法的对比:
| 方法 | 公式 | 适用场景 | Sklearn类 |
|---|---|---|---|
| MinMax | (x-min)/(max-min) | 数据有明确边界 | MinMaxScaler |
| Z-Score | (x-μ)/σ | 数据分布近似正态 | StandardScaler |
| Robust | (x-median)/IQR | 存在显著异常值 | RobustScaler |
| Log | log(1+x) | 右偏分布 | FunctionTransformer |
# 混合标准化实践
from sklearn.compose import ColumnTransformer
numeric_cols = ['日均UV', '平均注册率', '订单转化率']
categorical_cols = ['广告类型', '素材类型']
preprocessor = ColumnTransformer(
transformers=[
('num', MinMaxScaler(), numeric_cols),
('cat', OneHotEncoder(), categorical_cols)
])
processed_data = preprocessor.fit_transform(raw_data)
4. 聚类分析与模型优化
4.1 确定最佳聚类数的科学方法
轮廓系数法的实现与解读:
# 轮廓系数法确定K值
range_n_clusters = range(2, 10)
silhouette_scores = []
for n_clusters in range_n_clusters:
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
cluster_labels = kmeans.fit_predict(processed_data)
silhouette_avg = silhouette_score(processed_data, cluster_labels)
silhouette_scores.append(silhouette_avg)
print(f"对于{n_clusters}个聚类,平均轮廓系数为{silhouette_avg:.3f}")
# 可视化结果
plt.plot(range_n_clusters, silhouette_scores, 'bo-')
plt.xlabel('聚类数K')
plt.ylabel('平均轮廓系数')
plt.title('轮廓系数法确定最佳K值')
plt.grid(True)
plt.savefig('./figures/silhouette_scores.png')
聚类质量评估的三重标准:
- 轮廓系数:衡量簇内紧密度和簇间分离度
- 肘部法则:观察SSE下降的拐点
- 业务解释性:聚类结果是否有商业意义
4.2 高级聚类技巧与调优
提升聚类效果的实用技巧:
- 特征选择:
# 使用方差阈值筛选特征
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1)
selected_features = selector.fit_transform(processed_data)
- 降维可视化:
# 使用PCA降维可视化
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
data_2d = pca.fit_transform(processed_data)
plt.scatter(data_2d[:,0], data_2d[:,1], c=cluster_labels)
plt.colorbar()
plt.title('聚类结果PCA可视化')
- 模型参数调优:
# KMeans++初始化与多次迭代
best_kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, max_iter=300, random_state=42)
5. 结果解读与商业应用
5.1 聚类特征分析框架
系统化的聚类结果分析方法:
- 数值特征对比:
cluster_summary = raw_data.groupby('cluster_label').agg({
'日均UV': ['mean', 'median'],
'订单转化率': ['mean', 'std']
})
print(cluster_summary)
- 类别特征分布:
# 交叉分析广告类型与聚类结果
pd.crosstab(raw_data['广告类型'], raw_data['cluster_label'])
- 雷达图可视化:
# 标准化聚类中心数据
scaler = MinMaxScaler()
cluster_centers_scaled = scaler.fit_transform(kmeans.cluster_centers_)
# 绘制雷达图
labels = numeric_cols
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, polar=True)
for i in range(len(cluster_centers_scaled)):
values = np.concatenate((cluster_centers_scaled[i], [cluster_centers_scaled[i][0]]))
ax.plot(angles, values, 'o-', label=f'Cluster {i}')
ax.fill(angles, values, alpha=0.1)
ax.set_thetagrids(angles[:-1] * 180/np.pi, labels)
plt.legend(loc='upper right')
plt.title('各聚类特征雷达图对比')
plt.savefig('./figures/radar_chart.png')
5.2 商业策略建议框架
基于聚类结果的渠道优化矩阵:
| 聚类类型 | 特征描述 | 优化策略 | 预算建议 |
|---|---|---|---|
| 高流量低转化 | UV高但转化低 | 优化落地页,提高转化率 | 保持投入,测试优化 |
| 低流量高转化 | UV低但转化高 | 扩大投放规模,增加曝光 | 战略性增加预算 |
| 均衡型 | 各项指标中等 | 维持现状,持续监控 | 稳定投入 |
| 低效型 | 各项指标较差 | 暂停投放或彻底优化 | 减少或停止投入 |
实战建议:
- 为每类渠道设计定制化的优化方案
- 建立渠道表现的动态监控机制
- 定期重新聚类以发现模式变化
- 将聚类结果与ROI分析结合
6. 项目复盘与进阶思考
在这个完整项目中,我们经历了数据科学项目的标准生命周期:
- 业务理解:明确广告渠道分析的目标
- 数据准备:清洗和预处理原始数据
- 建模分析:应用聚类算法发现模式
- 结果部署:将洞察转化为商业行动
常见问题解决方案:
-
问题:聚类结果不稳定
- 解决方案:增加n_init参数值,使用固定random_state
-
问题:高维数据难以解释
- 解决方案:结合降维技术,聚焦主要特征
-
问题:类别变量过多导致维度爆炸
- 解决方案:使用目标编码或嵌入技术
进阶方向:
- 结合时间维度分析渠道表现趋势
- 集成更多业务指标计算ROI
- 尝试分层聚类或DBSCAN等替代算法
- 构建自动化分析管道
在真实商业环境中,数据科学家80%的时间都花在数据准备和特征工程上。这个项目清晰地展示了从原始数据到商业价值的完整转化路径。记住,没有最好的算法,只有最适合业务需求的解决方案。
更多推荐


所有评论(0)