32 K-Means 信用卡用户行为模式聚类
32.1 引言信用卡用户分层
聚类目标: - 客户细分: 识别不同消费群体 - 风险控制: 识别高风险行为 - 精准营销: 针对性营销策略
32.2 数据准备
# 注:09_CC GENERAL.csv数据文件本地没有,但平台已经内置
# =============================================================================
# 题目:K-Means信用卡用户行为模式聚类
# =============================================================================
# 本代码使用K-Means算法对信用卡用户进行聚类分析。
# 聚类是无监督学习方法,将相似的用户归为一组,发现数据内在结构。
# 在金融场景中用于客户细分、风险识别、精准营销等。
# ==================== 导入必要的库 ====================
import pandas as pd # 数据处理库
import numpy as np # 数值计算库
from sklearn.cluster import KMeans # K-Means聚类算法
from sklearn.metrics import silhouette_score # 轮廓系数评估指标
import matplotlib.pyplot as plt # 绘图库
import seaborn as sns # 统计绘图库
# ==================== 读取数据 ====================
# 读取信用卡用户数据,包含用户ID和各种消费行为特征
data = pd.read_csv('09_CC GENERAL.csv') # 从CSV文件加载数据
# ==================== 数据探索 ====================
print('数据形状:', data.shape) # 打印数据维度(样本数,特征数)
print('\n数据预览:')
print(data.head()) # 显示前5行数据,了解数据结构
# ==================== 数据清洗 ====================
# 删除客户ID列,因为聚类算法不应受ID影响
data_clean = data.drop(['CUST_ID'], axis=1) # axis=1表示删除列
# ==================== 处理缺失值 ====================
# 使用前向填充方法处理缺失值,即用前一个有效值填充
data_clean.fillna(method='ffill', inplace=True) # ffill=forward fill,前向填充
print(f'\n缺失值处理:')
print(data_clean.isnull().sum().sum()) # 检查是否还有缺失值,应该输出0
# ==================== 数据描述统计 ====================
print('\n数据描述统计:')
print(data_clean.describe()) # 显示各特征的统计量(均值、标准差、分位数等)32.3 K-Means聚类
# 注:09_CC GENERAL.csv数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd # 导入Pandas数据分析库
data = pd.read_csv('09_CC GENERAL.csv') # 从CSV文件读取数据存入data
# 数据处理
data.drop(['CUST_ID'], axis=1, inplace=True)
data.fillna(method='ffill', inplace=True) # 使用前向填充法处理缺失值
from sklearn.cluster import KMeans # 导入Scikit-learn的KMeans模块
import matplotlib.pyplot as plt # 导入Matplotlib绑图库
# 使用Kmeans算法对数据进行聚类
kmeans = KMeans(n_clusters=5, n_init=10, max_iter=300,algorithm="elkan", random_state=42)
kmeans.fit(data) # 在数据上训练kmeans模型
# 可视化展示聚类结果
plt.scatter(data.iloc[:, 0], data.iloc[:, 1], c=kmeans.labels_, cmap='viridis')
plt.savefig("s.png") # 保存图形至文件
plt.show() # 显示图形
# 分析不同类别的用户特征和行为差异
data['cluster'] = kmeans.labels_
cluster_summary = data.groupby('cluster').mean() # 按指定列分组聚合
print(cluster_summary) # 输出聚类数据
# 对聚类结果进行评估
from sklearn.metrics import silhouette_score
print(silhouette_score(data, kmeans.labels_)) # 输出均值数据32.4 聚类可视化
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 可视化前两维特征的聚类结果 ====================
# 注意:高维数据只能投影到2D平面展示,可能丢失部分信息
plt.figure(figsize=(10, 8)) # 创建10x8英寸的画布
# 绘制散点图,不同簇用不同颜色表示
scatter = plt.scatter(
data_clean.iloc[:, 0], # x坐标:第一个特征
data_clean.iloc[:, 1], # y坐标:第二个特征
c=labels, # 颜色根据簇标签着色
cmap='viridis', # 使用viridis配色方案(紫色到黄色)
s=50, # 点的大小为50
alpha=0.6 # 透明度0.6,便于看到重叠点
)
plt.colorbar(scatter, label='Cluster') # 添加颜色条,显示簇标签
plt.title('信用卡用户聚类结果', fontsize=14) # 设置标题
plt.xlabel('特征1', fontsize=12) # x轴标签
plt.ylabel('特征2', fontsize=12) # y轴标签
plt.grid(True, alpha=0.3) # 添加网格线,透明度0.3
plt.tight_layout() # 自动调整布局
plt.show() # 显示图形32.5 用户行为分析
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 按簇统计特征均值 ====================
# 计算每个簇各特征的平均值,用于理解各簇的行为模式
cluster_summary = data_clean.groupby('cluster').mean() # 按簇分组,计算均值
print('各簇平均特征:')
print(cluster_summary)
# 输出解读:比较各簇在余额、购买频率、信用额度等方面的差异
# ==================== 计算轮廓系数 ====================
# 轮廓系数衡量聚类质量:值越接近1,聚类效果越好
silhouette_avg = silhouette_score(data_clean.iloc[:, :-1], labels) # 排除cluster列
print(f'\n平均轮廓系数: {silhouette_avg:.4f}')
# ==================== 轮廓系数解读 ====================
# 轮廓系数范围:[-1, 1]
# >0.5: 良好聚类,样本分配合理
# 0.2-0.5: 中等聚类,部分样本可能分配错误
# <0.2: 较差聚类,簇之间重叠严重
# <0: 样本可能被分配到错误的簇
print('\n轮廓系数解读:')
if silhouette_avg > 0.5:
print(' 聚类效果良好,簇间分离度高')
elif silhouette_avg > 0.2:
print(' 聚类效果中等,可考虑调整K值或特征')
else:
print(' 聚类效果较差,建议重新选择特征或算法')32.6 商业应用
用户分群策略: 1. 高消费高频率: VIP客户,专属服务 2. 高消费低频率: 潜力客户,提升频率 3. 低消费高频率: 价格敏感,优惠券激励 4. 低消费低频率: 流失风险,召回活动