Python学习笔记——关联规则(关联分析)

目录

 机器算法分类​编辑

关联分析(association analysis)

应用的领域

涉及概念

Python实现

生成频繁集的方法

        现有如下例子数据集

转换事务数据集表达形式

 

apriori算法提取频繁项集

apriori算法步骤

apriori算法的Python实现

FP增长树算法提取频繁项集

提取关联规则

筛选出提升度大于1的规则 

零售店关联规则挖掘

读取数据

数据预处理

one-hot编码

生成频繁项集

提取关联规则

关联规则的分类

可操作的规则

平凡的规则

费解的规则


 机器算法分类

关联分析(association analysis)

在大规模数据集中寻找数据之间有意义的关系(关联规则)的无监督的算法

        假设你是一家超市的数据分析师,你想要了解顾客的购物习惯。你有一个包含所有交易数据的数据库,每一笔交易都记录了顾客购买的商品。

        关联规则是你在分析中发现的规律或者模式。比如,你可能会发现“如果顾客购买了牛奶,那么他们也很可能购买面包”这样一个规则。这个规则说明了牛奶和面包之间存在一种关联性。

        关联分析则是你用来发现这些规则的过程。在这个过程中,你会使用像Apriori这样的算法来分析数据库中的交易数据。关联分析的目的是找出数据库中的项目之间隐藏的关联性。

关联分析的关系可以概括为:

  • 关联分析是方法:关联分析是一种数据分析的方法,它用来挖掘大量数据中的关联性。

  • 关联规则是结果:关联规则是关联分析发现的结果,它描述了数据中不同项目之间的有趣关系。

        关联分析就是试图找出这种无明显逻辑关系的变量之间的关联性。在数据挖掘中,关联分析通常用来寻找大量数据中的规律或者模式。例如,在超市的数据中,关联分析可能会发现某些商品经常一起被购买,或者在特定的时间段某些商品的销售量会增加。

        关联分析的一个著名例子就是“尿布和啤酒”的故事。在一家超市中,分析人员发现尿布和啤酒经常一起被购买。最初,这个发现看起来很奇怪,但是后来他们发现,很多年轻的父亲在买尿布的时候会顺便为自己买一些啤酒。这就是一个关联:年轻的父亲和尿布、啤酒的购买行为。

        关联分析就是寻找数据中不同变量之间的意外联系,这些联系可能在没有明确逻辑关系的情况下出现。通过发现这些关联,我们可以更好地理解数据,预测未来的趋势,或者优化业务策略。

应用的领域

  • 零售中的产品组合、促销
  • 移动通信可选服务的绑定
  • 通过识别不寻常的保险索赔组合发现保险欺诈
  • 零售业:零售商使用关联分析来确定哪些商品经常一起被购买,以便在商店中调整商品的位置或者进行捆绑销售。例如,尿布和啤酒的关联在超市中被发现后,超市就将这两种商品放在了靠近的货架上。

  • 营销和广告:通过分析消费者的购买习惯和偏好,营销人员可以设计更有效的广告策略,比如针对特定人群的定制广告。

  • 金融领域:银行和金融机构使用关联分析来发现欺诈行为,比如信用卡欺诈。通过分析交易模式,可以识别出异常行为并采取预防措施。

  • 医疗健康:在医疗领域,关联分析可以帮助医生发现疾病和特定生活习惯之间的联系,或者药物之间可能的相互作用。

  • 电信行业:电信公司使用关联分析来分析用户的使用模式,比如通话、短信和数据使用,以便提供个性化的服务计划。

  • 库存管理:通过分析销售数据,企业可以更有效地管理库存,确定哪些商品需要更多的库存,哪些商品可能需要减少库存。

  • 推荐系统:在线购物平台和流媒体服务使用关联分析来创建推荐系统,向用户推荐他们可能会感兴趣的商品或内容。

  • 供应链管理:分析供应链中的数据,企业可以优化物流,减少成本,提高效率。

  • 安全监控:在安全领域,关联分析可以用来识别可能的威胁或异常行为,比如在监控视频中识别可疑活动。

  • 教育:在教育领域,关联分析可以帮助教育工作者了解学生的学习习惯和成绩之间的关系,以便提供个性化的教学支持。

涉及概念

  1. 项集(Itemset):指一组项的集合。在超市的例子中,项集可以是“尿布”和“啤酒”或者其他单独的商品。频繁项集是指那些在数据集中出现频率超过用户定义的最小支持度的项集。

  2. 事务:指一组项目或物品的集合,这些项目或物品在一次交易、事件或行为中同时出现。事务通常用于描述消费者购买商品、数据库中的记录或者其他任何一组相关的项目。

    1. 例如,在超市的销售数据中,每一行数据可以代表一个事务,其中每一列代表一个商品。如果一个顾客在一次购物中购买了牛奶、面包和鸡蛋,那么这就可以被视为一个事务,其中包含三个项目(牛奶、面包、鸡蛋)。

  3. 支持度(Support):指某个项集在所有事务中出现的频率。比如,如果我们在所有的购物篮中查看,发现尿布和啤酒一起出现在80%的购物篮中,那么我们就说尿布和啤酒的支持度是80%。支持度越高,说明这两个物品一起购买的概率越大。

  1. 置信度(Confidence):当前提(前件)发生时,结论(后件)发生的概率。例如指在购买了尿布(前件)的顾客中,有多少比例同时也购买了啤酒(后件)。如果购买了尿布的顾客中有80%同时也购买了啤酒,那么尿布导致啤酒的置信度就是80%。置信度越高,说明购买尿布的顾客购买啤酒的概率越大

  2. 关联规则(Association Rule):关联规则是指在一个数据集中发现的频繁项集之间的关系。在超市的例子中,我们可以得到一条关联规则:“如果顾客购买了尿布,那么顾客很可能也会购买啤酒。”

  3. 最小支持度(Minimum Support):最小支持度是用户定义的一个阈值,用来决定一个项集是否足够频繁。如果我们设置的最小支持度是50%,那么只有当尿布和啤酒一起出现在至少50%的购物篮中时,我们才认为这个组合是频繁的。

  4. 最小置信度(Minimum Confidence):最小置信度也是用户定义的一个阈值,用来决定一条关联规则是否足够可信。如果我们设置的最小置信度是60%,那么只有当尿布导致啤酒的置信度至少是60%时,我们才会认为这个关联规则是有趣的

  5. 频繁集:指在足够多的购物篮中出现的项集。换句话说,频繁集就是包含在一组数据中出现频率较高的项集。

  6. 提升度(Lift):提升度是衡量关联规则强度的一个指标,它表示两个项集共同出现的概率与各自独立出现概率的乘积的比值。如果提升度大于1,说明两个项集之间存在正相关关系;如果提升度小于1,说明两个项集之间存在负相关关系。在超市的例子中,如果尿布和啤酒的提升度大于1,那么就说明购买尿布的顾客购买啤酒的概率大于这两个物品独立购买的概率。

Python实现

pip install -U mlxtend

生成频繁集的方法

        现有如下例子数据集

bskt = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
           ['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
           ['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
           ['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
           ['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
tp = [','.join(each) for each in bskt]
pd.DataFrame(tp,columns=['事务'])

 

转换事务数据集表达形式

from mlxtend.preprocessing import TransactionEncoder

te = TransactionEncoder() #建立one-hot编码模型te

te.fit_transform(X) #利用建立的one-hot编码模型te对原始事务数据集X
进行编码转换

te.columns_ #经过one-hot编码后数组的列名,即所有独特项的名称

 

from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()

bsktOH = te.fit_transform(bskt)
bsktdf = pd.DataFrame(bsktOH,columns=te.columns_)

apriori算法提取频繁项集

apriori算法步骤
  1. 第一步:设定支持度阈值
    支持度是一个项集在所有事务中出现的频率。例如,如果你设定支持度阈值为30%,那么一个项集如果出现在30%以上的事务中,我们就会认为它是频繁的。

  2. 第二步:生成所有单个项目的列表
    在这个阶段,算法会检查数据库中的每一笔交易,列出所有单独出现的商品。

  3. 第三步:计算每个项目的支持度并筛选
    对于列表中的每个项目,算法会计算它们在所有交易中出现的频率,并与我们设定的支持度阈值比较。那些支持度低于阈值的项目就会被排除。

  4. 第四步:生成频繁项集
    算法会利用剩余的项目来创建更长的项集,并重复计算支持度的过程,直到没有新的项集可以被创建。这些剩余的项集就是频繁项集。

  5. 第五步:生成关联规则
    一旦我们找到了频繁项集,我们就可以使用这些项集来生成关联规则。例如,"牛奶"和"面包"常常一起被购买,那么我们可以得到一个规则:“如果购买了牛奶,那么购买面包的概率是70%”。

apriori算法的Python实现
from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.5, use_colnames=False, max_len=None)
  • dfpandasdataframe类型,经过one-hot编码
  • min_supportfloat类型,取值[0,1],最小支持度阈值,用来判断一个项集是否是频繁的。
    • 支持度是一个项集在所有事务中出现的频率。如果一个项集的支持度高于这个阈值,那么它被认为是频繁的。
  • use_colnamesbool类型,返回的频繁项集是否用原有的列名,False用列的位置。
    • 这个参数指示是否使用 DataFrame 的列名作为项集的标识。如果设置为 True,列名将被用作项集的标识;如果设置为 False(默认值),将会使用从 0 开始的整数作为项集的标识。
  • max_len:生成项集的最大数量,默认生成所有项集。
    • 这个参数指定了要寻找的项集的最大长度。如果设置为 None(默认值),算法将寻找所有长度的频繁项集。如果设置为一个整数,算法将只寻找长度小于或等于该整数的频繁项集。
  • 返回值:由项集构成的dataframe,列包括["support", "itemsets"]
itemsets = apriori(bsktdf,min_support=0.6,use_colnames=True)

FP增长树算法提取频繁项集

        FP增长树算法可以看作是Apriori算法的一种改进版本,解决Apriori算法在处理大规模数据集时遇到的效率问题。FP增长树算法同样可以用于发现数据集中的频繁模式,但它通过采用FP树的压缩表示来减少候选项集的数量,从而提高算法的效率和减少内存需求。

from mlxtend.frequent_patterns import fpgrowth
fpgrowth(df, min_support=0.5, use_colnames=False, max_len=None)
  • dfpandasDataFrame,经过one-hot编码后的数据集
  • min_support:支持度阈值
  • use_colnames:返回的频繁项集是否用原有的列名
  • max_len:生成项集的最大数量,默认生成所有项集
itemsetsFp = fpgrowth(bsktdf,min_support=0.6,use_colnames=True)

提取关联规则

from mlxtend.frequent_patterns import association_rules
association_rules(df, metric='confidence', min_threshold=0.8)
  • df:生成的频繁项集
  • metricstr类型,用于评估关联规则重要性的度量标准,可以是support支持度, confidence置信度, lift
    • ​​​​​​​如果想要找出顾客一定会购买的商品组合,那么更关注置信度;如果想要找出频繁一起购买的商品,那么更关注支持度。
  • min_thresholdfloat类型,设定所选顶metric的阈值,用于过滤关联规则的阈值。只有当规则的支持度或置信度超过这个阈值时,才会保留这个规则。
    • 例如,如果你设置metric='confidence'min_threshold=0.5,那么只有当一条规则的置信度至少为50%时,这条规则才会被考虑。如果你设置metric='support'min_threshold=0.1,那么只有当一条规则的支持度至少为10%时,这条规则才会被考虑。
minedRules = association_rules(itemsets)

筛选出提升度大于1的规则

minedRules.loc[minedRules['lift']>1,:]

 

零售店关联规则挖掘

读取数据

groceryDf = pd.read_csv('./data/association/groceriesR.csv')
#导入数据时可能会出错的原因:原始数据每行的元素数量不一致
#用python自带的open和readlines函数可解决
grocery = []
with open('./data/association/groceriesR.csv','r') as f:
    for each in f.readlines():
        grocery.append(each.strip('\n').split(','))

 

数据预处理

one-hot编码

gte = TransactionEncoder()
groceryOH = gte.fit_transform(grocery)
groceryDfOH = pd.DataFrame(groceryOH,columns=gte.columns_)

生成频繁项集

gItemSets = apriori(groceryDfOH,min_support=0.005,use_colnames=True)

提取关联规则

gRules = association_rules(gItemSets,metric='confidence', min_threshold=0.3)
gRules.loc[gRules['lift']>2,:]

关联规则的分类

关联规则应当具有透明度可用性

  • 以下关联规则,哪个更好?
    1. 在沃尔玛购买芭比娃娃的客户有60%的可能也购买一种糖果
    2. 签购维修保养协议的客户很有可能购买大型家用电器
    3. 当一个新的五金店开张时,最常卖的是抽水马桶清洁器
  • 关联规则的三种类型
    • 可操作的规则
    • 平凡的规则
    • 费解的规则

可操作的规则

可操作的规则:包含高质量,可操作的信息

  • 例如:
    • 在沃尔玛购买芭比娃娃的客户有60%的可能也购买一种糖果
    • 购买啤酒的同时购买尿布
  • 一旦被识别,规则容易理解
  • 规则可以为产品布局、产品促销提供依据

平凡的规则

平凡的规则:该规则早已是相应领域的常识

  • 例如:
    • 签购维修保养协议的客户很有可能购买大型家用电器
    • 购买黄油的同时购买面包
    • 买油漆的客户也购买油漆刷
  • 需要注意:平凡的规则可能仅仅检验了上次营销活动的效果
    • 例如,在上次营销活动种捆绑促销牛奶和大米
  • 逆向应用平凡规则:当规则应当100%出现的时候,并没有出现,可能反映出数据收集或者经营过程中出现了问题

费解的规则

费解的规则:该规则似乎无法解释,也不具备操作建议

  • 例如:
    • 当一个新的五金店开张时,最常卖的是抽水马桶清洁器
  • 可能由于一些特定原因导致关联规则的出现,但是这种规则不具备广泛的意义
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值