商品购物篮分析 h- i3 n c# h ~% g
现代商品种类繁多,顾客往往会由于需要购买的商品众多而变得疲于选择,且顾客并不会因为商品选择丰富而选择购买更多的商品。) r, Q3 ?$ g7 m3 I7 z
: |9 l8 y' s+ N# x对于某些商品,顾客会选择同时购买,如面包与牛奶、薯片与可乐等,当面包与牛奶或者薯片与可乐分布在商场的两侧,且距离十分遥远时,顾客购买的欲望就会减少,在时间紧迫的情况下顾客甚至会放弃购买某些计划购买的商品。相反,把牛奶与面包摆放在相邻的位置,既给顾客提供便利,提升购物体验,又提高顾客购买的概率,达到了促销的目的。 7 |, I! X" x' ]. c9 W. Q6 w 5 x6 @6 d$ l4 h3 ~) o I/ i. }某商品零售企业共收集了9835个购物篮的数据,其中包含169个不同的商品类别,售出商品总数为43367件。其数据示例如表所示。& y) i# f' H; w/ o, A ( `; ~, l# F- h
) j- C1 A7 r1 i$ V8 w针对原始数据中不同商品销量进行统计,结果如表所示。 ; I6 X. O/ ?. O; k+ OØ全脂牛奶销售量最高,销量为2513件,占比5.795%。: M: ~9 C2 F' F% k" M4 g
Ø其余热销商品还有其他蔬菜销量1903件,占比4.388%。 . ^8 L4 I6 k- HØ面包卷销量1809件,占比4.171%。 3 z7 K7 Q' @5 e2 s" SØ苏打销量1715件,占比3.955%。酸奶销量1372件,占比3.164%等。 " g: y( F7 c! b* }# A% T! |( v前20种商品销量占据的比例约为50%,基本符合“二八定律”。 5 Y5 u/ z: y; m3 Y0 R5 E7 G8 g, I8 [0 ]" x. P
对每一类商品的热销程度进行分析,有利于商家制定商品在货架的摆放策略和位置。若是某类商品较为热销,它的摆放位置可以有如下选择。 ' G* Q/ u) F6 i H& h/ `" g S; Q: ]Ø可以把此类商品摆放到商场的中心位置,方便顾客选购。 " j# o) p8 t& k6 Y: AØ或者把此类商品摆放到商场深处位置,使顾客在购买热销商品前经过非热销商品,增加在非热销商品处的停留时间,促进非热销产品的销量。 ! S+ t: H$ y( R, a关联规则算法主要用于寻找数据中项集之间的关联关系,基于样本的统计规律,进行关联规则分析。根据所分析的关联关系,可从一个特征的信息来推断另一个特征的信息。当信息置信度达到某一阈值时,就可以认为规则成立。0 ]+ u5 g% K; x. k% ]
关于这个算法有一个非常有名的故事:“尿布和啤酒”。故事是这样的:美国的妇女们经常会嘱咐她们的丈夫下班后为孩子买尿布,而丈夫在买完尿布后又要顺 手买回自己爱喝的啤酒,因此啤酒和尿布在一起被购买的机会很多。这个举措使尿布和啤酒的销量双双增加,并一直为众商家所津津乐道。 7 Q6 Q W$ [' Y$ N 1 C" k* c* D* |2 r1 y U( nØ1. Apriori算法应用广泛,可用于消费市场价格分析,猜测顾客的消费习惯,比如较有名的“尿布和啤酒”的故事;' g/ M& a$ @5 ^
Ø2.网络安全领域中的入侵检测技术;/ Z" l+ j+ |9 @# v
Ø3.可用在用于高校管理中,根据挖掘规则可以有效地辅助学校管理部门有针对性的开展贫困助学工作;! {! M E5 M! I) t6 c
Ø4.也可用在移动通信领域中,指导运营商的业务运营和辅助业务提供商的决策制定。# g3 G, } T6 `% ^! v
Ø关联规则算法的主要应用是购物篮分析,是为了从大量的订单中发现商品潜在的关联。其中常用的一个算法叫Apriori先验算法。 % t9 O' R. z c x( b / o' v9 g: l0 I2 `/ |" |Ø关联规则(association rule):是形如 X → Y 的蕴含表达式,其中X和Y是不相交的项集,即:X∩Y=∅。关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。" s x# N" v* p5 P* f3 v: e
Ø支持度:一个项集或者规则在所有事物中出现的频率,确定规则可以用于给定数据集的频繁程度。σ(X):表示项集X的支持度计数 ! Z1 \8 \, W& `! OØ项集X的支持度:s(X)=σ(X)/N;规则X → Y的支持度:s(X → Y) = σ(X∪Y) / N ~2 k3 q7 ~' EØ通俗解释:简单地说,X==>Y的支持度就是指物品集X和物品集Y同时出现的概率。. A# B& J. O4 I' a
Ø概率描述:物品集X对物品集Y的支持度support(X==>Y)=P(X n Y)# {) T7 r6 Z) X+ y1 h
Ø实例说明:某天共有1000 个顾客到商场购买物品,其中有150个顾客同时购买了圆珠笔和笔记本,那么上述的关联规则的支持度就是15%。 , \6 V6 N9 o0 D. W3 c##商品购物篮分析 数据科学实验 20210428! K6 \. X3 N S- w* U
$ T3 J& c$ Y$ T
#install.packages('arules') ; @1 Y% x8 X" K/ g: _# 用来画很神奇的云词图!! # e! u M6 W8 f! u. i9 I7 O' s#install.packages('htmlwidgets') 6 I- j! r) I, q( X% }, @% g% X/ _#install.packages('wordcloud2')1 m% z2 `3 }( G
#install.packages('ggplot2') 1 D/ X# O) k1 @#install.packages('rlang') 3 P! M+ \# W$ U" }1 I- A3 ulibrary(Matrix) # S9 q. l* U# r+ I. t! Vlibrary(arules) * `2 y3 j6 _; }! }# z: O, y' @5 Hlibrary(wordcloud2)3 {; _4 e |- u$ o8 J
library(ggplot2)/ T+ U9 E) |+ Y1 H) H' T
library(rlang)) m1 x# K4 m: v" h
8 _( ~% c; O0 V8 c. x& N* W
# i0 P- w0 ]( I5 g, a6 G3 UGoodOrder <- read.csv("/Users/janine/testt/GoodsOrder.csv")+ q3 G; ~. b) i$ [
GoodsTypes <- read.csv("/Users/janine/testt/GoodsTypes.csv") 1 W, b ]% b7 @7 ?0 k% [) Z- _head(GoodOrder,10)/ h# _/ W9 ^$ F1 C* q7 G h( G# b! y
9 @9 K4 W3 J/ O4 s7 n5 z' r# \, v, u
hotGoods <- data.frame(table(GoodOrder[,2]))* L- ]# \! T4 y/ p
names(hotGoods) <- c("Goods","Num")* ]' [% S* g* u9 Y [
hotGoods$Percent <- hotGoods$Num / sum(hotGoods$Num) 9 o" m$ n3 r3 t* N8 r; B$ GhotGoods <- hotGoods[order(hotGoods$Percent, decreasing = T),] #商品按销量降序排列 + m6 ~9 }1 g0 R# H" Q H5 jwrite.csv(hotGoods, "/Users/janine/testt/hotGoods.csv", row.names = F) #导出数据 , S' a/ u' L7 q9 C; _set.seed(3)0 u d1 T. b( f' E$ f2 G+ w
#hotGoods排完序 4 }) B, Y9 _9 W* u* Cwordcloud2(hotGoods[1:60,1:2],size = 0.75) #制作销量前60的商品名称词云,size:颜色4 |: V; e' d7 L, {
head(hotGoods,10) #展示销量前10名商品名称、销量和占比1 h2 c5 E! _* S) \1 a- G
sum(hotGoods[1:20,3]) #前20中商品销量累积占比" o! w( l. F' q4 u5 t& w7 O
/ X6 T6 k/ z! Q) d S7 r' H G% @0 ~7 X- N( H- x7 E$ J
# w4 f H0 r3 U! f8 ]
Goods <- merge(GoodOrder, GoodsTypes, "Goods", all.x=T, all.y=T)$ p$ u0 e( H6 D: N# h0 U( C
head(Goods, 10) ' f/ W3 e4 U/ o, M' P. ShotTypes <- data.frame(table(Goods$Types))6 G7 T, J" W* m( L
names(hotTypes) <- c("Types", "Num") # 重新命名 2 V! P+ e0 Q* o4 v# b D# 求出每个大类的比例值 round是保留四位小数$ T' r9 [$ W) Z
hotTypes$Percent <- round(hotTypes$Num / sum(hotTypes$Num),4)! c+ ^; |1 `+ ]! w
hotTypes <- hotTypes[order(hotTypes$Percent, decreasing = T),]#数据从大到小排序( }9 L4 f) } A2 Y/ f
write.csv(hotTypes,"/Users/janine/testt/hotGoods.csv",row.names = F)' g: g! M2 A% A
hotTypes$Types <- factor(hotTypes$Types ,levels =hotTypes$Types ,ordered = T) f5 x- g0 U7 Hhead(hotTypes,10) #展示销量前10大类商品名称、销量和占比. Y2 Y. |' u: B/ o4 u E
sum(hotTypes[1:3,3]) # 证明排名前三的商品销量和超过全部销量总和的50%5 U, ]4 U7 P) f$ X( d2 ~" ~
wordcloud2(hotTypes[1:10,1:2],size = 0.65) #制作销量前30的商品大类名称词云, size:颜色1 O( I6 h9 M( s: Z9 D2 E
% S. {% e% B/ ^0 [, M/ M6 Q4 }
( ~# ] { M2 A) R/ q# 利用which函数将 这一类 全部取出来/ U2 b; B* y" \& g" Z
Drink <- Goods[which(Goods$Types=="非酒精饮料"),]+ u* P$ J U5 g1 p/ R9 }( {
hotDrink <- data.frame(table(Drink$Goods)) 2 D- u/ _; M2 r( F6 ^) m+ \0 znames(hotDrink) <- c("Goods","Num")* {0 _# }# e1 A' U* `
hotDrink$Percent <- round(hotDrink$Num/sum(hotDrink$Num),4) 7 e" F+ B. p a4 d' fhotDrink <- hotDrink[order(hotDrink$Percent, decreasing = T), ] " g& j: U& D: m% A8 Q7 Chead(hotDrink)7 m; Y$ }$ l; g9 F& V* i
sum(hotDrink[1:3,3]) #计算前三种饮料的占比( @# ^8 v# m" n2 i* Z, z, Q
# 第一大类热销商品的前三销量 接近70%# M6 w/ C! f! A Q# @
, a( n. `) @/ |' y" G
4 {9 P/ w4 E: R' I( a7 e4 C$ g# @par(family='STKaiti') #输出中文 " B) c( O6 G5 qhotDrink1<- hotDrink[1:5,] + @, _; l9 c1 I- ~+ W/ o% Z zOthers.drk <- data.frame(Goods="其他", Num=sum(hotDrink$Num)-sum(hotDrink1$Num), Percent=1-sum(hotDrink1$Percent)) - P2 q3 ~ S. O- {5 @hotDrink1 <- rbind(hotDrink1, Others.drk), L# G9 x( N, r5 R! I6 B
hotDrink1 <- hotDrink1[order(hotDrink1$Num, decreasing = F),] # ?- F+ {5 T: n6 B7 DhotDrink1$Goods <- factor(hotDrink1$Goods ,levels =hotDrink1$Goods ,ordered = T) 6 ~& G5 E: j! f& v, V' O' U& vmyLabel = as.vector(hotDrink1$Goods) 9 C) d/ M' ^7 i$ o% a' D
myLabel = paste(myLabel, "(", round(hotDrink1$Percent * 100, 2), "%) ", sep = "") * t! n0 G7 D$ j: I$ h. ~
library(RColorBrewer) 6 @8 m1 ~1 d( g8 J' s3 A0 ep <- ggplot(hotDrink1, aes(x="", y=Percent, fill=Goods))+9 C [8 Y' W, ?5 N$ h2 E
geom_bar(stat = "identity")+ # ]1 X. Q l, O( I' W/ m6 [ coord_polar(theta = "y")+ * C9 L/ F: z9 d, M! s2 l labs(x="", y="", title = "")+; `4 Z6 {' I4 q+ [9 S
theme(axis.ticks = element_blank())+* K# ~( w4 R# E- _5 k0 j
theme(legend.title = element_blank(), legend.position = "top")+ / t$ L: A# J5 O theme(axis.text.x = element_blank()). g6 f: U- ?" L0 n
p+scale_fill_brewer(breaks = hotDrink1$Goods, labels = myLabel)+guides(fill=guide_legend(reverse = T)) 6 X+ M: _9 F# P4 W* f% ]% }$ Z& ~6 I# ]$ v6 a: \' s
5 R4 B$ j2 M7 [: K7 B* @' w! x4 ~! }
# 建模之前要转换数据格式list 然后才能使用apriori3 Z; ~. a7 O" f
datalist <- list()/ K+ [8 [$ z- l7 J$ V. [) b
for(i in unique(GoodOrder$ID)){9 o/ {% o2 Y% Y
datalist[] <- GoodOrder[which(GoodOrder$ID == i), 2] ; @, k) z( A8 k) b}9 l; ~# n9 x) `
#datalist # 可以显示出所有的购物篮里面的 九千多条 2 S" F) A& z( J: o, O0 W i! m( }5 W( `
# 以下才正式开始关联分析apriori* m' [8 j2 D- Q
# 导入到关联分析函数中 1 k# m( b. C; r
TransRep <- as(datalist, "transactions")% r9 ]1 P! m }) I( Q7 N. W) M/ s4 P/ E
RulesRep <- apriori(TransRep, parameter = list(support=0.02, confidence=0.25)) 2 w3 C6 ?- s; b1 f5 p. einspect(sort(RulesRep, by="lift")[1:25]) #按提升度从高到低查看前25条规则 1 e D) l0 a4 J( _" e' o 1 o \* Y( Z( n / t4 z; X! C/ _, b% d2 iguides(fill=guide_legend(reverse = T)). X% E4 V, @+ t7 {4 i
通过模型的规则得出在顾客购买商品的时候会同时购买全脂牛奶。因此,商场可以根据实际情况进行布置。; s7 S. y, y% }+ o" C1 F3 l7 o
6 @9 D' i& N% |3 u3 ?) JØ将全脂牛奶放在顾客购买商品的必经之路,或者商场显眼位置,方便顾客拿取。0 q4 | S' X3 n' z
Ø其他蔬菜、根茎类蔬菜、酸奶油、猪肉、黄油、本地蛋类和多种水果同时购买的概率较高,可以考虑捆绑销售,或者适当调整商场布置,将这些商品的距离尽量拉近,提升购物体验。 H* y# K9 }+ K: v
' m7 L7 m' E. H) }0 s3 ]7 i结论; s4 b0 M! }" d0 T" |! s% F) ?
本案例主要结合商品零售购物篮的案例,重点介绍了关联规则算法中的Apriori算法在商品零售购物篮分析案例中的应用。过程中详细的分析了商品零售的现状与问题,同时给出某商场的商品零售数据,分析了商品的热销程度,最后通过Apriori算法构建相应模型,并根据模型结果制定销售策略。 6 t- t8 s8 u7 u: s4 Y% V5 M" q2 J/ J2 F. P- Z
; f, ~" U* L8 k8 G9 K' { S7 R6 V3 B
. L; N& e; J q2 j! |5 n