日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

调用kmeans_聚类分析—KMeans

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调用kmeans_聚类分析—KMeans 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

K-Means(K均值)是聚類最常用的方法之一,基于點與點距離的相似度來計算最佳類別歸屬。

數據來源業務部門,這些數據是關于客戶的,苦于沒有分析入手點希望數據部門通過對這些數據的分析,給業務部門一些啟示,或者提供數據后續分析或者業務思考的建議。

基于以上的場景的描述和需求,由于業務部門可以自己做一些描述性的統計分析,以及此次數據屬于探索性數據分析,沒有之前的參考案例。故考慮對客戶進行聚類分析,分析客戶的一些特點。

數據源鏈接:https://pan.baidu.com/s/1gx0q2k9HtTBM-T7xW3oD2Q

提取碼:1k95

數據描述:

  • USER_ID:客戶id
  • AVG_ORDERS:平均用戶訂單數量
  • AVG_MONEY:平均訂單價值
  • IS_ACTIVE:是否活躍
  • SEX:性別(0,1,2分別代表未知,男,女)

1.導入庫

# 導入庫 import pandas as pd import numpy as np import matplotlib.pyplot as pltfrom sklearn.cluster import KMeans #Kmeans from sklearn.preprocessing import MinMaxScaler#數據標準化包 # x效果評估模塊 from sklearn.metrics import silhouette_score , calinski_harabaz_score#忽略警告信息 import warnings warnings.filterwarnings('ignore')#解決中文亂碼問題 plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號

2.導入數據文件

# 導入數據文件 raw_data = pd.read_csv('F:pythonpython數據分析與數據運營課本數據chapter4cluster.txt') # 數值型特征 numeric_features = raw_data.iloc[:,1:3] raw_data.head()

numeric_features.head()

3.數據標準化

# 數據標準化 scaler = MinMaxScaler() scaled_numeric_features = scaler.fit_transform(numeric_features) print(scaled_numeric_features[:,:2])

4.訓練模型

#設置聚類數量 n_clusters = 3 # random_state = 0的目的是保證每次訓練時的初始值一致 model_kmeans = KMeans(n_clusters = n_clusters,random_state = 0) model_kmeans.fit(scaled_numeric_features)''’對象持久化:將模型保存至硬盤,便于后期使用時直接調用''' import pickle # dump:將python對象序列化保存至本地文件 pickle.dump(model_kmeans,open('my_model_object.pk1','wb')) #load:從本地文件讀取python對象并恢復實例對象 model_kmeans = pickle.load(open('my_model_object.pk1','rb'))

5.模型效果指標評估

# 輸出總樣本量,總特征數 n_sample,n_feature = raw_data.iloc[:,1:].shape print('n_sample: %d n n_feature: %d'%(n_sample,n_feature))

n_sample: 1000
n_feature: 4

# 非監督式評估方法 # 平均輪廓系數 silhouette_s = silhouette_score (scaled_numeric_features,model_kmeans.labels_,metric ='euclidean') # calinski和harabaz得分 calinski_harabaz_s = calinski_harabaz_score(scaled_numeric_features,model_kmeans.labels_) print('silhouette_s: %f n calinski_harabaz_s: %f'%(silhouette_s,calinski_harabaz_s))

silhouette_s: 0.634086
calinski_harabaz_s: 2860.821834

silhouette_s大于0.5,說明聚類質量較優。優秀與否的基本原則是不同類別間是否具有顯著的區分效果。

6.合并數據和特征

# 整合上面的聚類標簽到原始數據中 kmeans_labels = pd.DataFrame(model_kmeans.labels_ , columns= ['labels']) #組合原始數據與標簽 kmeans_data = pd.concat((raw_data,kmeans_labels),axis = 1) kmeans_data.head()

7.計算不同類別的樣本量和占比

#計數 label_count = kmeans_data.groupby('labels')['SEX'].count() #占比 label_count_rate = label_count/kmeans_data.shape[0] kmeans_record_count = pd.concat((label_count,label_count_rate),axis=1) kmeans_record_count.columns = ['record_count','record_rate']kmeans_record_count

# 計算樣本容量 customer_count = kmeans_record_count.record_count.sum() customer_count

1000

# 畫圖 plt.pie(kmeans_record_count.record_rate,autopct="%3.1f%%",labels=kmeans_record_count.index ) plt.title('不同類別的樣本量和占比')

樣本數量共1000人

1)分類為‘0’332人,占33.2%,

2)分類為‘1’337人,占33.7%,

3)分類為‘2’331人,占33.1人

8.計算不同聚類類別數值型特征

# 查看一下數值型特征的均值情況 kmeans_numeric_features = kmeans_data.groupby('labels')[['AVG_ORDERS','AVG_MONEY']].mean() kmeans_numeric_features

kmeans_numeric_features.plot()

3個分類中,AVG_ORDERS和AVG_MONEY有輕微變化。

9.計算不同聚類類別分類類型特征

9.1 不同活躍度在不同標簽中的占比

kmeans_data['n']=1 kmeans_active_count = kmeans_data.groupby(['labels','IS_ACTIVE'])['n'].count().unstack() kmeans_active_count

# 'labels = 0' 時,活躍與不活躍用戶占比 plt.pie(kmeans_active_count.iloc[0,:],autopct="%3.1f%%",labels=kmeans_active_count.columns) plt.title('labels = 0')

# 'labels = 1' 時,活躍與不活躍用戶占比 plt.pie(kmeans_active_count.iloc[1,:],autopct="%3.1f%%",labels=kmeans_active_count.columns) plt.title('labels = 1')

# 'labels = 2' 時,活躍與不活躍用戶占比plt.pie(kmeans_active_count.iloc[2,:],autopct="%3.1f%%",labels=kmeans_active_count.columns) plt.title('labels = 2')

由上面的3個餅圖可知,用戶是否活躍對標簽的影響不大,在各分類中,活躍與不活躍用戶基本各占50%。

9.2不同性別在不同標簽中的占比

kmeans_sex_count = kmeans_data.groupby(['labels','SEX'])['n'].count().unstack() kmeans_sex_count

# 'labels = 0' 時,各性別用戶占比 plt.pie(kmeans_sex_count.iloc[0,:],autopct="%3.1f%%",labels=kmeans_sex_count.columns) plt.title('labels = 0')

# 'labels = 1' 時,各性別用戶占比 plt.pie(kmeans_sex_count.iloc[1,:],autopct="%3.1f%%",labels=kmeans_sex_count.columns) plt.title('labels = 1')

# 'labels = 2' 時,各性別用戶占比 plt.pie(kmeans_sex_count.iloc[2,:],autopct="%3.1f%%",labels=kmeans_sex_count.columns) plt.title('labels = 2')

由上面的3個餅圖可知,性別對分類的影響比較大,近似可以看做每個性別類型對應一個分類。

總結:

通過kmeans聚類分析主要得出以下結論:

  • 使用 kmeans對客戶信息進行聚類,共3個分類,silhouette_s大于0.5,說明聚類質量較優;
  • 樣本數量共1000人
  • 分類為‘0’332人,占33.2%,
  • 分類為‘1’337人,占33.7%,
  • 分類為‘2’331人,占33.1人
  • 3個分類中,AVG_ORDERS和AVG_MONEY有輕微變化;
  • 用戶是否活躍對標簽的影響不大,在各分類中,活躍與不活躍用戶基本各占50%;
  • 用戶性別對分類的影響比較大,近似可以看做每個性別類型對應一個分類。
  • 總結

    以上是生活随笔為你收集整理的调用kmeans_聚类分析—KMeans的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。