參考:
數(shù)據(jù)挖掘入門系列教程(五)之Apriori算法Python實現(xiàn)
Python 極簡關(guān)聯(lián)分析(購物籃分析)
- 數(shù)據(jù)集:
鏈接:https://pan.baidu.com/s/1V_vxEriCf9ticDj8pWPDcQ
提取碼:14yq
#!/usr/bin/python
# coding=utf-8
import numpy as np
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
# 畫圖支持中文顯示
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 負號
plt.rcParams['axes.unicode_minus'] = False
# 顯示所有列
pd.set_option('display.max_columns', None)
# 顯示所有行
pd.set_option('display.max_rows', None)
# 設(shè)置value的顯示長度為10000伏尼,默認(rèn)為50
pd.set_option('display.width',10000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#
np.set_printoptions(linewidth=1000)
df = pd.read_excel('G:\\rnn\\relationship analysis\Online Retail.xlsx')
print(df.head())
'''
發(fā)票編號:發(fā)票編號馁痴。標(biāo)稱,唯一分配給每個交易的6位整數(shù)披摄。如果此代碼以字母“ c”開頭提陶,則表示已取消钥飞。
StockCode:產(chǎn)品(項目)代碼。標(biāo)稱简肴,唯一地分配給每個不同產(chǎn)品的5位整數(shù)。
描述:產(chǎn)品(項目)名稱榨咐。名義上
數(shù)量:每筆交易中每個產(chǎn)品(項目)的數(shù)量诺祸。數(shù)字。
InvoiceDate:通知日期和時間祭芦。數(shù)字筷笨,每筆交易生成的日期和時間。
單價:單價龟劲。數(shù)值胃夏,單位為英鎊的產(chǎn)品價格。
客戶編號:客戶編號昌跌。標(biāo)稱仰禀,唯一分配給每個客戶的5位整數(shù)。
國家:國家名稱蚕愤。名義上答恶,每個客戶居住的國家的名稱。
'''
df['Description'] = df['Description'].str.strip() # Description字段去除首尾空格
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True) # 刪除發(fā)票ID"InvoiceNo"為空的數(shù)據(jù)記錄
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')] # 刪除發(fā)票ID"InvoiceNo"不包含“C”的記錄
# 數(shù)據(jù)預(yù)處理——處理為購物籃數(shù)據(jù)集
# 方法一:使用pivot_table函數(shù)
basket = df[df['Country'] =="France"].pivot_table(columns = "Description",index="InvoiceNo", values="Quantity",aggfunc=np.sum).fillna(0)
print(basket.head(3))
# 方法二:groupby后unstack
basket2 = (df[df['Country'] =="Germany"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
# basket選擇法國地區(qū)數(shù)據(jù)萍诱,basket2為德國地區(qū)數(shù)據(jù)悬嗓,記得fillna(0),將空值轉(zhuǎn)為0裕坊,算法包需要包竹。
# 將購物數(shù)量轉(zhuǎn)為0/1變量
# 0:此訂單未購買包含列名
# 1:此訂單購買了列名商品
def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
basket_sets = basket.applymap(encode_units)
basket_sets.drop('POSTAGE', inplace=True, axis=1) # 刪除購物籃中的郵費項(POSTAGE)
# 進行關(guān)聯(lián)規(guī)則運算
frequent_itemsets = apriori(basket_sets, min_support=0.05, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
print('frequent_itemsets 為頻繁項集:(Support列為支持度,即 項集發(fā)生頻率/總訂單量)\n', frequent_itemsets)
print('rules為最終關(guān)聯(lián)規(guī)則結(jié)果表:(antecedants前項集籍凝,consequents后項集周瞎,support支持度,confidence置信度饵蒂,lift提升度声诸。)\n', rules)
print('==================================================================================================')
# 結(jié)果檢視
# 選取(置信度confidence≥0.8)&(提升度lift≥6)的規(guī)則退盯,按lift降序排序
head_rules = rules[ (rules['lift'] >= 6) & (rules['confidence'] >= 0.8) ].sort_values("lift",ascending = False)
print(head_rules)