我目前是在一家铅酸蓄电池公司工作,这篇文章主要是使用R并采用关联规则模型从两个角度分析:1、成本中心领用物料之间是否有关联规则;2、根据五金备件类领用情况,通过分析关联规则给出设置安全库存的建议;这两个场景虽然最后得到的结论并没有非常实用的业务价值,但是经过这个过程,我对R语言的运用和算法的理解以及实际业务场景的理解更进一步提高了。
本文提纲:
1、选择算法
2、导出数据
3、编程建模
4、结论评价
一、选择算法
本次案例选择了关联规则当中最经典的Apriori和Eclat算法;这两种算法在R语言当中有R包可以直接运用,省去了自己构建函数代码的工作(但是如果想有更深层次的提升,自己编写算法代码是必要的)
二、导出数据
1、从SAP中导出需要分析的数据清单(EXCEL);
2、按照算法所需参数的要求将EXCEL不必要的数据删掉;
3、转换成TXT格式文件(如下图);TID指的是领料单号,ITEMS指领料单中的物料
说明:
步骤1当中有两个场景:
数据场景1: 各车间、部门在2019-2020年的成本中心领用(移动类型201)情况汇总表
数据场景2:设备科用到的五金类物料,将设置了安全库存的物料号筛选出来,查出对应的成本中心领料单号,在将这些领料单的所有行项目汇总得到清单
将这些数据整理完成之后把TXT文件放到r语言默认的路径下(我设置的是E盘根目录,下面的代码中会有体现)
三、R语言编程
library(arules)
library(Matrix)
setwd('E:/')
Trans <- read.transactions(file ="./设备科领用记录.txt" ,format="single",header=TRUE,cols=c("TID","ITEMS"),sep="",encoding = "UTF-8") #从EXCEL转成TXT之前,把表里的特殊符号全删掉;导出TXT之后另存为UTF-8
str(Trans) #查看数据对象结构
#Apriori算法#
rules <- apriori(data=Trans,parameter=list(support =0.007,confidence =1,minlen =5,target="rules"))
inspect(rules) #显示规则
#Eclat算法#
sets<-eclat(data=Trans,parameter=list(support =0.007,target="frequent itemsets"))
rules1<-ruleInduction(x=sets,transactions=Trans,confidence=0.6)
inspect(sort(x=rules1,by="lift")) #显示规则并按提升度排序
代码说明:
1、转换成TXT格式时,一定是要保证utf-8的编码格式
2、函数中的support、confidence、minlen等参数是要不断调整的,如果support数值过大则找不出规则,如果数值太小则找到的规则太多,这个地方我用的是笨办法,先将support设为0.01,根据找到的rules数量来判断是接着调大还是调小,然后再依次调整confidence、minlen这俩参数,直到最后找到一个数量不多不少的rules数量
3、Apriori,Eclat运算结果是一样的,这一点我已多次验证,代码运算结果就不展示了
4、使用FP-growth的算法,函数“fpgrowth”在运行时一直报错调用函数的接口错误,估计是JAVA环境没有配置正确,这个问题已经百度过N个答案都无法解决(如果有大神知道这个问题请不吝赐教,感谢),故这个算法代码就不在此展示 了
四、结论评价
1、数据场景1,各车间领料情况分析:
以设备科为例,R语言执行得到的规则复制到EXCEL中截图如下
简单归纳后得出规律:
3M9501\9401口罩-布质手套-纱质手套-肥皂-绿色机修服L ;这些物料在领用时往往是有规则的,即领用口罩的也会去领手套,领用了机修服的也会再去领手套和肥皂
以此类推,分别分析其他部门情况如下:
安环科:浸塑手套-纱质手套-长乳胶手套耐腐蚀耐酸-布质手套
总经办:浸塑手套-纱质手套
车间领用:布质手套-布质袖套-3M1270圣诞树型带线耳塞
品管科:布质手套-肥皂-纱质手套-长乳胶手套耐腐蚀耐酸-浸塑手套
R执行后得出的规则既是出现频次高,也是互相关联高的,由此可见,对于成本中心类的领用当中,劳保类是所有部门领用的最频繁的,这个规律与铅酸行业的特点相关性很高:对于员工的保护是生产当中非常重要的环节。
通过跟仓管员的沟通,他们在实际工作当中发料的情况也差不多与以上规则类似。
2、数据场景2 ,五金类安全库存分析
这个场景的思路是:首先将已设置了安全库存的物料找出来,再将他们对应的领料单以及领料单中的行项目全都导出来,通过R语言对这部分数据进行处理,得到结果的截图如下
其中已经设置了安全库存的物料如下所示,括号为安全库存数量
开关接近开关E2B-M18KN16-WZ-C1 (2)
外丝接头DN25(10)
五孔插座(5)
外丝接头DN25(10)
交流接触器辅助触头LADN22C(20)
ABS胶水(50)
弹簧垫圈SUS直径8(2000)
平垫圈SUS直径8(2000)
将其中已经设置过安全库存的物料所在的规则一一挑出,得到如下规则;斜体的物料是与设置过安全库存的物料有关联规则的,推测这些也是可以设置安全来保证及时供应,比如以外丝接头DN25为例,该物料设置了安全库存,根据关联规则,镀锌弯头DN25mm是与其有关联性的,故推测其也是关键备件,也可以设置安全库存
{接近开关E2B-S08KN02-WP-C1} => {开关接近开关E2B-M18KN16-WZ-C1}
{镀锌弯头DN25mm,外丝接头DN25} => {不锈钢卜申DN25-DN15}
{镜反射光电E3Z-R66} => {五孔插座}
{三通DN25} => {外丝接头DN25}
{镀锌弯头DN25mm} => {外丝接头DN25}
{交流接触器施耐德} => {交流接触器辅助触头LADN22C}
{ABS胶水,薄膜} => {塑料包装袋820*800}
{平垫圈SUS直径8,透明胶带} => {弹簧垫圈SUS直径8}
{回丝} => {弹簧垫圈SUS直径8}
将以上筛选之后得到潜在的可设置安全库存物料号,并查看其最近几年所有采购情况,此时推测其采购频率会比较高,因为他们没用设安全库存,但是跟设了安全库存的物料有关联性,故需要大量采购才能满足需要;
具体采购情况简要如下所示:
7103030706接近开关/E2B-S08KN02-WP-C1 2M 1次采购
7104020969不锈钢卜申/DN25-DN15 1次采购
7103040350镜反射光电E3Z-R66 2次采购
7104020187镀锌三通/DN25 1次采购
7101011566镀锌弯头/DN25mm 1次采购
7103060580交流接触器/施耐德 LC1E3210/220V 1次采购
7302030088薄膜 19次采购
51050020014塑料包装袋/820*800 8次采购
7302010029透明胶带 27次采购
7001020002 回丝 61次采购
再通过库龄分析:
之前的推测当中,关于薄膜 ,塑料包装袋/820*800 ,透明胶带 ,回丝 的推测是正确的;其他的与推测有出入的物料在两年前会大量使用,从目前来看已经成了呆滞料;所以在做关联分析时,数据的时间范围选取要符合所分析的目的。
基于以上分析能给出的建议方案是,将薄膜 ,塑料包装袋/820*800 ,透明胶带 ,回丝设置安全库存,但是从实际业务来讲,设不设安全库存其实没有影响,车间在申请这些物料时通常都是会留余量,所以此建议并不实用。
总结:这两个场景通过关联规则建模分析后,得到的结论与实际业务大同小异,虽然谈不上给业务部门“出出主意”,但是从侧面反映了这个分析过程当中思路和操作是基本正确的。今后可以在这个基础上再细分业务场景进行分析,也许能够得出有指导性的结论。
参考文献:《数据挖掘在机械制造业外购件供应系统的应用》(重庆大学 张亮)