32  K-Means 信用卡用户行为模式聚类

32.1 引言信用卡用户分层

聚类目标: - 客户细分: 识别不同消费群体 - 风险控制: 识别高风险行为 - 精准营销: 针对性营销策略

32.2 数据准备

列表 32.1
# 注: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聚类

列表 32.2
# 注: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 聚类可视化

列表 32.3
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行

# ==================== 可视化前两维特征的聚类结果 ====================
# 注意:高维数据只能投影到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 用户行为分析

列表 32.4
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行

# ==================== 按簇统计特征均值 ====================
# 计算每个簇各特征的平均值,用于理解各簇的行为模式
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. 低消费低频率: 流失风险,召回活动