########################################二维及数据标准化展示###############################################3
4.1 聚类分析
导入库
import numpy as np # 导入numpy库
import pandas as pd
import matplotlib.pyplot as plt # 导入matplotlib库
from sklearn.cluster import KMeans # 导入sklearn聚类模块
from sklearn import metrics # 导入sklearn效果评估模块
数据准备
raw_data = np.loadtxt('D:\Python数据分析与数据化运营\python_book\chapter4\cluster.txt') # 导入数据文件
raw_data = pd.read_csv('D:\打包7.2\购买珠宝钻石客户群体特征细分数据源.csv',encoding='UTF-8') # 导入数据文件
data0=raw_data[['性别','年龄','购买金额','家庭收入']]#只取参与建模的字段
raw_data.head()#查看前五行数据
data0=raw_data.iloc[:,3:]#只取参与建模的字段
data0.info()#查看数据各字段结构含义,无数据缺失
data0.shape#查看总样本及总变量
data0.describe()#观察数据资本情况
2、异常值处理
可以通过箱线图观察异常值,没有异常值,
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
x1=data0['性别']
x2=data0['年龄']
x3=data0["购买金额"]
x4=data0["家庭收入"]
fig=plt.figure(figsize=(20,15))
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222)
ax3=fig.add_subplot(223)
ax4=fig.add_subplot(224)
ax1.boxplot(x1)
ax1.set_xticklabels("性别", fontsize=20)
ax2.boxplot(x2)
ax2.set_xticklabels('年龄', fontsize=20)
ax3.boxplot(x3)
ax3.set_xticklabels("购买金额", fontsize=20)
ax4.boxplot(x4)
ax4.set_xticklabels('家庭收入', fontsize=20)
数据进行标准化,目的消除变量数据差异太大,量纲影响
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
X= scaler.fit_transform(data0)#数据标准化
data1=pd.DataFrame(X)#转化为DataFrame格式
data1.columns=['性别','年龄','购买金额','家庭收入']#标准化数据重命名
建模
训练聚类模型
n_clusters = 5 # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters,random_state=0) # 建立聚类模型对象#聚成3类数据,并发数为4,最大循环次数为500
model_kmeans.fit(data1) # 训练聚类模型
y_pre = model_kmeans.predict(data1) # 预测聚类模型
r1 = pd.Series(model_kmeans.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(model_kmeans.cluster_centers_) #找出聚类中心
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data1.columns) + [u'类别数目'] #重命名表头,每一列对应的列名及对应的类别数量
print (r)
r0 = pd.concat([data1, pd.Series(model_kmeans.labels_, index = data1.index)], axis = 1) #详细输出每个样本对应的类别
r0.columns = list(data1.columns) + [u'聚类类别'] #重命名表头
print (r0)
r0.to_excel('D:\Python数据分析与数据化运营\python_book\chapter4\julei_result1.xlsx') #保存分类结果
r3=r0.groupby('聚类类别').mean()[:]#求每一类对应的同一列的样本特征均值
print (r3)
模型效果可视化
centers = model_kmeans.cluster_centers_ # 各类别中心
colors = ['#4EACC5', '#FF9C34', '#4E9A06'] # 设置不同类别的颜色,'#ff8099','#ffff00'
plt.figure() # 建立画布
for i in range(n_clusters): # 循环读类别
index_sets = np.where(y_pre == i) # 找到相同类的索引集合
cluster = X[index_sets] # 将相同类的数据划分为一个聚类子集
plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.') # 展示聚类子集内的样本点
plt.plot(centers[i][0], centers[i][1], 'o', markerfacecolor=colors[i], markeredgecolor='k',
markersize=6) # 展示各聚类子集的中心
plt.show() # 展示图像
数据要反标准化还原
rr0= pd.DataFrame(scaler.inverse_transform(r.iloc[:,0:4]))
rr0.columns=['性别','年龄','购买金额','家庭收入'] #重命名表头
print(rr0)
每一列对应的列名及对应的类别数量
rr00=pd.merge(left=rr0, right=r, how='left', left_on=rr0.index, right_on=r.index)# 关联取出类别数目
rr00.info()
rr000=rr00[['性别_x','年龄_x','购买金额_x','家庭收入_x','类别数目']]#关联取出左边需要的字段
rr000
rr0001=sum(rr000['类别数目'])
rr0002=rr000['类别数目']/sum(rr000['类别数目'])
rr0003=rr0002
rr0003.columns=['百分比']
rr0003
详细输出每个样本对应的类别
rr1= pd.DataFrame(scaler.inverse_transform(r0.iloc[:,0:4]))
rr1.columns=['性别','年龄','购买金额','家庭收入'] #重命名表头
print(rr1)
rr11=pd.merge(left=rr1, right=r0, how='left', left_on=rr1.index, right_on=r0.index)# 关联取出类别数目
rr111=rr11[['性别_x','年龄_x','购买金额_x','家庭收入_x','聚类类别']]#关联取出左边需要的字段
rr111
r33=rr111.groupby('聚类类别').mean()[:]#求每一类对应的同一列的样本特征均值
r33
rr111.to_csv("D:\打包7.2\qingdan.csv",encoding='UTF-8')