【挖掘模型】:Python-KMeans算法聚類消費行為特征數據

原理:快速聚類法,在最小化誤差函數的基礎上將數據劃分為預定類數K,簡單并便于處理大數據 K-Means是聚類算法

    # 目標:把n個樣本點劃分到K個類中,使得每個點屬于離它最近的質心對應的類,以之作為聚類的標準
    # ken老師計算步驟:
        # 隨機找出三個點,作為質點
        # 其他的點,分別于這三個點記錄最近的點一組
        # 把每組中心,作為新的質點
        # 再次計算每個點,與質心的距離,歸為質心最近的那一組
        # 把每組的中心,作為新的質點
        # 如果新的分組成員不在變化,并且質心不在變化,聚類完成
    # API:
        # sklearn.cluster.Kmeans(n_cluters_要聚類的個數 = 8) 
        # fit(data_訓練數據) 訓練模型
        # predict(data_需要預測的數據) 
    
    # 典型的基于距離的非層次聚類算法,在最小化誤差函數的基礎上將數據劃分預定的類數K,采用距離作為相似性的評級指標
    # K的含義:K是人工固定好的數字,假設數據集合可以分為K個簇,由于是依靠人工定好,需要一點先驗知識
    # 算法過程   聚類的結果可能依賴于初始聚類中心的隨機選擇,可能使得結果嚴重偏離全局最優分類,需要多次測試K值
        # 1. 從N個樣本數據中隨機選取K個對象作為初始的聚類中心
        # 2. 分布計算每個樣本到各個聚類中心的距離,將對象分配到距離近的聚類中
        # 3. 所有對象分配完成后,重新計算K各聚類的中心
        # 4. 與前一次計算得到的K個聚類中心比較,如果聚類中心發生變化,換過程2,否則轉過程5
        # 5. 當質心不發生變化時停止輸出聚類結果
    # 數據類型與相似性的度量
        # 連續屬性,先要對各個屬性值進行標準化,在進行距離計算
        # 文檔數據,使用余弦相似度度量,現將文檔整理成文檔-詞矩陣格式
        # 目標函數
    # 代碼模型解釋
        # .fit()  來訓練模型
        # .lable_ 訓練好之后,給樣本數據的標簽
        # .predict() 預測新的輸入的標簽

數據源

consumption_data.xls

結果

Paste_Image.png
客戶價值:

分群1特點: R間隔相對較小,主要集中在030天,消費次數集中在2025次,消費金額在500~2000,
時間間隔短,消費次數多,而且消費金額大,是高消費,高價值人群
分群2特點: R間隔分布在030天,消費次數集中在012次,消費金額在0~1800,
時間間隔,消費次數以及消費金額處于中等水平,一般客戶
分群3特點: R間隔相對較大,間隔分布在3080天,消費次數集中在015次,消費金額在0~2000,
時間間隔長,消費次數少,消費金額一般,是價值較低的用戶

源代碼

import pandas as pd

#參數初始化
inputfile = 'F:/python 數據挖掘分析實戰/Data/consumption_data.xls' #銷量及其他屬性數據
outputfile = 'F:/python 數據挖掘分析實戰/Output/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) #橫向連接(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)
  [p[i].set_ylabel(u'密度') for i in range(k)]
  plt.legend()
  return plt

pic_output = 'F:/python 數據挖掘分析實戰/Output/pd_1' #概率密度圖文件名前綴
for i in range(k):
  density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

參考資料:《Python數據分析與挖掘實戰》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容