【机器学习】k-means——航空用户聚类分析案例

  1 import pandas as pd
  2 import numpy as np
  3 from sklearn.cluster import KMeans
  4 import matplotlib.pyplot as plt
  5
  6
  7 def stand_sca(data):
  8     """
  9     标准差标准化
 10     :param data:原数据
 11     :return: 标准差之后的数据
 12     """
 13     data = (data - data.mean()) / data.std()
 14
 15     return data
 16
 17
 18 def box_analysis(data):
 19     """
 20     箱线图分析去除异常值
 21     :param data: 原数据---series
 22     :return: bool数组
 23     """
 24     # 上四分位数
 25     qu = data.quantile(q=0.75)
 26     # 下四分位数
 27     ql = data.quantile(q=0.25)
 28     # 计算四分位间距
 29     iqr = qu - ql
 30
 31     # 上限
 32     up = qu + 1.5 * iqr
 33     # 下限
 34     low = ql - 1.5 * iqr
 35
 36     bool_index = (data < up) & (data > low)
 37
 38     return bool_index
 39
 40
 41 # 1、了解航空公司现状以及 航空用户的价值
 42 # 6w+ 样本  44个特征 ----> LRFMC
 43 # 2、数据处理
 44 # (1)缺失值处理
 45 # 删除法
 46 #  (2) 筛选相关特征---构建最终的特征
 47 # LRFMC <----筛选出能够构建这5个特征的相关特征
 48 # (3)异常值处理
 49 # 3sigma 原则 或者 box_analysis
 50 # (4)标准化处理
 51 # 标准差标准化
 52 # 3、k-means实现航空用户的聚类
 53 # sklearn
 54 # 4、结果展示
 55 # 绘制雷达图
 56 # 5、输出结论
 57 # 营销策略
 58
 59 def build_data():
 60     """
 61     构建原始数据
 62     :return: 原始数据
 63     """
 64     # 1、加载数据
 65     air_data = pd.read_csv("./air_data.csv", encoding="ansi")
 66     # print("air_data:\n", air_data)
 67     # print("air_data 的列索引名称:\n", air_data.columns)
 68
 69     return air_data
 70
 71
 72 def deal_data(air_data):
 73     """
 74     数据处理
 75     :param air_data:原始数据
 76     :return: 数据处理之后的结果
 77     """
 78     # 2、数据清洗
 79     # 缺失值、异常值
 80     # 检测缺失值
 81     res_null = pd.isnull(air_data).sum()
 82     # print("缺失值检测结果:", res_null)
 83
 84     # 处理缺失值
 85     # (1)丢弃票价为空的记录 # SUM_YR_1  SUM_YR_2两列
 86     # ----可以理解保留票价不为空
 87     bool_index_1 = air_data.loc[:, "SUM_YR_1"].notnull()
 88     bool_index_2 = air_data.loc[:, "SUM_YR_2"].notnull()
 89     # 个人认为 只有两列票价都不为空,票价才不为空
 90     bool_index = bool_index_1 & bool_index_2
 91     air_data = air_data.loc[bool_index, :]
 92     # (2)丢弃票价为0,折扣不为0,飞行里程 > 0 的数据--->丢弃航空公司没有盈利的数据
 93     # 保留盈利的数据
 94     # 保留票价 > 0,折扣 > 0,飞行里程 > 0
 95     # 个人认为只要有一列票价>0,票价就>0
 96     bool_id_1 = air_data.loc[:, "SUM_YR_1"] > 0
 97     bool_id_2 = air_data.loc[:, "SUM_YR_2"] > 0
 98
 99     # 折扣> 0
100     bool_id_3 = air_data.loc[:, "avg_discount"] > 0
101
102     # 飞行里程>0
103     bool_id_4 = air_data.loc[:, "SEG_KM_SUM"] > 0
104
105     bool_id = (bool_id_1 | bool_id_2) & bool_id_3 & bool_id_4
106
107     air_data = air_data.loc[bool_id, :]
108
109     res_null = pd.isnull(air_data).sum()
110     # print("缺失值检测结果:", res_null)
111
112     # 先筛选特征
113     # LRFMC
114     # 筛选 入会时间、窗口结束时间、最后乘坐飞机距离窗口结束的时长,乘坐飞机次数、飞行里程、折扣系数
115     air_data = air_data.loc[:, ["FFP_DATE", "LOAD_TIME", "LAST_TO_END", "FLIGHT_COUNT", "SEG_KM_SUM", "avg_discount"]]
116
117     # 构建LRFMC五个特征
118     air_data.loc[:, "FFP_DATE"] = pd.to_datetime(air_data.loc[:, "FFP_DATE"])
119     air_data.loc[:, "LOAD_TIME"] = pd.to_datetime(air_data.loc[:, "LOAD_TIME"])
120     # 获取时间差--单位是day
121     air_data.loc[:, "L_days"] = air_data.loc[:, "LOAD_TIME"] - air_data.loc[:, "FFP_DATE"]
122     # 获取相差天数 的数值
123     air_data.loc[:, "L_days"] = [i.days for i in air_data.loc[:, "L_days"]]
124     # 获取具体的月数--即L
125     air_data.loc[:, "L"] = np.ceil(air_data.loc[:, "L_days"] / 30)
126     # print(air_data.loc[:, "L"])
127     # 构建R --- LAST_TO_END 这个时长应该是天数
128     # print(air_data.loc[:, "LAST_TO_END"])
129     air_data.loc[:, "R"] = np.ceil(air_data.loc[:, "LAST_TO_END"] / 30)
130     # print("air_data.loc[:, "R"]:\n",air_data.loc[:, "R"])
131
132     air_data.loc[:, "F"] = air_data.loc[:, "FLIGHT_COUNT"]
133
134     air_data.loc[:, "M"] = air_data.loc[:, "SEG_KM_SUM"]
135
136     air_data.loc[:, "C"] = air_data.loc[:, "avg_discount"]
137
138     air_data = air_data.iloc[:, -5:]
139     # print("最终的数据:\n", air_data)
140
141     # 异常值处理
142     for column in air_data.columns:
143         bool_ = box_analysis(air_data.loc[:, column])
144         air_data = air_data.loc[bool_, :]
145
146     # 标准化数据
147     air_data = stand_sca(air_data)
148
149     print("标准化之后的数据:\n", air_data)
150
151     return air_data
152
153
154 def km_fit(air_data, k):
155     """
156     k-means训练数据,并进行用户聚类
157     :param air_data: 数据
158     :param k: 聚类的类别数目
159     :return:
160     """
161     # 1、创建算法实例
162     km = KMeans(n_clusters=k)
163     # 2、训练数据
164     km.fit(air_data)
165     # 3、预测
166     y_predict = km.predict(air_data)
167
168     # 获取聚类中心
169     center = km.cluster_centers_
170
171     return y_predict, center
172
173
174 def show_res(center, feature_num):
175     """
176     绘制雷达图
177     :param center:聚类中心
178     :param feature_num: 特征的数量
179     :return:
180     """
181     # 1、创建画布
182     # 绘制雷达图 需要用到极坐标
183     fig = plt.figure()
184     # 修改RC参数,来让其支持中文
185     plt.rcParams[‘font.sans-serif‘] = ‘SimHei‘
186     plt.rcParams[‘axes.unicode_minus‘] = False
187     # polar  开启极坐标
188     fig.add_subplot(1, 1, 1, polar=True)
189     # 2、绘图
190     # 准备数据
191     # 准备角度数据
192     angle = np.linspace(start=0, stop=2 * np.pi, num=feature_num, endpoint=False)
193     print(angle)
194     # 闭合角度
195     angle = np.concatenate((angle, [angle[0]]))
196     # print(angle)
197     for i in range(center.shape[0]):
198         # print(center[i, 0])
199         # 闭合数据
200         data = np.concatenate((center[i, :],[center[i, 0]]))
201         plt.polar(angle, data)
202
203     # 设置刻度
204     plt.xticks(angle[:-1],["L","R","F","M","C"])
205
206     # 增加图例
207     plt.legend(["第一类用户","第二类用户","第三类用户","第四类用户","第五类用户"])
208     # 保存图片
209     plt.savefig("./航空用户聚类分析结果雷达图展示.png")
210     # 3、展示
211     plt.show()
212
213
214 def main():
215     """
216     主函数
217     :return:
218     """
219     # 1、构建原始数据
220     air_data = build_data()
221     # 2、数据处理
222     air_data = deal_data(air_data)
223     # 3、构建聚类模型进行用户聚类
224     # 确定聚类的类别数目
225     k = 5
226     y_predict, center = km_fit(air_data, k)
227     print("预测值为:\n", y_predict)
228     print("聚类中心为:\n", center)
229
230     # 4、结果展示
231     show_res(center, center.shape[1])
232
233
234 if __name__ == ‘__main__‘:
235     main()

原文地址:https://www.cnblogs.com/Tree0108/p/12116168.html

时间: 2024-07-29 16:33:03

【机器学习】k-means——航空用户聚类分析案例的相关文章

软件——机器学习与Python,聚类,K——means

K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64TianJin,2459.77,495.47,697.33,302.87,284.19,735.97,570.84,305.08HeBei,1495.63,515.90,362.37,285.32,272.95,540.58,364.91,188.63

聚类分析案例

一.数据挖掘的常用方法 利用数据挖掘进行数据分析常用的方法主要有分类.回归分析.聚类.关联规则.特征.变化和偏差分析.Web页挖掘等,它们分别从不同的角度对数据进行挖掘. 分类.分类是找出数据库中一组数据对象的共同特点并按照分类模式将其划分为不同的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别.它可以应用到客户的分类.客户的属性和特征分析.客户满意度分析.客户的购买趋势预测等,如一个汽车零售商将客户按照对汽车的喜好划分成不同的类,这样营销人员就可以将新型汽车的广告手册直接邮寄到

零基础学习java------22----------社交用户分析案例,反射(概念,获取配置文件的3种方式)

1. 社交用户关系数据分析案例 数据样例: 需求: 1. 获取每个人的好友个数,并按照好友数量排序 2. 获取任意两个人的共同好友 3.获取所有人两两共同好友 1. public class SimpleFriendsDemo1 { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); try ( // 获取缓冲字符流,读取并切割数据 BufferedRead

用户登陆案例

这一篇,我们用之前学习过的知识,做一个用户登陆的案例. 1. 需求分析 用户界面中进行登录判断.输错三次禁止登陆(半小时),用数据库记录ErrorTimes. 在客户端要求登陆的时候,我们需要将用户名和密码进行验证,如果输错密码的次数达到3次,就禁止用户在半小时内登陆.于是,我们就需要在数据库中记录下用户被禁止登陆的时间.如果输错密码的次数达到了3次,就判断距离禁止登陆的时间是否超过了半个小时:如果超过了,就允许用户登陆. 2. 设计表 建立用户表 t_user ErrorTimes  用户输错

机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法

K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实

Spark2.0机器学习系列之8: 聚类分析(K-Means,Bisecting K-Means,LDA,高斯混合模型)

在写这篇文章之前,先说一些题外话. 许多机器学习算法(如后面将要提到的LDA)涉及的数学知识太多,前前后后一大堆,理解起来不是那么容易. 面对复杂的机器学习模型,尤其是涉及大量数学知识的模型,我们往往要花费大量的时间和精力去推导数学算法(公式),如果过分沉湎于此会忽略了很多背后也许更重要的东西,正所谓只见树木,不见森林,而这是缺乏远见,是迷茫的. 我们需要深入理解模型背后的逻辑和所蕴含的或简或繁的思想.某些思想甚至可能是很美的思想,很伟大的思想.这些理解,使得面对复杂的问题时候,面对陌生问题时,

机器学习--k均值聚类(k-means)算法

一.基本原理 分类是指分类器根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类.分类被称为监督学习.如果训练集的样本没有标注类别,那么就需要用到聚类.聚类是把相似的样本聚成一类,这种相似性通常以距离来度量.聚类被称为无监督学习. 聚类是指根据"物以类聚"的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程.它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似.与分类规则不同,进行聚类前并不知道

Linux用户管理案例(第二版)

批量添加用户 1.按照/etc/passwd文件格式编写用户信息文件users.info xiaofang01::1001:503::/home/xiaofang01:/bin/bash  #注意不能有空行,不然会报错 2.newusers < users.info #newusers命令 导入用户信息文件 3.pwunconv #取消shadow password功能 4.以[用户名:密码]的格式编写密码文件passwd.info 5.chpasswd < passwd.info #导入密码

机器学习--K近邻 (KNN)算法的原理及优缺点

一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类. KNN算法的描述: (1)计算测试数据与各个训练数据之间的距离: (2)按照距离的递增关系进行排序: (3)选取距离最小的K个点: (4)确定前K个点所在类别的出现频率   (5