利用Apriori算法发现交易数据集中的关联规则

关联规则

数据挖掘中的关联规则是一种在大规模数据集中寻找变量之间有趣关系的方法。关联规则揭示了数据项之间的依赖性和关联性,这些关系可以用来预测未来事件或指导决策制定。

基本概念

  1. 项集(Itemset)
    • 项集是数据集中一组项目的集合。例如,在一个消费者一次超市购物的数据中,{牛奶, 面包}可以是一个项集。
  2. 频繁项集(Frequent Itemset)
    • 频繁项集是指在数据集中出现频率超过某个预定阈值(称为最小支持度)的项集。
  3. 关联规则(Association Rule)
    • 关联规则是形如X → Y的蕴含式,其中X和Y是不相交的项集,即X ∩ Y = ∅。
    • X称为规则的前提条件(antecedent),Y称为规则的结论(consequent)。
  4. 支持度(Support)
    • 支持度是项集在数据集中出现的频率,用于衡量项集的普遍性。
    • 支持度(X → Y)表示同时包含X和Y的交易数量占总交易数量的比例。
  5. 置信度(Confidence)
    • 置信度是关联规则的可靠性指标,表示在包含X的交易中也包含Y的比例。
    • 置信度(X → Y) = 支持度(X ∪ Y) / 支持度(X)。
  6. 提升度(Lift)
    • 提升度衡量关联规则的实用性,表示在已知X的情况下Y发生的概率与Y独立发生时的概率之比。
    • 提升度(X → Y) = 置信度(X → Y) / 支持度(Y)。

关联规则挖掘过程

  1. 数据预处理
    • 清洗数据,处理缺失值和异常值。
    • 将数据转换为适合关联规则挖掘的格式,通常是事务数据库的形式。
  2. 生成频繁项集
    • 使用算法(如Apriori算法或FP-Growth算法)找出所有满足最小支持度阈值的频繁项集。
  3. 生成关联规则
    • 从频繁项集中生成所有可能的关联规则。
    • 计算每个规则的置信度和提升度,并筛选出满足最小置信度和最小提升度阈值的强关联规则。

应用场景

  • 零售业:发现哪些商品经常一起购买,优化货架布局和产品推荐。
  • 医疗诊断:识别症状与疾病之间的关联,辅助医生进行诊断。
  • 网络安全:检测网络攻击模式,识别潜在的安全威胁。
  • 金融分析:分析交易数据,识别欺诈行为和市场趋势。

注意事项

  • 关联规则挖掘的结果需要结合领域知识进行解释和应用。
  • 过高的支持度和置信度阈值可能导致遗漏有用的规则,而过低的阈值可能导致大量无关紧要的规则。

总之,关联规则挖掘是一种强大的数据分析工具,能够帮助我们从海量数据中发现有价值的信息和模式。

Apriori算法

Apriori算法由学者Agrawal和R.Srikant在1994年提出,它通过连接和剪枝操作,采用自下而上的策略,从频繁项集开始,逐层地搜索频繁项集,最后产生关联规则。

Apriori算法的主要分为两个阶段:

(1)产生频繁项集;

(2)基于频繁项集产生强关联规则。

数据集内容

表格Online_Retail.xlsx中的数据样例:

InvoiceNoStockCodeDescriptionQuantityInvoiceDateUnitPriceCustomerIDCountry
53637022728ALARM CLOCK BAKELIKE PINK242010-12-01 08:45:003.7512583France
53637022727ALARM CLOCK BAKELIKE RED242010-12-01 08:45:003.7512583France
53637022726ALARM CLOCK BAKELIKE GREEN122010-12-01 08:45:003.7512583France
53637021724PANDA AND BUNNIES STICKER SHEET122010-12-01 08:45:000.8512583France
53637021883STARS GIFT TAPE242010-12-01 08:45:000.6512583France
53637010002INFLATABLE POLITICAL GLOBE482010-12-01 08:45:000.8512583France
53637021791VINTAGE HEADS AND TAILS CARD GAME242010-12-01 08:45:001.2512583France
53637021035SET/2 RED RETROSPOT TEA TOWELS182010-12-01 08:45:002.9512583France
53637022326ROUND SNACK BOXES SET OF4 WOODLAND242010-12-01 08:45:002.9512583France
53637022629SPACEBOY LUNCH BOX242010-12-01 08:45:001.9512583France
53637022659LUNCH BOX I LOVE LONDON242010-12-01 08:45:001.9512583France
53637022631CIRCUS PARADE LUNCH BOX242010-12-01 08:45:001.9512583France
53637022661CHARLOTTE BAG DOLLY GIRL DESIGN202010-12-01 08:45:000.8512583France
53637021731RED TOADSTOOL LED NIGHT LIGHT242010-12-01 08:45:001.6512583France
53637022900SET 2 TEA TOWELS I LOVE LONDON242010-12-01 08:45:002.9512583France
53637021913VINTAGE SEASIDE JIGSAW PUZZLES122010-12-01 08:45:003.7512583France
53637022540MINI JIGSAW CIRCUS PARADE242010-12-01 08:45:000.4212583France
53637022544MINI JIGSAW SPACEBOY242010-12-01 08:45:000.4212583France
53637022492MINI PAINT SET VINTAGE362010-12-01 08:45:000.6512583France
536370POSTPOSTAGE32010-12-01 08:45:001812583France

源码

以下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。下面是这段代码的逐步解释:

  1. data[data['Country'] =="France"]: 这一步从原始数据集data中筛选出所有国家(Country)为”France”的记录。
  2. .groupby(['InvoiceNo', 'Description'])['Quantity']: 接着,按照发票号(InvoiceNo)和商品描述(Description)进行分组,并且选择数量(Quantity)这一列进行处理。
  3. .sum().unstack().reset_index().fillna(0)
    • .sum():对每个分组(即每张发票上的每种商品)的购买数量进行求和。
    • .unstack():将分组后的结果从长格式转换为宽格式,使得商品描述(Description)成为列名,发票号(InvoiceNo)成为行索引。
    • .reset_index():将之前设置为索引的发票号(InvoiceNo)还原为数据列。
    • .fillna(0):将所有NaN值填充为0,这通常是因为某些发票上没有购买某些商品。
  4. .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)

获取案例套件

需要登录后才允许下载文件包。登录

发表评论