关联规则挖掘中置信度超100%的问题排查与解读
关联规则挖掘中置信度超过100%的问题排查与修正
问题背景
我正在对包含acct_id和商户类别码(MCC)的数据集应用关联规则挖掘,目标是识别每位客户频繁光顾的MCC码(不受交易日期影响)。使用SAS/Proc SQL编写的关联规则代码出现了部分账户内规则置信度超过100%的情况,请问该如何解读这类数值?置信度不应≤100%吗?查询语句是否存在错误?
示例数据集
data dfsample; input acct_id mcc $; datalines; 1 5411 1 5411 1 5812 1 5942 1 5942 2 5411 2 5812 2 5812 2 5967 2 5411 ; run;
原SAS代码
proc sql; create table mcc_pairs as select a.acct_id, a.mcc as mcc1, b.mcc as mcc2 from dfsample a inner join dfsample b on a.acct_id=b.acct_id where a.mcc^=b.mcc; run; proc freq data=mcc_pairs noprint; tables acct_id*mcc1*mcc2/out=mcc_pair_counts(drop=percent); run; proc freq data=dfsample noprint; tables acct_id*mcc/out=mcc_support(drop=percent); run; proc sql; create table assoc_rules as select a.acct_id, a.mcc1, a.mcc2, a.count as pair_count, b.count as mcc1_count, (a.count/b.count) as confidence format=percent8.2 from mcc_pair_counts as a inner join mcc_support as b on a.acct_id=b.acct_id order by confidence desc; run;
问题原因分析
1. 置信度超100%的本质
关联规则中置信度的定义是P(B|A) = 同时出现A和B的有效次数 / 出现A的有效次数,正常范围应≤100%。你的代码出现异常的核心原因:
- 生成
mcc_pairs时直接用交易记录级的自连接,导致pair_count统计的是「A交易记录与B交易记录的配对次数」,而非「客户同时拥有A和B两类MCC的有效共存次数」。 - 举个实例:账户1的MCC5812有1条交易记录,MCC5411有2条交易记录,自连接后会生成1×2=2条
(5812,5411)的配对记录,因此pair_count=2;而mcc_support中MCC5812的交易次数是1,最终计算置信度为2/1=200%,完全偏离了关联规则的逻辑。
2. 原代码的关键错误
- 未对客户MCC记录去重:你的目标是识别客户频繁光顾的MCC类别,而非交易记录间的关联,应基于每个客户的唯一MCC集合计算,而非原始重复交易记录。
- 配对逻辑错误:直接用交易记录自连接会无意义地放大配对次数,导致统计值失去关联规则所需的“共存”意义。
- 关联条件遗漏:最后一步计算置信度时,仅用
acct_id关联,未匹配mcc1和b.mcc,会导致错误的次数匹配(比如把账户1的mcc1=5812和mcc=5411的次数关联),进一步加剧置信度异常。
修正后的SAS代码
步骤1:生成每个客户的唯一MCC集合(去重)
proc sql; create table unique_mcc as select distinct acct_id, mcc from dfsample; run;
步骤2:基于去重数据集生成MCC配对(排除自身配对)
proc sql; create table mcc_pairs as select a.acct_id, a.mcc as mcc1, b.mcc as mcc2 from unique_mcc a inner join unique_mcc b on a.acct_id = b.acct_id where a.mcc ^= b.mcc; run;
步骤3:统计配对出现次数(每个客户的同一MCC配对仅出现1次)
proc freq data=mcc_pairs noprint; tables acct_id*mcc1*mcc2/out=mcc_pair_counts(drop=percent); run;
步骤4:统计每个客户各MCC的交易次数(体现光顾频率)
proc freq data=dfsample noprint; tables acct_id*mcc/out=mcc_support(drop=percent); run;
步骤5:计算正确的置信度(补充mcc1的关联条件)
proc sql; create table assoc_rules as select a.acct_id, a.mcc1, a.mcc2, a.count as pair_count, b.count as mcc1_count, (a.count / b.count) as confidence format=percent8.2 from mcc_pair_counts as a inner join mcc_support as b on a.acct_id = b.acct_id and a.mcc1 = b.mcc -- 关键:匹配对应MCC的次数 order by confidence desc; run;
内容的提问来源于stack exchange,提问作者Mcloy
相关产品推荐
相关产品推荐

