利用R语言中的KMEANS算法对业务中各类客户进行分析
第一步,数据导入
setwd("C:\\Users\\admin\\Desktop\\R_sv")
datafile=read.csv("air_data.csv",header = T)
导入之后我们先通过summary函数来查看一下各变量的统计量。
发现其中部分数据存在缺失值,那么我们首先对缺失值进行处理。
第二步,数据清洗
缺失值的处理,去掉所有第一年和第二年票价为缺失值的所有行
delet_na<-datafile[-which(is.na(datafile$SUM_YR_1)| is.na(datafile$SUM_YR_2)),]
index<-(delet_na$SUM_YR_1==0&delet_na$SUM_YR_2==0)*(delet_na$avg_discount!=0)
#返回0或者1
deletdata<-delet_na[-which(index==1),]
处理掉无价值客户的数据(票价为0,折扣不为0)
这里需要对我们要分析的数据属性做一个归类。样本数据来自某家航空公司,我们需要分析哪些客户需要保留,哪些值得开发,等等。
因此我们通过业务方面分析,从第一张图中属性选出以下五种:
L:入会时长
R:飞行次数
F:里程数
M:飞行里程
C:折扣系数
下面定义一个向量,其中的元素都是和所选元素相关的
vars<-c("FFP_DATE","LOAD_TIME","LAST_FLIGHT_DATE",
"FLIGHT_COUNT","SEG_KM_SUM","avg_discount")
之后,我们的目标就是去掉和这些指标无关的数据:
gy<-deletdata[,vars]
gy$FFP_DATE<-as.Date(gy$FFP_DATE)
gy$LOAD_TIME<-as.Date(gy$LOAD_TIME)
gy$LAST_FLIGHT_DATE<-as.Date(gy$LAST_FLIGHT_DATE)
#用transform为gy添加新的变量L和R,并赋值给新的变量bh
bh<-transform(gy,L=difftime(LOAD_TIME,FFP_DATE,units="days")/30,
R=difftime(LOAD_TIME,LAST_FLIGHT_DATE,units="days")/30)
bh$L<-as.numeric(bh$L)
bh$R<-as.numeric(bh$R)
bh<-bh[-which(is.na(bh$LAST_FLIGHT_DATE)),]
#筛选出所选5个指标的数据
yt<-bh[,c("L","R","FLIGHT_COUNT","SEG_KM_SUM","avg_discount")]
对筛选完的数据进行标准化
bzh<-data.frame(scale(yt))
names(bzh)<-c("L","R","F","M","C")
第三步、建模
这里直接通过R中的kmeans对标准化后的数据进行聚类。
set.seed(10)
clust<-kmeans(bzh,centers=5)
centers<-clust$centers #查看类中心
table(clust$cluster)
第四步、作图(雷达图)
用fmsb包制作雷达图,通过for循环为每个类设置标签
library(fmsb)
max<-apply(centers,2,max)
min<-apply(centers,2,min)
#合并行max,min,类中心
data.radar<-data.frame(rbind(max,min,centers))
radarchart(data.radar,pty=32,plty=1,plwd=2,vlcex=0.7)
L<-1.2
for(i in 1:5){
text(1.8,L,labels = paste("--class",i),col=i)
L<-L-0.2
}
最后得到图片:
最后我们只需要通过自己的业务知识,对分类后的数据进行分析即可。
小结: 通过以上整套流程的分析,我明白了数据分析最重要,最复杂的一步其实是数据处理和清洗,否则后面模型哪怕建的再好,效果也不会好。这就和做菜类似。买菜,洗菜很重要,否则厨艺再高的人,面对烂菜也会无济于事。
本次分析是我的第一次尝试,希望大家多多支持,谢谢!
|
请发表评论