score_list = []
max_score = -1
for k in range(2, 6): # 2,3,4,5
kmeans_model = KMeans(n_clusters=k) # 建模
kmeans_temp = kmeans_model.fit_predict(data_matrix) # 计算点距离
# print(kmeans_temp)
score = silhouette_score(data_matrix, kmeans_temp) # 得到每个K下的平均轮廓系数
# 获取最佳k值
if score > max_score: # 如果平均轮廓系数更高
max_score = score # 保存更高的系数值
best_k = k # 保存最佳的k值
labels_temp = kmeans_temp # 保存标签数据
# print(k, score)
score_list.append([k, score]) # 存每一次的k值和对应的平均轮廓系数
# print('{:*^60}'.format('所有的k值以及对应平均轮廓系数'))
print(score_list)
print('最佳K值:', best_k)
结果
[[2, 0.3865549293769709], [3, 0.45864450618656805], [4, 0.5020981194788054], [5, 0.48003589664576785]]
最佳K值: 4
# 将聚类标签转化为df
cluster_labels = pd.DataFrame(labels_temp, columns=['clusters'])
# 整合原始数据与聚类标签
merge_data = pd.concat((data, cluster_labels), axis=1)
cluster_counts = pd.DataFrame(merge_data['渠道代号'].groupby(merge_data['clusters'])
.count()).T.rename({
'渠道代号': 'counts'})
print(cluster_counts)
结果
clusters 0 1 2 3
counts 349 313 154 73
cluster_percents = (cluster_counts / len(data)).round(3).rename({
'counts': 'percentage'})
print(cluster_percents)
结果
clusters 0 1 2 3
percentage 0.393 0.352 0.173 0.082
# 查看各聚类的特征,对数值类型查看均值,对文本类型查看众数
features = []
for label in range(best_k):
label_data = merge_data[merge_data['clusters'] == label]
# 数值类特征的均值
p1_data = label_data.iloc[:, 1:7] # 筛选出数值类特征
p1_des = p1_data.describe().round(3) # 获取描述性统计信息
p1_mean = p1_des.iloc[1, :] # 获取均值数据
# 字符类特征的众数
p2_data = label_data.iloc[:, 7:12] # 筛选出字符类特征
p2_des = p2_data.describe() # 获取描述性统计信息
p2_mode = p2_des.iloc[2, :] # 获取频数最高的标签
# 横向拼接2类不同特征的数据
merge_line = pd.concat((p1_mean, p2_mode), axis=0)
# 纵向拼接4类簇的统计数据
features.append(merge_line)
# 数据合并与展示
cluster_pd = pd.DataFrame(features).T
all_cluster_pd = pd.concat((cluster_counts, cluster_percents, cluster_pd), axis=0)
print(all_cluster_pd)
结果
0 1 2 3
counts 73 349 313 154
percentage 0.082 0.393 0.352 0.173
日均UV 1401.53 300.205 572.521 613.836
平均注册率 0.001 0.001 0.001 0.003
平均搜索量 0.033 0.016 0.051 0.02
访问深度 1.727 2.27 2.145 2.19
订单转化率 0.002 0.002 0.004 0.003
投放总时间 15.603 15.35 17.125 15.682
素材类型 swf jpg swf jpg
广告类型 tips 横幅 不确定 banner
合作方式 cpm cpc roi cpc
广告尺寸 450*300 600*90 600*90 308*388
广告卖点 打折 直降 打折 满减
K-Means建模分析完成
数据文件