1. 程式人生 > >python資料分析:客戶價值分析案例實戰

python資料分析:客戶價值分析案例實戰

簡介:本案例以電信運營商客戶資訊為資料,通過層次聚類和K-means聚類,對使用者劃分成不同的群體,然後可以根據使用者群體的不同特徵提供個性化的策略,從而達到提高ARPU的效果。

1.商業理解

根據客戶的日常消費行為,我們可以把客戶劃分為不同的群體,根據不同群體的消費行為特徵,我們可以作出針對性的營銷策略。從而達到發展新業務、減少客戶流失率,爭取新使用者,提高ARPU的目標

對運營商使用者的分類,一般可以分為:
公眾使用者
企業使用者
大客戶

本次針對公眾使用者進行劃分,目標將“公眾使用者”分類為:
高階使用者
中端使用者
離網趨勢使用者
其他使用者

2.展示資料

本次採用的資料有:
客戶的個人資訊
客戶的通話資訊
各資費套餐的詳情

這裡寫圖片描述

3.資料預處理

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.cluster.hierarchy#聚類、層次
#讀入資料
custinfo=pd.read_csv("custinfo.csv")
custcall=pd.read_csv("custcall.csv")

#資料聚合
custcall_average=custcall.groupby(custcall["Customer_ID"
]).mean() del custcall_average["month"] #資料合併 data = pd.merge(custinfo,custcall_average,left_on='Customer_ID',right_index=True)#使用右邊dataframe的索引值作為連線鍵 data.index=data["Customer_ID"] del data["Customer_ID"]

4.資料觀察

des=data.describe()
#檢視取值離散變數的分佈
pd.value_counts(data["Gender"]) #檢視性別分佈
pd.value_counts(data
['Tariff'])#套餐
pd.value_counts(data['Handset'])#手機品牌 for i in data.columns: if i not in ['Gender','Tariff','Handset']: plt.figure() sns.distplot(data[i],bins=10,hist_kws=dict(edgecolor='k'),kde=False) plt.show()

這裡寫圖片描述

5.模型建立

#模型建立
#資料整理
xunibinaliang=data[["Gender",'Tariff','Handset']]
dummies=pd.get_dummies(xunibinaliang)   #將類別變數轉為虛擬變數,gender為二值型,get_dummies處理後還是一列
data_zs=pd.DataFrame
i=data.columns.difference([u'Age',u'Gender',u'Tariff',u'Handset']) #一維陣列做差
data_zs=(data[i]-data[i].mean())/data[i].std()
#確定聚類數目
from scipy.cluster.hierarchy import linkage,dendrogram
#進行層次聚類
Z = linkage(data_zs, method = 'ward', metric = 'euclidean') 
P = dendrogram(Z, 0) #將層級聚類結果以樹狀圖表示出來 dendrogram-樹圖
plt.show()#觀察樹圖,認為分成4類比較合適

這裡寫圖片描述


#K-means聚類
#引數初始化
k = 4 #聚類的類別
iteration = 500 #聚類最大迴圈次數,即迭代次數

#構建k-means模型
from sklearn.cluster import KMeans 
model = KMeans(n_clusters = k, n_jobs = 4,max_iter=iteration) #構造聚類器,分為k類,併發數4
model.fit(data_zs) #開始聚類

6.資料展示

#簡單列印結果
r1 = pd.Series(model.labels_).value_counts() #label_:每個樣本對應的簇類別標籤,統計各個類別的數目
r3=model.labels_
r2 = pd.DataFrame(model.cluster_centers_) #行為每一類的聚類中心,每一列的意義是按照data_zs
r4=model.cluster_centers_
r = pd.concat([r2, r1], axis = 1) #橫向連線(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data_zs.columns)+ [u'class'] #重命名錶頭#這裡傳入的列表名必須list
print(r)

#類中心比較
r[i].plot(figsize=(10,10))
plt.show()

#每個類別各屬性的概率密度圖

這裡寫圖片描述

分群的注意點:
1)群間差異是否明顯
2)群內特徵是否相似
3)分群對業務是否有指導意義