K-Means聚类算法如何划分用户生命周期

从事互联网产品,运营或者数据的同学,无论在工作中还是各种博客上,经常接触到用户生命周期这个名词,但各种资料下来,用户生命周期是什么大家可能都非常清楚,但怎么划分出各个生命周期阶段,可能是我们一直头疼的问题,用什么方法,需要那些用户特征进行处理,这些干货是否网上资料很少,本人目前就职与某直播平台,基于实际的业务需求,为大家分享一套完整的分析案例;

一、基于业务需求梳理用户特征

image.png

具体的业务特征这个需要大家根据自己的业务数据理解进行数据清洗,对于我们直播行业,可以是不同阶段的观看时长,送礼金额,关注主播数等,如果不清楚那些特征对结果产生大的影响,可以先脑补特征,通过特征重要性排序进行筛选;
整个逻辑就是通过前期的用户特征进行用户群体划分,然后用后7天的相关数据验证用户群体是否合理;

二、清晰用户特征数据

image.png

因为后续是采用的聚类算法,训练的特征需要进行归一处理,相关代码见后面;

三、简单介绍一下聚类算法

聚类思想
聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征,根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高;
K-Means 聚类
对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大,训练流程如下(算法原理详细介绍可以百度一下)

image.png

四、聚类(K)值选取

用户群体到底聚成几类,这个需要结合自己的业务需求和科学的检验方法进行评定,因为我们初期是准备划分成5类人群,通过相关的检验评估,最好的聚类数是6个,我们这里就取的K值为6,将所有用户群体划分为6类


image.png

五、聚类训练

image.png

基于确定的聚类K值,进行各项维度评估,结合特征数据,确定所处周期,检验后续的消费,留存,活跃情况(为保证数据安全性,以上数据均进行处理,非正式业务数据)

六、定性分析

image.png

基于确定的生命周期,进行用户群体定性分析,因为分析结果需要同步给领导,上面关心的是能明确出来的各项指标数据(为保证数据安全性,以上数据均进行处理,非正式业务数据)

七、附带源代码

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import matplotlib as mpl
import pylab
pd1=pd.read_excel('C:/Users/lirenyong/Desktop/用户聚类分析.xlsx','Sheet4')
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
data1=pd1[pd1.columns[1:19]]
data1_scale= pd.DataFrame(scaler.fit_transform(data1))
#K-means聚类通过距离进行群体划分,需要对数据进行归一处理

data1_scale.columns=['7日新','30日新','近1年关注主播数',
'近7天访问天数','近7天消费金额','近7天观看时长','近7天发言次数','近7天关注主播数',
'近30天访问天数','近30天消费金额','近30天观看时长','近3O天发言次数','近3O天关注主播数','近90天访问天数','近90天消费金额','近90天观看时长','近90天发言次数','近90天关注主播数']
data1_scale.head(5)
import seaborn as sns
from sklearn.decomposition import PCA
pca_1 = PCA(n_components=2)
data_pca_1 = pd.DataFrame(pca_1.fit_transform(data1))
data_pca_2 = pd.DataFrame(pca_1.fit_transform(data1_scale))
data_pca_1.columns=['colm1','colm2']
data_pca_2.columns=['colm1','colm2']
# 降到二维方便查看数据分布


# 簇内误方差(SSE)评估
from sklearn.metrics import silhouette_score
import random
from pandas import  DataFrame
silhouettescore=[]
for i in range(2,10):
  kmeans=KMeans(n_clusters=i,random_state=123)
  kmeans.fit(data3)
  silhouettescore.append(kmeans.inertia_)
plt.rcParams['figure.dpi'] = 100
plt.figure(figsize=(8,5)) 
plt.plot(range(2,10),silhouettescore,linewidth=1.5,linestyle='-',marker='o')
plt.xlabel('簇数量')
plt.ylabel('簇内误方差')
plt.title('簇内误方差(SSE)评估')
plt.show()



# calinski_harabaz指数检验
from sklearn.metrics import calinski_harabasz_score
silhouettescore=[] 
for i in range(2,10):
    kmeans=KMeans(n_clusters=i,random_state=123).fit(data3)
    score=calinski_harabasz_score(data3,kmeans.labels_)
    silhouettescore.append(score)
    print('聚类%d簇的calinski_harabaz分数为:%f'%(i,score))

plt.plot(range(2,10),silhouettescore,linewidth=1.5,linestyle='-',marker='o') 

plt.xlabel('簇数量')
plt.ylabel('calinski_harabaz指数')
plt.title('calinski_harabaz指数检验')
plt.show()

# 模型训练

from sklearn.cluster import KMeans
iteration = 500 #最大循环次数
kms = KMeans(n_clusters=6,n_jobs=4,max_iter=iteration)
kms.fit(data1_scale) #开始聚类
y_pred = kms.fit_predict(data1_scale) 


r1 = pd.Series(kms.labels_).value_counts() #统计各个类别的数目
r2 = pd.DataFrame(kms.cluster_centers_) #找出聚类中心
r = pd.concat([r2,r1],axis=1) #横向连接,0是纵向
r.columns = list(data1_scale.columns)+[u'聚类类别'] #重命名表头


#详细输出原始数据及类别
data_all = pd.concat([pd1,pd.Series(kms.labels_,index=data1_scale.index)],axis=1)
data_all.columns = list(pd1.columns)+[u'聚类类别']
data_all.head()

for g in range(1,6):
    rMean=rMean.append(data_all[data_all['聚类类别']==g].describe().iloc[1:2])
rMean

有更好的群体划分方法,欢迎大家留言讨论

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容