这是第一次使用CSDN记录自己的学习笔记,主要是记录代码语句的用法。

import pandas as pd
#我原本使用的是'gbk'解码方式, 但出现了报错,查询后选择了更高级的'gb18030'解码方式
air_data = pd.read_csv('air_data.csv', encoding = 'gb18030',error_bad_lines = False)
air_data.describe().T
#我使用describe()进行描述性统计,主要看min、max、mean、中位数

打印如图所示

观察原始数据发现了票价存在空值,处理方法为丢弃票价为空的记录

#打印原始数据记录条数
air_data.shape[0]
#丢弃票价为空的记录
clear_air_data = air_data[air_data["SUM_YR_1"].notnull() & air_data["SUM_YR_2"].notnull()]
#notfull()返回非空数据
clear_air_data.shape[0]

可明显观察到数据的数量变化

丢弃票价为0,平均折扣率不为0,总飞行公里数大于0的记录。

doc1 = (clear_air_data["SUM_YR_1"] !=0) | (clear_air_data["SUM_YR_2"] !=0)          #票价不为0的, '|'是或。 '&'是与。
doc2 = (clear_air_data["SEG_KM_SUM"] == 0) & (clear_air_data["avg_discount"] == 0)   #飞行公里==0,平均折扣==0的
data = clear_air_data[doc1 | doc2]
print(data.shape[0])

这是进行清洗后的数据记录条数

经过分析,通过数据选择抽离LRFMC特征。
'L’是会员入会时间到窗口结束的时间,在模型中越大越好;
'R’是客户最近一次乘坐公司飞机距观测窗口结束的月数,在模型中越小越好;
'F’是客户在观测窗口内乘坐公司飞机的次数,在模型中越大越好;
'M’是客户在观测窗口内累计的飞行里程,在模型中越大越好;
'C’客户在观测窗口内乘坐舱位所对应的折扣系数的平均值,在模型中越大越好。

#使用to_datetime()方法将数据转变成标准日期格式
import numpy as np
data["LOAD_TIME"] = pd.to_datetime(data["LOAD_TIME"])
data["FFP_DATE"] = pd.to_datetime(data["FFP_DATE"])
#转换为月份
#timedelta64(),参数'M'是将对象转变为“几个月”,参数'1'是以“一个M为单位”对对象进行处理
data["L"]= (data["LOAD_TIME"] - data["FFP_DATE"]) / np.timedelta64(1,'M')
#生成新的DataFrame
data2=data[['L','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
#对列索引进行重命名处理
data2.columns=['L','R','F','M','C']
print(data2)

#对数据进行Z-标准化处理
#Z-Scores的处理方式是减均值再除以方差
data3=(data2-data2.mean(axis=0))/(data2.std(axis=0))
data3

标准化后的数据如图所示

对数据预处理后进行聚类。一开始并不确定K值为多少时能达到最好的聚类效果,故先用一个迭代器进行遍历打印不同K值下的聚类效果

def distEclud(vecA, vecB):"""计算两个向量的欧式距离的平方,并返回"""return np.sum(np.power(vecA - vecB, 2))def test_Kmeans_nclusters(data_train):"""计算不同的k值时,SSE的大小变化簇内和方差"""data_train = data_train.valuesnums=range(2,10)SSE = []for num in nums:sse = 0kmodel = KMeans(n_clusters=num, n_jobs=4)#初始化kmodel.fit(data_train)# 簇中心cluster_ceter_list = kmodel.cluster_centers_# 个样本属于的簇序号列表cluster_list = kmodel.labels_.tolist()for index in  range(len(data3)):cluster_num = cluster_list[index]sse += distEclud(data_train[index, :], cluster_ceter_list[cluster_num])print("簇数是",num , "时; SSE是", sse)SSE.append(sse)return nums, SSE
nums, SSE = test_Kmeans_nclusters(data3)

通过遍历打印不能直观的看到“肘值”,故选择画图呈现SSE随k的取值变化而变化的关系

#代码来源博客@chnhbhndchngn
#画图,通过观察SSE与k的取值尝试找出合适的k值
# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['font.size'] = 12.0
plt.rcParams['axes.unicode_minus'] = False
# 使用ggplot的绘图风格
plt.style.use('ggplot')
## 绘图观测SSE与簇个数的关系
fig=plt.figure(figsize=(10, 8))
ax=fig.add_subplot(1,1,1)
ax.plot(nums,SSE,marker="+")
ax.set_xlabel("n_clusters", fontsize=18)
ax.set_ylabel("SSE", fontsize=18)
fig.suptitle("KMeans", fontsize=20)
plt.show()

判别方法SSE又被称作“手肘法”,其核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

通过观察曲线并没有发现一个明显的“肘点”,所以我们要尝试通过代入K值,能不能找到比较好的聚类类别

#雷达图代码来源博客@chnhbhndchngnkmodel = KMeans(n_clusters=4, n_jobs=4)
kmodel.fit(data3)
# 简单打印结果
r1 = pd.Series(kmodel.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_) #找出聚类中心
# 所有簇中心坐标值中最大值和最小值
max = r2.values.max()
min = r2.values.min()
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data3.columns) + [u'类别数目'] #重命名表头# 绘图
fig=plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, polar=True)
center_num = r.values
feature =["会员入会时长","最后一次飞行时间与窗口期间隔","飞行次数","总公里数","平均折扣率"]
N =len(feature)
for i, v in enumerate(center_num):# 设置雷达图的角度,用于平分切开一个圆面angles=np.linspace(0, 2*np.pi, N, endpoint=False)# 为了使雷达图一圈封闭起来,需要下面的步骤center = np.concatenate((v[:-1],[v[0]]))angles=np.concatenate((angles,[angles[0]]))# 绘制折线图ax.plot(angles, center, 'o-', linewidth=2, label = "第%d簇人群,%d人"% (i+1,v[-1]))# 填充颜色ax.fill(angles, center, alpha=0.25)# 添加每个特征的标签ax.set_thetagrids(angles * 180/np.pi, feature, fontsize=15)# 设置雷达图的范围ax.set_ylim(min-0.1, max+0.1)# 添加标题plt.title('客户群特征分析图', fontsize=20)# 添加网格线ax.grid(True)# 设置图例plt.legend(loc='upper right', bbox_to_anchor=(1.3,1.0),ncol=1,fancybox=True,shadow=True)# 显示图形
plt.show()

图为k = 4的聚类模型

图为k = 5时的聚类模型

图为k = 6时的聚类模型

打印出k = 4, k = 5时的客户类群

#打印客户类群代码来源博客@爱吃牛肉的拉面#K-Means聚类算法
from sklearn.cluster import KMeans #导入K均值聚类算法k = 5                       #需要进行的聚类类别数
#调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters = 4, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data3) #训练模型#kmodel.cluster_centers_ #查看聚类中心
# kmodel.labels_ #查看各样本对应的类别#简单打印结果
s = pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5'], index=[0,1,2,3,4]) #创建一个序列s
r1 = pd.Series(kmodel.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_) #找出聚类中心
r = pd.concat([s,r1,r2], axis = 1)#横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns =['聚类名称'] +['聚类个数'] + list(data3.columns)#重命名表头
#r.columns = ['聚类名称', '聚类个数', '会员入会时长', '最后一次飞行与窗口期间隔', '飞行次数', '总公里数', '平均折扣率']
print(r)

k = 4时的客户类群

k = 5时的客户类群

结合雷达图和客户类群分布 可以看出来k = 4时,每个人群包含的信息比较复杂,且特征不明显

当k = 5时,分析的结果比较合理,分出的五种类型人群都有自己的特点又不相互重复

当k取值6时,各种人群也都有自己的特点,但是第4簇人群完全在第5簇人群特征中包含了,没有必要多分这么一类

综上,当k = 5时能到到较好的分类结果。
分析如下:
第一簇用户:12125人。最大的特点是飞行次数多,飞行间隔时间短,不太看重折扣率,可以发展

第二簇用户:5336人。入会时间长,飞行总里程大,是公司的“老客户”,应当争取

第三簇用户:24663人。各方面数据都比较低,属于一般用户

第四簇用户:4179人。该类客户折扣率最高,应该是乘坐商务舱的人员,是重点发展对象

第五簇用户:15741人。入会时间长但其他数据偏低,需要推出一系列优惠措施吸引他们的目光。

航空公司客户价值数据的分析相关推荐

  1. Hive任务实施(航空公司客户价值数据)

    实训目的 了解Hive 数据预处理与分析: 熟悉Hive 的查询语句: 掌握tez 和Spark 引擎的使用方法: 具有使用Hive知识完成航空公司客户价值数据预处理与分析的能力. 1.任务描述 飞机 ...

  2. 利用Python分析航空公司客户价值

      利用Python分析航空公司客户价值 一.背景介绍 随着社会生活中数据量的急剧增多,如何从这些海量的数据中提取与发掘出对我们决策有用的信息成为当前亟待解决的题,因此,数据分析与挖掘技术在这些年得到 ...

  3. 基于python分析航空公司客户价值《数据挖掘》 课程实验报告

    一.实验目的 1)了解K-Means 聚类算法在客户价值分析实例中的应用. 2)利用pandas快速实现数据z-score(标准差)标准化以及用scikit-learn 的聚类库实现K-Means聚类 ...

  4. 基于RFM的航空公司客户价值分析模型

    目录 一.背景 二.分析方法与过程 2.1数据抽取 2.2 数据探索分析 2.3 数据预处理 2.3.1 数据清洗 2.3.2 属性规约 2.3.3 数据变换 2.4 聚类分析 2.5特征分析 三.分 ...

  5. Python数据挖掘:利用聚类算法进行航空公司客户价值分析

    无小意丶 个人博客地址:无小意 知乎主页:无小意丶 公众号: 数据路(shuju_lu) 刚刚开始写博客,希望能保持关注,会继续努力. 以数据相关为主,互联网为辅进行文章发布. 本文是<Pyth ...

  6. 航空公司客户价值分析(附完整代码)

    一.什么是客户价值分析:   客户价值分析是以客户为中心,从客户需求出发,搞清楚客户需要什么,他们有怎样的一个特征,需要什么样的产品,然后设计相应的产品,通过对客户分群从而满足客户的需求.进行客户价值 ...

  7. 利用K-Means聚类进行航空公司客户价值分析

    1.背景与挖掘目标 1.1背景 航空公司业务竞争激烈,从产品中心转化为客户中心. 针对不同类型客户,进行精准营销,实现利润最大化. 建立客户价值评估模型,进行客户分类,是解决问题的办法 1.2挖掘目标 ...

  8. 数据挖掘——航空公司客户价值分析(分析+建模)

    前言 本次建模项目是来自于<python数据分析与挖掘实战>的案例,是介绍航空公司客户价值的分析,书中给出了关于62988个客户的基本信息和在观测窗口内的消费积分等相关信息,其中包含了会员 ...

  9. 【数据挖掘实战】——航空公司客户价值分析(K-Means聚类案例)

    目录 一.背景和挖掘目标 1.RFM模型缺点分析 2.原始数据情况 3.挖掘目标 二.分析方法与过程 1.初步分析:提出适用航空公司的LRFMC模型 2.总体流程 第一步:数据抽取 第二步:探索性分析 ...

  10. 数据挖掘——航空公司客户价值分析(代码完整)

    最近在阅读张良均.王路等人出版的书<python数据分析与挖掘实战>,其中有个案例是介绍航空公司客户价值的分析,其中用到的聚类方法是K-Means方法,我一直把学习的重心放在监督学习上,今 ...

最新文章

  1. 计算机系统结构总概,计算机系统结构概论
  2. 2020大学计算机知到答案,2020年_知到_大学计算机(济南大学)_网课答案
  3. pygame里面物体闪烁运动_Pygame-游戏中的运动
  4. day 05总结(格式化输出的三种方式/基本运算符/if判断)
  5. Android ListView下拉与上拉刷新加载更多(一)
  6. 自旋锁:pthread_spinlock_t,互斥锁:pthread_mutex_t,条件变量:pthread_cond_t,读写锁:pthread_rwlock_t
  7. 基于51单片机的密码锁
  8. 《图解算法》第九章之动态规划
  9. NGUI的输入框制作(attach- input filed script的使用)
  10. java相册代码 淘豆网_基于jsp的网络相册-JavaEE实现网络相册 - java项目源码
  11. 调用登录接口返回“参数错误”
  12. call方法 java_漫谈JS中的call和apply方法
  13. Introduction to Reinforcement Learning notes
  14. P5304旅行者(比bk201还要流氓的解法)
  15. 【LeetCode击败99%+】猜数字大小
  16. (菜鸟python)统计字符串的字符数和标点数
  17. 路由器的工作原理,形成,转发数据包的过程
  18. 三、kylin读写分离集群部署
  19. Java接入微信支付超级详细教程——从入门到精通
  20. 抽象类(abstract class)和接口(interface)

热门文章

  1. Python 自动识别图片文字—保姆级OCR实战教程
  2. JAVA冰箱评测开题报告,关于电冰箱相关论文范例,与电冰箱制冷系统的维修技术相关研究生毕业论文开题报告...
  3. 20天学习Spark(0)之最简单版Spark入门
  4. 宏观经济判断指标-GDP、CPI、PPI、PMI
  5. MAC电脑配置环境变量
  6. 形式语言与自动机_第二章_语言及文法
  7. java获取字典表数据,利用注解完成字典表数据对应
  8. 卜若的代码笔记-机器学习基础-UCI数据库简介与Iris数据集分析
  9. 分享一个USB转杜邦线 5V取电的3D打印件,附3D打印文件
  10. python 公众号爬虫_微信公众号爬虫,看这个就足够了