商业数据分析--中医辨证

姜智浩 Lv5

声明

本文代码均保存在
https://github.com/super-213/business_data_analysis
有需要的可以自行下载

查看数据

1
2
df = pd.read_excel('中医辨证.xlsx')
df.head()
病人编号 病人症状
1 消化不良,便秘
2 心悸,失眠
3 腰疼,脱发,眼干
4 腹胀,便秘,哮喘,胸闷气短,消化不良
5 神经衰弱,失眠,月经不调

数据处理

1
2
3
transactions = []
for i in df['病人症状'].tolist():
transactions.append(i.split(','))

Apriori

原理

Apriori 基于向下封闭原则

如果一个项集是频繁的,那么它的所有子集也一定是频繁的
如果一个项集不是频繁的,那么它的所有超集也不可能频繁

我们先找出每个单个症状出现的频率
然后只保留出现频率高(支持度高)的症状
再用它们组合成双项、三项……,逐步扩展
并在每次扩展时剪枝,减少不可能频繁的组合

代码

1
2
3
4
5
6
7
8
for i in results:  # 遍历results中的每一个频繁项集
for j in i.ordered_statistics: # 获取频繁项集中的关联规则
X = j.items_base # 关联规则的前件
Y = j.items_add # 关联规则的后件
x = ', '.join([item for item in X]) # 连接前件中的元素
y = ', '.join([item for item in Y]) # 连接后件中的元素
if x != '': # 防止出现关联规则前件为空的情况
print(x + ' -> ' + y) # 通过字符串拼接的方式更好呈现结果

FP-Growth

原理

Apriori 的问题是“候选项集太多”,计算量指数级增加。
FP-Growth 采用 压缩存储 和 模式增长 思想:

  1. 把所有样本转成一棵频繁模式树(FP-Tree),只存出现次数;
  2. 然后从树结构中“挖”出所有频繁项集,而不用穷举所有组合。

这样可以极大提升效率,尤其在上千条病例时,FP-Growth 比 Apriori 快 10~100 倍。

代码

1
2
3
4
5
6
7
from mlxtend.frequent_patterns import apriori, fpgrowth, association_rules

freq_fp = fpgrowth(df_hot, min_support=0.05, use_colnames=True)
rules_fp = association_rules(freq_fp, metric="confidence", min_threshold=0.6)
rules_fp.sort_values(by='lift', ascending=False, inplace=True)

rules_fp.head()
antecedents consequents antecedent support consequent support support confidence lift representativity leverage conviction zhangs_metric jaccard certainty kulczynski
(腹胀, 消化不良) (便秘) 0.076 0.184 0.076 1.000000 5.434783 1.0 0.062016 inf 0.883117 0.413043 1.000000 0.706522
(腹胀) (便秘, 消化不良) 0.092 0.160 0.076 0.826087 5.163043 1.0 0.061280 4.830000 0.888013 0.431818 0.792961 0.650543
(胸闷气短) (哮喘) 0.140 0.124 0.088 0.628571 5.069124 1.0 0.070640 2.3

Word2Vec

原理

Word2Vec 是一种词嵌入模型(embedding),最初用于自然语言处理。
思想非常简单:
如果两个词经常出现在相同的上下文中,它们的意义就可能相似。
这就是分布式语义假设(Distributional Hypothesis)。

模型通过两种方式学习:

CBOW(Continuous Bag of Words):用周围词预测中间词;
Skip-gram:用当前词预测周围词

训练后,每个词(症状)都会得到一个向量表示
向量之间的余弦相似度代表症状的语义相似度

如果我们把每个病例当作一句话,症状当作词语,Word2Vec 就能学出“哪些症状经常一起出现”的语义模式

例如模型可能学出

头痛 与 眩晕 相似度高(0.89)
咳嗽 与 咽干 相似度高(0.84)

说明它们经常一起出现,甚至可以作为同一证候的表现。

这种方法从连续分布的角度理解“症状间的语义接近度”,
比 Apriori 的硬规则更柔和、能度量相似强度。

代码

1
2
3
4
model = Word2Vec(sentences=transactions, vector_size=50, window=3, min_count=1, sg=1)
symptom = all_symptoms[0]
print(f"与『{symptom}』最相似的症状:")
print(model.wv.most_similar(symptom, topn=5))

与『便秘』最相似的症状:
[(‘哮喘’, 0.32900574803352356), (‘神经衰弱’, 0.30445194244384766), (‘腰疼’, 0.29307475686073303), (‘心悸’, 0.29051631689071655), (‘失眠’, 0.2569029927253723)]

K-Means

原理

K-Means 是一种经典的无监督学习算法。
它的目标是:把样本自动分成 k 个簇,使得同一簇内部相似度高、不同簇之间差异大。

算法步骤:

  1. 随机选 k 个初始中心;
  2. 把每个样本分配到距离最近的中心;
  3. 重新计算各簇的中心;
  4. 重复直到收敛。

数学目标

在中医理论中,不同病人虽然症状各异,但可以归为几种“证型”:

气滞血瘀型
湿热内蕴型
阴虚火旺型
……

KMeans 可以把患者按照症状向量(One-Hot 形式)聚类,
从而自动分出潜在的证型群体。
之后可以观察每类群体中最常见的症状组合,就能从数据中“还原证候分类”。

代码

1
2
3
4
5
6
7
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=4, random_state=42)
labels = kmeans.fit_predict(df_hot)
df['聚类标签'] = labels

df.head()

PCA

原理

PCA(Principal Component Analysis)是一种降维算法,
通过线性变换找到数据中最主要的变化方向(主成分)。
核心思想:
找一组正交方向,使得投影后样本的方差最大。

换句话说:
它用尽量少的维度(通常 2~3 个)去保留最多的信息。

症状矩阵维度非常高(每个症状一列),
直接观察不方便。
PCA 可以把这些高维数据投影到二维平面,
让我们直观地看到:
• 不同患者在症状空间中的分布;
• 不同聚类(证型)之间是否分离清晰;
• 哪些症状是主要的区分因素(主成分载荷高的症状)。

这样医生或研究者可以快速识别:

“这群患者的症状模式相似、可能属于同一证型。”

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
all_symptoms = sorted(list(set(sum(transactions, []))))
df_hot = pd.DataFrame([[1 if s in t else 0 for s in all_symptoms] for t in transactions],
columns=all_symptoms)


from sklearn.decomposition import PCA

pca = PCA(n_components=2)
reduced_data = pca.fit_transform(df_hot)
plt.figure(figsize=(7,6))
plt.scatter(reduced_data[:,0], reduced_data[:,1], c=labels, cmap='rainbow', s=30)
plt.title("患者症状分布图")
plt.xlabel("主成分1")
plt.ylabel("主成分2")
plt.show()

photo

  • Title: 商业数据分析--中医辨证
  • Author: 姜智浩
  • Created at : 2025-10-09 11:45:14
  • Updated at : 2025-10-09 12:20:44
  • Link: https://super-213.github.io/zhihaojiang.github.io/2025/10/09/20251009商业数据分析--中医辨证/
  • License: This work is licensed under CC BY-NC-SA 4.0.