1. 程式人生 > >[Python聚類] K-Means聚類演算法分類

[Python聚類] K-Means聚類演算法分類

根據資料將客戶分類成不同客戶群,並評價這些客戶群的價值。

資料示例

部分餐飲客戶的消費行為特徵資料如下:
R最近一次消費時間間隔
F消費頻率
M消費總金額
這裡寫圖片描述

方法

採用K-Means聚類演算法,設定聚類個數為3,最大迭代次數為500次,距離函式取歐式距離。

程式碼實現

#-*- coding: utf-8 -*-
#使用K-Means演算法聚類消費行為特徵資料

import pandas as pd

#引數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性資料
outputfile = '../tmp/data_type.xls'
#儲存結果的檔名 k = 3 #聚類的類別 iteration = 500 #聚類最大迴圈次數 data = pd.read_excel(inputfile, index_col = 'Id') #讀取資料 data_zs = 1.0*(data - data.mean())/data.std() #資料標準化 from sklearn.cluster import KMeans model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,併發數4 model.fit(data_zs) #開始聚類 #簡單列印結果 r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心 r = pd.concat([r2, r1], axis = 1) #橫向連線(axis=0是縱向),得到聚類中心對應的類別下的數目 r.columns = list(data.columns) + [u'類別數目'] #重命名錶頭 print(r) #詳細輸出原始資料及其類別 r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #詳細輸出每個樣本對應的類別 r.columns = list(data.columns) + [u'聚類類別'
] #重命名錶頭 r.to_excel(outputfile) #儲存結果 def density_plot(data): #自定義作圖函式 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號 p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False) #data有3列,所以有3個子圖,p[0],p[1],p[2] [p[i].set_ylabel(u'密度') for i in range(k)] #設定子y軸標籤(預設為density) plt.legend() return plt #作出類別1、類別2和類別3的概率密度圖,並儲存 pic_output = '../tmp/pd_' #概率密度圖檔名字首 for i in range(k): density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i)) #r[u'聚類類別']==i結果為布林值

結果分析

這裡寫圖片描述
分群1的概率密度函式圖
分群1特點:R間隔相對較小,主要集中在0-30天;消費次數集中在10-25次;消費金額在500-2000。
這裡寫圖片描述
分群2的概率密度函式圖
分群2特點:R間隔主要分佈在0-30天;消費次數集中在0-12次;消費金額在0-1800。

這裡寫圖片描述
分群3的概率密度函式圖
分群3特點:R間隔主要分佈在30-80天;消費次數集中在0-15次;消費金額在0-2000。

對比分析
分群1時間間隔較短,消費次數多,而且消費金額較大,是高消費、高價值人群。
分群2的時間間隔、消費次數和消費金額處於中等水平,代表著一般客戶。
分群3的時間間隔較長,消費次數較少,消費金額也不是特別高,是價值較低的客戶群體。