关联分析思想及其Python实现

发布时间 2023-12-19 23:55:08作者: 郝hai

关联规则分析算法是一种用于挖掘数据集中项之间关系的技术,它可以揭示数据中的潜在模式和趋势。这种算法的核心思想是寻找数据集中频繁出现的组合,从而推断它们之间的关联关系。其中,Apriori算法是关联规则分析的代表之一。Apriori算法的基本原理是利用"先验原理",即如果一个项集是频繁的,那么它的所有子集也是频繁的。该算法通过迭代的方式,从单个项开始,逐步生成包含更多项的频繁项集,最终找到数据中的频繁项集和关联规则。关联规则一般包括两个部分:前项(antecedent)和后项(consequent),它们之间的关联性通过支持度(support)和置信度(confidence)来衡量。关联规则分析广泛应用于不同领域,以下是该算法的一些主要应用:

零售业务: 在零售业中,关联规则分析可以帮助商家了解顾客购物习惯,提高销售额。例如,通过发现某一商品与另一商品之间的关联性,商家可以优化商品摆放位置,实现交叉销售。
市场篮分析: 在超市或电商平台,关联规则分析可以揭示顾客购物篮中的商品组合。通过了解哪些商品经常一同购买,商家可以进行定向促销或推荐系统优化,提升用户体验。
医学研究: 在医学领域,关联规则分析可用于发现疾病之间的关联,以及某种治疗方法与患者症状之间的关系。这有助于制定更有效的治疗方案和药物组合。
网络安全: 通过分析网络数据,关联规则算法可以检测异常行为和潜在的网络攻击。例如,可以发现某些异常模式与恶意软件活动相关联,有助于及早发现并应对网络威胁。
交通管理: 在交通领域,关联规则分析可用于理解交通流模式。通过识别车辆之间的关联性,可以优化交通信号灯控制,减缓交通拥堵。

一、关联分析算法的发展和思想

1.1 关联分析算法发展

关联分析算法在过去几十年里经历了显著的发展,这是数据挖掘领域中一项重要而成熟的技术。以下是关联分析算法发展的主要趋势和里程碑:

Apriori算法的提出: Apriori算法是关联分析领域的先驱之一,由Rakesh Agrawal 和 Ramakrishnan Srikant 在1994年提出。该算法使用"先验原理",通过递归生成频繁项集,为发现关联规则奠定了基础。Apriori算法的简洁性和可解释性促使了关联规则分析在业界的广泛应用。
FP-growth算法: 随着数据规模的增大,Apriori算法在处理大规模数据集时效率较低。为解决这一问题,Han 等人于2000年提出了FP-growth(Frequent Pattern growth)算法。该算法通过构建FP树(Frequent Pattern Tree)的方式,显著减少了扫描数据集的次数,提高了关联分析的效率。
关联规则的度量: 随着关联规则的应用领域不断扩展,度量关联规则质量的方法也得到了改进。支持度、置信度等传统度量指标之外,还出现了其他度量方法,如Lift(提升度)、Conviction(确信度)等,更全面地评估关联规则的有效性。
多层次关联分析: 随着数据的多样性和复杂性增加,单一层次的关联分析不再能满足需求。多层次关联分析考虑了数据的多个层次,例如时间、空间、用户等,从而更全面地理解数据中的关联关系。
关联分析与机器学习的融合: 近年来,关联分析算法与机器学习技术的融合成为研究的热点。通过将关联规则挖掘与分类、聚类等机器学习任务相结合,可以更好地发现数据中的模式,并将其应用于更广泛的领域。
流式数据处理: 随着实时数据处理需求的增加,关联分析算法也逐渐向流式数据处理方向发展。新的算法不仅能够处理大规模离线数据,还能实时地对流数据进行关联分析。
图数据库和图挖掘: 针对复杂关系型数据,图数据库和图挖掘技术逐渐与关联分析算法结合,以更好地表达和挖掘实体之间的关系,如社交网络、知识图谱等领域。
总体而言,关联分析算法在发展过程中不仅在效率和准确性上取得了显著进展,还逐渐拓展了应用领域。未来,随着大数据、人工智能和深度学习等技术的不断演进,关联分析算法将继续发挥重要作用,为更广泛的领域提供深度洞察和智能决策支持。

1.2 关联分析算法思想

关联分析算法是一种数据挖掘技术,其基本思想是通过挖掘数据集中的关联规则,找到不同项之间的潜在关联性。这种算法的目标是发现数据中的模式、趋势,以便更好地理解数据和做出预测。其中,Apriori算法是关联分析的典型代表,以下是关联分析算法的主要思想:

频繁项集的发现: 关联分析算法的第一步是找到频繁项集,即在数据集中频繁出现的项的组合。这里的“项”可以是商品、产品、关键词等,取决于具体的应用领域。频繁项集的发现可以通过统计每个项的支持度(support)来实现,支持度表示某一项集在整个数据集中出现的频率。
先验原理: Apriori算法基于先验原理,该原理认为如果一个项集是频繁的,那么它的所有子集也是频繁的。这个原理的应用使得算法可以通过逐层迭代的方式生成更大的频繁项集,而不必检查所有可能的项集。
关联规则的生成: 一旦找到频繁项集,接下来的任务是生成关联规则。关联规则一般包含两个部分,即前项(antecedent)和后项(consequent)。关联规则的质量可以通过两个主要指标来衡量,即置信度(confidence)和支持度。置信度表示在前项出现的情况下,后项也同时出现的概率,支持度表示规则在整个数据集中的频率。
支持度和置信度的阈值设定: 在关联分析中,通常需要设定支持度和置信度的阈值,以过滤掉低质量的规则。这样可以确保挖掘到的关联规则更有实际意义和可信度。
算法优化: 针对大规模数据集,关联分析算法进行了不断优化。例如,FP-growth算法采用了不同的数据结构,通过构建FP树来显著提高算法的效率。这种优化使得关联分析算法更适用于处理大数据。
多层次关联分析: 随着数据复杂性的增加,关联分析算法逐渐发展出多层次关联分析,考虑数据的多个层次,如时间、空间、用户等,以更全面地理解关联规律。

流程图 数据集

二、关联分析算例

2.1 基本概念

项集:item的集合,如集合{牛奶、麦片、糖}是一个3项集,可以认为是购买记录里物品的集合。
频繁项集:顾名思义就是频繁出现的item项的集合。如何定义频繁呢?用比例来判定,关联规则中采用支持度和置信度两个概念来计算比例值
支持度:共同出现的项在整体项中的比例。以购买记录为例子,购买记录100条,如果商品A和B同时出现50条购买记录(即同时购买A和B的记录有50),那边A和B这个2项集的支持度为50%
置信度:购买A后再购买B的条件概率,根据贝叶斯公式,可如下表示:
提升度:为了判断产生规则的实际价值,即使用规则后商品出现的次数是否高于商品单独出现的频率,提升度和衡量购买X对购买Y的概率的提升作用。如下公式可见,如果X和Y相互独立那么提升度为1,提升度越大,说明X->Y的关联性越强

2.2 Apriori算法

Apriori算法是发现频繁项集的一种方法。并不会找出关联规则,关联规则需要在找到频繁项集以后我们再来统计。
频繁项集:频繁项集挖掘是数据挖掘研究课题中一个很重要的研究基础,它可以告诉我们在数据集中经常一起出现的变量,为可能的决策提供一些支持。频繁项集挖掘是关联规则、相关性分析、因果关系、序列项集、局部周期性、情节片段等许多重要数据挖掘任务的基础。
Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含K个项的集合为k项集。项集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集。
最小支持度:最小支持度就是人为规定的阈值,表示项集在统计意义上的最低重要性。 最小置信度:最小置信度也是人为规定的阈值,表示关联规则最低可靠性。 只有支持度与置信度同时达到了最小支持度与最小置信度,此关联规则才会被称为强规则。 频繁项集:满足最小支持度的所有项集,称作频繁项集。 频繁项集性质:1、频繁项集的所有非空子集也为频繁项集;2、若A项集不是频繁项集,则其他项集或事务与A项集的并集也不是频繁项集)
要想获得频繁项集,最简单直接的方法就是暴力搜索法,但是这种方法计算量过于庞大,如下图所示,k项的数据集可能生成\(2^k-1\)个频繁项集。

图1 图2

2.3 实例

关联关系是一种非常有用的数据挖掘算法,它可以分析出数据内在的关联关系。其中比较著名的是啤酒和尿不湿的案例

交易号 清单
0 豆奶,莴苣
1 莴苣,尿布,啤酒,甜菜
2 豆奶,尿布,啤酒,橙汁
3 莴苣,豆奶,尿布,啤酒
4 莴苣,豆奶,尿布,橙汁

当超市在分析顾客的购物清单时发现一个比较奇怪的问题,为什么大部顾客在购买啤酒的时候还会买啤酒呢?后来经过超市的调查发现,顾客的妻子提醒丈夫买尿不湿时丈父会把自己的啤酒也一起带上。这是超市调查发现的尿不湿和啤酒的关系,如果数据量小我们还是可以处理的,但是涉及到大数据时,其复杂度就非常高,那我们有没有其它方式去寻找这种关系呢?其实我们可以使用关联算法去挖掘我们商品之间的关联关系,这些关系可以有两种形式:频繁项集或者关联规则。频繁项集(frequent item sets)是经常出现在一块的物品的集合(即经常被一起购买的商品),关联规则(association rules)暗示两种物品之间可能存在很强的关系。

支持度和置信度
为了有效定义频繁和关联,我们引入两个概念,支持度和置信度。

支持度(support),即事件发生的频率,记作support({A, B}) = num(A\cup B) = P(A \cap B) ,例如一共有5条记录,啤酒和尿布出现的次数是3次,这样啤酒的支持度就是 3 / 5 = 0.6,支持度越大表格商品出现的次数就越多。

置信度(confidence),置信度揭事了如果事件A发生了,则事件B发生的的概率,记作 confidence(A \to B) = \frac{support({A ,B})}{support({A})}

例如啤酒和尿布被购买时,橙汁也一起被购买的概率记作 confidence({啤酒, 尿布} \to {橙汁}) = \frac{support({{啤酒, 尿布} ,{橙汁}})}{({橙汁})} = \frac{\frac{1}{5}}{\frac{2}{5}} = \frac{1}{2},置信度的值表示事件A和B同时发生后的概率占了A事件出现的概率的百份比,值越大表明买了啤酒和尿刷的顾客购买橙汁的概率比较大。

Apriori原理
由上面的介绍可以知道,我们需要计算所有组合的支持度和置信度,从而计算出所有可能被购买的频繁项集这样我们就可以对商品进行合理的布局。
定理1: 如果一个项集是频繁的,那么其所有的子集(subsets)也一定是频繁的。 这个比较容易证明,因为某项集的子集的支持度一定不小于该项集。
定理2: 如果一个项集是非频繁的,那么其所有的超集(supersets)也一定是非频繁的。 定理2是上一条定理的逆反定理。根据定理2,可以对项集树进行如下剪枝(下图来自网络):

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

item_list = [['牛奶', '面包'],
             ['面包', '尿布', '啤酒', '土豆'],
             ['牛奶', '尿布', '啤酒', '可乐'],
             ['面包', '牛奶', '尿布', '啤酒'],
             ['面包', '牛奶', '尿布', '可乐']]

item_df = pd.DataFrame(item_list)

te = TransactionEncoder()
df_tf = te.fit_transform(item_list)
df = pd.DataFrame(df_tf, columns=te.columns_)

frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True)

frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)

# 选择2频繁项集
print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) == 2])

association_rule = association_rules(frequent_itemsets, metric='confidence', min_threshold=0.9)

# 关联规则可以提升度排序
association_rule.sort_values(by='lift', ascending=False, inplace=True)

# 将排序后的关联规则输出为一个表格
result_table = pd.DataFrame({
    'Antecedents': [set(a) for a in association_rule['antecedents']],
    'Consequents': [set(c) for c in association_rule['consequents']],
    'Support': association_rule['support'],
    'Confidence': association_rule['confidence'],
    'Lift': association_rule['lift']
})

# 打印排序后的关联规则表格
print(result_table)
数据集 决策树

四、算法评价

以下是关联规则分析的常见评价标准,以及它们的定义和解释:

  • 支持度(Support):

    • 定义:数据集中包含规则项的事务比例。
    • 解释:指示规则在数据集中的频繁程度。
    • 公式:支持度(X→Y)=包含X和Y的事务数总事务数\text{支持度}(X \rightarrow Y) = \frac{\text{包含} X \text{和} Y \text{的事务数}}{\text{总事务数}}支持度(X→Y)=总事务数包含X和Y的事务数​
  • 置信度(Confidence):

    • 定义:包含前提的事务中也包含结果的可能性。
    • 解释:衡量规则的强度。
    • 公式:置信度(X→Y)=支持度(X∩Y)支持度(X)\text{置信度}(X \rightarrow Y) = \frac{\text{支持度}(X \cap Y)}{\text{支持度}(X)}置信度(X→Y)=支持度(X)支持度(X∩Y)​
  • 提升度(Lift):

    • 定义:观察到的支持度与如果项目相互独立时的期望支持度之比。
    • 解释:指示关联的强度,值大于1表示关联比随机发生的强。
    • 公式:提升度(X→Y)=支持度(X∩Y)支持度(X)×支持度(Y)\text{提升度}(X \rightarrow Y) = \frac{\text{支持度}(X \cap Y)}{\text{支持度}(X) \times \text{支持度}(Y)}提升度(X→Y)=支持度(X)×支持度(Y)支持度(X∩Y)​
  • 杠杆(Leverage 或 Piatetsky-Shapiro):

    • 定义:测量规则的观察频率与如果 X 和 Y 独立时的期望频率之间的差异。
    • 解释:正值表示 X 和 Y 共同出现的频率高于预期。
    • 公式:杠杆(X→Y)=支持度(X∩Y)−支持度(X)×支持度(Y)\text{杠杆}(X \rightarrow Y) = \text{支持度}(X \cap Y) - \text{支持度}(X) \times \text{支持度}(Y)杠杆(X→Y)=支持度(X∩Y)−支持度(X)×支持度(Y)
  • 确信度(Conviction):

    • 定义:衡量 X 发生而没有 Y 的期望频率与 X 发生而没有 Y 的观察频率之比。
    • 解释:高确信度值表示结果对前提的依赖性较高。
    • 公式:确信度(X→Y)=1 - 支持度(Y)1 - 置信度(X→Y)\text{确信度}(X \rightarrow Y) = \frac{\text{1 - 支持度}(Y)}{\text{1 - 置信度}(X \rightarrow Y)}确信度(X→Y)=1 - 置信度(X→Y)1 - 支持度(Y)​

总结

关联分析算法是一种在数据集中发现变量之间关系的方法,主要用于挖掘数据中的关联规则。常见的关联分析算法包括Apriori算法和FP-growth算法。Apriori算法是一种基于频繁项集的方法,它通过逐层搜索数据集,找到满足最小支持度要求的频繁项集。该算法采用逐层的方式生成候选项集,并通过剪枝策略减少搜索空间,从而提高算法效率。Apriori算法的核心思想是通过先验知识(先验规则)来降低问题的复杂性。FP-growth算法则采用一种称为“频繁模式树”的结构来组织数据集,通过压缩数据集并构建一颗树形结构,有效地减少了搜索空间。相比于Apriori算法,FP-growth算法在某些情况下表现更优,尤其是在处理大规模数据集时。关联分析算法在商业、市场营销和推荐系统等领域有着广泛的应用。通过发现商品、服务或行为之间的关联规则,企业可以更好地了解客户需求,制定精准的营销策略。在推荐系统中,关联分析算法可以用于发现用户的偏好和习惯,从而提供个性化的推荐。总的来说,关联分析算法是一类重要的数据挖掘方法,通过发现数据中的关联规则,帮助人们更好地理解数据背后的关系,为决策和业务优化提供有力支持。

参考文献

  1. python关联分析实践学习笔记
  2. python做apriori关联分析
  3. 关联分析(Apriori)详解和python实现