如何基于交易数据计算客户购物行为erraticism的0-1量化值
客户购物行为一致性指标聚合实现思路
以下方案均默认你已完成特征预处理:分类特征Gender需先做独热编码,避免直接输入数值1/2/3引入无意义的顺序权重,编码后与其余0-1型购物特征合并为相似度计算的特征集。
方案1:平均两两相似度(最常用,易解释)
原理
单客户n条交易记录可生成n*(n-1)/2组不重复的两两相似度,直接取所有相似度的均值作为一致性得分,天然落在0-1区间:
- 所有记录完全一致时,所有两两相似度为1,得分=1
- 所有记录完全不相似时,所有两两相似度为0,得分=0
代码实现
import numpy as np import pandas as pd from sklearn.metrics.pairwise import cosine_similarity def calc_consistency_avg(cust_trx: pd.DataFrame, feat_cols: list) -> float: """ cust_trx: 单个客户的所有交易记录 feat_cols: 用于计算相似度的特征列名列表 """ trx_cnt = len(cust_trx) if trx_cnt < 2: # 仅1条交易默认一致性为1,可根据业务规则调整为0或其他值 return 1.0 # 计算两两相似度矩阵 sim_matrix = cosine_similarity(cust_trx[feat_cols]) # 提取上三角矩阵(排除对角线自身对自身的相似度1,避免重复计算正反序配对) valid_sim = sim_matrix[np.triu_indices_from(sim_matrix, k=1)] return valid_sim.mean()
方案2:分位数/最小值聚合(严格判断一致性)
原理
如果业务对"波动"的容忍度低,只要出现一次异常购物行为就判定一致性差,可以取所有两两相似度的最小值、10%分位数等作为得分,放大异常交易的影响。比如某客户9次购物完全一致,第10次完全不同,平均相似度可能还有0.8+,但最小值会直接降到0,更符合高波动的判定需求。
代码调整
仅需修改方案1的返回值即可:
# 取最小值 return valid_sim.min() # 取10%分位数 return np.quantile(valid_sim, 0.1)
方案3:时间衰减加权相似度(适配有序交易序列)
原理
如果交易数据带有时间戳,行为一致性更偏向"近期行为是否稳定",可以给间隔更近的交易对更高权重,加权平均两两相似度。比如相邻两次交易的权重为1,间隔1次的权重为0.8,间隔越远权重越低,更贴合业务对"当前行为稳定性"的需求。
方案4:融合离散度的修正得分
原理
如果要区分"相似度都稳定在0.8"和"一半相似度1、一半相似度0.6"两种场景(两者平均相似度都是0.8,但前者一致性更高),可以引入相似度的离散度修正:
修正得分 = 平均相似度 * (1 - 相似度的变异系数)
变异系数=标准差/均值,值越大说明相似度波动越大,修正后得分会更低,最终结果仍保持在0-1区间。
内容的提问来源于stack exchange,提问作者Sajid
相关产品推荐
相关产品推荐

