Python数据挖掘012-关联规则
关联规则挖掘是数据挖掘中第三个比较大的类别。
关联规则分析也称为购物篮分析,最早是为了发现超市销售数据库中不同的商品之间的关联关系。
关联规则挖掘的意义在于:比如如果发现超市中购买了面包的顾客也会极大概率的同时购买牛奶,那么就会有关联规则“面包==>牛奶”,所以超市就可以对面包降价促销,而提高牛奶的价格,这样可能增加超市整体的利润。
关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找出各项之间的关联关系。
常用的关联规则算法有:

1. Apriori算法
Apriori算法是最经典的挖掘频繁项集的算法,第一次实现了在大数据集上可行的关联规则提取,其核心思想是通过连接产生候选项与其支持度,然后通过剪枝生成频繁项集。
1.1 几个重要的概率:
支持度:项集A,B同时发生的概率。
置信度:项集A发生时,项集B发生的概率。
最小支持度:是用户或专家定义的衡量支持度的一个阈值,表示项目集在统计意义上的最低重要性。
最小置信度:是用户或专家定义的衡量置信度的一个阈值,表示关联规则的最低可靠性。
同时满足最小支持度阈值和最小置信度阈值的规则称为强规则。
项集:项的集合,比如集合{牛奶,麦片,糖}是一个3项集
频繁项集:如果项集I的相对支持度满足预定义的最小支持度阈值,则为频繁项集。
支持度计数:项集A的支持度计数是事务数据集中包含项集A的事务个数,将成为项集的频率或计数。

所以计算支持度和置信度,关键在于计算出所有事务个数,A,B,A∩B的支持度个数。
1.2 挖掘过程
Apriori挖掘主要分两个步骤:找出频繁项集,生成强关联规则。
基本原理:频繁项集的非空子集也一定是频繁项集,非频繁项集的超集也一定是非频繁项集。
有很多现成的挖掘库,也可以自己来手写挖掘库,实现起来也不是那么难。如下是使用pymining库来实现的挖掘过程,考察指标不仅仅考虑支持度,置信度,提升度,还会考虑kulc, IR等。
from pymining import itemmining
def mine_associate_rules(time_dicts_path,save_path,min_support_ratio=0.001):
def load_baskets(dict_path): #OK
with open(time_dicts_path,'r',encoding='utf-8') as file:
result=eval(file.readline())
return [item for item in result.values()]
# 挖掘出频繁项集
all_samples=load_baskets(time_dicts_path)
baskets_len=len(all_samples) # 总个数N
print('all samples len: ',baskets_len)
relim_input=itemmining.get_relim_input(all_samples)
item_sets = itemmining.relim(relim_input, min_support=baskets_len*min_support_ratio ) # 获取频繁项集
# return item_sets
# 使用item_sets来计算各种指标:支持度,置信度,提升度,kulc, IR等
sup_cnt={} # 首先将各种数量存放到dict中,此处只存放单个项和两个项的情况,不考虑多个项
for item,num in item_sets.items():
if len(item)==1:
sup_cnt[str(list(item)[0])]=num
elif len(item)==2:
first,second=list(item)
sup_cnt[str(first)+'_'+str(second)]=num
# 使用sup_cnt来计算各种指标
indicators=[]
for key,value in sup_cnt.items():
one_item=[]
if '_' in key: # 两个项
first,sec=key.split('_')
one_item.append(key) # 第一列: 两个项
one_item.append(sup_cnt[key]/baskets_len) # 支持度
# if first in sup_cnt.keys(): first_in=True
# if sec in sup_cnt.keys(): sec_in=True
conf=sup_cnt[key]/sup_cnt[first]
one_item.append(conf) # 置信度
lift=sup_cnt[key]*baskets_len/(sup_cnt[first]*sup_cnt[sec])
one_item.append(lift)
conf2=sup_cnt[key]/sup_cnt[sec]
kulc=(conf+conf2)/2
one_item.append(kulc)
ir=abs(sup_cnt[first]-sup_cnt[sec])/(sup_cnt[first]+sup_cnt[sec]-sup_cnt[key])
one_item.append(ir)
indicators.append(one_item)
# 转换为df,进行整理
result_df=pd.DataFrame(indicators,columns=['items','support','conf','lift','kulc','IR'])
result_df=np.round(result_df,4)
result_df=result_df.sort_values(by = ['kulc'],axis = 0,ascending = False) # 按照kulc排序
result_df.to_csv(save_path,index=False)
print('finished...')
return result_df
注意:挖掘出来的关联规则并不是都有实际意义,有的可能没有太多意义,仅仅是偶然而已,所以要根据实际应用场景来判断挖掘出来的关联规则的实际应用价值。
参考资料:
《Python数据分析和挖掘实战》张良均等