R聚类分析航空公司数据(筛选出不同的客户类别)

效果图如下
在这里插入图片描述
图片是将3万四千条航空公司数据用k-means算法分成五个类,并通过ggplot2包作图作出来的特征属性。
我们将通过不同的属性值,分析出高价值用户,低价值用户,主力用户,一般用户,潜力用户
在这里插入图片描述
可以分析得F,M,C自然是越高越好,C主要是判断潜力用户,F,M判断主力用户,R判断用户是否还在关注航空公司。
由于class5的F,M都高,我们可以判断其为主力用户(属于航空公司需要保持,不允许流失的客户)
class4的R偏高,而F,M偏低,可以判断class4用户不关注航空公司,属于低价值用户,
class3的L偏高,其他均为平均水平,属于老用户
class2的C偏高,属于注重乘机体验而不在乎钱的vip用户,属于高价值用户,而F,M都偏低,说明客户体验不好,航空公司需要将该类别的F,M提高起来
class1的L偏低,还没怎么体验航空公司的服务,属于潜力用户
通过客户属性的划分和特征属性的分析,航空公司可以针对不同的客户类群,制定不同的营销方案和服务,来提高航空公司的竞争力和业绩
通过雷达图可以较清楚看出不同客户的特征属性
在这里插入图片描述

分析过程

航空公司的属性说明
航空公司数据中有特别多的属性,我们第一步就需要筛选出我们对我们业务分析有用的属性,忽略掉一些弱相关和没有用的属性。
在这里插入图片描述
在这里插入图片描述
总共有45条属性数据,我们要在其中筛选出我们最需要的属性
毫无疑问,第一年和第二年总票价是很重要的,我们需要将它们挑选出来。
在分析客户是否为潜在价值大时,我们需要看平均折扣率,如果平均折扣率小,说明客户在乎出行的质量而不是价格。
同样我们需要找到用户最后一次乘机的时间距离现在的时间,以此来判断用户是否还关注此家航空公司。
还有里程也是衡量用户的重要因素。
第一次乘机到最后一次乘机可以判断客户的忠诚度。
所以我挑选出来的第一年和第二年总票价,平均折扣率,最后一次乘机的时间距离现在的时间,里程,第一次乘机。
下面通过R语言实现数据清洗过程
数据清洗有两个部分,一个是缺失值删除,一个是异常值删除
下面进行缺失值删除过程
首先需要选取需要删除的属性,通过对原始数据的观察和summary函数,选择第一年和第二年的缺失值进行删除,用到which(is.na())函数,which用于定位。
再分析异常值。
观察原始数据可以得到,存在第一年和第二年票价为0但是平均折扣率不为0的情况。
通过布尔法则,可以删除异常值
代码如下

#设置工作路径
setwd("D:\\数据分析\\R语言基础\\课程数据")
flight<-read.csv("air_data.csv",header = T)
#选取所需要探索的属性
col <- c(15:18, 20:29) 
summary(flight[,col])
#删除掉缺失值
flight<-flight[-which(is.na(flight$SUM_YR_1|flight$SUM_YR_2)),]
#查找异常值
a<-flight$SUM_YR_1==0&flight$SUM_YR_2==0&flight$avg_discount!=0
flight<-flight[-which(a),]

属性规约
在分析航空数据时,我们通常用到5个属性L,R,F,M,C
L=LOAD_TIME-FFP_DATE
R=LOAD_TIME-LAST_FLIGHT_DATE
F=FLIGHT_COUNT
M=SEG_KM_SUM
C=avg_discount
在转化中,我们需要将LOAD_TIME和FFP_DATE和LAST_FLIGHT_DATE用as.date转化为日期类型的数据
再transform函数和difftime计算时间差
在使用difftime的时候,需要注意units之间的区别,我首次使用difftime的时候,L的units是days而R的units是seconds,units不同自然无法分析,且units的范围只有“auto”, “secs”, “mins”, “hours”, “days”, “weeks”其中的一个,我的想法是将units设置为days,并且将其除以30,得到months的units
计算出L与R后会发现L与R是difftime的属性,需要将其转化为numerical的类型。同时需要用summary判断是否有缺失值。
代码块如下

#创建副本
copy<-flight
#属性规约2 10 11 17 29 23六个属性
flight1<-flight[,c(2,10,11,17,19,29)]
#将因子类型转化为数据类型
flight1$FFP_DATE<-as.Date(flight1$FFP_DATE)
flight1$LOAD_TIME<-as.Date(flight1$LOAD_TIME)
flight1$LAST_FLIGHT_DATE<-as.Date(flight1$LAST_FLIGHT_DATE)
#计算LRFMC
bh<-transform(flight1,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)),]
#找出需要的属性
bh1<-bh[,c("FLIGHT_COUNT","SEG_KM_SUM","avg_discount","L","R")]
#查看属性的最大值最小值
apply(bh1,2,range)
#进行标准化
bzh<-data.frame(scale(x=bh1))
names(bzh)<-c("F","M","C","L","R")

数据的标准化
一般如果得到的数据属性的最大值和最小值的差很大的话,我们需要进行数据的标准化。来缩小最大值和最小值的差
进行标准化的过程分为两步.
第一步用apply函数查看属性的最大最小值
apply(data,1or2,fun=range)
第二步用scale函数进行标准化
数据预处理完成后,就要进行模型的训练了
在这里我们用k-means算法进行模型的训练

#进行聚类分析
#设置随机种子
set.seed(10)
#centers的数值代表的是类别的数量,我们一般选取3到8类
clust<-kmeans(bzh,centers = 5)

数据的可视化和特征属性的分析
在使用ggplot2包之前,我们需要将宽格式转化为长格式
电脑不读取宽格式,读取长格式,将宽格式转化为长格式需要melt函数
宽格式
在这里插入图片描述
长格式
在这里插入图片描述

代码实现如下

#数据可视化
install.packages("reshape")
install.packages("ggplot2")
library(reshape2)
library(ggplot2)
new<-as.data.frame(t(clust$centers))
colnames(new)<-paste("class",c(1:5),sep = "")
new<-data.frame(index=c("F","M","C","L","R"),new)
#短标识转化为长标识
new<-melt(new,c("index"))

完整代码如下

#设置工作路径
setwd("D:\\数据分析\\R语言基础\\课程数据")
flight<-read.csv("air_data.csv",header = T)
#选取所需要探索的属性
col <- c(15:18, 20:29) 
summary(flight[,col])
#删除掉缺失值
flight<-flight[-which(is.na(flight$SUM_YR_1|flight$SUM_YR_2)),]
#查找异常值
a<-flight$SUM_YR_1==0&flight$SUM_YR_2==0&flight$avg_discount!=0
flight<-flight[-which(a),]
#创建副本
copy<-flight
#属性规约2 10 11 17 29 23六个属性
flight1<-flight[,c(2,10,11,17,19,29)]
#将因子类型转化为数据类型
flight1$FFP_DATE<-as.Date(flight1$FFP_DATE)
flight1$LOAD_TIME<-as.Date(flight1$LOAD_TIME)
flight1$LAST_FLIGHT_DATE<-as.Date(flight1$LAST_FLIGHT_DATE)
#计算LRFMC
bh<-transform(flight1,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)),]
#找出需要的属性
bh1<-bh[,c("FLIGHT_COUNT","SEG_KM_SUM","avg_discount","L","R")]
#查看属性的最大值最小值
apply(bh1,2,range)
#进行标准化
bzh<-data.frame(scale(x=bh1))
names(bzh)<-c("F","M","C","L","R")
#进行聚类分析
#设置随机种子
set.seed(10)
clust<-kmeans(bzh,centers = 5)
#数据可视化
install.packages("reshape")
install.packages("ggplot2")
library(reshape2)
library(ggplot2)
new<-as.data.frame(t(clust$centers))
colnames(new)<-paste("class",c(1:5),sep = "")
new<-data.frame(index=c("F","M","C","L","R"),new)
#短标识转化为长标识
new<-melt(new,c("index"))
#条形图
colnames(new)<-c("index","class","centers")
ggplot(data = new,mapping = aes(x=index,y=centers),fill=class)+
  scale_y_continuous(limits = c(-1, 3)) + geom_bar(stat = "identity") + 
  facet_grid(class ~ .) + guides(fill = FALSE) + theme_bw()
  
# 每一簇各指标的关系程度  --雷达图
install.packages("fmsb")
library(fmsb)
max <- apply(clust$centers, 2, max)
min <- apply(clust$centers, 2, min)
data.radar <- data.frame(rbind(max, min, clust$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
}

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值