中医证型关联规则----apriori算法挖掘及plotly数据可视化

建模流程

导入常用包

from plotly.subplots import make_subplots
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
from PIL import Image
%matplotlib inline
import seaborn as sns
import itertools
import warnings
warnings.filterwarnings("ignore")
import io
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls
import plotly.figure_factory as ff
import plotly.express as px

可视化统计分析

data  = pd.read_excel('./data/data.xls',usecols=[0,1,2,3,4,5,7])
data_d = data.describe().reset_index()
data_n = data.nunique().reset_index().T
fig = make_subplots(
    rows=3, cols=1,
    specs=[[{"type": "table"}],[{"type": "table"}],[{"type": "table"}]]
)

fig.add_trace(
    go.Table(
        header=dict(
            values=['','肝气郁结证型系数', '热毒蕴结证型系数', '冲任失调证型系数', '气血两虚证型系数', '脾胃虚弱证型系数', '肝肾阴虚证型系数'],
            font=dict(size=10),
            align="left"
        ),
        cells=dict(
            values=[data_d[k].tolist() for k in data_d.columns],
            align = "left")
    ),
    row=2, col=1
)

fig.add_trace(
    go.Table(
        header=dict(
            values=['肝气郁结证型系数', '热毒蕴结证型系数', '冲任失调证型系数', '气血两虚证型系数', '脾胃虚弱证型系数', '肝肾阴虚证型系数'],
            font=dict(size=10),
            align="left"
        ),
        cells=dict(
            values=[data[k].tolist() for k in data.columns[1:]],
            align = "left"),
             name= '1'
    ),
    row=1, col=1
)

fig.add_trace(
    go.Table(
        header=dict(
            values=[data_n[k].tolist()[:1] for k in data_n.columns],
            font=dict(size=10),
            align="left"
        ),
        cells=dict(
            values=[data_n[k].tolist()[1:] for k in data_n.columns],
            align = "left")
    ),
    row=3, col=1
)

fig.update_layout(
    height=1000,
    showlegend=False,
    title_text="中医证型关联挖掘: 1-图表 2-描述统计 3-去重值"

)

fig.show()

在这里插入图片描述

data.info()
data_x = data[['肝气郁结证型系数', '热毒蕴结证型系数', '冲任失调证型系数', '气血两虚证型系数', '脾胃虚弱证型系数', '肝肾阴虚证型系数']]

在这里插入图片描述

sns.pairplot(data)

在这里插入图片描述

def plot_violin(i):
    print(i)
    fig = px.violin(data, y=i, x='TNM分期', color='TNM分期',box=True, points="all", hover_data=data_x.columns)
    fig.show()
    
for i in data_x.columns:
    plot_violin(i)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

color_m = data['TNM分期'].map({"H1":1,"H2":2,"H3":3,"H4":4})

fig = px.parallel_coordinates(data, color=color_m, labels={"肝气郁结证型系数": "'肝气郁结证型系数",
                  "热毒蕴结证型系数": "热毒蕴结证型系数", "冲任失调证型系数": "冲任失调证型系数","气血两虚证型系数":"气血两虚证型系数",
                  "脾胃虚弱证型系数": "脾胃虚弱证型系数", "肝肾阴虚证型系数": "肝肾阴虚证型系数", },
                    color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=2)
fig.show()

在这里插入图片描述

fig = px.box(data_x, y=data_x.columns,color=data['TNM分期'])
fig.show()

在这里插入图片描述

数据离散化处理

#数据离散化处理
from __future__ import print_function
from sklearn.cluster import KMeans #使用K-means算法

processdfile = './data/data_processed.xls'
typelabel = {
    '肝气郁结证型系数':'A',
    '热毒蕴结证型系数':'B',
    '冲任失调证型系数':'C',
    '气血两虚证型系数':'D',
    '脾胃虚弱证型系数':'E',
    '肝肾阴虚证型系数':'F',
}

k = 4 #需要聚类的类别数

data2 = pd.read_excel('./data/data.xls')
keys = list(typelabel.keys())
result = pd.DataFrame()

if __name__ == '__main__':
    for i in range(len(keys)):
        print('正在进行"%s"的聚类。。。'%keys[i])
        kmodel = KMeans(n_clusters=k,n_jobs=4)
        kmodel.fit(data2[[keys[i]]].values)
        r1 = pd.DataFrame(kmodel.cluster_centers_,columns=[typelabel[keys[i]]])#查看中心点
        r2 = pd.Series(kmodel.labels_).value_counts()#各样本对应类别
        r2 = pd.DataFrame(r2,columns=[typelabel[keys[i]]+'n'])
        r = pd.concat([r1,r2],axis=1).sort_values(typelabel[keys[i]])
        r.index = [1,2,3,4]
        r[typelabel[keys[i]]] = r[typelabel[keys[i]]].rolling(2).mean()#这里取相邻两个中心的的均值,作为范围的边界
        r[typelabel[keys[i]]][1] = 0.0
        result =result.append(r.T)
    result = result.sort_index()
    result.to_excel(processdfile)

在这里插入图片描述

data3 = pd.read_excel('./data/data_processed.xls',index_col=0)
data3
#以A列为例,0-0.178有240个样本,用A1表示,0.17-0.25有356个样本用A2表示,以此类推

在这里插入图片描述

data

在这里插入图片描述

# 用每个数值去匹配所在范围,根据data3的数据来分类,最后替换原数据
def replace_num(cols,num,data3):
    typelabel = {
    '肝气郁结证型系数':'A',
    '热毒蕴结证型系数':'B',
    '冲任失调证型系数':'C',
    '气血两虚证型系数':'D',
    '脾胃虚弱证型系数':'E',
    '肝肾阴虚证型系数':'F',
}
    x = typelabel[cols]
    bins = list(data3.loc[x])
    if bins[0]<num<bins[1]:
        return '%s1'%x
    elif bins[1]<num<bins[2]:
        return '%s2'%x
    elif bins[2]<num<bins[3]:
         return '%s3'%x
    else:
        return '%s4'%x
for i in data.columns:
    if i == 'TNM分期':
        break
    for j in range(len(data)):
        data[i][j] = replace_num(i,data[i][j],data3)

生成结果数据表

data

在这里插入图片描述

分类变量可视化

fig = px.parallel_categories(data.iloc[:,:], color = color_m,color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

在这里插入图片描述

导出算法所需格式

data.to_csv('a3.txt',index=False,header=False)

在这里插入图片描述

导入apriori算法

from apriori import *
import time
inputfile = 'a3.txt'
data = pd.read_csv(inputfile,header=None,dtype=object)
start = time.time()
print('转化数据矩阵...'+'\n')
ct = lambda x : pd.Series(1, index= x[pd.notnull(x)])
b = map(ct,data.values)
data = pd.DataFrame(b).fillna(0)
end = time.time()
print('转换完毕用时%0.2f秒'%(end - start))
del b

support = 0.06 #支持度阈值,根据业务需要自行设置,数值越小,结果越多
confidence = 0.75 #置信度阈值,根据业务需要自行设置,数值越小,结果越多

ms = '---'
start = time.time()
print('开始搜索关联规则。。。')
result = find_rule(data,support,confidence,ms)
end = time.time()
print('搜索完成,共计用时%0.2f秒'%(end - start))

在这里插入图片描述

结果展示

 我们要剔除结果中以非”TNM分期“为结果的数据

在这里插入图片描述

结果说明

 A3、F4=>H4的支持度最大,达到7.9%,置信度也最大,达到88%。说明肝气郁结证型系数在(0.25,0.35),肝肾阴虚证型系数在(0.35,0.6)范围
 内TNM分期诊断为H4的可能性为87.96%,而这种情况占所有情况的7.9%
  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DM。

对您有帮助的话,打赏一下吧~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值