#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Author : {Jack Zhao}
@Time : 2019/12/6 15:28
@Contact : {[email protected]}
@Desc : 聚类分析
'''
import os
import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
inputfile = './jiaoyi.xlsx' # 待聚类的数据文件
outputfile = '../result/fenlei.xlsx'
k = 4 # 需要进行的聚类类别数
iteration = 50 # 聚类最大循环数
# 训练kmeans聚类模型
def kmeans(data):
# 调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters=k, n_jobs=2) # n_jobs是并行数
kmodel.fit(data) # 训练模型
print('正在聚类')
r1 = pd.Series(kmodel.labels_).value_counts() # 统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_) # 找出聚类中心
return r1,r2,kmodel
def save_to_excel(r1,r2):
r = pd.concat([r2, r1], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data.columns) + [u'类别数目'] # 重命名表头
print('聚类中心的客户数据及相关数目为:')
print(r)
print('输出分类结果到文件')
r = pd.concat([data, pd.Series(kmodel.labels_, index=data.index)], axis=1) # 详细输出每个样本对应的类别
r.columns = list(data.columns) + [u'聚类类别'] # 重命名表头
r.to_excel(outputfile) # 保存分类结果
return r,data
# 绘制饼图
def pie(r1):
plt.pie(sorted(list(r1)), labels=['中端客户,常搞促销', '中高端客户,潜力股', '高端客户,需要VIP服务', '低端客户,维持现状'])
plt.savefig('../result/q4.jpg')
plt.show()
# 绘制概率密度图
def density_plot(data):
p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
[p[i].set_ylabel('density') for i in range(k)]
plt.legend()
plt.show()
return plt
if __name__ == '__main__':
# 读取数据并进行聚类分析
data = pd.read_excel(inputfile) # 读取数据
r1,r2,kmodel = kmeans(data)
# 存入excel文件
r,data = save_to_excel(r1,r2)
print('正在绘制概率密度图')
# 绘制概率密度图
pic_output = '../result/' # 概率密度图文件名前缀
for i in range(k):
density_plot(data[r[u'聚类类别'] == i]).savefig(u'%s%s.png' % (pic_output, i))
# 绘制饼图
pie(r1)
print('已完成')
os.startfile('E:/test/decision1/result/fenlei.xlsx')
分类结果