赞
踩
K-Means是聚类算法的一种,以距离来判断数据点间的相似度并对数据进行聚类。前面的文章中我们介绍过K-Means聚类算法的原理及实现。本篇文章使用scikit-learn库对数据进行聚类分析。
开始之前先导入要使用的各种库文件,首先是scikit-learn库,然后是数值计算numpy和科学计算pandas库,以及用于绘制图表的matplotlib库文件。
1
2
3
4
|
from
sklearn.cluster
import
KMeans
import
numpy as np
import
pandas as pd
import
matplotlib.pyplot as plt
|
读取用于聚类的数据并创建名为loan_data的数据表,用于后续的聚类分析。
1
2
|
#读取用于聚类的数据,并创建数据表
loan_data
=
pd.DataFrame(pd.read_csv(
'loan_data.csv'
,header
=
0
))
|
1
2
|
#查看数据表
loan_data.head()
|
1
2
3
4
5
|
#查看表中的各列的名称
loan_data.columns
Index([
'member_id'
,
'loan_amnt'
,
'term'
,
'grade'
,
'emp_length'
,
'annual_inc'
,
'issue_d'
,
'loan_status'
,
'total_pymnt_inv'
,
'total_rec_int'
],
dtype
=
'object'
)
|
我们对数据表中的贷款金额和用户年收入进行聚类,这里先绘制两个维度的散点图,观察分布情况并与后续的聚类结果进行对比。
1
2
3
4
5
6
7
8
|
#绘制散点图
plt.rc(
'font'
, family
=
'STXihei'
, size
=
10
)
plt.scatter(loan_data[
'loan_amnt'
],loan_data[
'annual_inc'
],
50
,color
=
'blue'
,marker
=
'+'
,linewidth
=
2
,alpha
=
0.8
)
plt.xlabel(
'贷款金额'
)
plt.ylabel(
'年收入'
)
plt.xlim(
0
,
25000
)
plt.grid(color
=
'#95a5a6'
,linestyle
=
'--'
, linewidth
=
1
,axis
=
'both'
,alpha
=
0.4
)
plt.show()
|
我们数据表中的贷款金额和用户年收入两个维度进行聚类,这里先对数据进行预处理,然后设置类别数量。
1
2
3
4
5
6
|
#设置要进行聚类的字段
loan
=
np.array(loan_data[[
'loan_amnt'
,
'annual_inc'
]])
#设置类别为3
clf
=
KMeans(n_clusters
=
3
)
#将数据代入到聚类模型中
clf
=
clf.fit(loan)
|
聚类结果将数据分析三类,第一类的均值是贷款金额8754,年收入88853。第二类的均值是贷款金额4596,年收入22406。第三类的均值是贷款金额9168,年收入46870。换个角度来看,第一个类的用户属于贷款金额高,年收入也较高的一群人。第二个类别的用户属于贷款金额较低,年收入也较低的一群人。第三个类别的用户则属于贷款金额高,年收入居中的一群人。
1
2
3
4
5
|
#查看聚类结果
clf.cluster_centers_
array([[
8754.54545455
,
88853.19909091
],
[
4596.875
,
22406.5
],
[
9168.18181818
,
46870.72727273
]])
|
假设这时我们又有了新的用户数据输入,在原有聚类模型中,新数据贷款金额7000,年收入30000,被分为了第三个类别,贷款金额高,年收入居中的类别。
1
2
3
|
#测试新数据聚类结果
clf.predict([
'7000'
,
'30000'
])
array([
2
])
|
将K-Means模型对原始数据聚类的结果标记在原始数据表中。
1
2
|
#在原始数据表中增加聚类结果标签
loan_data[
'label'
]
=
clf.labels_
|
查看标记聚类结果的数据表,其中label字段为聚类结果。
1
2
|
#查看数据表
loan_data.head()
|
为了更加清晰和直观的查看原始数据的聚类结果,我们将聚类结果绘制成散点图,以三种不同颜色标记不同的类别的数据点。
1
2
3
4
|
#提取不同类别的数据
loan_data0
=
loan_data.loc[loan_data[
"label"
]
=
=
0
]
loan_data1
=
loan_data.loc[loan_data[
"label"
]
=
=
1
]
loan_data2
=
loan_data.loc[loan_data[
"label"
]
=
=
2
]
|
1
2
3
4
5
6
7
8
9
10
|
#绘制聚类结果的散点图
plt.rc(
'font'
, family
=
'STXihei'
, size
=
10
)
plt.scatter(loan_data0[
'loan_amnt'
],loan_data0[
'annual_inc'
],
50
,color
=
'#99CC01'
,marker
=
'+'
,linewidth
=
2
,alpha
=
0.8
)
plt.scatter(loan_data1[
'loan_amnt'
],loan_data1[
'annual_inc'
],
50
,color
=
'#FE0000'
,marker
=
'+'
,linewidth
=
2
,alpha
=
0.8
)
plt.scatter(loan_data2[
'loan_amnt'
],loan_data2[
'annual_inc'
],
50
,color
=
'#0000FE'
,marker
=
'+'
,linewidth
=
2
,alpha
=
0.8
)
plt.xlabel(
'贷款金额'
)
plt.ylabel(
'年收入'
)
plt.xlim(
0
,
25000
)
plt.grid(color
=
'#95a5a6'
,linestyle
=
'--'
, linewidth
=
1
,axis
=
'both'
,alpha
=
0.4
)
plt.show()
|
绿色表示第一个类别的用户属于贷款金额居中,年收入较高的一群人。红色第二个类别的用户属于贷款金额较低,年收入也较低的一群人。蓝色表示第三个类别的用户则属于贷款金额高,年收入居中的一群人。
—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。