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

2023-11-15

效果图如下
在这里插入图片描述
图片是将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
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 在r中的某个阈值处破坏 cumsum() 函数

    例如我有以下代码 cumsum 1 100 我想打破它 如果一个元素 i 1 大于3000 我怎样才能做到这一点 因此 而不是这个结果 1 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 15
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • 在包加载之前如何知道 R 中特定函数属于哪个包?

    例如 我知道许多流行的功能 例如tbl df 我通常不记得它属于哪个包 即data table or dplyr 所以我必须始终记住并加载一个包 但我做不到 tbl df除非我加载了正确的包 在 R 控制台本身加载或安装包之前 有没有办法知
  • R:按组,测试一个变量的每个值是否存在于另一个变量中

    我有一个数据框架 结构如下 a lt c 1 1 1 2 2 2 3 3 3 3 4 4 b lt c 1 2 3 1 2 3 1 2 3 4 1 2 c lt c NA NA 2 NA 1 1 NA NA 1 1 NA NA df lt
  • 当设置 coord_fixed 时,ggplot/shiny 中的鼠标悬停坐标是错误的

    我正在使用问题中的答案 当您将鼠标悬停在闪亮的 ggplot 上时出现工具提示 https stackoverflow com questions 27965931 tooltip when you mouseover a ggplot o
  • ggplot:如何限制条形图中的输出,以便仅显示最频繁出现的情况?

    我几个小时以来一直在寻找这个简单的东西 但没有结果 我有一个数据框 其中一列为变量 国家 地区 我想要两件事以下 绘制最常见的国家 地区 最常见的位于顶部 找到部分解决方案EDIT找到完整的解决方案 gt gt 重点问题是根据频率限制条形图
  • R:如何将字符/数字转为1,NA转为0?

    有没有一种简单的方法可以将列的字符 数字变为 1 将 NA 变为 0 这里有一些示例数据 我想将其应用于 3 4 structure list Item Code c 176L 187L 191L 201L 217L 220L Item x
  • R 中 SVG 图形的最佳设备? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想从 R 导出 SVG 图形 似乎有两种选择 RSvgDevice 和 Cairo 有人可以对这些包发表评论吗 是默认的还是明显比另一个
  • 如何将旋转的 NetCDF 转换回正常的纬度/经度网格?

    我有一个带有旋转坐标的 NetCDF 文件 我需要将其转换为正常的纬度 经度坐标 经度为 180到180 纬度为 90到90 library ncdf4 nc open dat nf 对于尺寸 它显示 1 5 variables exclu
  • R:单纯形错误:在下标赋值中不允许使用 NA

    对于以下具有目标函数和约束的最小化 boot simplex返回错误 Error in tab pr lt tab pr tab pr pc pv o tab pr NAs are not allowed in subscripted as
  • 在 R 上安装 TDA 包时出错:目标“diag.o”的配方失败

    使用 Ubuntu 16 04 和 R 3 4 1 安装 R 包 TDA 时收到错误消息 它似乎与制作 CGAL diag cpp 和 或 diag o 最后的完整错误打印输出 有关 我仔细看了这个 在 R 上安装 TDA 包时出错 htt
  • 在 Google Colab 上的 R 笔记本中安装 python 库

    我正在尝试在 Google Colab 上的 R 笔记本中安装 python 库 为此我使用 reticulate 包 library reticulate py install pandas 但我得到的结果是这个错误 Error coul
  • 自定义轴缩放后 ggplot2 缺少标签

    我正在尝试使用我的 x 轴应用自定义缩放ggplot2 and scales trans new 但是 当我这样做时 一些轴标签丢失了 有人可以帮我弄清楚为什么吗 Setup library tidyverse the data ds lt
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • 是否有weighted.median()函数?

    我正在寻找类似形式的东西weighted mean 我通过搜索找到了一些解决方案 这些解决方案写出了整个函数 但希望有一些更用户友好的解决方案 以下软件包都有计算加权中位数的函数 aroma light isotone limma cwhm
  • ggplot2:带有 geom_line 的 x 轴因子不起作用

    我想要一个线图 其中value绘制为函数expt每级一行var 这是我的数据 lines lt expt var value 1 none p 0 183065327746799 2 none p 0 254234138384241 3 n

随机推荐

  • [413]notepad把多行转换为一行和内容去重

    文章目录 notepad中如何把多行转换为一行 notepad 文件内容去重 notepad中如何把多行转换为一行 ctrl f 然后替换 扩展按钮 or 正则表达式 先 n 替换为空 后 r 替换为空 notepad 文件内容去重 方法1
  • PyCharm中无法调用numpy,报错ModuleNotFoundError: No module named ‘numpy‘

    原因分析 pycharm所使用的解释器并不是已经安装的python3 6 而是自带了python exe解释器 解决方法 在PyCharm的settings File gt settings gt project 当前项目名 gt Proj
  • idea配置jdbc连接MySQL的全部详细步骤(包含运行代码)

    前言必读 读者手册 必读 云边的快乐猫的博客 CSDN博客 一 导包 1 打开idea 在左上角找到当前使用的这个模块 右键打开新建一个Directory 2 这个目录包命名为lib 3 在本地磁盘中找到下载的MySQL的这个jar包 点击
  • vscode常用插件-Auto Close Tag

    1 插件作者 Jun Han 2 作用 自动补全结束标签 输入
  • seata分布事务

    Seata是什么 官网解释 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 用咱们理解的说 s
  • [Pandas]Dataframe中的多条件切片为什么不能使用and运算符

    对于Dataframe中同一列 如果有多个条件 则不能使用and运算符 需要使用 位运算符 示例如下 import pandas as pd df pd DataFrame name a a b b classes 1 2 3 4 pric
  • [哲学部分]马克思主义基本原理概论思维导图

    2020 3 3 更新 之前链接关了补一个 链接 https pan baidu com s 1tsmAkdRG7jE1eMz34Ea4qQ 提取码 7y2j 2019 10 23 更新 由于最近比较忙 没时间一一回复大家的评论和邮件 我把
  • 用选择法对数组中n个整数按由小到大排序

    include
  • 判断python字典中key是否存在的两种方法

    今天来说一下如何判断字典中是否存在某个key 一般有两种通用做法 下面为大家来分别讲解一下 第一种方法 使用自带函数实现 在python的字典的属性方法里面有一个has key 方法 这个方法使用起来非常简单 在python的字典的属性方法
  • 前几天面了个30岁左右的测试员,年薪50w问题基本都能回答上,必是刷了不少八股文···

    互联网行业竞争是一年比一年严峻 作为测试工程师的我们唯有不停地学习 不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水 进入心仪的企业 阿里 字节 美团 腾讯等大厂 所以 大家就迎来了一堆问题 自己目前的能力能不能够支撑自己晋升 如果
  • 2022年11月26日-12月15日(CesiumGeospatial源码抄写+其他视频教程,本周10小时,合计1757小时,剩余8243小时)

    远程办公中 目前 视频教程进行到了mysql 7 1 tf1 4 4 oss 12 1 蓝图反射 1 7 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 41 按照月计划 制定周计划如下 1 cesi
  • 关于浏览器主页被https://hao.360.com/?src=lm&ls=n78852a3c9b劫持

    一 起因 是我的vscode不支持html文件夹右键用vscode打开 后来百度了下 有两种方法 一种是重新下载vscode 一种是在注册表注册vscode信息 鉴于我的vscode里用很多插件了 懒得再下载就决定使用第二种方法 结果设置到
  • java学习路线

    阶段一 第一阶段 Java 基础 第二阶段 数据库 第三阶段 Java Web 第四阶段 主流框架 第五阶段 服务器中间件 第六阶段 微服务和分布式 第七阶段 练手项目 第一阶段 Java 基础 最开始要学习的是 Java 基础 学习了这部
  • Java实现一个简单的Kafka消息测试程序

    记录一下最近做的一个小程序 模拟很多辆车不定时上报里程等状态数据到Kafka 从而对后端的批处理应用进行性能测试 车辆的上报消息是JSON格式 假设包含如下字段 telemetry engineStatus 1 odometer 120 d
  • Always On 数据库无法自动同步的问题

    问题 在给客户的SQL Server 2019 配置好Always On 之后 不久就出现高可用组里的一个库无法正常同步 第一次出现 以为是偶发性问题 直接右键点击恢复数据同步 没一会就同步好了 过了一个月问题又出现了 这次右键恢复数据同步
  • 计算机网络 概念

    一 计算机网络概念 计算机网络的组成 有若干个节点和连接的节点的链路组成 主机的概念 与网络相连接的计算机称为主机 计算机网络 是一个将分散的 具有独立功能的计算机系统 通过通信设备和线路 由功能完善的软件实现资源共享和信息传递 计算机网络
  • 再谈缓存

    凡是涉及管理数据的系统 都可以用图书馆来考虑 都要面临图书的位置查找和实际摆放两个问题 对应的两大组件就是就是index store 所有的数据管理系统都包含这两部分 缓存从过期又什么触发的角度分为容量触发和时间触发 容量触发 就是缓存满了
  • 内置tomcat整合SpringMVC

    spring MVC是一个基于MVC模式的表现层框架 在spring2 5以后增加了注解功能 使得开发变得更加高效 快捷 由于spring MVC是spring框架的一个模块 springmvc和spring无需通过中间整合层进行整合 可以
  • SQLServer 2008R2 配置允许外网访问

    SQL Server 2008 1433端口启用的解决方案 cqs 2012 CSDN博客
  • R聚类分析航空公司数据(筛选出不同的客户类别)

    效果图如下 图片是将3万四千条航空公司数据用k means算法分成五个类 并通过ggplot2包作图作出来的特征属性 我们将通过不同的属性值 分析出高价值用户 低价值用户 主力用户 一般用户 潜力用户 可以分析得F M C自然是越高越好 C