若两个或多个变量的取值之间存在某种规律性,就称为关联。关联规则是寻找在同一个事件中出现的不同项的相关性,比如在一次购买活动中所买不同商品的相关性。例如:“在购买计算机的顾客中,有30%的人也同时购买了打印机”。
一个样本称为一个“事务”
每个事务由多个属性来确定,这里的属性称为“项”
多个项组成的集合称为“项集”
由k个项构成的集合
{牛奶}、{啤酒}都是1-项集;
{牛奶,果冻}是2-项集;
{啤酒,面包,牛奶}是3-项集
X==>Y含义:
X和Y是项集
X称为规则前项(antecedent)
Y称为规则后项(consequent)
支持度(support):一个项集或者规则在所有事务中出现的频率,σ(X):表示项集X的支持度计数
项集X的支持度:s(X)=σ(X)/N
规则X==>Y表示物品集X对物品集Y的支持度,也就是物品集X和物品集Y同时出现的概率
某天共有100个顾客到商场购买物品,其中有30个顾客同时购买了啤酒和尿布,那么上述的关联规则的支持度就是30%
置信度(confidence):确定Y在包含X的事务中出现的频繁程度。c(X → Y) = σ(X∪Y)/σ(X)
p(Y│X)=p(XY)/p(X)。
置信度反应了关联规则的可信度—购买了项目集X中的商品的顾客同时也购买了Y中商品的可能性有多大
购买薯片的顾客中有50%的人购买了可乐,则置信度为50%
(X , Y)==>Z :
支持度:交易中包含{X 、 Y 、 Z}的可能性
置信度:包含{X 、 Y}的交易中也包含Z的条件概率
设最小支持度为50%, 最小可信度为 50%, 则可得到 :
A==>C (50%, 66.6%)
C==>A (50%, 100%)
若关联规则X->Y的支持度和置信度分别大于或等于用户指定的最小支持率minsupport和最小置信度minconfidence,则称关联规则X->Y为强关联规则,否则称关联规则X->Y为弱关联规则。
提升度(lift):物品集A的出现对物品集B的出现概率发生了多大的变化
lift(A==>B)=confidence(A==>B)/support(B)=p(B|A)/p(B)
现在有** 1000 ** 个消费者,有** 500** 人购买了茶叶,其中有** 450人同时** 购买了咖啡,另** 50人** 没有。由于** confidence(茶叶=>咖啡)=450/500=90%** ,由此可能会认为喜欢喝茶的人往往喜欢喝咖啡。但如果另外没有购买茶叶的** 500人** ,其中同样有** 450人** 购买了咖啡,同样是很高的** 置信度90%** ,由此,得到不爱喝茶的也爱喝咖啡。这样看来,其实是否购买咖啡,与有没有购买茶叶并没有关联,两者是相互独立的,其** 提升度90%/[(450+450)/1000]=1** 。
由此可见,lift正是弥补了confidence的这一缺陷,if lift=1,X与Y独立,X对Y出现的可能性没有提升作用,其值越大(lift>1),则表明X对Y的提升程度越大,也表明关联性越强。
Leverage 与 Conviction的作用和lift类似,都是值越大代表越关联
Leverage : P(A,B)-P(A)P(B)
Conviction:P(A)P(!B)/P(A,!B)
所有指标的计算公式:
以上转自https://blog.csdn.net/tangyudi/article/details/88822705
接下来获取电影数据集中个电影类型之间的关联关系:
anaconda安装mlxtend包
conda install -c conda-forge mlxtend
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
movie_genres = pd.DataFrame(data,columns=['original_title','genres'])
movies_ohe = movie_genres.drop('genres',1).join(movie_genres.genres.str.get_dummies())
movies_ohe.shape#(10866, 21)
movies_ohe.set_index(['original_title'],inplace=True)
frequent_itemsets_movies = apriori(movies_ohe,use_colnames=True, min_support=0.025)
result = [i for i in frequent_itemsets_movies.itemsets if len(i)>1]
len(result)#37
rules_movies = association_rules(frequent_itemsets_movies, metric='lift', min_threshold=1.25)
rules_movies[(rules_movies.lift>4)].sort_values(by=['lift'], ascending=False)
也挺符合常理哈。
网友评论