效果图如下

航空公司客户价值数据分析 航空公司客户数据集_practice


图片是将3万四千条航空公司数据用k-means算法分成五个类,并通过ggplot2包作图作出来的特征属性。

我们将通过不同的属性值,分析出高价值用户,低价值用户,主力用户,一般用户,潜力用户

航空公司客户价值数据分析 航空公司客户数据集_最小值_02


可以分析得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偏低,还没怎么体验航空公司的服务,属于潜力用户

通过客户属性的划分和特征属性的分析,航空公司可以针对不同的客户类群,制定不同的营销方案和服务,来提高航空公司的竞争力和业绩

通过雷达图可以较清楚看出不同客户的特征属性

航空公司客户价值数据分析 航空公司客户数据集_数据_03

分析过程

航空公司的属性说明

航空公司数据中有特别多的属性,我们第一步就需要筛选出我们对我们业务分析有用的属性,忽略掉一些弱相关和没有用的属性。

航空公司客户价值数据分析 航空公司客户数据集_缺失值_04


航空公司客户价值数据分析 航空公司客户数据集_practice_05


总共有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函数

宽格式

航空公司客户价值数据分析 航空公司客户数据集_数据_06


长格式

航空公司客户价值数据分析 航空公司客户数据集_数据_07

代码实现如下

#数据可视化
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
}