相關分析與關聯分析
數據之間最常見的關系是函數關系,在數據函數關系下,一些數據發生變動,與之對應的另一些數據會嚴格按照函數關系發生相應的變動。但實際上,數據之間的變動清咖u給你還會收到其他沒有考慮到或者根本無法考慮的因素的影響,使得數據變動狀況很少真正能夠用函數的形式來具體表述,數據之間的關系往往體現為相互依存的非函數關系。
還有些數據數值上可能不具有上述描述的關系,但是產生這些數據的行為可能發生關聯。
相關分析
函數關系和相關關系
相關分析(correlation analysis)主要分析兩個變量之間的相互依存關系,在學習相關分析之前,應當先區分變量或數據之間的兩種主要關系
函數關系:當一個或幾個變量取一定的值時,另一個變量有確定值與之具體嚴格相對應,則稱這種關系為函數關系。
相關關系:變量之間的影響不能夠用具體的函數來度量,但變量之間的關系確實存在數量上不是嚴格對應的相互依存關系,稱之為相關關系。
函數關系時確定性的,往往把發生變動的變量稱之為自變量,受自變量變動影響而發生變動的變量稱之為因變量。
相關關系是不確定的,主要考察變量之間的相互影響,這種影響不存在方向性,即變量A與變量B相關和變量B與變量A相關是一致的。相關關系主要體現為變量之間的相互依存關系。相關分析不具有傳遞性,即A和C相關,B和C相關,A和B不一定相關。
相關分析根據其分析方法和處理對象不同,可分為:簡單相關分析、偏相關分析、非參數相關分析等。根據相關關系表現形式不同,可分為:線性相關分析、非線性相關分析。
簡單相關分析
簡單相關分析主要分析兩個變量之間相互依存的關系,可以通過主管觀測和客觀測度指標來衡量。
主觀觀測變量之間的相關關系,主要是通過兩個變量之間散點圖的手段來進行分析的。客觀測度主要是通過統計分析的方法,計算相關系數,利用相關系數數值的符號和大小來判定相關關系的方向和強弱。
- 用圖形描述相關關系
利用散點圖可以描繪出兩個變量的相互影響狀況。根據散點圖的不同表現情形,有如下類型:完全正線形相關、完全負線形相關、曲線相關、正線性相關、負線性相關、不相關。
- 用相關系數測度相關關系
相關系數是描述線性相關程度和方向的統計量,根據樣本收集的數據計算的相關系數,通常用字母 \(r\) 表示。\(r\) 的正負號表示相關關系的方向,\(r\) 的絕對值大小表示相關關系的強弱程度。
設兩個變量分別是 \(x,y\),根據樣本數據計算相關系數的方法主要采用Pearson提出的方法,即Pearson相關系數
相關系數 \(r\) 有如下情況
r=+1 表示完全正線性相關
r=-1 表示完全負線性相關
r<0 表示負線性相關
r>0 表示正線性相關
r=0 表示不存在線性關系
|r|<0.3 表示低度線性相關
0.3<=|r|<0.5表示中低度線性相關
0.5<=|r|<0.8表示中度線性相關
0.8<=|r|<1.0表示高度線性相關
- 相關系數的顯著性檢驗
相關系數的顯著性檢驗主要是根據樣本數據計算的樣本相關系數 \(r\),利用 \(t\) 統計量,根據 \(r\) 服從自由度為 \(n-2\) 的 \(t\) 分布的假定,對總體相關系數(\(\rho\))是否等於0進行假設檢驗。若在一定的顯著性水平下,拒絕 \(\rho=0\) 的原假設,則表示樣本相關系數 \(r\) 是顯著的。其原假設和備擇假設:
示例
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 為了評價汽車最高時速和汽車自身相應指標的影響,收集了相關數據。
car_corr = pd.read_csv('./data/car_corr.csv')
print(car_corr.head(5))
# Brand_Model Weight Circle Max_Speed Horsepower
# 0 Acura Legend V6 3265 42 163 160
# 1 Audi 100 2935 39 141 130
# 2 BMW 535i 3640 39 209 208
# 3 Buick Century 2880 41 151 110
# 4 Buick Riviera V6 3465 41 231 165
# 計算樣本相關系數
# 方法一:numpy
res = np.corrcoef((car_corr['Weight'], car_corr['Circle'], car_corr['Max_Speed'], car_corr['Horsepower']))
print(res)
# [[ 1. 0.07548513 0.85458981 0.82559164]
# [ 0.07548513 1. 0.26369327 -0.02829931]
# [ 0.85458981 0.26369327 1. 0.75015192]
# [ 0.82559164 -0.02829931 0.75015192 1. ]]
# 主對角現的相關系數均為1,表示自己與自己完全相關。其他部分表示變量之間的相關系數。
# 方法二:pandas
res = car_corr.corr() # 可自動識別DataFrame對象中的數值型數據
print(res)
# Weight Circle Max_Speed Horsepower
# Weight 1.000000 0.075485 0.854590 0.825592
# Circle 0.075485 1.000000 0.263693 -0.028299
# Max_Speed 0.854590 0.263693 1.000000 0.750152
# Horsepower 0.825592 -0.028299 0.750152 1.000000
# 顯著性檢驗
# 1.計算兩變量之間的相關系數
res = stats.pearsonr(car_corr['Max_Speed'], car_corr['Weight'])
print(res) # (0.8545898074815489, 1.8591897095041332e-09)
# p_v \approx 0,拒絕原假設,線性相關顯著。
# 2.計算多組數據兩兩之間的相關系數及顯著性
correlation = []
for i in car_corr[['Weight', 'Circle', 'Horsepower']].columns:
correlation.append(stats.pearsonr(car_corr['Max_Speed'], car_corr[i]))
print(correlation)
# [(0.8545898074815489, 1.8591897095041332e-09),
# (0.2636932690716119, 0.15913089371709174),
# (0.7501519209192845, 1.8164321769966608e-06)]
# 其他方法
# 1.僅有p值:sklearn
from sklearn.feature_selection import f_regression
F, P_value = f_regression(car_corr[['Weight', 'Circle', 'Horsepower']], car_corr['Max_Speed'])
print(F, P_value)
# [75.82819719 2.09245283 36.03335654] [1.85918971e-09 1.59130894e-01 1.81643218e-06]
# 結論:在不考慮其他因素作用下,最高時速與車身自重存在顯著的高度正線性相關,與發動機馬力存在顯著的中度線性相關
偏相關分析
簡單相關分析有時不能夠真實反映現象之間的關系。如某個變量可能會影響其他的變量,而這種影由於相關關系的不可傳遞性,往往會得出錯誤的結論。
所以在進行相關分析時要控制這種變量,剔除其對其他變量的影響后,再研究變量之間的相關關系。這種方法稱之為偏相關分析(partial correlation analysis)
一階偏相關分析(控制住一個變量 \(p\),單純分析 \(x,y\) 之間的相關關系)
其中 \(r_{xy},r_{xp},r_{yp}\) 分別表示 \(x\) 和 \(y\)之間、\(x\) 和控制變量 \(p\)之間、\(y\) 和控制變量 \(p\)之間的簡單相關系數。
示例
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 為了評價汽車最高時速和汽車自身相應指標的影響,收集了相關數據。
car_corr = pd.read_csv('./data/car_corr.csv')
print(car_corr.head(5))
# Brand_Model Weight Circle Max_Speed Horsepower
# 0 Acura Legend V6 3265 42 163 160
# 1 Audi 100 2935 39 141 130
# 2 BMW 535i 3640 39 209 208
# 3 Buick Century 2880 41 151 110
# 4 Buick Riviera V6 3465 41 231 165
# 馬力可能對其他變量產生影響,控制主馬力變量,進行偏相關分析
# 一階偏相關系數
def partial_corr(x, y, partial=[]):
# x,y為考察相關關系的變量,partical為控制變量
xy, xyp = stats.pearsonr(x, y)
xp, xpp = stats.pearsonr(x, partial)
yp, ypp = stats.pearsonr(y, partial)
n = len(x)
df = n - 3
r = (xy - xp * yp) / (np.sqrt(1 - xp * xp) * np.sqrt(1 - yp * yp))
if abs(r) == 1:
prob = 0.0
else:
t = (r * np.sqrt(df)) / np.sqrt(1 - r * r)
prob = (1 - stats.t.cdf(abs(t), df)) * 2
return r, prob
pcorrelation = []
for i in car_corr[['Weight', 'Circle']].columns:
pcorrelation.append(partial_corr(car_corr[i], car_corr['Max_Speed'], partial=car_corr['Horsepower']))
print(pcorrelation)
# [(0.6305309485292878, 0.00024594990184656496), (0.43104653010728905, 0.01957036695163783)]
# 剔除馬力影響后,車身自重的相關系數有所下降,處於中度線性相關,非常顯著;輪胎尺寸的相關系數有所提升,也較為顯著。
點二列相關分析
點二列相關分析(point-biserial correlation)適用於兩個變量中一個是來自正態總體的定距或定比數據,另一個變量是二分類數據。一般將后者編碼為0,1,然后計算Pearson相關系數。計算公式
其中 \(p\) 表示二分類數據某類的占比,\(q=1-p\) 表示另一類的占比。\(\bar{x}_p,\bar{x}_q\) 分別表示對應分類對應的另一個變量的平均數,\(s_x\) 為另一個變量的樣本標准差。
示例
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 分析性別和成績之間的相關關系,0女1男
scorebygender = pd.read_csv('./data/scorebygender.csv')
print(scorebygender.head(5))
# score gender
# 0 68 1
# 1 81 1
# 2 78 0
# 3 91 0
# 4 91 1
# 相關系數及顯著性水平
res = stats.pointbiserialr(scorebygender['gender'], scorebygender['score'])
print(res) # PointbiserialrResult(correlation=0.013517390176463254, pvalue=0.8777414982748739)
# 相關系數比較低相關性非常弱,p_v比較大非常不顯著,可以認為成績和性別無關。
非參數相關分析
簡單相關分析和偏相關分析廣泛應用於定量數據或連續型數據的研究。
對於某些數據尤其是定性數據的相關分析而言,使用Pearson法計算相關系數,很難得到定性數據的協方差和標准差。對此類數據的相關分析往往從數據值的次序入手,並借助非參數統計分析的思想。
次序在數列中代表了某個具體變量值的位置、等級或秩,因此此類相關分析稱之為非參數相關分析、等級相關分析或秩相關分析,其計算的相關系數變對應的稱為非參數相關系數、等級相關系數或秩相關系數。
常用的方法有:Spearman、Kendall tau-b、Hoeffding's D相關系數等
- Spearman系數
主要測度順序變量間的線性相關關系,在計算過程中只考慮變量值的順序不考慮變量值的大小。
其計算過程:首先把變量值轉換為在樣本所有變量值中的排列次序,再利用Pearson方法求解轉換后的兩個變量對應的排列次序的相關系數。其計算公式為
其中,\(R_{x_i},R_{y_i}\) 分別表示第 \(i\) 個 \(x\) 變量和 \(y\) 變量經過排序后的次序,\(\bar{R}_x,\bar{R}_y\) 分別表示\(R_{x_i},R_{y_i}\) 的均值。
- Kendall tau-b系數
主要測度順序變量間的線性相關關系,在計算過程中只考慮變量值的順序不考慮變量值的大小。
在Kendall tau-b系數計算過程中,除對數據進行排列順序外,還應綜合考慮該排序與變量值的具體情況,即
同序對:在兩個變量上排列順序相同的一對變量
異序對:在兩個變量上排列順序相反的一對變量
上述對子的數目簡稱為對子數,設 \(P\) 為同序對子數,\(Q\) 為異序對子數,\(T_x\) 為在 \(x\) 變量上是同序但在 \(y\) 變量上不是同序的對子數,\(T_y\)為在 \(y\) 變量上是同序但在 \(x\) 變量上不是同序的對子數,則Kendall tau-b系數
\(\tau_b\) 的取值范圍與簡單相關系數相同,即 \(\tau_b \in [-1,+1]\)
- Hoeffding's D系數
該系數主要測度順序變量或具有等級水平變量間的線性相關關系,其計算公式為
其中:
\(R_i,S_i\)分別表示變量 \(x,y\) 的排列順序,\(Q_i\)表示1加上變量 \(x,y\) 的值均小於這兩個變量中的第 \(i\) 個值時的個數,也稱之為雙變量等級。
上述相關系數也可用於定量數據中,在相關分析中只要除去定量數據的數值意義即可。
示例
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 考察研究生對自身所選專業的興趣與其他因素之間的相關關系
# 各變量以1~5分的像是進行收集,對應值標簽如下
# Interest: 更高、沒變化、下降、失去興趣、根本不感興趣
# Major: 完全一致、基本一致、有點聯系、不一致、完全不一致
# Teaching: 非常滿意、比較滿意、一般滿意、不太滿意、非常不滿意
# Tutor: 非常大、比較大、一般、不大、沒作用
# 由於需要用數字進行相關系數計算,故無需將值標簽掛在數據集變量中
graduate = pd.read_csv('./data/graduate.csv')
print(graduate.head(5))
# Interest Major Teaching Tutor
# 0 2 2 2 2
# 1 2 2 1 2
# 2 4 3 4 4
# 3 1 1 2 1
# 4 3 3 3 3
# 由於變量都是順序變量,可以用非參數相關系數考察各變量之間的相關系數
# 方法一:spearman
rho, p = stats.spearmanr(graduate)
print(rho, p)
# 相關系數
# [[1. 0.72134588 0.27430442 0.8062982 ]
# [0.72134588 1. 0.28790361 0.73184305]
# [0.27430442 0.28790361 1. 0.28440269]
# [0.8062982 0.73184305 0.28440269 1. ]]
# p值
# [[0.00000000e+000 2.58589179e-163 6.31375185e-019 1.49316919e-232]
# [2.58589179e-163 0.00000000e+000 9.09876371e-021 2.08047486e-170]
# [6.31375185e-019 9.09876371e-021 0.00000000e+000 2.77199934e-020]
# [1.49316919e-232 2.08047486e-170 2.77199934e-020 0.00000000e+000]]
# 方法二:kendall tau-b
kt = []
for i in graduate['Interest', 'Major', 'Teaching'].columns:
kt.append(stats.kendalltau(graduate[i], graduate['Tutor']))
print(kt)
# 相關系數
# [[1. 0.72134588 0.27430442 0.8062982 ]
# [0.72134588 1. 0.28790361 0.73184305]
# [0.27430442 0.28790361 1. 0.28440269]
# [0.8062982 0.73184305 0.28440269 1. ]]
# p值
# [[0.00000000e+000 2.58589179e-163 6.31375185e-019 1.49316919e-232]
# [2.58589179e-163 0.00000000e+000 9.09876371e-021 2.08047486e-170]
# [6.31375185e-019 9.09876371e-021 0.00000000e+000 2.77199934e-020]
# [1.49316919e-232 2.08047486e-170 2.77199934e-020 0.00000000e+000]]
# 結論:學生專業興趣與如下相關且顯著:所學知識與專業方向相符性、導師對學業的幫助;與如下無關:教師上課的水平高低
關聯分析
關聯分析(association analysis)常用語發現大量數據中有意義的聯系,這種聯系前調的是產生數據的行為之間的聯系。這些數據之間的關聯即關聯規則(association rule)。
這里討論的關聯指這些數據會同時出現,但不討論之間的因果關系。
在關聯分析時,需處理兩個關鍵問題
1.從海量數據中發現規則或模式的計算成本非常高
2.所發現的規則或模式可能是偶然性的,實際應用價值不大
基本概念與預處理
- 基本概念
import pandas as pd
# 購物籃數據
aa = pd.read_csv('./data/Association.csv', encoding='gbk')
print(aa.head(5))
# TID 項集
# 0 1 {面包,牛奶}
# 1 2 {面包,尿布,啤酒,雞蛋}
# 2 3 {牛奶,尿布,啤酒,可樂}
# 3 4 {面包,牛奶,尿布,啤酒}
# 4 5 {面包,牛奶,尿布,可樂}
每一行數據是一筆交易或事務(transaction),記其總量為 \(N\);具體的某種產品叫做項(item),是分析的基本對象。
項集(itemset):項的集合。若一個項集包含 \(k\) 各項,則稱其為\(k-項集\),\(k\)為項集的長度。
關聯規則(association rule):形如 $X \to Y $ 的蘊含表達式,其中 \(X\) 和 \(Y\) 是不相交的項集。關聯規則的強度可以用支持度和置信度來衡量,同時滿足最小支持度和置信度的關聯規則稱之為強關聯規則。
支持度計數(support count):指項集出現的頻數,通常用 \(\sigma\) 表示。
支持度(support):所有交易中包含指定項集的比例,定義為
支持度可以用來衡量給定項集的頻繁程度。
置信度(confidence):\(Y\) 在包含 \(X\) 的交易中出現的頻繁程度。定義為
頻繁項集(frequent itemset):支持度大於等於所設定閾值的項集,如果頻繁項集中有 \(L\) 項,記為 \(L-頻繁項集\)。
如果有一個項集是頻繁的,則它的所有子集也一定是頻繁的,此即為先驗原理1。如果一個項集是非頻繁的,那么包含該項集的超集也一定是非頻繁的,此即為先驗原理2。
依據頻繁項集的原理可以節約算法搜索相關項集的時間,提高計算效率,這種過程稱為剪枝。基於支持度度量修剪搜索空間的策略稱為基於支持度的剪枝,這種剪枝策略依賴於支持度的一個關鍵性質,即一個項集的支持度絕對不會超過它的子集的支持度,該性質被稱為支持度度量的反單調性(anti-monotone)
關聯規則的主要任務就是要從給定的交易或事物數據集合中,找出支持度和置信度大於等於其各自閾值的所有規則。但是當數據規模較大時(如數目為 \(d\) 項的數據,理論上有 \(2^d\) 各候選項集和 \(3^d-2^{d+1}+1\) 個規則),如果再去計算每個項集的支持度和置信度,將會對系統的計算能力提出極高的要求。
圍繞如何發現頻繁項集降低計算頻次等具體問題產生了較多的關聯分析算法。大體可分為三類:
1. 搜索法:只適用於項集數量相對較小數據集的關聯規則挖掘
2. 分層算法:寬度優先算法,以Apriori算法為典型代表,需掃描數據集的次數等於最大頻繁項目集的項目數
3. 深度優先算法:以FP-growth算法為典型代表
- 預處理
在實際分析過程中,往往通過正則表達式、分詞等文本分析技術將數據中的項識別處理啊,然后處理為如下的機構數據進行分析
# TID 面包 牛奶 尿布 啤酒 雞蛋 可樂
# 0 1 1 1 0 0 0 0
# 1 2 1 0 1 1 1 0
# 2 3 0 1 1 1 0 1
# 3 4 1 1 1 1 0 0
# 4 5 1 1 1 0 0 1
一般采用“0-1”型二元變量:如果項在事務中出現賦值為1,反之則為0。
Apriori算法
是一種頻繁項集算法,其兩個輸入參數是最小支持度和數據集。該算法首先生成所有單項(項集長度為1)列表,得到滿足最小支持度的 \(1-項集\),將其進行組合生成包含2個元素的 \(2-項集\),繼續提出不滿足最小支持度的項集,重復上述過程直到所有非頻繁項集都被剔除。
示例
from random import randint
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 分析業務訂購之間的關聯規則
mpb = pd.read_csv('./data/mpb.csv')
print(mpb.head(5))
# news email callreminder
# 0 0 1 0
# 1 0 1 0
# 2 0 1 0
# 3 0 1 0
# 4 0 1 0
# 挖掘關聯規則
# python中雖有apriori/orange等包實現,但是多年未更新,可靠性未知
sign = '-->' # 定義蘊含符,用於描述關聯規則
class Apriori(object):
def __init__(self, minsupport=0.1, minconfidence=0.4):
self.minsupport = minsupport
self.minconfidence = minconfidence
def link(self, x, sign):
'''
該函數用於連接前項和后項
'''
x = list(map(lambda i: sorted(i.split(sign)), x))
l = len(x[0])
r = []
for i in range(len(x)):
for j in range(i, len(x)):
if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:
r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))
return r
def apriori(self, data):
'''
該函數用於頻繁項集的挖掘
'''
final = pd.DataFrame(index=['support', 'confidence'])
support_series = 1.0 * data.sum() / len(data) # 生成支持度序列
column = list(support_series[support_series > self.minsupport].index)
# 初步支持度篩選
k = 0
while len(column) > 1:
k = k + 1
column = self.link(column, sign)
sf = lambda i: data[i].prod(axis=1, numeric_only=True)
# 支持度的計算函數
data_2 = pd.DataFrame(list(map(sf, column)),
index=[sign.join(i) for i in column]).T
support_series_2 = 1.0 * data_2[[sign.join(i) for i in column]].sum() / len(data)
# 更新支持度
column = list(support_series_2[support_series_2 > self.minsupport].index)
# 更新后支持度篩選
support_series = support_series.append(support_series_2)
column2 = []
for i in column:
i = i.split(sign)
for j in range(len(i)):
column2.append(i[:j] + i[j + 1:] + i[j:j + 1])
# 計算置信度
confidence_series = pd.Series(index=[sign.join(i) for i in column2], dtype='float64')
for i in column2:
confidence_series[sign.join(i)] = support_series[sign.join(sorted(i))] \
/ support_series[sign.join(i[:len(i) - 1])]
for i in confidence_series[confidence_series > self.minconfidence].index:
# 置信度篩選
final[i] = 0.0
final[i]['confidence'] = confidence_series[i]
final[i]['support'] = support_series[sign.join(sorted(i.split(sign)))]
# 計算結果
final = final.T.sort_values(['confidence', 'support'], ascending=False)
return final
# 創建用於分析的實例對象
rule = Apriori()
# 調用實例對象的apriori方法對mpb數據對象進行規則挖掘
res = rule.apriori(mpb)
print(res)
# support confidence
# news-->email 0.184727 0.540640
# callreminder-->email 0.100120 0.477597
# 將置信度放寬
rule = Apriori(minconfidence=0.2)
res = rule.apriori(mpb)
print(res)
# support confidence
# news-->email 0.184727 0.540640
# callreminder-->email 0.100120 0.477597
# email-->news 0.184727 0.242870
FP-growth算法
FP-growth算法只需掃描原始數據2遍,將原始數據中的事務壓縮到一個FP-tree中,從而達到壓縮數據的目的。在FP-tree中找出每個項集的條件模式基、條件FP-tree,遞歸的挖掘條件FP-tree得到所有的頻繁項集。
構造FP-tree主要有兩個步驟:從事務數據集中構建FP-tree和從FP-tree中挖掘出規則。具體步驟如下:首先掃描數據集1次,生成 \(1-頻繁項集\),然后將 \(1-頻繁項集\)降序排列后放入 \(L\) 頻繁項集表中;再次掃描數據集,將每個事務相應項集的關聯及頻數等信息記入FP-tree中。
示例
from random import randint
import pandas as pd
import statsmodels.api as sm
import scipy.stats as stats
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 分析業務訂購之間的關聯規則
mpb_fpg = pd.read_csv('./data/mpb_fpgrowth.csv')
res = mpb_fpg.iloc[[randint(0, 98371) for _ in range(10)]]
print(res)
# new email callreminder
# 58375 new email NaN
# 42039 NaN email callreminder
# 28960 NaN email callreminder
# 20923 NaN email NaN
# 71076 new NaN NaN
# 89245 NaN email NaN
# 31867 NaN email NaN
# 90654 NaN email NaN
# 17114 NaN email NaN
# 37505 NaN email callreminder
# fp_growth支持python2,不支持python3
from fp_growth import find_frequent_itemsets as ffi
# find_frequent_itemsets可用於頻繁項集的挖掘
# 參數1:事務數據,參數2:最小支持度計數=支持度閾值*樣本量
for itemset in ffi(np.array(mpb_fpg), minimum_support=int(len(np.array(mpb_fpg)) * 0.1)):
if nan in itemset:
# 舍去含有NaN的項集
pass
elif len(itemset) == 1:
# 舍去1-項集
pass
else:
# 該算法是逆向輸出結果,將列表反序即可得到結果
print(itemset[::-1])
# ['news', 'email']
# ['callreminder', 'email]
# 結果輸出滿足最小支持度0.1的結果與Apriori算法一致,且效率更高