实验题目:基于信用卡客户数据的 K-Means 聚类分析¶

实验背景¶

本实验基于信用卡客户数据集,目标是通过 K-Means 聚类方法将客户分为不同的群体,帮助理解客户的消费和还款行为,为进一步的客户细分和策略制定提供依据。


实验目标¶

  1. 掌握 K-Means 聚类的基本原理和实现步骤。
  2. 学习如何对特征进行标准化处理以适应聚类算法。
  3. 理解 K 值选择的重要性,并尝试使用方法确定合适的 K 值。
  4. 通过聚类结果分析不同群体的行为特征。

实验步骤¶

  1. 数据预处理

    • 加载数据并查看字段描述。
    • 检查数据是否有缺失值并适当填补(如用均值或中位数填补 MINIMUM_PAYMENTS 的缺失值)。
    • 对特征进行标准化处理(使用 StandardScaler 或其他方法),将所有特征缩放到相同的尺度。

      注意事项:K-Means 使用欧几里得距离计算相似性,因此不同尺度的特征可能导致结果偏差,必须进行标准化。

  2. 确定 K 值(以下方法任选其一)

    • 使用 肘部法则(Elbow Method):绘制不同 K 值下的簇内平方和(Inertia),找到拐点。
    • 使用 轮廓系数(Silhouette Score):尝试不同的 K 值,选择使得轮廓系数最高的 K 值。

      提示:K 值选择过小可能导致簇内差异过大,过大会导致过拟合。

  3. 执行 K-Means 聚类

    • 在确定的 K 值下,应用 K-Means 聚类算法。
    • 将聚类结果加入数据集中,并统计每个簇的基本信息(如簇内样本数量、均值等)。
  4. 结果可视化(可选)

    • 使用降维方法(如 PCA 或 t-SNE)将特征降到二维空间,绘制不同簇的分布图。
    • 对每个簇的特征均值绘制雷达图或柱状图,直观展示不同簇的行为差异。

数据集字段说明¶

  1. CUST_ID:客户的唯一标识符。
  2. BALANCE:客户账户的当前余额。
  3. BALANCE_FREQUENCY:余额更新频率(值越接近1,表示更新越频繁)。
  4. PURCHASES:客户的总消费金额。
  5. ONEOFF_PURCHASES:客户一次性消费的总金额。
  6. INSTALLMENTS_PURCHASES:分期付款消费的总金额。
  7. CASH_ADVANCE:客户预支现金的总金额。
  8. PURCHASES_FREQUENCY:消费发生的频率(值范围为0到1)。
  9. ONEOFF_PURCHASES_FREQUENCY:一次性消费的发生频率。
  10. PURCHASES_INSTALLMENTS_FREQUENCY:分期消费的发生频率。
  11. CASH_ADVANCE_FREQUENCY:预支现金的发生频率。
  12. CASH_ADVANCE_TRX:预支现金的交易次数。
  13. PURCHASES_TRX:消费的交易次数。
  14. CREDIT_LIMIT:客户的信用额度。
  15. PAYMENTS:客户的总还款金额。
  16. MINIMUM_PAYMENTS:客户的最低还款金额。
  17. PRC_FULL_PAYMENT:客户全额还款的比例(值范围为0到1)。
  18. TENURE:客户账户的活跃月份数(通常为12个月)。
In [1]:
import findspark
findspark.init()
findspark.find()
Out[1]:
'/Users/heyunan/opt/anaconda3/lib/python3.9/site-packages/pyspark'
In [2]:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Clustering using K-Means').getOrCreate()
data_customer=spark.read.csv('CC General.csv', header=True, inferSchema=True)
data_customer.printSchema()
24/12/11 16:58:51 WARN Utils: Your hostname, s-MacBook-Pro.local resolves to a loopback address: 127.0.0.1; using 10.201.147.28 instead (on interface en0)
24/12/11 16:58:51 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
24/12/11 16:58:51 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
root
 |-- CUST_ID: string (nullable = true)
 |-- BALANCE: double (nullable = true)
 |-- BALANCE_FREQUENCY: double (nullable = true)
 |-- PURCHASES: double (nullable = true)
 |-- ONEOFF_PURCHASES: double (nullable = true)
 |-- INSTALLMENTS_PURCHASES: double (nullable = true)
 |-- CASH_ADVANCE: double (nullable = true)
 |-- PURCHASES_FREQUENCY: double (nullable = true)
 |-- ONEOFF_PURCHASES_FREQUENCY: double (nullable = true)
 |-- PURCHASES_INSTALLMENTS_FREQUENCY: double (nullable = true)
 |-- CASH_ADVANCE_FREQUENCY: double (nullable = true)
 |-- CASH_ADVANCE_TRX: integer (nullable = true)
 |-- PURCHASES_TRX: integer (nullable = true)
 |-- CREDIT_LIMIT: double (nullable = true)
 |-- PAYMENTS: double (nullable = true)
 |-- MINIMUM_PAYMENTS: double (nullable = true)
 |-- PRC_FULL_PAYMENT: double (nullable = true)
 |-- TENURE: integer (nullable = true)

24/12/11 16:59:02 WARN GarbageCollectionMetrics: To enable non-built-in garbage collector(s) List(G1 Concurrent GC), users should configure it(them) to spark.eventLog.gcMetrics.youngGenerationGarbageCollectors or spark.eventLog.gcMetrics.oldGenerationGarbageCollectors

接下来,请你通过 K-Means 聚类方法将客户聚为不同的群体。实验步骤见第一个cell的内容。¶

In [ ]: