调用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: 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_count1000
# 畫圖 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_featureskmeans_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_聚类分析—KMeans的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx 上传 文件超时设置_Ingr
- 下一篇: java 注释 depredated_