数据分析项目 基于K-Means算法的广告聚类分析(5)----KMeans建模:基于平均轮廓系数,找到最佳K值

一、基于K-Means获取最佳K值

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建模分析完成

数据文件

你可能感兴趣的:(数据分析项目,python,聚类,数据分析)