案例:使用K-Means对用户进行分群
Contents
K-Means定义
K-Means 算法是聚类算法的一种,所以先了解聚类算法。
聚类分析是在没有给定划分类别情况下,根据数据相似度进行样本分组的一种方法。是一种无监督的学习算法。划分依据主要是自身的距离或相似度将他们划分为若干组,划分原则是组内样本最小化而组间(外部)距离最大化。聚类多数场景下用在「数据探索」环节,也就是用来了解数据。它无法提供明确的行动指向,更多是为后期挖掘和分析提供参考,无法回答“为什么”和“怎么办”的问题。
聚类分析和分类区别:分类是从特定的数据中挖掘模式,作出分类判断;聚类是根据数据本身特点,按照不同的模型来判断数据之间的相似性、相似性高的一组数据聚成一簇。
K-Means 算法是基于距离的聚类方法,在最小误差函数的基础上将数据划分为预定的类数 K,采用距离作为相似性的评价指标,认为两个对象的距离越近,其相似度越高。适用于连续型数据。使用场景可以是:用户分群分析。
算法过程
- 从 n 个样本数据中随机选取 K 个对象作为初始的聚类中心(在一开始确定 K 值上,凭业务经验划分,所以K值的选定不一定合理);
- 分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中;
- 所有对象分配完成后,重新计算 K 个聚类的中心(类似重新计算虚拟中心);
- 与前一次计算得到的 K 个聚类中心比较,如果聚类中心发生变化,转至步骤 2,否则转至步骤 5;
- 当质心不发生变化时,停止并输出聚类结果;
- 度量距离:度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离(Python 中目前支持欧氏距离)。
伪代码如图所示
案例演示
注:以下案例数据集来源于《Python数据分析与挖掘实战(第2版)》,但是整体分析流程有调整。可以互相查阅学习。
1 | import pandas as pd |
部分数据字段
描述性统计分析
查看整体数据描述性分析
1 | explore = df.describe(percentiles=[], include='all').T |
部分数据字段
1 | explore['null'] = len(df) - explore['count'] |
部分数据字段
查看单个主体变量会员逐年增长情况
1 | df['FFP_DATE_year'] = pd.to_datetime(df['FFP_DATE']).dt.year |
查看单个分类型变量比例变化情况(直方堆积图)
1 | # 使用数据交叉表,计算每个年度时间节点,出现男女分类的数量情况 |
1 | # 通过div函数,让分组每行合计等于1,用来看每个分组占比 |
1 | cross_table.plot(kind='bar', stacked=True) |
查看单个分类型变量占比情况(直方图&饼图)
1 | # 男女分别数量合计占比 |
1 | # 男女会员分别所有数量。方式一 |
查看单个分类型变量频数情况(直方图)
1 | # 方式一: 直接使用sns.countplot 查看单个变量的分类情况 |
查看单个数值型变量分布情况(箱型图)
1 | # 会员年龄分布箱型图 |
相关性分析
1 | # 'FFP_TIER','FLIGHT_COUNT','LAST_TO_END','SEG_KM_SUM','EXCHANGE_COUNT','Points_Sum','FFP_DATE'的相关系数分析 |
1 | # 设置图形大小 |
数据预处理
数据清洗
1 | # 去除票价为空的行 |
部分数据字段
属性归约
1 | airline = airline[['FFP_DATE', 'LOAD_TIME', 'LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount' ]] |
数据标准化
1 | from sklearn.preprocessing import StandardScaler |
1 | array([[-0.94493902, 14.03402401, 26.76115699, 1.29554188, 1.43579256], |
聚类分析
1 | from sklearn.cluster import KMeans |
聚类分析可视化(雷达图)
1 | #标签 |