python打卡 DAY 18 推断聚类后簇的类型

article/2025/8/4 12:39:11

目录

聚类结果分析与簇类型推断学习笔记

一、聚类后分析基础流程

1.1 基本分析步骤

1.2 常用可视化工具

二、簇特征分析方法

2.1 数值型特征分析

簇中心对比

雷达图展示

2.2 类别型特征分析

频数统计

卡方检验

三、簇类型推断技术

3.1 基于统计特征的推断

关键指标计算

特征重要性排序

3.2 基于业务规则的标签分配

业务规则示例(电商场景)

3.3 自动化标签生成(NLP技术)

使用TF-IDF生成标签

四、验证与优化方法

4.1 簇稳定性检验

重采样验证

4.2 业务合理性验证

专家评估表设计

五、实战案例:客户分群分析

5.1 RFM模型聚类

5.2 簇类型定义

六、常见问题解决方案

6.1 簇难以解释的情况

6.2 混合型数据处理

作业:接续 day17 内容

5簇的含义

4簇的含义

3簇类型推断

2推断簇的类型

1 推断簇的类型

0推断簇的类型


聚类结果分析与簇类型推断学习笔记

一、聚类后分析基础流程

1.1 基本分析步骤

  1. 可视化检查:降维后观察簇分布

  2. 统计特征:计算各簇的统计量

  3. 对比分析:识别簇间差异特征

  4. 业务解释:结合领域知识赋予语义

1.2 常用可视化工具

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 降维可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)plt.scatter(X_pca[:,0], X_pca[:,1], c=labels, cmap='viridis')
plt.title("Cluster Visualization (PCA)")
plt.show()

二、簇特征分析方法

2.1 数值型特征分析

簇中心对比
import pandas as pd# 计算各簇中心
centers = pd.DataFrame(scaler.inverse_transform(kmeans.cluster_centers_),columns=feature_names
)# 可视化
centers.plot(kind='bar', figsize=(12,6))
plt.title("Cluster Centers Comparison")
plt.ylabel("Feature Value (Original Scale)")
plt.xticks(rotation=0)
plt.show()
雷达图展示
from math import pi# 准备数据
categories = centers.columns
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, polar=True)for i in range(len(centers)):values = centers.iloc[i].values.flatten().tolist()values += values[:1]ax.plot(angles, values, linewidth=1, label=f'Cluster {i}')ax.fill(angles, values, alpha=0.1)ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
plt.legend(loc='upper right')
plt.title("Cluster Profiles (Radar Chart)")
plt.show()

2.2 类别型特征分析

频数统计
# 添加聚类标签到原始数据
data['cluster'] = labels# 分类变量分析
for col in categorical_cols:cross_tab = pd.crosstab(data['cluster'], data[col], normalize='index')cross_tab.plot(kind='bar', stacked=True, figsize=(10,4))plt.title(f"Distribution of {col} by Cluster")plt.ylabel("Proportion")plt.show()
卡方检验
from scipy.stats import chi2_contingencyfor col in categorical_cols:contingency_table = pd.crosstab(data['cluster'], data[col])chi2, p, _, _ = chi2_contingency(contingency_table)print(f"{col}: χ²={chi2:.1f}, p={p:.3f}")

三、簇类型推断技术

3.1 基于统计特征的推断

关键指标计算
cluster_stats = data.groupby('cluster').agg({'age': ['mean', 'std'],'income': ['median', 'min', 'max'],'purchase_frequency': 'mean'
})# 标准化比较
normalized_stats = cluster_stats.apply(lambda x: (x - x.mean()) / x.std(), axis=0
)
特征重要性排序
# 计算簇间差异最大的特征
feature_importance = {}
for col in numeric_cols:f_val, p_val = f_oneway(*[data[data['cluster']==i][col] for i in range(n_clusters)])feature_importance[col] = f_valsorted_features = sorted(feature_importance.items(), key=lambda x: -x[1])

3.2 基于业务规则的标签分配

业务规则示例(电商场景)
def assign_cluster_label(row):if row['recency'] > 30 and row['frequency'] < 2:return '流失风险客户'elif row['monetary'] > 500 and row['frequency'] > 5:return '高价值客户'else:return '普通客户'data['cluster_label'] = data.apply(assign_cluster_label, axis=1)

3.3 自动化标签生成(NLP技术)

使用TF-IDF生成标签
from sklearn.feature_extraction.text import TfidfVectorizer# 假设有文本型特征
tfidf = TfidfVectorizer(max_features=50)
tfidf_matrix = tfidf.fit_transform(data['text_feature'])# 聚合每个簇的关键词
for i in range(n_clusters):cluster_tfidf = tfidf_matrix[labels==i].mean(axis=0)top_words_idx = cluster_tfidf.argsort()[0,-3:][::-1]top_words = [tfidf.get_feature_names_out()[i] for i in top_words_idx]print(f"Cluster {i} 关键词:", ", ".join(top_words))

四、验证与优化方法

4.1 簇稳定性检验

重采样验证
from sklearn.utils import resamplestability_scores = []
for _ in range(10):# 重采样X_sample = resample(X, random_state=42)# 重新聚类kmeans_sample = KMeans(n_clusters=3).fit(X_sample)# 计算相似度(使用调整兰德指数)ari = adjusted_rand_score(labels, kmeans_sample.labels_)stability_scores.append(ari)print(f"平均稳定性得分: {np.mean(stability_scores):.3f}")

4.2 业务合理性验证

专家评估表设计
簇ID主要特征假设类型业务合理性(1-5)备注
0高收入低频潜在VIP4需激活消费频率
1低收入高频价格敏感5适合促销活动

五、实战案例:客户分群分析

5.1 RFM模型聚类

# 计算RFM指标
recency = (current_date - purchase_dates).dt.days
frequency = purchase_history.groupby('customer_id').size()
monetary = purchase_history.groupby('customer_id')['amount'].sum()# 标准化
rfm = pd.DataFrame({'Recency': recency, 'Frequency': frequency, 'Monetary': monetary})
rfm_scaled = StandardScaler().fit_transform(rfm)# 聚类
kmeans = KMeans(n_clusters=5)
rfm['cluster'] = kmeans.fit_predict(rfm_scaled)

5.2 簇类型定义

RecencyFrequencyMonetary类型标签营销策略
0低(新近)冠军客户专属服务/高端推荐
1高(久远)流失客户唤醒优惠/问卷调查
2潜力客户交叉销售/忠诚计划

六、常见问题解决方案

6.1 簇难以解释的情况

解决方案

  1. 尝试不同聚类算法(如DBSCAN可能发现密度簇)

  2. 增加/减少簇数量

  3. 使用特征选择技术去除噪声特征

  4. 尝试不同的特征组合或衍生新特征

6.2 混合型数据处理

处理流程

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder# 数值型和类别型分别处理
preprocessor = ColumnTransformer(transformers=[('num', StandardScaler(), numeric_cols),('cat', OneHotEncoder(), categorical_cols)])# 构建聚类流水线
cluster_pipe = Pipeline([('preprocess', preprocessor),('cluster', KMeans(n_clusters=3))
])

作业:接续 day17 内容

接续 DAY17 的内容, 对 kmeans 聚类后的簇类型进行分析:

x1= X.drop('KMeans_Cluster',axis=1) # 删除聚类标签列
y1 = X['KMeans_Cluster']
# 构建随机森林,用shap重要性来筛选重要性
import shap
import numpy as np
from sklearn.ensemble import RandomForestClassifier  # 随机森林分类器
model = RandomForestClassifier(n_estimators=100, random_state=42)  # 随机森林模型
model.fit(x1, y1)  # 训练模型,此时无需在意准确率 直接全部数据用来训练了
shap.initjs()# 初始化 SHAP 解释器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(x1) # 这个计算耗时
shap_values.shape # 第一维是样本数,第二维是特征数,第三维是类别数

SHAP 特征重要性条形图,挑选出最重要的四个特征进行分析 

# --- 1. SHAP 特征重要性条形图 (Summary Plot - Bar) ---
print("--- 1. SHAP 特征重要性条形图 ---")
shap.summary_plot(shap_values[:, :, 0], x1, plot_type="bar",show=False)  #  这里的show=False表示不直接显示图形,这样可以继续用plt来修改元素,不然就直接输出了
plt.title("SHAP Feature Importance (Bar Plot)")
plt.show()

 

 判断一下这几个特征是离散型还是连续型:

# 此时判断一下这几个特征是离散型还是连续型
import pandas as pd
selected_features = [ 'slope','sex',  'target', 'thalach']for feature in selected_features:unique_count = X[feature].nunique() # 唯一值指的是在某一列或某个特征中,不重复出现的值# 连续型变量通常有很多唯一值,而离散型变量的唯一值较少print(f'{feature} 的唯一值数量: {unique_count}')if unique_count < 10:  # 这里 10 是一个经验阈值,可以根据实际情况调整print(f'{feature} 可能是离散型变量')else:print(f'{feature} 可能是连续型变量')

总样本中的前四个重要性的特征分布图 

# X["Purpose_debt consolidation"].value_counts() # 统计每个唯一值的出现次数
import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

 

# 绘制出每个簇对应的这四个特征的分布图
X[['KMeans_Cluster']].value_counts()

查看簇数 

 

# 分别筛选出每个簇的数据
X_cluster0 = X[X['KMeans_Cluster'] == 0]
X_cluster1 = X[X['KMeans_Cluster'] == 1]
X_cluster2 = X[X['KMeans_Cluster'] == 2]
X_cluster3 = X[X['KMeans_Cluster'] == 3]
X_cluster4 = X[X['KMeans_Cluster'] == 4]
X_cluster5 = X[X['KMeans_Cluster'] == 5]

 绘制簇0的分布图

# 先绘制簇0的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster0[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

绘制簇1的分布图

# 绘制簇1的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster1[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

 绘制簇2的分布图

# 先绘制簇2的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster2[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

 绘制簇3的分布图

# 先绘制簇3的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster3[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

 绘制簇4的分布图

# 先绘制簇4的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster4[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

 绘制簇5的分布图

# 先绘制簇5的分布图import matplotlib.pyplot as plt# 总样本中的前四个重要性的特征分布图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X_cluster5[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

6个簇的总结与定义

5簇的含义

该簇代表高风险心脏病患者群体,典型特征为:

  • 男性为主,心电图ST段斜率异常,确诊心脏病比例极高。

  • 可能伴随心率异常(如运动耐受性差),需进一步临床干预。

4簇的含义

该簇代表低风险或健康人群,典型特征为:

  • 女性为主,心电图ST段斜率正常,未确诊心脏病。

  • 心率可能正常,无显著心脏疾病风险。

3簇类型推断:中等风险疑似病例

该簇很可能代表:

  • 具有部分心脏病风险因素但未明确诊断的人群

  • 或已确诊但症状较轻的心脏病患者

2推断簇的类型

  • 健康男性簇:该簇主要由男性组成,且大多数为非心脏病患者。甲状腺体积在120-160之间,斜率特征在1.0和2.0附近有两个主要的集中区域。

       该簇的含义可以总结为:

  • 健康男性:该簇中的样本主要是健康的男性,甲状腺体积在正常范围内,斜率特征在1.0和2.0附近有两个主要的集中区域。

  • 非心脏病患者:该簇中的样本大多数为非心脏病患者,表明这些特征组合与心脏病的发生没有显著关联。

1 推断簇的类型

根据上述特征分布,我们可以推断该簇的类型如下:

  • 心脏病女性簇:该簇主要由女性组成,且大多数为心脏病患者。甲状腺体积在140-180之间,斜率特征在1.0和2.0附近有两个主要的集中区域。

    该簇的含义可以总结为:

  • 心脏病女性:该簇中的样本主要是心脏病女性,甲状腺体积在140-180之间,斜率特征在1.0和2.0附近有两个主要的集中区域。

  • 心脏病患者:该簇中的样本大多数为心脏病患者,表明这些特征组合与心脏病的发生有显著关联。

0推断簇的类型

根据上述特征分布,我们可以推断该簇的类型如下:

  • 健康男性簇:该簇主要由男性组成,且大多数为非心脏病患者。甲状腺体积在120-150之间,斜率特征主要集中在1.0附近。

     该簇的含义可以总结为:

  • 健康男性:该簇中的样本主要是健康的男性,甲状腺体积在120-150之间,斜率特征主要集中在1.0附近。

  • 非心脏病患者:该簇中的样本大多数为非心脏病患者,表明这些特征组合与心脏病的发生没有显著关联。

@浙大疏锦行


http://www.hkcw.cn/article/ZjwVjnANjR.shtml

相关文章

【RocketMQ 生产者和消费者】- 生产者发送同步、异步、单向消息源码分析(2)

文章目录 1. 前言2. InvokeCallback#operationComplete3. onExceptionImpl 异常处理4. 定时任务扫描 responseTable5. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 【RocketMQ】- 源码系列目录【RocketMQ 生产者消费者】- 同步、异步、单向发送消费消息【RocketMQ 生产者和消费者…

【大模型DA】Unified Language-driven Zero-shot Domain Adaptation

Motivation 本文动机在于解决现有方法对 domain-ID 和多模型的依赖问题&#xff0c;提出一个更实用、更通用的新设定 ULDA&#xff0c;使模型仅通过语言描述就能在不访问目标图像的前提下一次性适应多个未知目标域 这篇文章的方法部分提出了一个统一框架来解决Unified Language…

Tomcat 线程模型详解性能调优

1. Tomcat I/O模型详解**&#xff08;了解&#xff09;** 1.1 Linux I/O模型详解 I/O要解决什么问题 I/O&#xff1a;在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令&#xff0c;数据从外部设备拷贝至内存需要一段时间&#xff0c;这段时间CPU就…

Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory

文章目录 摘要Abstract1. 引言2. Mem03. graph-based Mem0参考总结 摘要 Mem0是一种针对AI智能体的长时记忆架构&#xff0c;旨在解决大型语言模型固定上下文窗口导致的跨会话连贯性问题。其基础版本采用两阶段处理范式&#xff1a;提取阶段通过结合对话摘要、近期消息序列和新…

C++构造函数详解:从基础到高级

文章目录 1. 摘要2. 默认构造函数3. 无参构造函数4. 带参构造函数5. 拷贝构造函数6. 移动构造函数 (C11)7. 委托构造函数 (C11)8. 转换构造函数9. 默认拷贝构造函数10. 总结 1. 摘要 构造函数是C类的重要组成部分&#xff0c;负责对象的初始化工作。本文将详细讲解8种构造函数…

day16 leetcode-hot100-32(链表11)

138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.哈希表 思路 第一次遍历创建新节点并将原节点与新节点同时放入哈希表中 第二次遍历为新节点加入next与random 具体代码 /* // Definition for a Node. class Node {int val;Node next;Node random;public N…

52. N-Queens II

题目描述 52. N-Queens II 回溯法 这道题与第51题是一样的。51. N-Queens-CSDN博客 class Solution {int columns; //从低位到高位起算&#xff0c;第i位为0表示棋盘第i列可以放置皇后&#xff0c;第i位为1表示棋盘第i列不能放置皇后//边长为n的棋盘分别有2n-1条正斜线和反…

关于adb devices无法找到设备:error: device not found 的解决办法

一、此类问题出现的原因&#xff0c;一般是设备所使用的端口被占用&#xff0c;需要找到被占用的端口。 二、操作步骤 1、打开命令窗口。 2、输入adb shell 会发现提示error:device not found&#xff01; 3、输入adb kill-server ,然后启动adb start-server 4、输入 net…

关于不同平台微信多开的解决方案(WIN/MAC/IOS/Andriod)

日常生活跟工作中需要用到多开微信&#xff0c;本次分享下在不同平台上解决微信多开的方法。这些方法我都用了超过1年以上&#xff0c;都比较稳定。中间遇到的一些问题我也有说明&#xff0c;包括每个方法的优缺点&#xff0c;每个平台的操作等。 先说下我自己体验下来的结论&a…

Flutter项目兼容鸿蒙Next系统

一、环境搭建&#xff1a; 1.1 下载鸿蒙DevEco Studio开发工具。 下载地址&#xff1a;下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 下载之前需要先登录&#xff0c;后面的模拟器创建还要开发者验证、审核啥的&#xff0c;好在审核进度还可以&am…

无需密码强制移除Apple ID 工具! iOS 11.3以下可用 ipad和iphone通用!还不快快收藏起来

无需密码强制移除Apple ID 工具&#xff01; iOS 11.3以下可用 ipad和iphone通用&#xff01;还不快快收藏起来 ✅ 支持的设备范围注意事项使用方法如何下载&#xff1f; 很多朋友在不再使用某个Apple 帐户或是转卖旧的iPhone&#xff0c;为了防止 ID 被盗导致个人信息泄露&…

Mac 散热救星:Macs Fan Control,让你的苹果电脑“冷静”又安静!

各位果粉们&#xff0c;是不是经常遇到这样的烦恼&#xff1a;用着用着电脑&#xff0c;突然就发热卡顿&#xff0c;风扇狂转噪音大得跟拖拉机似的&#xff1f;别担心&#xff0c;今天给大家安利一款超实用的软件 —— Macs Fan Control&#xff0c;它可是让苹果电脑“冷静”又…

mac 安装idea,碰到“已损坏,无法打开,您应该推出磁盘映像”的解决办法

1.打开终端&#xff0c;先输入如下命令&#xff0c;之后回车操作&#xff0c;碰到输入密码时&#xff0c;正常输入密码即可 sudo spctl --master-disable 2.打开系统设置-安全与隐私性-找到‘允许以下来源的应用程序’ &#xff0c;更改为任何来源&#xff0c;碰到输入密码时&…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的作用 二、ClusterIP类型 1、ClusterIP 类型的特点和用途 2、ClusterIP 的工作机制 3、…

Android studio 模拟器运行时弹窗显示The emulator process for AVD 模拟器的名字 has terminated 的解决方法

Android studio 问题解决方案 一&#xff1a;.运行模拟器报错展示二.解决步骤第一步:找到.android的文件夹第二步&#xff1a;剪切该文件到SDK的下载路径第三步&#xff1a;点开该文件第四步&#xff1a;找到配置文件第五步&#xff1a;编辑配置文件 三&#xff1a;设置环境变量…

Android Studio快速配置国内镜像源和HTTP代理

最近开始学习Android Studio开发&#xff0c;发现老是连接超时&#xff0c;下面配置下国内镜像源和HTTP代理&#xff0c;而且通过尝试发现最快下载速度方法 一.配置 SDK 镜像源 打开 Android Studio。 进入 File > Settings 然后点击 System Settings,点击 Android SDK。 …

mac/Windows安装python+pycharm【小白操作】

macOS通常自带Python&#xff0c;但建议安装最新版本的Python。你可以通过Homebrew来安装Python。 方法一&#xff1a;通过Homebrew安装Python 安装Homebrew&#xff08;如果尚未安装&#xff09;&#xff1a; 打开终端&#xff0c;输入以下命令并按回车&#xff1a; /bin/bas…

Mac电脑安装Postman教程

Postman 是一款非常常用的 API 调试工具&#xff0c;支持接口测试、自动化测试等功能&#xff0c;本文将分享在 Mac 电脑上安装 Postman 的完整步骤。 1. 下载 Postman 安装包 方法一&#xff1a;官网下载 打开 Postman 官方网站&#xff1a;https://www.postman.com/downlo…

MySQL连接报错处理:1130-host ... is not allowed to connect to this MySql server

在MySQL安装完成后&#xff0c;很多开发者会遇到这样一个问题&#xff1a; 错误代码 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 这个错误通常出现在你尝试通过远程工具&#xff08;如 Navicat、DBeaver 等&#xff09;连接 MySQL …

五、单元测试-概述入门

目录 main方法测试缺点&#xff1a; 在pom.xm中&#xff0c;引入junit的依赖。,在test/java目录下&#xff0c;创建测试类&#xff0c;并编写对应的测试方法&#xff0c;并在方法上声明test注解。 练习&#xff1a;验证身份证合法性 测试成功 测试失败 main方法测试缺点&am…