
本文介绍一种针对时序型用户行为数据(如按月记录的指标x1)的聚类建模方法,通过将原始长格式数据重构为宽格式、按季度聚合特征、标准化后应用kmeans,实现按季节性响应模式(如冬夏高峰/低谷)对id进行分组。
本文介绍一种针对时序型用户行为数据(如按月记录的指标x1)的聚类建模方法,通过将原始长格式数据重构为宽格式、按季度聚合特征、标准化后应用kmeans,实现按季节性响应模式(如冬夏高峰/低谷)对id进行分组。
在处理具有潜在季节性规律的用户级时序数据(如每月X1值)时,直接使用时间序列聚类算法(如tslearn的TimeSeriesKMeans)往往倾向于按整体量级而非季节性形态分组——这正是用户遇到的核心问题:模型把“高值ID”和“低值ID”分开,却无法识别“冬季显著升高”或“夏季明显下降”的差异化季节响应模式。
要真正捕捉季节性行为模式,关键在于将每个ID转化为一组能表征其季节性特征的向量。推荐采用以下四步流程:
1. 数据重塑:从长格式到宽格式
将原始数据按ID为行、YR-MONTH为列展开,缺失月份补0,确保每个ID对应一条完整的时间向量:
df['YR-MONTH'] = pd.to_datetime(df['YR-MONTH']) wide_df = df.pivot(index='ID', columns='YR-MONTH', values='X1').fillna(0)
2. 季节性特征工程:按季度聚合均值
避免逐月建模带来的高维稀疏问题,同时保留季节结构。使用resample('Q', axis=1)沿时间轴(列方向)按自然季度重采样并计算均值:
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
quarterly_mean = wide_df.resample('Q', axis=1).mean() # 输出形状: (n_ids, n_quarters)例如:Q1(Jan–Mar)、Q2(Apr–Jun)、Q3(Jul–Sep)、Q4(Oct–Dec)各生成一个代表值,每个ID最终得到4维特征向量。
3. 标准化与聚类
因各季度量纲一致且需平等对待季节差异,使用StandardScaler消除量级影响;再以KMeans进行无监督分组:
from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans scaler = StandardScaler() X_scaled = scaler.fit_transform(quarterly_mean) kmeans = KMeans(n_clusters=3, random_state=42, n_init=10) labels = kmeans.fit_predict(X_scaled) # 关联结果 result = quarterly_mean.copy() result['Cluster'] = labels
4. 解读与验证
聚类结果可直观分析:例如Cluster 0可能表现为Q4/Q1均值显著高于Q2/Q3(“双峰型-冬夏高峰”),Cluster 1可能Q3峰值突出(“单峰型-盛夏高峰”),Cluster 2则整体平缓或Q2最低(“反季节型”)。建议辅以箱线图或均值折线图可视化各簇的季度分布。
⚠️ 注意事项:
- 若数据跨年不足,季度聚合可能失真,建议至少覆盖2个完整年度;
- resample('Q')默认按自然季度(Jan–Mar等),若业务季节定义不同(如财年Q1=Oct–Dec),需先用pd.PeriodIndex自定义;
- 对稀疏ID(大量月份缺失),补零策略合理,但若缺失非随机,可考虑插值或标记缺失率作为额外特征;
- 聚类数n_clusters建议通过肘部法则(Elbow Method)或轮廓系数(Silhouette Score)辅助确定。
该方法不依赖复杂时序模型,却精准锚定“季节性响应模式”这一业务核心维度,是面向运营分析、用户分群等场景的轻量高效实践方案。

















