K均值聚类与Apriori应用探索中医证素数据分析

随着数据科学在医学领域的逐步渗透,如何通过大数据分析为中医诊疗提供理论支持和实践指导,成为了一个重要课题。中医证素数据作为一个复杂的多维数据集合,涵盖了大量的疾病信息和患者特征,其潜在的关联关系对于中医证型的研究和个性化治疗具有重要价值。

本文将结合K均值聚类与Apriori算法,介绍如何分析中医证素数据,挖掘潜在的证型关联规则。通过数据预处理、聚类分析以及关联规则的计算,本文展示了一种系统化的数据分析方法,旨在帮助学者和实践者更好地理解和利用中医证素数据。

文章目录

案例概述

本案例展示了如何使用Apriori算法和K均值聚类算法来分析中医证素数据。数据通过K均值聚类进行预处理,接着通过Apriori算法挖掘关联规则,最后得到关于不同证型的统计信息与预测指标。该过程分为数据预处理、数据转换以及关联规则计算三个主要步骤,分别应用了聚类分析和关联规则算法来帮助进一步理解和处理复杂的中医证素数据。整个过程不仅涉及聚类分析的实现,还涵盖了Apriori算法用于发现证型之间潜在关联的应用,旨在为中医证素的分析与实践提供一种系统化的计算方法。

模块名称 内容简介 所需技能 数据类型 应用场景
案例概述 本案例展示了如何结合K均值聚类与Apriori算法分析中医证素数据。 聚类分析,关联规则挖掘 Excel表格 中医数据分析,数据预处理
案例目标 通过K均值聚类分析证素数据,结合Apriori算法挖掘潜在的关联规则。 K均值聚类,Apriori算法,数据处理 结构化数据 证素分析,数据建模与预测
评价指标 使用支持度、置信度等指标评估关联规则的效果。 数据分析,模型评估 数值型数据 关联规则挖掘,模型验证
业务意义 通过对证素数据的分析,可以更好地理解不同证型之间的关联关系。 业务分析,数据驱动决策 分类数据 中医证型分析,个性化诊疗

在该案例中通过K均值聚类分析,数据集中的证型被细分为不同的类别,以便更清晰地理解和预测不同证型的特征。每个类别的聚类中心和类别数目提供了对数据的基本认识。通过应用Apriori算法进行关联规则挖掘,数据被转化为0-1矩阵,进而发现了不同证型间的潜在关系,这些关系可用于进一步的分析与决策支持。这些步骤的结合不仅实现了对数据的全面处理,也为中医领域的数据驱动决策提供了科学依据。

数据详解

本次竞赛涉及的两个数据集提供了关于不同病症类型和临床表现的数据。第一个数据集包含了多种病症类型的系数,用以描述疾病的不同表现和强度。第二个数据集(Excel格式)包括了相关的病程、转移部位和TNM分期等信息,进一步丰富了病情分析的维度。通过结合这些数据,可以进行多方面的临床分析,如疾病的分期、转移情况与不同病症类型系数之间的关系。数据分析有助于揭示不同变量之间的潜在模式,助力对疾病的更深层次理解。

apriori.csv数据集

字段名称 类型/范围 描述信息
肝气郁结证型系数 类别型 描述肝气郁结症状的强度系数。
热毒蕴结证型系数 类别型 描述热毒蕴结症状的强度系数。
冲任失调证型系数 类别型 描述冲任失调症状的强度系数。
气血两虚证型系数 类别型 描述气血两虚症状的强度系数。
脾胃虚弱证型系数 类别型 描述脾胃虚弱症状的强度系数。
肝肾阴虚证型系数 类别型 描述肝肾阴虚症状的强度系数。
TNM分期 类别型 表示疾病的分期情况,可能采用TNM分期系统(如H4)。

data.xlsx

字段名称 类型/范围 描述信息
肝气郁结证型系数 数值型 描述肝气郁结症状的强度系数。
热毒蕴结证型系数 数值型 描述热毒蕴结症状的强度系数。
冲任失调证型系数 数值型 描述冲任失调症状的强度系数。
气血两虚证型系数 数值型 描述气血两虚症状的强度系数。
脾胃虚弱证型系数 数值型 描述脾胃虚弱症状的强度系数。
肝肾阴虚证型系数 数值型 描述肝肾阴虚症状的强度系数。
病程阶段 类别型 表示疾病的不同阶段(如S4)。
TNM分期 类别型 表示疾病的分期情况(如H4)。
转移部位 类别型 疾病是否转移及转移部位(如R1, R2)。
确诊后几年发现转移 类别型 描述确诊后几年内是否发现转移(如J1, J2)。

这些表格提供了有关疾病症状、分期和转移的详细数据,能够为分析不同病症的影响因素提供依据。通过对这些字段进行交叉分析,能够深入挖掘疾病的演变过程及其相关因素,从而为临床决策提供支持。这些数据的整合和分析,能够帮助研究者识别疾病与其他临床因素之间的潜在关联性,为医疗行业的进一步发展和治疗方案的优化提供支持。

案例分析

apriori_new

该代码主要实现了一个寻找关联规则的算法,目的是从给定的数据中通过支持度(support)和置信度(confidence)来挖掘频繁项集和关联规则。关联规则通常用于发现数据项之间的潜在关系,例如,市场篮子分析中找出哪些商品常常一起被购买。函数 connect_string 用于通过某种分隔符(默认为 '--')将输入的字符串进行连接处理,生成一个二项集。这是为了寻找项集之间的关系,特定的规则逻辑判断项集之间是否应该连接。find_rule 函数则是用来实际计算和筛选出满足用户输入支持度和置信度阈值的关联规则。

connect_string 函数

该函数接收两个参数:x 是一个字符串列表,ms 是分隔符(默认为 '--')。此函数的目的是生成一个二项集,判断相同前缀的项集是否可以合并。具体做法是,首先将字符串按分隔符 ms 拆分并排序,然后通过两两比较判断哪些项集符合特定的条件(如字母和数字不同,但其前缀相同),并将符合条件的项集连接成新的项集。

python 复制代码
def connect_string(x, ms):
    x = list(map(lambda i: sorted(i.split(ms)), x))  # 将每个项集按分隔符拆分并排序
    l = len(x[0])  # 获取拆分后的项集的长度
    r = []  # 用来存储最终的二项集
    for i in range(len(x)):
        for j in range(i, len(x)):  # 两两比较项集
            if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:  # 判断是否为可连接的项集
                r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))  # 合并项集
    return r

find_rule 函数

该函数是进行关联规则挖掘的主要函数。它的输入参数包括 d(数据集),support(支持度阈值),confidence(置信度阈值)和 ms(分隔符,默认为 '--')。其核心思想是通过反复迭代来计算支持度和置信度,生成频繁项集并过滤出符合条件的关联规则。计算每个项集的支持度,并根据支持度进行初步筛选。然后,通过 connect_string 函数生成更大规模的候选项集,并计算新的支持度,重复这个过程直到无法生成更多的频繁项集。接着,对于每个候选规则,计算其置信度,并根据设定的置信度阈值进行筛选。

python 复制代码
def find_rule(d, support, confidence, ms=u'--'):
    result = pd.DataFrame(index=['support', 'confidence'])  # 定义结果存储结构

    support_series = 1.0 * d.sum() / len(d)  # 计算每个项集的支持度
    column = list(support_series[support_series > support].index)  # 根据支持度筛选项集

    k = 0
    while len(column) > 1:  # 迭代直到没有更多的频繁项集
        k = k + 1
        print(u'\n正在进行第%s次搜索...' % k)
        column = connect_string(column, ms)  # 使用 connect_string 生成新的候选项集
        print(u'数目:%s...' % len(column))
        sf = lambda i: d[i].prod(axis=1, numeric_only=True)  # 定义计算支持度的函数

        # 计算新一轮支持度
        d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i) for i in column]).T
        support_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d)
        column = list(support_series_2[support_series_2 > support].index)  # 筛选支持度符合条件的项集
        support_series = support_series.append(support_series_2)
        
        # 生成所有可能的推理规则
        column2 = []
        for i in column:
            i = i.split(ms)
            for j in range(len(i)):
                column2.append(i[:j] + i[j + 1:] + i[j:j + 1])

        cofidence_series = pd.Series(index=[ms.join(i) for i in column2])  # 定义置信度序列

        # 计算每个候选规则的置信度
        for i in column2:
            cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))] / support_series[ms.join(i[:len(i) - 1])]

        # 筛选符合置信度条件的规则
        for i in cofidence_series[cofidence_series > confidence].index:
            result[i] = 0.0
            result[i]['confidence'] = cofidence_series[i]
            result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]

    # 根据置信度和支持度排序输出最终的关联规则
    result = result.T.sort_values(by=['confidence', 'support'], ascending=False)
    return result

该代码实现了关联规则挖掘中的核心过程,首先计算项集的支持度,然后生成候选项集,计算新的支持度和置信度,最终筛选出符合阈值的关联规则。通过反复迭代和筛选,逐步构建出符合条件的频繁项集及其关联规则。对于自学编程的开发者,这段代码展示了如何通过 Python 和 pandas 库实现关联规则挖掘算法,尤其是在处理大数据时如何有效地筛选和计算支持度、置信度等重要指标。

apriori_tcm

该代码实现了一个中医证素分析的流程,主要包括数据的聚类、转换和关联规则的计算三个步骤。代码首先通过K均值聚类对数据进行聚类处理,然后将聚类结果进行转换,最后使用Apriori算法计算并输出关联规则。

在数据预处理方面,代码从Excel文件中读取数据,并通过KMeans算法对每个特征进行聚类,得到每个特征的聚类中心及类别分布。接下来,通过计算各类别的划分边界和对应的类别信息,将数据转化为适合后续分析的格式。然后,利用Apriori算法计算关联规则,主要通过支持度和置信度两个指标来筛选有效的关联规则,最终输出符合条件的关联规则。

聚类数据处理

在这个部分,代码使用了K均值聚类算法(KMeans)对数据进行聚类分析。首先从Excel文件读取数据,并选择用于聚类的特征列。对于每个特征列,进行K均值聚类,得出聚类中心和每个类别的数量。聚类过程包括对每个特征进行滚动均值计算,并将数据整理后保存到结果文件中。

python 复制代码
import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法

if __name__=='__main__':
    data = pd.read_excel("data/data.xlsx")  # 读取数据
    keys = data.columns[:-4]
    k = 5
    result = pd.DataFrame()
    for i in range(len(keys)):
        print(u'正在进行"%s"的聚类...' % keys[i])
        kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好
        kmodel.fit(data[[keys[i]]].as_matrix()) #训练模型
        r1 = pd.DataFrame(kmodel.cluster_centers_, columns = [keys[i]]) #聚类中心
        r2 = pd.Series(kmodel.labels_).value_counts() #分类统计
        r2 = pd.DataFrame(r2, columns = [keys[i]+'n']) #转为DataFrame,记录各个类别的数目
        r = pd.concat([r1, r2], axis = 1).sort_values(keys[i]) #匹配聚类中心和类别数目
        r.index = [1, 2, 3, 4, 5]
        r[keys[i]] = r[keys[i]].rolling(2).mean()  # 滚动计算两个聚类中心均值
        r[keys[i]][1] = 0.0 #这两句代码将原来的聚类中心改为边界点。
        result = result.append(r.T)
    result.to_excel("result/result.xlsx")

2数据转换与构建模型

代码将聚类结果进行转换,并为后续关联规则挖掘准备数据。通过根据每个聚类中心的值来划分数据,并将其转换成0-1矩阵,便于后续的模型训练。此时,数据已经被转换成适合建模的格式,并输出为CSV文件。

python 复制代码
strabc = pd.DataFrame()
for i in range(len(keys)):
    strabcd = [keys[i] + '%s' % (j + 1) for j in range(k)]
    strabcd = pd.DataFrame(strabcd, columns=[keys[i]])  # columns=[values[i]],columns须是list,要转化加[],[values[]]
    strabc = strabc.append(strabcd.T)
data_ = data[[keys[i] for i in range(len(keys))]]  # 提取要建模的各证型
result_ = result.iloc[::2, :]
result_count = result.iloc[1::2, :]
data_new = pd.DataFrame()
for i in range(len(result_)):
    index1 = data[keys[i]] < result_.iloc[i, 1]
    index2 = (result_.iloc[i, 1] < data[keys[i]]) & (data[keys[i]] < result_.iloc[i, 2])
    index3 = (result_.iloc[i, 2] < data[keys[i]]) & (data[keys[i]] < result_.iloc[i, 3])
    index4 = result_.iloc[i, 3] < data[keys[i]]
    data_n = index1.copy()
    data_n[index1 == True] = strabc.iloc[i, 0]
    data_n[index2 == True] = strabc.iloc[i, 1]
    data_n[index3 == True] = strabc.iloc[i, 2]
    data_n[index4 == True] = strabc.iloc[i, 3]
    data_new = pd.concat([data_new, data_n], axis=1)
data_model = pd.concat([data_new, data['TNM分期']], axis=1)
data_model.to_csv("data/apriori.csv")

关联规则计算

在这部分,代码首先将数据转换成0-1矩阵,然后使用Apriori算法计算数据之间的关联规则。通过设定最小支持度和最小置信度来筛选有效的关联规则,并将结果输出。最终,输出的关联规则是符合设定的支持度和置信度阈值的频繁项集。

python 复制代码
import pandas as pd
from apriori_new import * #导入自行编写的apriori函数
import time #导入时间库用来计算用时

inputfile = 'data/apriori.csv' #输入事务集文件
data = pd.read_csv(inputfile, header=None, dtype = object)

start = time.clock() #计时开始
print(u'\n转换原始数据至0-1矩阵...')
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行
data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充
end = time.clock() #计时结束
print(u'\n转换完毕,用时:%0.2f秒' %(end-start))
del b #删除中间变量b,节省内存

support = 0.06 #最小支持度
confidence = 0.75 #最小置信度
ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符

start = time.clock() #计时开始
print(u'\n开始搜索关联规则...')
print(find_rule(data, support, confidence, ms))
end = time.clock() #计时结束
print(u'\n搜索完成,用时:%0.2f秒' %(end-start))

该代码展示了一个完整的数据分析流程,包括数据聚类、转换和关联规则的计算。通过K均值聚类对数据进行处理,生成聚类中心并转换为适合建模的数据格式,随后通过Apriori算法计算并筛选关联规则。这个过程适用于中医证素数据的分析,能够揭示不同证型之间的潜在关联和规律。

总结

中医证素数据的分析为探索疾病的多维特征提供了丰富的信息。通过结合K均值聚类和Apriori算法,能够从复杂的数据中提取有价值的模式,尤其是在中医证型的分类和疾病的关联规则挖掘中表现出强大的应用潜力。K均值聚类帮助细化不同证型的特征,而Apriori算法则揭示了证型之间的潜在关联,为数据驱动的临床决策提供了有力支持。

未来的研究可以进一步加强算法在高维复杂数据上的应用,尤其是在动态数据处理、实时监控和个性化诊疗方案的制定方面。通过持续优化算法性能和扩展其应用场景,数据分析将在中医学领域起到越来越重要的作用。

相关推荐
用户Taobaoapi20145 小时前
淘宝店铺所有商品详情API技术文档
大数据·数据挖掘·数据分析
WSSWWWSSW1 天前
Seaborn数据可视化实战:Seaborn数据可视化实战入门
python·信息可视化·数据挖掘·数据分析·matplotlib·seaborn
Highcharts.js1 天前
Highcharts Stock :打造专业级金融图表的利器
信息可视化·金融·数据分析
smilejingwei1 天前
数据分析编程第五步:数据准备与整理
大数据·开发语言·数据分析·esprocspl
fanstuck1 天前
2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析
大数据·人工智能·数学建模·数据挖掘·数据分析
SelectDB1 天前
Apache Doris 登顶 RTABench —— 实时分析领域的性能王者
数据库·数据分析·开源
MaxHua1 天前
SQL查询优化全指南:从语句到架构的系统性优化策略
后端·数据分析
王小王-1231 天前
基于Spark的白酒行业数据分析与可视化系统的设计与实现
大数据·数据分析·spark·白酒数据分析·白酒评价文本分析·白酒价格预测·白酒行业
葡萄城技术团队1 天前
从传统到创新:用报表插件重塑数据分析平台
信息可视化·数据挖掘·数据分析
阿Paul果奶ooo1 天前
数据分析与数据挖掘
人工智能·数据挖掘·数据分析