簡介:本案例以電信運營商客戶信息為數據,通過層次聚類和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"]
[/code]
## 4.數據觀察
```code
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()
[/code]
```code
#確定聚類數目
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) #開始聚類
[/code]
## 6.數據展示
```code
#簡單打印結果
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()
#每個類別各屬性的概率密度圖
[/code]

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