本文使用python語言完成了在線電子零售公司的跨國交易數據集的數據分析與可視化、根據關聯規則原理設計實現了基於Apriori算法的關聯規則挖掘程序並將程序封裝、使用封裝好的關聯規則挖掘程序對數據集進行關聯規則的挖掘,並對挖掘結果進行分析。
數據集地址:Online Retail | Kagglehttps://www.kaggle.com/puneetbhaya/online-retail
目錄
一、算法原理
1.1 關聯規則
1.2 Apriori原則生成頻繁項集
二、數據預處理
2.1 數據描述
2.2 導入需要的第三方庫、讀取數據集、查看數據集基本信息
2.3 數據去重
2.4 數據異常值處理
2.5 數據缺失值處理
三、統計不同國家銷售量
四、整體關聯規則
4.1. 關聯規則程序執行原理,數據為演示數據,並非 Online Retail 數據集中數據。
4.2 編寫數據集格式修改函數,生成適合 Apriori 算法程序執行的數據格式。
4.3 編寫生成關聯規則類(即將關聯規則生成程序封裝在類中,方便調用)
4.4 調用Apriori類
五、主要的 3 個國家的關聯規則分析
關聯規則是以規則的方式呈現項目之間的相關性,目的是在一個數據集中找到各項之間的關聯關系(這種關系往往不會在數據中直接體現出來)。並且將發現的聯系用關聯規則或頻繁項集的形式表現。
相關概念解釋如下:
①關聯規則的支持度(相對支持度):
項集A、B同時發生的概率稱為關聯規則的支持度(相對支持度)。
Support ( A = > B ) = P ( A∪B )
②關聯規則的置信度:
在項集A發生的條件下,則項集B發生的概率為關聯規則的置信度。
Confidence(A=>B)=P(B|A)
③關聯規則的提升度:
指A項和B項一同出現的頻率,但同時要考慮這兩項各自出現的頻率。
{A→B}的提升度={A→B}的置信度/P(B)=P(B|A)/P(B)= P(A∩B)/(P(A)*P(B))。
④最小支持度:衡量支持度的一個阈值,表示項目集在統計意義上的最低重要性。
⑤最小置信度:衡量置信度的一個阈值,表示關聯規則的最低可靠性。
⑥強規則:同時滿足最小支持度阈值和最小置信度阈值的規則。
⑦項集:項的集合。包含k個項的集合稱為k項集,如集合 {牛奶,麥片,糖} 是一個三項集。項集出現的頻率是所有包含項集的事務計數,又稱為絕對支持度或支持度計數。如果項集L的相對支持度滿足預定義的最小支持度阈值,則L是頻繁項集。如果有K項,記為Lk。
Apriori算法是常用於挖掘出數據關聯規則的算法,能夠發現事物數據庫中頻繁出現的數據集,這些聯系構成的規則可幫助用戶找出某些行為特征,以便進行企業決策。例如,某食品商店希望發現顧客的購買行為,通過購物籃分析得到大部分顧客會在一次購物中同時購買面包和牛奶,那麼該商店便可以通過降價促銷面包的同時提高面包和牛奶的銷量。
(1)找出全部頻繁項集(支持度大於等於給定的支持度阈值)
①連接
連接步的目的是找到K項集。對於給定的最小支持度阈值,分別對1項候選項集C1,剔除支持度小於阈值的項集得到1項頻繁項集L1;下一步由L1自身連接產生2項候選項集C2,剔除支持度小於阈值的項集得到2項頻繁項集L2;再下一步由L2和L1連接產生3項候選集項集C3;剔除支持度小於阈值的項集得到3項頻繁項集L3;這樣循環下去,直至由L(k-1)和L1連接產生k項候選項集Ck,剔除小於阈值的項集得到最大頻繁項集Lk。
②剪枝
剪枝緊接著連接步驟,在產生候選項集Ck的過程中起到了減小搜索空間的目的。根據Apriori的性質,頻繁項集的所有非空子集也一定是頻繁項集,所以不滿足該性質的項集將不會存在於候選項集C中,該過程就是剪枝。
(2)由頻繁項集生成強關聯規則
由(1)可知,支持度未超過支持度阈值的項集已被剔除,如果剩下的這些項集又滿足預定的置信度阈值,那麼就可挖掘出強關聯規則,並計算規則的提升度。
Apriori算法的詳細過程以及示意圖將在下文操作部分給出。
數據集來自一個在英國注冊的在線電子零售公司,在2010年12月1日到2011年12月9日期間發生的網絡交易數據,共有541909條記錄、8個字段。
字段含義如下:
import matplotlib.pyplot as plt
import pandas as pd
import missingno as msno
import seaborn as sns
from matplotlib import cm
plt.rcParams['font.sans-serif'] = ['SimHei'] # 顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False
# 讀取數據
dataset = pd.read_excel("Online Retail.xlsx")
#查看數據集維度
print(dataset.shape) # (541909, 8)
#查看數據集中各列數據格式
print(dataset.dtypes)
#查看各列數據分布情況
print(dataset.info())
print(dataset.describe())
運行結果如下:
可以看出數據總共有541909條,其中“Description”、“CustomerID”兩個字段存在數據缺失情況。“Quantity”、“UnitPrice”字段最小值為負數,產品銷售數量存在負數可能是存在退貨情況,但是這種情況對產生關聯規則存在反向作用(削弱關聯強度),產品銷售單價存在負數說明該字段存在異常數據。
刪除完全相同的記錄。
dataset.drop_duplicates(inplace=True)
print("去重後數據基本信息:")
#查看數據集維度
print(dataset.shape) # (536641, 8)
#查看數據集中各列數據格式
print(dataset.dtypes)
#查看各列數據分布情況
print(dataset.info())
print(dataset.describe())
運行結果如下:
可以看到,數據集中存在5268條完全重復的記錄,刪除重復記錄後,數據集還剩536641條記錄。
去除“Quantity”<= 0 或“UnitPrice”< 0 的不符合實際情況的異常記錄。
print("數據異常值處理:")
dataset = dataset.loc[(dataset["Quantity"]>0) & (dataset["UnitPrice"]>=0)]
print(dataset.describe())
運行結果如下:
可以看到,去除異常值後還剩下526052條記錄。
查看數據缺失情況
msno.matrix(dataset, labels=True, fontsize=9) # 矩陣圖
plt.show()
print(dataset.info())
運行結果如下:
可以看到“CustomerID”字段數據存在明顯大量的缺失,“Description”字段數據存在少量缺失數據。考慮到“CustomerID”字段數據缺失量極大,且客戶編號難以估計,遂刪除在“CustomerID”字段存在缺失值的記錄。“Description”為產品信息描述,其缺失量較少,同一種產品的描述相同,因此可以很容易地填補“Description”字段的空缺值。由於“Description”字段對構建關聯規則作用不大,因此之後可以單獨提取出“StockCode”和“Description”字段,並對其進行去重,生成{“StockCode” : “Description”}字典,用於根據產品編號查找對應的產品描述。
刪除在“CustomerID”字段存在缺失值的記錄
dataset["InvoiceNo"] = dataset["InvoiceNo"].astype("int")
print(dataset.info())
運行結果如下:
可以看到,去除缺失值後,數據集還剩下392732條記錄。
# 對數據集按照"Country"字段值進行分組
groupByCountry = dataset.groupby("Country")
# 對各組中數據的"Quantity"字段進行求和
country_quantity_list = list(dict(groupByCountry["Quantity"].sum()).items())
# 對數據集按照產品銷售總量進行排序
country_quantity_list.sort(key=lambda x: x[1])
print("country_quantity_list:")
print(country_quantity_list)
統計結果如下:
對統計結果可視化
# country_quantity_list.pop() #在可視化時去除/保留銷量第一的國家銷量數據
norm = plt.Normalize(0, country_quantity_list[-1][1])
norm_values = norm([i[1] for i in country_quantity_list])
map_vir = cm.get_cmap(name='jet')
colors = map_vir(norm_values)
plt.barh([i[0] for i in country_quantity_list], [i[1] for i in country_quantity_list], height = 0.4,color=colors)
plt.tick_params(labelsize=8) #設置坐標字體大小
sm = cm.ScalarMappable(cmap=map_vir, norm=norm) # norm設置最大最小值
sm.set_array([])
plt.colorbar(sm)
# 給條形圖添加數據標注
for index, y_value in enumerate([i[1] for i in country_quantity_list]):
plt.text(y_value+10, index-0.2, "%s" %y_value)
plt.ylabel("Country", fontdict={'size':18})
plt.title("不同國家產品總銷售量")
plt.show()
可以看到該商店產品在United Kingdom中銷量最高,遠遠超過了在剩余國家中銷量的總和。銷量前五的國家依次是United Kingdom、Netherlands、EIRE、Germany、France。
為了更直觀看清產品在除United Kingdom之外的國家中的銷量情況,遂再繪制沒有United Kingdom的產品銷量條形圖。
可以看到該商店的產品的出口國主要為英國周邊的國家(如荷蘭、愛爾蘭)以及歐洲的部分人口大國(如德國、法國)。
分別統計United Kingdom與Bahrain國家中各產品的銷量情況,並繪制銷量排前十的產品的餅狀圖(其中others表示第11名到最後一名的產品的銷量總和),對產品銷售量排名的統計可以在一定程度上反映一些產品之間的關聯,如若銷售量排名第一的產品的銷售量與排名第二的產品的銷售量接近,則這兩種產品肯能存在較強的關聯。
# 獲取產品代碼及其對應的描述
Sto_Des = dataset.loc[:,["StockCode","Description"]]
Sto_Des.dropna(inplace=True) # 先除去缺失產品描述的行
Sto_Des.drop_duplicates(inplace=True) # 去重,留下產品唯一的 StockCode與Description
# print("Sto_Des shape:",Sto_Des.shape)
# print("Sto_Des:", Sto_Des)
# 分別查看銷量前三的國家中各產品的銷量
country_quantity_list.sort(key=lambda x: x[1], reverse=True)
for element in country_quantity_list[0:3]:
contryName = element[0]
# 獲取對應國家的分組數據
df = groupByCountry.get_group(contryName)
# 依照產品代碼 StockCode 進行分組
groupByStockCode = df.groupby("StockCode")
# 對分別對某一產品的全部銷售量進行求和
country_StockCode_quantity_list = list(dict(groupByStockCode["Quantity"].sum()).items())
country_StockCode_quantity_list.sort(key=lambda x: x[1], reverse=True)
# 對銷量後10名的產品銷量進行求和,並命名為"others"
othersQuantity = sum(list(i[1] for i in country_StockCode_quantity_list[10:]))
new_country_StockCode_quantity_list = country_StockCode_quantity_list[0:10] + [("others", othersQuantity)]
# 為產品添加對應的描述信息
# print(new_country_StockCode_quantity_list)
for i in range(len(new_country_StockCode_quantity_list)-1):
item = new_country_StockCode_quantity_list[i]
stockCode = item[0]
quantity = item[1]
description = Sto_Des["Description"].loc[Sto_Des["StockCode"]==item[0]]
new_country_StockCode_quantity_list[i] = (stockCode, quantity, list(description)[0])
# print(new_country_StockCode_quantity_list)
norm = plt.Normalize(0, max(new_country_StockCode_quantity_list, key=lambda x:x[1])[1])
# print(max(new_country_StockCode_quantity_list, key=lambda x:x[1])[1])
norm_values = norm([i[1] for i in new_country_StockCode_quantity_list])
map_vir = cm.get_cmap(name='Spectral')
# 產生連續的配色
colors = map_vir(norm_values)
explode = [0.09, 0.06, 0.03] + [0]*(len(new_country_StockCode_quantity_list)-3)
plt.pie([i[1] for i in new_country_StockCode_quantity_list],
autopct='%.2f%%',
labels=["StockCode: " + str(i[0]) for i in new_country_StockCode_quantity_list],
explode=explode,
startangle=90,
colors=colors)
labels = [i[2] for i in new_country_StockCode_quantity_list[0:-1]] + ["others"]
plt.legend(labels,
loc="upper left",
bbox_to_anchor=(1.2, 0, 0.5, 1))
plt.title(f"{contryName}產品銷量占比")
plt.show()
運行結果如下:
United Kingdom
銷量排名前十的產品名單如下:
繪制的餅圖如下:
可以看出該商店的各產品在United Kingdom國內的銷售量比較均衡,沒有一款特別火爆的產品
Bahrain
銷量排名前十的產品名單如下:
可以看到產品“23076”和“23077”的銷售量之和的占比超過了一般,並且兩個產品的編號相近,說明產品“23076”和“23077”之間可能存在較強關聯。
# 加載用於Apriori算法的數據
# InvoiceNo:發票編號。為每筆訂單唯一分配的6位整數。若以字母'C'開頭,則表示該訂單被取消。
# StockCode:產品代碼。為每個產品唯一分配的編碼。
'''
dataset:預處理好的數據集;pandas DataFrame
'''
def loatdata(dataset):
dataset["StockCode"] = dataset["StockCode"].apply(lambda x: "," + str(x))
# 將數據按照發票編號進行分組
dataset = dataset.groupby('InvoiceNo').sum().reset_index()
# 將相同發票編號的產品代碼放入同一個列表中
dataset["StockCode"] = dataset["StockCode"].apply(lambda x: [x[1:]])
StockCodeLists = list(dataset["StockCode"])
# 由於此時 StockCodeLists 中的具有相同發票編號的商品代碼是以一整個字符串形式組合在一起的,因此要將這一整個字符串進行切分
for i in range(len(StockCodeLists)):
StockCodesString = StockCodeLists[i][0]
StockCodeList = StockCodesString.split(",")
StockCodeLists[i] = StockCodeList
return StockCodeLists
StockCodeLists = loatdata(dataset.loc[:,["InvoiceNo", "StockCode"]])
for item in StockCodeLists:
print(item)
運行結果如下: 每個列表中存儲“InvoiceNo”發票編號相同的記錄的產品代碼。
from exam import loatdata, dataset
StockCodeLists = loatdata(dataset.loc[:,["InvoiceNo", "StockCode"]])
class Apriori:
# 初始化函數,獲取給定的數據集、支持度阈值、置信度阈值
'''
函數說明:
dataset:給定的數據集;二維列表;列表中的每一個子列表中存放一個 TID 的所有Items
supportThreshold:支持度阈值;float
confidenceThreshold:置信度阈值;float
'''
def __init__(self, dataset, supportThreshold, confidenceThreshold):
self.dataset = dataset
self.supportThreshold = supportThreshold
self.confidenceThreshold = confidenceThreshold
'''
函數說明:
找到1項候選集C1
param data: 數據集
return: 1項候選集C1
'''
def creatC1(self):
C1 = []
for row in self.dataset:
for item in row:
if [item] not in C1:
C1.append([item])
# 中文字符串升序排序
C1.sort()
# frozenset()返回1項集,項集中的每一項均為一個凍結的集合,凍結後集合不能再添加或刪除任何元素
return list(map(frozenset, C1))
'''
函數描述:
計算1項候選集的支持度,剔除小於最小支持度的項集,
param D: 數據集
param C1: 候選集
return: 返回1項頻繁集及其支持度
'''
def calSupport(self, D, C):
dict_sup = {} # 中間儲存變量,用於計數
# 迭代每一條數據,對項集中的每一項進行計數
for i in D:
for j in C:
# 集合j是否是集合i的子集,如果是返回True,否則返回False
if j.issubset(i):
# 再判斷之前有沒有統計過,沒有統計過的話為1
if j not in dict_sup:
dict_sup[j] = 1
else:
dict_sup[j] += 1
# 事務總數
sumCount = float(len(D))
# 計算支持度,支持度 = 項集的計數/事務總數
supportData = {} # 用於存儲頻繁集的支持度
relist = [] # 用於存儲頻繁集
for i in dict_sup:
temp_sup = dict_sup[i] / sumCount
# 將剔除後的頻繁項集及其對應支持度保存起來
if temp_sup > self.supportThreshold:
relist.append(i)
supportData[i] = temp_sup
# 返回1項頻繁項集及其對應支持度
return relist, supportData
'''
函數描述:
使用剪枝算法,減少了候選集空間,找到k項候選集
param Lk: k-1項頻繁集
param k: 第k項
return: 第k項候選集
'''
def aprioriGen(self, Lk, k):
reList = [] # 用來存儲第k項候選集
lenLk = len(Lk) # 第k-1項頻繁集的長度
# 兩兩組合遍歷
for i in range(lenLk):
for j in range(i + 1, lenLk):
L1 = list(Lk[i])[:k - 2]
L2 = list(Lk[j])[:k - 2]
L1.sort()
L2.sort()
# 前k-1項相等,則可相乘,這樣可以防止重復項出現
if L1 == L2:
a = Lk[i] | Lk[j] # a為frozenset集合
# 進行剪枝
a1 = list(a) # a1為k項集中的一個元素
b = [] # b為它的所有k-1項子集
# 構造b:遍歷取出每一個元素,轉換為set,依次從a1中剔除該元素,並加入到b中
for q in range(len(a1)):
t = [a1[q]]
tt = frozenset(set(a1) - set(t))
b.append(tt)
# 當b都是頻繁集時,則保留a1,否則,刪除
t = 0
for w in b:
# 如果為True,說明是屬於候選集,否則不屬於候選集
if w in Lk:
t += 1
# 如果它的子集都為頻繁集,則a1是候選集
if len(b) == t:
reList.append(b[0] | b[1])
return reList
'''
函數說明:
計算候選k項集的支持度,剔除小於最小支持度的候選集,得到頻繁k項集及其支持度
param D: 數據集
param Ck: 候選k項集
return: 返回頻繁k項集及其支持度
'''
def scanD(self, D, Ck):
sscnt = {} # 存儲支持度
for tid in D: # 遍歷數據集
for can in Ck: # 遍歷候選項
if can.issubset(tid): # 判斷數據集中是否含有候選集各項
if can not in sscnt:
sscnt[can] = 1
else:
sscnt[can] += 1
# 計算支持度
itemNum = len(D) # 事務總數
reList = [] # 存儲k項頻繁集
supportData = {} # 存儲頻繁集對應支持度
for key in sscnt:
support = sscnt[key] / itemNum
if support > self.supportThreshold:
reList.insert(0, key) # 滿足條件的加入Lk中
supportData[key] = support
return reList, supportData
def get_FrequentItemset(self):
# 首先,找到1項候選集
C1 = self.creatC1()
# 將數據集中各Item中的產品代碼裝入集合中,再將各Items放入列表中,用於支持度計算
D = list(map(set, self.dataset))
# 計算1項候選集的支持度,剔除小於最小支持度的項集,返回1項頻繁項集及其支持度
L1, supportData = self.calSupport(D, C1)
L = [L1] # 加列表框,使得1項頻繁集稱為一個單獨的元素
k = 2 # k項
# 跳出循環的條件是沒有候選集
while len(L[k - 2]) > 0:
# 產生k項候選集Ck
Ck = self.aprioriGen(L[k - 2], k)
# 計算候選k項集的支持度,剔除小於最小支持度的候選集,得到頻繁k項集及其支持度
Lk, supK = self.scanD(D, Ck)
# 將supK中的鍵值對添加到supportData字典中
supportData.update(supK)
# 將第k項的頻繁集添加到L中
L.append(Lk) # L的最後一個值為空值
k += 1
del L[-1]
# 返回頻繁集及其對應的支持度;L為頻繁項集,是一個列表,1,2,3項集分別為一個元素
return L, supportData
'''
函數描述:
生成集合的所有子集
param fromList:
param totalList:
'''
def getSubset(self, freqList, all_subset):
for i in range(len(freqList)):
t1 = [freqList[i]]
t2 = frozenset(set(freqList) - set(t1)) # k-1項子集
if t2 not in all_subset:
all_subset.append(t2)
t2 = list(t2)
if len(t2) > 1:
self.getSubset(t2, all_subset) # 所有非1項子集
'''
函數說明:
計算置信度,並剔除小於最小置信度的數據,這裡利用了提升度概念
param freqSet: k項頻繁集
param H: k項頻繁集對應的所有子集
param supportData: 支持度
param RuleList: 強關聯規則
'''
def calcConf(self, freqSet, all_subset, supportData, strongRuleList):
# 遍歷freqSet中的所有子集並計算置信度
for conseq in all_subset:
conf = supportData[freqSet] / supportData[freqSet - conseq] # 相當於把事務總數抵消了
# 提升度lift計算lift=p(a&b)/p(a)*p(b)
lift = supportData[freqSet] / (supportData[conseq] * supportData[freqSet - conseq])
if conf >= self.confidenceThreshold and lift > 1:
print(freqSet - conseq, '-->', conseq, '支持度', round(supportData[freqSet], 6), '置信度:', round(conf, 6),
'lift值為:', round(lift, 6))
strongRuleList.append((freqSet - conseq, conseq, conf))
'''
函數描述:
生成強關聯規則:頻繁項集中滿足最小置信度阈值,就會生成強關聯規則
param L: 頻繁集
param supportData: 支持度
return: 返回強關聯規則
'''
def get_rule(self, L, supportData):
strongRuleList = [] # 存儲強關聯規則
# 從2項頻繁集開始計算置信度
for i in range(1, len(L)):
for freqSet in L[i]:
freqList = list(freqSet)
all_subset = [] # 存儲H1的所有子集
# 生成所有子集
self.getSubset(freqList, all_subset)
# print(all_subset)
# 計算置信度,並剔除小於最小置信度的數據
self.calcConf(freqSet, all_subset, supportData, strongRuleList)
return strongRuleList
# 以荷蘭為例
Netherlands_dataset = dataset.loc[dataset["Country"]=="Netherlands"]
StockCodeLists2 = loatdata(Netherlands_dataset.loc[:,["InvoiceNo", "StockCode"]])
apriori2 = Apriori(StockCodeLists2, 0.1, 0.7)
L, supportData = apriori2.get_FrequentItemset()
print("所有頻繁項集:")
for i in range(len(L)):
print(f"頻繁 {i+1} 項集:")
print(f"個數:{len(L[i])}")
for j in L[i]:
print(j)
print("符合要求的關聯規則如下:")
rule = apriori2.get_rule(L, supportData)
print(f"個數:{len(rule)}")
考慮到數據集的數據量較大(共392732條),關聯規則存在的稀疏性較大,因此數據集中存在的關聯規則的支持度會比較小。在經過多次調整支持度阈值與置信度阈值後,設置支持度阈值為0.006,置信度阈值為0.7,生成整體關聯規則。
最終獲得1069個頻繁1項集、1178個頻繁2項集、529個頻繁3項集、135個頻繁4項集、18個頻繁5項集、1個頻繁6項集。
在符合置信度阈值要求的頻繁項集中,頻繁1項集的支持度普遍要高於頻繁k(1<k<6)項集。總共挖掘出1101個強關聯規則,在所有的強關聯規則中,支持度最高的關聯規則為:
frozenset({'22697'}) --> frozenset({'22699'}) 支持度 0.029186 置信度: 0.782923 lift值為: 18.534184
'22697'的產品描述為:GREEN REGENCY TEACUP AND SAUCER
'22699'的產品描述為:ROSES REGENCY TEACUP AND SAUCER
根據不同國家產品銷量排名,確定產品銷量前三的國家為:United Kingdom、Netherlands、EIRE,遂對這三個主要國家進行關聯規則分析。
①United Kingdom
設置支持度阈值為0.006,置信度阈值為0.7。
得到頻繁1項集1068個、頻繁2項集1179個,頻繁3項集571個,頻繁4項集169個,頻繁5項集23個,頻繁6項集1個。總共挖掘出1101個強關聯規則。
其中支持度最高的三個關聯規則為:
frozenset({'22699'}) --> frozenset({'22697'}) 支持度 0.02859 置信度: 0.702065 lift值為: 19.099148
frozenset({'22698'}) --> frozenset({'22697'}) 支持度 0.024266 置信度: 0.819473 lift值為: 22.293137
frozenset({'22698'}) --> frozenset({'22699'}) 支持度 0.023004 置信度: 0.776876 lift值為: 19.07701
②Netherlands
設置支持度阈值為0.1,置信度阈值為0.7。
得到頻繁1項集34個、頻繁2項集25個,頻繁3項集8個,頻繁4項集1個。總共挖掘出47個強關聯規則。
其中支持度最高的三個關聯規則為:
frozenset({'22630'}) --> frozenset({'22629'}) 支持度 0.221053 置信度: 0.954545 lift值為: 3.238636
frozenset({'22326'}) --> frozenset({'22629'}) 支持度 0.189474 置信度: 0.72 lift值為: 2.442857
frozenset({'22630'}) --> frozenset({'22326'}) 支持度 0.168421 置信度: 0.727273 lift值為: 2.763636
③EIRE
設置支持度阈值為0.1,置信度阈值為0.7。
得到頻繁1項集77個、頻繁2項集45個,頻繁3項集43個,頻繁4項集11個。總共挖掘出258個強關聯規則。
其中支持度最高的三個關聯規則為:
frozenset({'22697'}) --> frozenset({'22699'}) 支持度 0.119231 置信度: 0.911765 lift值為: 5.387701
frozenset({'22698'}) --> frozenset({'22699'}) 支持度 0.103846 置信度: 0.964286 lift值為: 5.698052
frozenset({'22698'}) --> frozenset({'22697'}) 支持度 0.1 置信度: 0.928571 lift值為: 7.10084
從以上挖掘結果中,可以發現項集{'22699'}、{'22698'}、{'22697'}在United Kingdom和EIRE中均為支持度較高的頻繁項集,並且這三個頻繁項集均在這兩個國家的銷售中存在強關聯性。考慮到愛爾蘭在地理位置上緊挨英國,因此民眾的消費特性接近,關聯規則的挖掘結果也間接證明了這一點。荷蘭民眾購買的產品的關聯規則則與英國和愛爾蘭不同,值得注意的是產品'22629'、'22630'、'22326'在荷蘭的銷售量分別排在第二、三、五名(產品在荷蘭的銷售量占比餅圖如下),說明具有強關聯性的產品,其銷售量往往相近,通過產品的強關聯性,熱銷產品可以帶動其相關產品的銷售。