如何计算子序列及其组合的序列转化概率并生成统计结果表
子序列转化概率统计方案
- 第一步:数据预处理
把原始序列按分隔符-拆分得到节点列表,同时保留每条记录对应的转化标签(1/0),比如你提供的第一条样本拆分后节点列表为['A','B','C','D','E','B','A'],对应转化标签为1。 - 第二步:枚举连续子序列
先设定需要统计的子序列最大长度(建议不超过5,过长子序列样本量不足无统计意义),遍历每条记录的节点列表,提取所有长度在1到最大长度之间的连续子序列,再用-拼接为字符串格式。注意同一条记录里同一个子序列重复出现时,只统计一次即可,避免虚高计数。 - 第三步:概率计算
- 先计算全局基准转化概率:
全局转化概率 = 总转化样本数 / 总样本数,你给出的样例中总样本8条,转化3条,基准值为37.5% - 对每个子序列统计两个指标:包含该子序列的总样本数N、包含该子序列且发生转化的样本数N_pos
- 子序列对应转化概率分为两种,按需计算:
- 绝对转化概率:
(N_pos / N) * 100% - 转化提升概率:
(N_pos / N - 全局转化概率) * 100%
- 绝对转化概率:
- 第四步:结果输出
过滤掉出现次数低于阈值(比如N<3)的低置信度子序列,按转化概率/提升幅度排序后加序号,即可得到你需要的统计结果表。
参考实现代码
from collections import defaultdict # 样例原始数据 raw_data = [ ("A-B-C-D-E-B-A", 1), ("A-B-C-D", 0), ("A-B-C-D", 1), ("D-E-H-I-A", 0), ("Z", 0), ("A-Z", 0), ("F-E-T-H-S-A-T-J-F-E-D-E-S-X-G-N-N-K-L-D", 1), ("H-S-A-T-J-F-E", 0) ] max_sub_len = 3 # 统计最长3个节点的子序列 min_count = 2 # 最少出现2次才纳入统计 # 统计子序列的总出现数和转化数 sub_total = defaultdict(int) sub_pos = defaultdict(int) total_pos = sum([x[1] for x in raw_data]) total_cnt = len(raw_data) base_rate = total_pos / total_cnt for seq, label in raw_data: nodes = seq.split('-') n = len(nodes) # 同一条记录里同一个子序列出现多次只算一次 used_sub = set() for l in range(1, max_sub_len+1): for i in range(n - l + 1): sub = '-'.join(nodes[i:i+l]) if sub not in used_sub: used_sub.add(sub) sub_total[sub] += 1 if label == 1: sub_pos[sub] += 1 # 生成结果 res = [] for sub in sub_total: cnt = sub_total[sub] if cnt < min_count: continue pos_cnt = sub_pos.get(sub, 0) conv_rate = pos_cnt / cnt res.append((sub, round(conv_rate*100, 2))) # 按转化概率降序排序 res.sort(key=lambda x: -x[1]) # 输出目标格式 print("Sno\tSub-sequence\tprobabilty_of_conversion") for idx, item in enumerate(res, 1): print(f"{idx}\t{item[0]}\t\t{item[1]}%")
内容的提问来源于stack exchange,提问作者Kshitij Yadav
相关产品推荐
相关产品推荐

