如何用Python实现K-means算法按应用使用行为将用户聚类为3组?
用户应用使用数据的K-means三群组实现步骤
安装依赖工具
- 不需要手搓K-means算法逻辑,直接用成熟的开源工具包跑通流程即可,安装命令:
pip install pandas scikit-learn
第一步:基础数据清洗
你拿到的数据集以用户ID为行索引,只需要保留应用使用次数的数值列作为聚类特征,不要把用户ID本身加入特征计算:
import pandas as pd # 读取CSV格式的数据集,指定用户ID为行索引 df = pd.read_csv("app_usage.csv", index_col="UserId") # 填充缺失值为0,符合使用次数的语义(无记录即无使用) df = df.fillna(0) # 筛掉全0使用的不活跃用户,这类用户无有效行为,硬聚类会干扰目标群组的划分 total_usage = df.sum(axis=1) inactive_user_mask = total_usage == 0 active_df = df[~inactive_user_mask] inactive_df = df[inactive_user_mask].copy() inactive_df['cluster_group'] = 'inactive'
第二步:必做的特征标准化
K-means基于样本间的欧氏距离计算相似度,你的数据中不同应用类别的使用次数数值范围差异很大(比如样例数据中教育类最高单次值为9,时钟类最高为2),不做缩放的话高数值列会完全主导距离计算,导致聚类结果失真:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_features = scaler.fit_transform(active_df)
第三步:运行K-means聚类
固定随机种子保证结果可复现,直接按需求设置3个聚类群组:
from sklearn.cluster import KMeans # n_clusters设为3对应你的目标群组数量,random_state固定为42避免每次运行结果随机波动 kmeans = KMeans(n_clusters=3, random_state=42, n_init="auto") cluster_labels = kmeans.fit_predict(scaled_features) # 把聚类标签合并回活跃用户的数据集 active_df['cluster_group'] = cluster_labels # 合并活跃用户聚类结果和之前标记的不活跃用户,得到完整结果 final_result = pd.concat([active_df, inactive_df])
结果解读方法
直接按群组维度计算每个应用类别的平均使用次数,就能快速对应每个群组的用户特征:
# 输出每个群组的平均使用行为画像 cluster_profile = final_result.groupby("cluster_group").mean() print(cluster_profile)
结合你给出的样例数据,通常会得到类似的群组特征:
- 某一群组通讯类使用次数均值高,其他类别数值偏低,对应普通社交类用户
- 某一群组娱乐、教育类使用次数均值高,对应学习娱乐双高的学生类用户
- 某一群组日历、金融类使用次数均值高,对应办公理财类用户
- 标记为
inactive的群组为无有效使用行为的不活跃用户
新手避坑提示
- 不要跳过特征标准化步骤,这是新手做K-means时最容易出现结果偏差的原因
- 不要把全0使用的用户硬塞进3个目标群组,否则算法会为了适配这类无行为用户打乱正常的群组划分
- 因为你的样本量只有61个,如果某一群组仅包含1-2个用户,可单独检查这些用户的使用数据是否为离群异常值
内容的提问来源于stack exchange,提问作者ab20225
相关产品推荐
相关产品推荐

