需求分析
理解并掌握聚類分析方法,掌握數據的標準化,掌握尋找最佳聚類數,掌握聚類的繪圖,掌握聚類分析的應用場景。
系統實現
實驗流程分析
- 借助航空公司數據,對客戶進行分類
- 對不同類別的客戶進行特征分析,比較不同類別客戶的價值
- 對不同價值的客戶類別進行個性化服務,制定相應的營銷策略
數據準備
- 加載本次實驗所需要用到的包
打開spyder,輸入以下代碼
import pandas as pd
import numpy as np
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans,AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import datetime
plt.rcParams['font.sans-serif']=['SimHei'] #中文正常顯示
plt.rcParams['axes.unicode_minus']=False #讓負號正常顯示
- 讀取數據,查看數據和整理數據信息
??https:staticfile.eduplus.netldataSetsystemLiblc3b5c0f37fe24797808613bc713d5585.rar。壓縮包中的數據為csv數據,解壓并將該數據移動到c:/數據分析/data目錄中
讀取并查看數據
?
取出SUM_YR_1和SUM_YR_2不為空的樣本
?
去除掉第一年、第二年票價均為0,同時平均折扣系數大于零和飛行里程大于零的數據
?
- 取出LRFMC模型數據,并整理
取出LRFMC模型數據
計算入會天數?
L = pd.to_datetime(new_data['LOAD_TIME'])-pd.to_datetime(new_data['FFP_DATE'])
L = np.int64(L.astype(str).str.split().str[0]) # 會員入會天數
L=pd.DataFrame(L,columns=['Days'])
air_features = pd.concat([L, new_data.iloc[:, 2:]], axis=1) # 橫向拼接
print(air_features.head())
更改列名,描述性統計?
?重置索引
數據標準化
?
尋找最佳聚類個數
- 繪制拐點圖,尋找下降最劇烈的點
sse=[]
for i in range(2,10):result=KMeans(i,random_state=100).fit(data_scale)sse.append(result.inertia_)
plt.figure()
plt.plot(range(2,10),sse,marker='o')
plt.xlabel('k')
plt.ylabel('sse')
plt.show()
k=3/4時最激烈?
- 繪制輪廓系數圖,尋找輪廓系數高的點
sil=[]
for i in range(2,8):result=KMeans(i,random_state=100).fit(data_scale)sil.append(silhouette_score(air_features,result.labels_))
plt.figure()
plt.plot(range(2,8),sil,marker='o')
plt.xlabel('k')
plt.ylabel('sil')
plt.show()
?k=2/3輪廓系數最高,綜合k=3
建立聚類模型
- 繪制聚類圖,觀察聚類情況
kmeans聚類
繪制聚類圖
結果分析
- 合并數據,并加入分類
- 聚合各類,對各特征計算平均值
- 加入客戶分類并畫圖
def customer_type(cluser):if cluser==0:return '重要發展客戶'elif cluser==1:return '最重要客戶'else:return '一般客戶'air_features['客戶類型']=air_features['cluster'].apply(customer_type)
print(air_features.head())
?繪制圖像
customer_count=air_features['客戶類型'].value_counts()
plt.figure()
plt.subplot(1,2,1)
plt.bar(customer_count.index,customer_count.values)
#添加文本
for a,b in zip(customer_count.index,customer_count.values):plt.text(a,b,b,ha='center',va='bottom',color='b')
plt.subplot(1,2,2)
plt.pie(customer_count.values,labels=list(customer_count.index),autopct='%.1f%%', textprops={'color':'r'},shadow=True)
plt.legend(loc=1)
plt.show()