关联规则
数据挖掘中的关联规则是一种在大规模数据集中寻找变量之间有趣关系的方法。关联规则揭示了数据项之间的依赖性和关联性,这些关系可以用来预测未来事件或指导决策制定。
基本概念
- 项集(Itemset):
- 项集是数据集中一组项目的集合。例如,在一个消费者一次超市购物的数据中,{牛奶, 面包}可以是一个项集。
- 频繁项集(Frequent Itemset):
- 频繁项集是指在数据集中出现频率超过某个预定阈值(称为最小支持度)的项集。
- 关联规则(Association Rule):
- 关联规则是形如X → Y的蕴含式,其中X和Y是不相交的项集,即X ∩ Y = ∅。
- X称为规则的前提条件(antecedent),Y称为规则的结论(consequent)。
- 支持度(Support):
- 支持度是项集在数据集中出现的频率,用于衡量项集的普遍性。
- 支持度(X → Y)表示同时包含X和Y的交易数量占总交易数量的比例。
- 置信度(Confidence):
- 置信度是关联规则的可靠性指标,表示在包含X的交易中也包含Y的比例。
- 置信度(X → Y) = 支持度(X ∪ Y) / 支持度(X)。
- 提升度(Lift):
- 提升度衡量关联规则的实用性,表示在已知X的情况下Y发生的概率与Y独立发生时的概率之比。
- 提升度(X → Y) = 置信度(X → Y) / 支持度(Y)。
关联规则挖掘过程
- 数据预处理:
- 清洗数据,处理缺失值和异常值。
- 将数据转换为适合关联规则挖掘的格式,通常是事务数据库的形式。
- 生成频繁项集:
- 使用算法(如Apriori算法或FP-Growth算法)找出所有满足最小支持度阈值的频繁项集。
- 生成关联规则:
- 从频繁项集中生成所有可能的关联规则。
- 计算每个规则的置信度和提升度,并筛选出满足最小置信度和最小提升度阈值的强关联规则。
应用场景
- 零售业:发现哪些商品经常一起购买,优化货架布局和产品推荐。
- 医疗诊断:识别症状与疾病之间的关联,辅助医生进行诊断。
- 网络安全:检测网络攻击模式,识别潜在的安全威胁。
- 金融分析:分析交易数据,识别欺诈行为和市场趋势。
注意事项
- 关联规则挖掘的结果需要结合领域知识进行解释和应用。
- 过高的支持度和置信度阈值可能导致遗漏有用的规则,而过低的阈值可能导致大量无关紧要的规则。
总之,关联规则挖掘是一种强大的数据分析工具,能够帮助我们从海量数据中发现有价值的信息和模式。
Apriori算法
Apriori算法由学者Agrawal和R.Srikant在1994年提出,它通过连接和剪枝操作,采用自下而上的策略,从频繁项集开始,逐层地搜索频繁项集,最后产生关联规则。
Apriori算法的主要分为两个阶段:
(1)产生频繁项集;
(2)基于频繁项集产生强关联规则。
数据集内容
表格Online_Retail.xlsx中的数据样例:
InvoiceNo | StockCode | Description | Quantity | InvoiceDate | UnitPrice | CustomerID | Country |
---|---|---|---|---|---|---|---|
536370 | 22728 | ALARM CLOCK BAKELIKE PINK | 24 | 2010-12-01 08:45:00 | 3.75 | 12583 | France |
536370 | 22727 | ALARM CLOCK BAKELIKE RED | 24 | 2010-12-01 08:45:00 | 3.75 | 12583 | France |
536370 | 22726 | ALARM CLOCK BAKELIKE GREEN | 12 | 2010-12-01 08:45:00 | 3.75 | 12583 | France |
536370 | 21724 | PANDA AND BUNNIES STICKER SHEET | 12 | 2010-12-01 08:45:00 | 0.85 | 12583 | France |
536370 | 21883 | STARS GIFT TAPE | 24 | 2010-12-01 08:45:00 | 0.65 | 12583 | France |
536370 | 10002 | INFLATABLE POLITICAL GLOBE | 48 | 2010-12-01 08:45:00 | 0.85 | 12583 | France |
536370 | 21791 | VINTAGE HEADS AND TAILS CARD GAME | 24 | 2010-12-01 08:45:00 | 1.25 | 12583 | France |
536370 | 21035 | SET/2 RED RETROSPOT TEA TOWELS | 18 | 2010-12-01 08:45:00 | 2.95 | 12583 | France |
536370 | 22326 | ROUND SNACK BOXES SET OF4 WOODLAND | 24 | 2010-12-01 08:45:00 | 2.95 | 12583 | France |
536370 | 22629 | SPACEBOY LUNCH BOX | 24 | 2010-12-01 08:45:00 | 1.95 | 12583 | France |
536370 | 22659 | LUNCH BOX I LOVE LONDON | 24 | 2010-12-01 08:45:00 | 1.95 | 12583 | France |
536370 | 22631 | CIRCUS PARADE LUNCH BOX | 24 | 2010-12-01 08:45:00 | 1.95 | 12583 | France |
536370 | 22661 | CHARLOTTE BAG DOLLY GIRL DESIGN | 20 | 2010-12-01 08:45:00 | 0.85 | 12583 | France |
536370 | 21731 | RED TOADSTOOL LED NIGHT LIGHT | 24 | 2010-12-01 08:45:00 | 1.65 | 12583 | France |
536370 | 22900 | SET 2 TEA TOWELS I LOVE LONDON | 24 | 2010-12-01 08:45:00 | 2.95 | 12583 | France |
536370 | 21913 | VINTAGE SEASIDE JIGSAW PUZZLES | 12 | 2010-12-01 08:45:00 | 3.75 | 12583 | France |
536370 | 22540 | MINI JIGSAW CIRCUS PARADE | 24 | 2010-12-01 08:45:00 | 0.42 | 12583 | France |
536370 | 22544 | MINI JIGSAW SPACEBOY | 24 | 2010-12-01 08:45:00 | 0.42 | 12583 | France |
536370 | 22492 | MINI PAINT SET VINTAGE | 36 | 2010-12-01 08:45:00 | 0.65 | 12583 | France |
536370 | POST | POSTAGE | 3 | 2010-12-01 08:45:00 | 18 | 12583 | France |
源码
以下apriori.py中的一代码片段,获取一专门针对法国地区的交易数据集,用于发现交易数据集中的关联规则。
basket_France = (data[data['Country'] =="France"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
这段Python代码主要是处理一个专门针对法国地区的交易数据集,目的是为了得到一个以发票号(InvoiceNo)为索引,商品描述(Description)为列,购买数量(Quantity)为值的DataFrame。下面是这段代码的逐步解释:
data[data['Country'] =="France"]
: 这一步从原始数据集data
中筛选出所有国家(Country)为”France”的记录。.groupby(['InvoiceNo', 'Description'])['Quantity']
: 接着,按照发票号(InvoiceNo)和商品描述(Description)进行分组,并且选择数量(Quantity)这一列进行处理。.sum().unstack().reset_index().fillna(0)
:.sum()
:对每个分组(即每张发票上的每种商品)的购买数量进行求和。.unstack()
:将分组后的结果从长格式转换为宽格式,使得商品描述(Description)成为列名,发票号(InvoiceNo)成为行索引。.reset_index()
:将之前设置为索引的发票号(InvoiceNo)还原为数据列。.fillna(0)
:将所有NaN值填充为0,这通常是因为某些发票上没有购买某些商品。
.set_index('InvoiceNo')
: 最后,将发票号(InvoiceNo)设置为DataFrame的索引。
综上所述,这段代码的结果是一个数据集,其中行代表不同的发票号,列代表不同的商品描述,每个单元格的值代表对应发票上对应商品的购买总数量,且只包含法国的数据。如果某个发票上没有购买某个商品,则对应的单元格值为0。
这样的数据结构非常适合进行后续的商品关联分析或者购物篮分析,例如使用Apriori算法找出常见的商品组合。
def hot_encode(x):
if(x<= 0): return 0
if(x>= 1): return 1
basket_France = basket_France.applymap(hot_encode) #0/1编码数据
# (1) 使用apriori算法在法国地区的交易数据集中挖掘关联规则
frq_items = apriori(basket_France, min_support = 0.1, use_colnames = True)
rules =association_rules(frq_items, metric ="confidence", min_threshold= 0.3)
rules= rules[ rules['lift']>=1.5] #设置最小提升度
rules = rules.sort_values(['confidence', 'lift'], ascending =[False, False])
print(rules.head()) #显示前5条关联规则
安装
conda create -n datamining python=3.10
conda activate datamining
conda install -c conda-forge mlxtend
conda install openpyxl
执行
python apriori.py
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10538 entries, 0 to 10537
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 InvoiceNo 10538 non-null object
1 StockCode 10538 non-null object
2 Description 10538 non-null object
3 Quantity 10538 non-null int64
4 InvoiceDate 10538 non-null datetime64[ns]
5 UnitPrice 10538 non-null float64
6 CustomerID 10433 non-null float64
7 Country 10538 non-null object
数据集内容:
InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
0 536370 22728 ALARM CLOCK BAKELIKE PINK 24 2010-12-01 08:45:00 3.75 12583.0 France
1 536370 22727 ALARM CLOCK BAKELIKE RED 24 2010-12-01 08:45:00 3.75 12583.0 France
2 536370 22726 ALARM CLOCK BAKELIKE GREEN 12 2010-12-01 08:45:00 3.75 12583.0 France
3 536370 21724 PANDA AND BUNNIES STICKER SHEET 12 2010-12-01 08:45:00 0.85 12583.0 France
4 536370 21883 STARS GIFT TAPE 24 2010-12-01 08:45:00 0.65 12583.0 France
执行apriori算法:
使用apriori算法在法国地区的交易数据集中挖掘关联规则
antecedents consequents ... conviction zhangs_metric
33 (SET/6 RED SPOTTY PAPER CUPS, SET/20 RED RETRO... (SET/6 RED SPOTTY PAPER PLATES) ... 34.858612 0.967673
32 (SET/6 RED SPOTTY PAPER PLATES, SET/20 RED RET... (SET/6 RED SPOTTY PAPER CUPS) ... 34.447301 0.955918
24 (SET/6 RED SPOTTY PAPER PLATES) (SET/6 RED SPOTTY PAPER CUPS) ... 21.529563 0.981563
27 (SET/6 RED SPOTTY PAPER PLATES, POSTAGE) (SET/6 RED SPOTTY PAPER CUPS) ... 18.084833 0.957637
25 (SET/6 RED SPOTTY PAPER CUPS) (SET/6 RED SPOTTY PAPER PLATES) ... 7.843188 0.993284
[5 rows x 10 columns]
数据集来源
Python数据挖掘实战(微课版)-图书-人邮教育社区 (ryjiaoyu.com)