关联分析思想及其Python实现
关联规则分析算法是一种用于挖掘数据集中项之间关系的技术,它可以揭示数据中的潜在模式和趋势。这种算法的核心思想是寻找数据集中频繁出现的组合,从而推断它们之间的关联关系。其中,Apriori算法是关联规则分析的代表之一。Apriori算法的基本原理是利用"先验原理",即如果一个项集是频繁的,那么它的所有子集也是频繁的。该算法通过迭代的方式,从单个项开始,逐步生成包含更多项的频繁项集,最终找到数据中的频繁项集和关联规则。关联规则一般包括两个部分:前项(antecedent)和后项(consequent),它们之间的关联性通过支持度(support)和置信度(confidence)来衡量。关联规则分析广泛应用于不同领域,以下是该算法的一些主要应用:
零售业务: 在零售业中,关联规则分析可以帮助商家了解顾客购物习惯,提高销售额。例如,通过发现某一商品与另一商品之间的关联性,商家可以优化商品摆放位置,实现交叉销售。
市场篮分析: 在超市或电商平台,关联规则分析可以揭示顾客购物篮中的商品组合。通过了解哪些商品经常一同购买,商家可以进行定向促销或推荐系统优化,提升用户体验。
医学研究: 在医学领域,关联规则分析可用于发现疾病之间的关联,以及某种治疗方法与患者症状之间的关系。这有助于制定更有效的治疗方案和药物组合。
网络安全: 通过分析网络数据,关联规则算法可以检测异常行为和潜在的网络攻击。例如,可以发现某些异常模式与恶意软件活动相关联,有助于及早发现并应对网络威胁。
交通管理: 在交通领域,关联规则分析可用于理解交通流模式。通过识别车辆之间的关联性,可以优化交通信号灯控制,减缓交通拥堵。
关联分析项集 | 基本概念 |
---|---|
![]() |
![]() |
一、关联分析案例导引
关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。所以说,关联规则挖掘是个非常有用的技术。
- 啤酒和尿不湿
啤酒和尿不湿之间的关联是一个经典的零售数据分析案例,常被用来说明关联分析算法在挖掘购物篮数据中的实际应用。在超市或零售商场的购物篮数据中,经常能够观察到购买啤酒和尿不湿的关联规律。这种关联可能的解释之一是与家庭的消费习惯有关。年轻父母在购物时,往往会同时购买尿不湿和啤酒。这可能是因为这两种商品的购买背后存在一些共同的情境,比如家庭聚会、社交活动或周末放松时。父母可能会在购物时一并考虑到孩子的需求和自己的休闲娱乐。此外,这种关联也可能反映了购物行为的某种季节性模式。例如,在假期、节日或户外烧烤季节,人们更倾向于购买啤酒,而同时也需要更多的尿不湿,因为这些时期通常有更多的社交活动,包括家庭聚会和友谊聚会。 - 电子商务平台商品推荐
在电子商务平台的商品推荐中,系统利用关联分析算法来深入分析用户的购物历史、浏览行为以及购买偏好,以实现个性化的商品推荐。通过理解用户在平台上的交互,系统可以发现商品之间的关联规律,从而更精准地为用户提供符合其兴趣和需求的推荐产品。这种个性化推荐不仅提升用户的购物体验,也有助于促进销售。 - 社交媒体平台的朋友推荐
在社交媒体平台的朋友推荐中,目标是增强用户的社交网络活跃度。通过应用社交网络分析和图算法,系统分析用户的社交关系、共同兴趣和互动频率,从而推荐潜在与用户有共同兴趣的新朋友。系统会构建用户的社交画像,考虑用户的朋友圈、动态和兴趣爱好,从而更准确地匹配适合用户社交圈的新伙伴。这种个性化的朋友推荐不仅提高了用户的社交体验,也有助于扩大社交网络,促使用户更积极地参与平台的社交活动。
二、关联分析算法的发展和思想
2.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(确信度)等,更全面地评估关联规则的有效性。
多层次关联分析: 随着数据的多样性和复杂性增加,单一层次的关联分析不再能满足需求。多层次关联分析考虑了数据的多个层次,例如时间、空间、用户等,从而更全面地理解数据中的关联关系。
关联分析与机器学习的融合: 近年来,关联分析算法与机器学习技术的融合成为研究的热点。通过将关联规则挖掘与分类、聚类等机器学习任务相结合,可以更好地发现数据中的模式,并将其应用于更广泛的领域。
流式数据处理: 随着实时数据处理需求的增加,关联分析算法也逐渐向流式数据处理方向发展。新的算法不仅能够处理大规模离线数据,还能实时地对流数据进行关联分析。
图数据库和图挖掘: 针对复杂关系型数据,图数据库和图挖掘技术逐渐与关联分析算法结合,以更好地表达和挖掘实体之间的关系,如社交网络、知识图谱等领域。
总体而言,关联分析算法在发展过程中不仅在效率和准确性上取得了显著进展,还逐渐拓展了应用领域。未来,随着大数据、人工智能和深度学习等技术的不断演进,关联分析算法将继续发挥重要作用,为更广泛的领域提供深度洞察和智能决策支持。
2.2 关联分析算法思想
关联分析算法是一种数据挖掘技术,其基本思想是通过挖掘数据集中的关联规则,找到不同项之间的潜在关联性。这种算法的目标是发现数据中的模式、趋势,以便更好地理解数据和做出预测。其中,Apriori算法是关联分析的典型代表,以下是关联分析算法的主要思想:
频繁项集的发现: 关联分析算法的第一步是找到频繁项集,即在数据集中频繁出现的项的组合。这里的“项”可以是商品、产品、关键词等,取决于具体的应用领域。频繁项集的发现可以通过统计每个项的支持度(support)来实现,支持度表示某一项集在整个数据集中出现的频率。
先验原理: Apriori算法基于先验原理,该原理认为如果一个项集是频繁的,那么它的所有子集也是频繁的。这个原理的应用使得算法可以通过逐层迭代的方式生成更大的频繁项集,而不必检查所有可能的项集。
关联规则的生成: 一旦找到频繁项集,接下来的任务是生成关联规则。关联规则一般包含两个部分,即前项(antecedent)和后项(consequent)。关联规则的质量可以通过两个主要指标来衡量,即置信度(confidence)和支持度。置信度表示在前项出现的情况下,后项也同时出现的概率,支持度表示规则在整个数据集中的频率。
支持度和置信度的阈值设定: 在关联分析中,通常需要设定支持度和置信度的阈值,以过滤掉低质量的规则。这样可以确保挖掘到的关联规则更有实际意义和可信度。
算法优化: 针对大规模数据集,关联分析算法进行了不断优化。例如,FP-growth算法采用了不同的数据结构,通过构建FP树来显著提高算法的效率。这种优化使得关联分析算法更适用于处理大数据。
多层次关联分析: 随着数据复杂性的增加,关联分析算法逐渐发展出多层次关联分析,考虑数据的多个层次,如时间、空间、用户等,以更全面地理解关联规律。
流程图 | 数据集 |
---|---|
![]() |
![]() |
三、关联分析算例
3.1 基本概念
事务集 | 频繁项集 |
---|---|
![]() ![]() |
![]() |
事务(Transaction ID),事务库中的每一条记录被称为一笔事务。在上表的购物篮事务中,每一行代表一个事务,每一个商品是一个项,表示一次购物行为。
项集:item的集合。一次所购买东西的总和叫做项集,例如我今天去超市买了:{方便面,火腿肠,可乐},这是我今天购买的项集,根据项集中所包含的项数,可以称为项集,为项集中的项数,例如{方便面,火腿肠,可乐}就可叫为3—项集,而我去超市购买商品就成了一个事务。
关联规则(Association Rules),由集合 X,可以在某置信度下推出集合Y。关联规则是形如X->Y的蕴含表达式,X称为前件,Y称为后件,X和Y不包含相同的项。即如果 X 发生了,那么 Y 也很有可能会发生。例如购买了{尿布}的人很可能会购买{啤酒}。关联规则暗示物品之间可能存在很强的关系。
频繁项集:顾名思义就是频繁出现的item项的集合。如何定义频繁呢?用比例来判定,关联规则中采用支持度和置信度两个概念来计算比例值。
前项——后项:如所求规则为:,则方便面称之为前项,火腿肠称之为后项。
支持度(Support):表示同时包含A和B的事务占所有事务的比例。如果用P(A)表示使用A事务的比例,那么
支持度表示了某一规则出现的可能性,支持度是某一规则同时发生的概率。例如今天超市有100人买东西,但只有我和我朋友买了同时购买了方便面和火腿肠,那么 这一规则的支持度就等于2/100=0.02。
可信度(Confidence):表示使用包含A的事务中同时包含B事务的比例,即同时包含A和B的事务占包含A事务的比例。公式表达:
提升度(Lift):表示“包含A的事务中同时包含B事务的比例”与“包含B事务的比例”的比值。公式表达:
提升度反映了关联规则中的A与B的相关性,提升度且越高表明正相关性越高,提升度且越低表明负相关性越高,提升度表明没有相关性。一般情况下,选择对提升度大于3的关联规则进行分析。
支持度 | 置信度 | 提升度 |
---|---|---|
![]() |
![]() |
![]() |
3.2 Apriori算法
Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含个项的集合为项集。项集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集。
最小支持度:最小支持度就是人为规定的阈值,表示项集在统计意义上的最低重要性。 最小置信度:最小置信度也是人为规定的阈值,表示关联规则最低可靠性。 只有支持度与置信度同时达到了最小支持度与最小置信度,此关联规则才会被称为强规则。频繁项集性质:1、频繁项集的所有非空子集也为频繁项集;2、若A项集不是频繁项集,则其他项集或事务与A项集的并集也不是频繁项集)
要想获得频繁项集,最简单直接的方法就是暴力搜索法,但是这种方法计算量过于庞大,如下图所示,k项的数据集可能生成个频繁项集。
频繁项集 | 关联规则 |
---|---|
![]() |
![]() |
3.3 关联分析实例
关联关系是一种非常有用的算法,它可以分析出数据内在的关联关系。
交易号 | 清单 |
---|---|
0 | 豆奶,莴苣 |
1 | 莴苣,尿布,啤酒,甜菜 |
2 | 豆奶,尿布,啤酒,橙汁 |
3 | 莴苣,豆奶,尿布,啤酒 |
4 | 莴苣,豆奶,尿布,橙汁 |
当超市在分析顾客的购物清单时发现一个比较奇怪的问题,为什么大部顾客在购买啤酒的时候还会买啤酒呢?后来经过超市的调查发现,顾客的妻子提醒丈夫买尿不湿时丈父会把自己的啤酒也一起带上。这是超市调查发现的尿不湿和啤酒的关系,如果数据量小我们还是可以处理的,但是涉及到大数据时,其复杂度就非常高,那我们有没有其它方式去寻找这种关系呢?其实我们可以使用关联算法去挖掘我们商品之间的关联关系,关联规则(association rules)暗示两种物品之间可能存在很强的关系。
支持度和置信度
支持度(support),即事件发生的频率。例如一共有5条记录,啤酒和尿布出现的次数是3次,这样啤酒的支持度就是,支持度越大表格商品出现的次数就越多。
置信度(confidence),置信度揭事了如果事件A发生了,则事件B发生的的概率。例如
置信度的值表示事件A和B同时发生后的概率占了A事件出现的概率的百份比,值越大表明买了啤酒和尿刷的顾客购买橙汁的概率比较大。
Apriori算法流程
要使用Apriori算法,我们需要提供两个参数,数据集和最小支持度。我们从前面已经知道了Apriori会遍历所有的物品组合,怎么遍历呢?答案就是递归。
先遍历1个物品组合的情况,剔除掉支持度低于最小支持度的数据项,然后用剩下的物品进行组合。
遍历2个物品组合的情况,再剔除不满足条件的组合。
不断递归下去,直到不再有物品可以组合。
关联规则 | 强关联规则 |
---|---|
![]() |
![]() |
四、Python实现
4.1 案例1
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)
数据集 | 关联规则 |
---|---|
![]() |
![]() |
4.2 案例2
#把电影数据转换成列表
data = [['葛优','黄渤','范伟','邓超','沈腾','张占义','王宝强','徐峥','闫妮','马丽'],
['黄渤','张译','韩昊霖','杜江','葛优','刘昊然','宋佳','王千源','任素汐','吴京'],
['郭涛','刘桦','连晋','黄渤','徐峥','优恵','罗兰','王迅'],
['黄渤','舒淇','王宝强','张艺兴','于和伟','王迅','李勤勤','李又麟','宁浩','管虎','梁静','徐峥','陈德森','张磊'],
['黄渤','沈腾','汤姆·派福瑞','马修·莫里森','徐峥','于和伟','雷佳音','刘桦','邓飞','蔡明凯','王戈','凯特·纳尔逊','王砚伟','呲路'],
['徐峥','黄渤','余男','多布杰','王双宝','巴多','杨新鸣','郭虹','陶虹','黄精一','赵虎','王辉'],
['黄渤','戎祥','九孔','徐峥','王双宝','巴多','董立范','高捷','马少骅','王迅','刘刚','WorapojThuantanon','赵奔','李麒麟','姜志刚','王鹭','宁浩'],
['黄渤','徐峥','袁泉','周冬雨','陶慧','岳小军','沈腾','张俪','马苏','刘美含','王砚辉','焦俊艳','郭涛'],
['雷佳音','陶虹','程媛媛','山崎敬一','郭涛','范伟','孙淳','刘桦','黄渤','岳小军','傅亨','王文','杨新鸣']]
#算法应用
itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
print(itemsets)
{1: {('徐峥',): 7, ('黄渤',): 9}, 2: {('徐峥', '黄渤'): 7}}
print(rules)
[{徐峥} -> {黄渤}]
数据集 | 关联规则 |
---|---|
![]() |
在宁浩的电影中,用的最多的是黄渤和徐峥,黄渤9次,支持度100%,徐峥7次,支持度78%,('徐峥', '黄渤') 同时出现7次,置信度为100%,看来有徐峥,必有黄渤,真是宁浩必请的黄金搭档。当然,这个数据量比较小,基本上肉眼也能看出来,这里只是提供一个分析案例,巩固下基础知识,大规模的数据,人眼无法直接感知的时候,算法的挖掘与发现,就显得特别有意义了。 |
4.3 案例3
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
# 设置pandas输出表格的属性
pd.options.display.max_colwidth = 100
pd.options.display.width = 500
# 原始数据集
data = {
'ID': [1, 2, 3, 4, 5, 6],
'Basket': [
['Beer', 'Diaper', 'Pretzels', 'Chips', 'Aspirin'],
['Diaper', 'Beer', 'Chips', 'Lotion', 'Juice', 'BabyFood', 'Milk'],
['Soda', 'Chips', 'Milk'],
['Soup', 'Beer', 'Diaper', 'Milk', 'IceCream'],
['Soda', 'Coffee', 'Milk', 'Bread'],
['Beer', 'Chips']
]
}
data = pd.DataFrame(data)
# 分隔 ID 列和 Basket 列
data_id = data.drop('Basket', axis=1)
# 将 Basket 列的列表转化为字符串
basket_str = data.Basket.str.join(',')
# 根据 Basket 列的字符串数据转化为数值型
basket_numeric = basket_str.str.get_dummies(',').astype(bool)
# 将数值型数据拼接回原数据
data = pd.concat([data_id, basket_numeric], axis=1)
# 用标准数据继续关联规则分析的步骤
# 利用 mlxtend 提供的 apriori 算法函数得到频繁项集,其中设置最小支持度为 50%
frequent_item_sets = apriori(basket_numeric, min_support=0.50, use_colnames=True)
# 计算规则,并设置提升度阈值为 1
rules = association_rules(frequent_item_sets, metric='lift', min_threshold=1)
# 按照支持度、置信度和提升度降序排列规则
rules_sorted = rules.sort_values(by=['support', 'confidence', 'lift'], ascending=[False, False, False])
# 输出排好序的规则表格
print("排序后的规则表格:")
print(rules_sorted[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
五、算法评价
以下是关联规则分析的常见评价标准,以及它们的定义和解释:
- 支持度(Support):
- 定义:数据集中包含规则项的事务比例。
- 解释:指示规则在数据集中的频繁程度。
- 公式:
- 置信度(Confidence):
- 定义:包含前提的事务中也包含结果的可能性。
- 解释:衡量规则的强度。
- 公式:
- 提升度(Lift):
- 定义:观察到的支持度与如果项目相互独立时的期望支持度之比。
- 解释:指示关联的强度,值大于1表示关联比随机发生的强。
- 公式:
- 杠杆(Leverage 或 Piatetsky-Shapiro):
- 定义:测量规则的观察频率与如果 X 和 Y 独立时的期望频率之间的差异。
- 解释:正值表示 X 和 Y 共同出现的频率高于预期。该值越大,表明X和Y的关联度越强。
- 公式:
- 确信度(Conviction):
- 定义:衡量 X 发生而没有 Y 的期望频率与 X 发生而没有 Y 的观察频率之比。
- 解释:高确信度值表示结果对前提的依赖性较高。该值越大,表明X和Y的关联度越强。
- 公式:
总结
关联分析算法是一种在数据集中发现变量之间关系的方法,主要用于挖掘数据中的关联规则。常见的关联分析算法包括Apriori算法和FP-growth算法。Apriori算法是一种基于频繁项集的方法,它通过逐层搜索数据集,找到满足最小支持度要求的频繁项集。该算法采用逐层的方式生成候选项集,并通过剪枝策略减少搜索空间,从而提高算法效率。Apriori算法的核心思想是通过先验知识(先验规则)来降低问题的复杂性。FP-growth算法则采用一种称为“频繁模式树”的结构来组织数据集,通过压缩数据集并构建一颗树形结构,有效地减少了搜索空间。相比于Apriori算法,FP-growth算法在某些情况下表现更优,尤其是在处理大规模数据集时。关联分析算法在商业、市场营销和推荐系统等领域有着广泛的应用。通过发现商品、服务或行为之间的关联规则,企业可以更好地了解客户需求,制定精准的营销策略。在推荐系统中,关联分析算法可以用于发现用户的偏好和习惯,从而提供个性化的推荐。总的来说,关联分析算法是一类重要的数据挖掘方法,通过发现数据中的关联规则,帮助人们更好地理解数据背后的关系,为决策和业务优化提供有力支持。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!