字段 | 含义 | 类型 |
---|---|---|
interested_travel | 旅行偏好 | 二分类 |
computer_owner | 是否有家用电脑 | 二分类 |
age | 估计的年龄 | 连续 |
home_value | 房产价格 | 连续 |
loan_ratio | 贷款比率 | 连续 |
risk_score | 风险分数 | 连续 |
marital | 婚姻状况估计 | 连续 |
interested_sport | 运动偏好 | 连续 |
HH_grandparent | 户主祖父母是否健在估计 | 连续 |
HH_dieting | 户主节食偏好 | 连续 |
HH_head_age | 户主年龄 | 连续 |
auto_member | 驾驶俱乐部估计 | 连续 |
interested_golf | 高尔夫偏好 | 二分类 |
interested_gambling | 博彩偏好 | 二分类 |
HH_has_children | 户主是否有孩子 | 二分类 |
HH_adults_num | 家庭成年人数量 | 连续 |
interested_reading | 阅读偏好 | 有序分类 |
1、数据集中的变量较多,如果全部进入模型会导致模型解释困难。因此,一方面我们对于有相关性的变量进行降维,减少变量数目;另一方面,基于业务理解,我们预先将变量进行分组,使得同一组的变量能尽量解释业务的一个方面。比如本例中将变量分成三组,分别是家庭基本情况、财务状况和用户爱好,通过对每组变量分别进行聚类,获取用户的侧写,再将三个聚类结果进行综合,以获得较完整的用户画像。
2、本例中数据类型复杂,包含了连续变量、无序分类和有序分类变量。由于K-means最好仅用于连续型变量聚类,因此需要对变量进行预处理。对于有序分类变量,如果分类水平较多可以视作连续变量处理,否则视作无序分类变量一样处理,再进入模型;无序分类变量数目较少时,可以使用其哑变量编码进入模型。本例中由于有较多的二分类变量,又集中在用户爱好这一方面,因此我们将interested_reading这一有序分类变量二值化,再与其他几个二分类变量一起进行汇总,得到用户的“爱好广度”,使用“爱好广度”与其他连续型的爱好类变量进行聚类。
3、离散变量如HH_has_children一般不参与聚类,因为其本身就可以视作是簇的标签;如果为了后期解释模型时简化处理,在离散变量不多的情况之下,也可以做哑变量变换后进入模型。
读取数据
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
travel = pd.read_csv('data_travel.csv',skipinitialspace=True) # skipinitialspace忽略前后空白
travel.head()
interested_travel | computer_owner | age | home_value | loan_ratio | risk_score | marital | interested_sport | HH_grandparent | HH_dieting | HH_head_age | auto_member | interested_golf | interested_gambling | HH_has_children | HH_adults_num | interested_reading | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | NaN | 64 | 124035 | 73 | 932 | 3 | 312 | 420 | 149 | 96 | 626 | 0 | 0 | NaN | NaN | 0 |
1 | 0.0 | 1.0 | 69 | 138574 | 73 | 1000 | 7 | 241 | 711 | 263 | 68 | 658 | 0 | 0 | N | 5.0 | 3 |
2 | 0.0 | 0.0 | 57 | 148136 | 77 | 688 | 1 | 367 | 240 | 240 | 56 | 354 | 0 | 1 | N | 2.0 | 1 |
3 | 1.0 | 1.0 | 80 | 162532 | 74 | 932 | 7 | 291 | 832 | 197 | 86 | 462 | 1 | 1 | Y | 2.0 | 3 |
4 | 1.0 | 1.0 | 48 | 133580 | 77 | 987 | 10 | 137 | 121 | 209 | 42 | 423 | 0 | 1 | Y | 3.0 | 3 |
所有字段值分别为:旅行偏好,是否有家用电脑,估计年龄,房产价格,贷款比率,风险系数,婚姻状况估计,运动偏好,
户主祖父母是否健在,户主饮食偏好,户主年龄,驾驶俱乐部估计,是否喜欢高尔夫,是否喜欢博彩,是否有孩子,家庭成年人数量,阅读偏好
travel.describe(include='all')# 描述所有列
interested_travel | computer_owner | age | home_value | loan_ratio | risk_score | marital | interested_sport | HH_grandparent | HH_dieting | HH_head_age | auto_member | interested_golf | interested_gambling | HH_has_children | HH_adults_num | interested_reading | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 149788.000000 | 149788.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 167177.000000 | 159899 | 145906.000000 | 167177 |
unique | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 | NaN | 5 |
top | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | N | NaN | 3 |
freq | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 111462 | NaN | 65096 |
mean | 0.427745 | 0.856571 | 59.507079 | 207621.314798 | 66.762707 | 817.031751 | 6.884015 | 259.431776 | 377.072498 | 204.593341 | 59.368023 | 486.861273 | 0.3 |