数据挖掘——如何利用Python实现产品关联性分析apriori算法篇4 p* T& F% v! v$ h" g( W
; l& u. S2 X; L$ W- @* c, S
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。 ! n+ x7 M; y; H - W/ R; u+ `( c; x$ b1.准备工作 b4 u3 c5 X& ~0 }# r. @7 t如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:4 C% i N( K# S m; s- j; ?2 Q
: ]2 p3 H! L! i c- Y/ {. npip install mlxtend) r1 _; f2 V% j0 F
1- _' I- m5 v$ G( q$ t+ h
为方便进行过程的演示,在此构建测试数据: 9 _1 w( X- t' P5 w6 U7 X4 h3 {9 w$ O
import pandas as pd1 P* x+ v4 K: c. {0 U6 d; C
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})# y8 g. t7 p+ u2 k
1 + A- S$ l" c, c/ @; G6 q# {' ?8 }2 ; h! ]* p; C4 u- r测试数据截图如下: & ~$ l. g/ ]4 j6 ?# K4 r1 v5 d/ @0 } c- w
t9 R$ W, `& d5 J6 @; E" y
对上述的数据进行以下处理:' ?- t! T1 |2 _6 j/ h0 t. C
0 }; q8 p* |8 ~2 h; {7 Ldf_chg=df['product_list'].str.split("-")" X( r: e5 ?* g/ M% o* {
1" O. H+ R8 o5 {9 K" I
数据处理后,结果截图如下:0 S8 T7 F' }7 F8 T
+ P0 m% R0 E1 u
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。1 F3 e% k/ h. e% w+ d
) Q0 X4 K. F$ n2.核心函数及代码: k- c0 f% A' b' g; H. m" H/ s7 K
2.1 数据预处理3 s9 x5 }& N: G: F
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' H1 j4 H1 Z2 B4 H7 F3 }9 F
8 O' k' N1 E4 `0 w#1.将传入的数据转换为算法可接受的数据类型(布尔值)! G% ~7 I. q% a. _1 g* R$ \$ q4 u
from mlxtend.preprocessing import TransactionEncoder. y8 L l. i6 `; ]) \1 c. g" i
te = TransactionEncoder() 3 I X( q& B" D" F; Z- |' |9 {* bdf_tf = te.fit_transform(df_chg)- \( v8 j% H5 c
#为方便进行查看,生成dataframe5 a5 ^3 z, V1 a
data = pd.DataFrame(df_tf,columns=te.columns_) 6 n5 D# y& N. y( [1" J( B) i9 |/ J3 I7 L
2; ?$ Q) c- d: a% o& \! p: e: }4 |
3 & W% ?) y. `, l! f( k# N2 Q. _46 X* H) V5 q5 x# G
57 z$ u* ?8 Q6 \% d
62 [: r- @" v8 g, N/ X
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:1 s: d4 T3 k( L" e! d; F3 U
. o& e, [; w8 ^( E% q# N, V2 J- c+ q . }, k* \8 K1 y2 l2.2 两个关键函数; |7 }' i8 d6 t. e% [% B ~
apriori函数# a0 j9 C4 v2 B1 ~1 v5 \! e0 j
语法: l0 g( {3 b8 @/ l& C
$ t7 V- S: l0 N3 {1 {& b
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)! h2 ]7 h4 x. g
10 ^% [( H. J. J% M
参数详解: # C& e) t+ K9 o' n- U& E+ ^; p! N* G9 m) f& r/ H( d, r! d
df: pandas模块中的数据帧,DataFrame形式的数据;, j1 n. g8 s# n' H% m
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。* h" Q y. M8 Y& `! [2 G: {
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。 7 |9 \! @: Y. W; V6 kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。 * H* ~; v# h' X5 u1 C5 j- H# S- Kverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。 4 g( ` ] g0 r* n% |9 {low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。& m4 }) C: X2 t3 D' S9 A6 ]
association_rules函数/ n4 W' U+ Z+ x1 Q
语法:0 H! y' M4 ^7 L5 w# n% z, q# ^' q+ }
+ q$ o( n7 G( r. K
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)4 i2 w$ @0 [) ~& v
1 ' |' D( v; ]/ c; E! c8 |% q参数如下: 0 Z$ z' i* Q1 `, O/ L2 r6 i, d % J& T+ M$ v# ]9 }9 T/ [df: pandas模块中的数据帧,DataFrame形式的数据; 4 t# i1 R% o+ Z mmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 c5 ^* k3 ]2 Y7 O# s( h+ i7 [
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。 ( O4 Y E k6 T' a3 f; ysupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。 . @ z9 X0 `' e; `附带metric几种参数的计算方法:- p$ Z' S' w! E4 a6 s
9 u" c) G# B, C9 |0 B9 o- W% x6 L
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1] p& T z; v0 j$ l: O1 \. Q