实验题目:基于信用卡客户数据的 K-Means 聚类分析¶
实验背景¶
本实验基于信用卡客户数据集,目标是通过 K-Means 聚类方法将客户分为不同的群体,帮助理解客户的消费和还款行为,为进一步的客户细分和策略制定提供依据。
实验目标¶
- 掌握 K-Means 聚类的基本原理和实现步骤。
- 学习如何对特征进行标准化处理以适应聚类算法。
- 理解 K 值选择的重要性,并尝试使用方法确定合适的 K 值。
- 通过聚类结果分析不同群体的行为特征。
实验步骤¶
数据预处理
- 加载数据并查看字段描述。
- 检查数据是否有缺失值并适当填补(如用均值或中位数填补
MINIMUM_PAYMENTS
的缺失值)。 - 对特征进行标准化处理(使用
StandardScaler
或其他方法),将所有特征缩放到相同的尺度。注意事项:K-Means 使用欧几里得距离计算相似性,因此不同尺度的特征可能导致结果偏差,必须进行标准化。
确定 K 值(以下方法任选其一)
- 使用 肘部法则(Elbow Method):绘制不同 K 值下的簇内平方和(Inertia),找到拐点。
- 使用 轮廓系数(Silhouette Score):尝试不同的 K 值,选择使得轮廓系数最高的 K 值。
提示:K 值选择过小可能导致簇内差异过大,过大会导致过拟合。
执行 K-Means 聚类
- 在确定的 K 值下,应用 K-Means 聚类算法。
- 将聚类结果加入数据集中,并统计每个簇的基本信息(如簇内样本数量、均值等)。
结果可视化(可选)
- 使用降维方法(如 PCA 或 t-SNE)将特征降到二维空间,绘制不同簇的分布图。
- 对每个簇的特征均值绘制雷达图或柱状图,直观展示不同簇的行为差异。
数据集字段说明¶
- CUST_ID:客户的唯一标识符。
- BALANCE:客户账户的当前余额。
- BALANCE_FREQUENCY:余额更新频率(值越接近1,表示更新越频繁)。
- PURCHASES:客户的总消费金额。
- ONEOFF_PURCHASES:客户一次性消费的总金额。
- INSTALLMENTS_PURCHASES:分期付款消费的总金额。
- CASH_ADVANCE:客户预支现金的总金额。
- PURCHASES_FREQUENCY:消费发生的频率(值范围为0到1)。
- ONEOFF_PURCHASES_FREQUENCY:一次性消费的发生频率。
- PURCHASES_INSTALLMENTS_FREQUENCY:分期消费的发生频率。
- CASH_ADVANCE_FREQUENCY:预支现金的发生频率。
- CASH_ADVANCE_TRX:预支现金的交易次数。
- PURCHASES_TRX:消费的交易次数。
- CREDIT_LIMIT:客户的信用额度。
- PAYMENTS:客户的总还款金额。
- MINIMUM_PAYMENTS:客户的最低还款金额。
- PRC_FULL_PAYMENT:客户全额还款的比例(值范围为0到1)。
- 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 [ ]: