当前位置: 首页 > news >正文

Kaggle电商数据处理实战:从E-Commerce Data到精准客户分群

1. 初识Kaggle电商数据集:从数据导入到初步探索

第一次接触Kaggle上的E-Commerce Data数据集时,我花了整整三天才理清数据脉络。这个来自英国在线零售商的交易记录数据集,包含了54万条2010-2011年间的交易数据,是练习数据处理绝佳的实战素材。

用pandas导入数据时有个坑要注意:原始数据用的是ISO-8859-1编码,直接utf-8读取会报错。我建议新手先用data.info()快速扫描数据结构:

import pandas as pd data = pd.read_csv("E-Commerce_Data.csv", encoding='ISO-8859-1') print(data.info())

输出显示8个字段全是object类型,包括本应是数值的Quantity和UnitPrice。这是因为原始数据中存在特殊字符导致pandas自动识别为文本。更麻烦的是CustomerID有24.9%的缺失值,Description字段也有0.27%的空值。

第一次查看数据分布时,我发现了几个明显异常:

  • Quantity列竟有负值(最小-80995)
  • UnitPrice存在-11062这样的离谱数值
  • 90%以上订单来自英国,其他国家数据稀少

这些问题都需要在后续清洗中处理。建议新手养成先看describe()的习惯,能快速发现数值异常:

print(data[['Quantity','UnitPrice']].describe())

2. 数据清洗实战:处理缺失值与异常值

处理缺失值时,我试过三种策略:

  1. 直接删除CustomerID缺失的行(简单粗暴但有效)
  2. 用众数填充Description字段(适合类别型数据)
  3. 对UnitPrice采用前后均值填充(适合时间序列)

最终选择方案如下:

# 删除CustomerID缺失行 data = data.dropna(subset=['CustomerID']) # Description用"unknown"填充 data['Description'] = data['Description'].fillna('unknown') # 删除异常负值 data = data[(data['Quantity']>0) & (data['UnitPrice']>0)]

处理重复值时发现个有趣现象:约0.1%的记录是完全重复的。可能是系统bug导致重复下单,直接去重即可:

print(f"去重前:{len(data)}条") data = data.drop_duplicates() print(f"去重后:{len(data)}条")

日期处理时踩过坑:原始日期格式是"MM/DD/YYYY HH:MM",需要先转换格式再提取日期部分。推荐用pd.to_datetime的format参数明确指定格式:

data['InvoiceDate'] = pd.to_datetime( data['InvoiceDate'], format='%m/%d/%Y %H:%M' ) data['Date'] = data['InvoiceDate'].dt.date

3. 特征工程:构建客户分群的关键指标

好的特征工程能让模型效果提升50%以上。基于电商场景,我构建了这些核心特征:

基础特征:

  • 购买频率:客户下单次数
  • 消费金额:总支付金额
  • 商品数量:购买商品总数

进阶特征:

  • 最近购买日(R):最后一次消费距今天数
  • 价格敏感度:订单折扣率平均值
  • 品类偏好:购买最多的商品类别

具体实现代码:

# 计算RFM特征 rfm = data.groupby('CustomerID').agg({ 'InvoiceDate': lambda x: (pd.to_datetime('2011-12-10') - x.max()).days, 'InvoiceNo': 'nunique', 'UnitPrice': lambda x: (x * data.loc[x.index,'Quantity']).sum() }).rename(columns={ 'InvoiceDate': 'Recency', 'InvoiceNo': 'Frequency', 'UnitPrice': 'Monetary' }) # 添加品类偏好 top_products = data.groupby(['CustomerID','Description']).size() top_products = top_products.groupby('CustomerID').idxmax().apply(lambda x:x[1]) rfm['Favorite'] = top_products

4. 客户分群实战:XGBoost模型构建与优化

经过测试,XGBoost在客户分群任务上准确率可达97%+。关键步骤包括:

1. 数据准备:

  • 将RFM特征标准化
  • 对类别特征进行Label Encoding
  • 按8:2划分训练/测试集
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(rfm[['Recency','Frequency','Monetary']])

2. 聚类分析:先用K-Means找最佳聚类数,肘部法则显示4-5类较合适:

from sklearn.cluster import KMeans inertia = [] for k in range(2,10): kmeans = KMeans(n_clusters=k).fit(X) inertia.append(kmeans.inertia_)

3. XGBoost建模:设置早停机制防止过拟合,用网格搜索调参:

import xgboost as xgb params = { 'max_depth': [3,5,7], 'learning_rate': [0.01, 0.1], 'n_estimators': [100,200] } xgb_model = xgb.XGBClassifier(objective='multi:softmax') grid = GridSearchCV(xgb_model, params, cv=5) grid.fit(X_train, y_train)

最终得到的客户分群结果可分为:

  • 高价值客户(15%):高频高消费
  • 潜力客户(25%):高频率低单价
  • 流失风险客户(30%):久未购买
  • 普通客户(30%):各项指标中等

5. 分析结果可视化与业务解读

用Seaborn绘制特征分布图能直观展示分群效果:

import seaborn as sns rfm['Cluster'] = clusters sns.pairplot(rfm, hue='Cluster', vars=['Recency','Frequency','Monetary'])

业务建议:

  1. 对高价值客户:提供VIP服务与专属优惠
  2. 对潜力客户:推荐高价关联商品
  3. 对流失风险客户:发送召回优惠券
  4. 对普通客户:常规营销维护

存储结果时建议保存原始ID与分群结果的映射关系:

results = rfm[['Cluster']].reset_index() results.to_csv('customer_segments.csv', index=False)

6. 避坑指南与实用技巧

在项目复现时注意这些细节:

  1. 内存优化:大数据集可指定dtype减少内存占用
    dtypes = { 'InvoiceNo': 'category', 'StockCode': 'category', 'CustomerID': 'int32' }
  2. 加速技巧:对Category特征用df[col].cat.codes比LabelEncoder更快
  3. 日期处理:建议统一转换为UTC时间避免时区问题
  4. 特征缩放:树模型虽不需要但能加速收敛

常见错误解决方案:

  • 遇到MemoryError可尝试分块读取:
    chunk_iter = pd.read_csv('data.csv', chunksize=10000) data = pd.concat([chunk for chunk in chunk_iter])
  • 类别不平衡时设置scale_pos_weight参数
  • 模型过拟合时增加subsamplecolsample_bytree

这个项目教会我最重要的一点是:真实数据永远比教程复杂。曾经有个StockCode包含"POST"的记录导致数值转换失败,调试两小时才发现是邮费特殊标记。建议处理每个字段时都先用unique()检查特殊值。

http://www.jsqmd.com/news/488519/

相关文章:

  • Phi-3-vision-128k-instruct一文详解:开源轻量多模态模型部署与调用全链路
  • CMOS反相器设计实战:如何用0.18um工艺优化噪声容限和开关速度
  • KMS_VL_ALL_AIO开源工具:本地激活方案与批量授权管理的技术实现
  • 3个场景解锁开源工具escrcpy:图形化Android设备管理效率提升指南
  • 丹青识画实操手册:基于达摩院多模态技术的书法AI部署全流程
  • 基于PY32F002A的燃气灶自动调火开关:硬件设计与低功耗实现
  • 3步搞定Windows/Office激活:免费开源工具让你告别激活难题
  • Z-Image-GGUF完整使用指南:从部署到高级功能的全流程解析
  • 嵌入式AI新篇章:将轻量化伏羲模型部署到边缘设备进行实时天气推断
  • ESP32双模蓝牙开发进阶指南:从RSSI优化到多设备协同通信
  • CHORD-X视觉战术指挥系统Java开发集成指南:SpringBoot微服务实战
  • Qwen3-VL-WEBUI快速部署指南:Docker配置详细步骤(新手友好)
  • 避开这些坑!360浏览器+VLC播放海康RTSP流的最全实践指南
  • 金融租赁行业必备:MDM设备锁在逾期设备管理中的实战应用
  • Qwen3-14B部署教程:vLLM服务日志分析(cat /root/workspace/llm.log)详解
  • ESP32系列之LVGL(四):实体按键驱动与事件映射实战
  • 3分钟解锁专业鼠标体验:给Mac用户的效率提升指南
  • CompressO:端侧视频轻量化的技术民主化实践
  • Qwen3-ASR-1.7B效果展示:四川话直播语音实时转写+标点自动补充
  • 智能语音处理新范式:AsrTools实现高效转写与多格式输出全攻略
  • 从零到一:用TypeScript打造你的第一个MCP工具服务器
  • Web前端技术选型:手机检测系统管理后台开发指南
  • 通义千问2.5-0.5B-Instruct部署教程:Windows本地运行指南
  • 魔兽世界私服搭建指南:从零开始轻松架设个人游戏服务器
  • VinXiangQi:AI驱动的中国象棋智能助手技术突破
  • 基于嘉立创梁山派与三环串级PID的O型独轮车自平衡与电磁循迹实战(附开源代码)
  • HTML5 Canvas贪吃蛇游戏开发实战:从零到可玩(附完整代码)
  • Qwen3-14b_int4_awq部署案例:低成本GPU服务器上运行14B大模型的实测分享
  • MySQL连表查询实战:从基础到高级应用
  • 光敏电阻选型避坑指南:从MG45到硫化铅的8个实战经验