[Python聚類] K-Means聚類演算法分類
阿新 • • 發佈:2019-02-10
根據資料將客戶分類成不同客戶群,並評價這些客戶群的價值。
資料示例
部分餐飲客戶的消費行為特徵資料如下:
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的時間間隔較長,消費次數較少,消費金額也不是特別高,是價值較低的客戶群體。