数据集[user_duration]是1000名用户使用APP时长及次数的情况,针对该数据集做出聚类
R实现:
library(cluster)
library(factoextra)
#加载数据
user_duration=read.csv('/user_duration.csv')
#查看数据
head(user_duration)
>>>结果
duration launch_cnt
1 3681.6350 4
2 488.7920 3
3 504.2426 3
4 40.2190 4
5 163.1598 14
6 716.0249 1
#观察数据特征
summary(user_duration)
>>>结果
duration launch_cnt
Min. : 0.019 Min. : 1.000
1st Qu.: 102.964 1st Qu.: 1.000
Median : 300.020 Median : 3.000
Mean : 629.259 Mean : 4.601
3rd Qu.: 737.318 3rd Qu.: 5.000
Max. :4924.707 Max. :34.000
#标准化数据集
use_z=scale(user_duration)
#对标准化后数据集进行绘图
plot(use_z)
绘图结果如下图1所示:#由于k均值聚类需要指定要生成的聚类数量,使用函数clusGap()来计算用于估计最优聚类数。
gap_user=clusGap(use_z,FUN=kmeans,nstart=25,K.max=10,B=500)
>>>结果
Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 500) [one "." per sample]:
.................................................. 50
.................................................. 100
.................................................. 150
.................................................. 200
.................................................. 250
.................................................. 300
.................................................. 350
.................................................. 400
.................................................. 450
.................................................. 500
#可视化最优聚类数
fviz_gap_stat(gap_user)
从下图上可以看到最优聚类数为2。#根据最有聚类数进行聚类
user_km=kmeans(use_z,2,nstart=25)
#计算和可视化k均值聚类
fviz_cluster(user_km,user_duration)
得到聚类结果:#判断聚类结果好坏
sil=silhouette(user_km$cluster,dist(use_z))
fviz_silhouette(sil)
>>>结果
cluster size ave.sil.width
1 1 122 0.22
2 2 878 0.78
轮廓系数图:#将聚类结果合并
user_duration2=cbind(user_km$cluster,user_duration)