建模流程
导入常用包
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%