?

基于Python的中醫藥數據挖掘中標準數據集的加工-以高血壓治療數據為例

2023-09-08 07:04田穎郭棟彭偉范曉艷張晨岳朱俊潼
中國循證心血管醫學雜志 2023年5期
關鍵詞:表格數據挖掘處方

田穎,郭棟,彭偉,范曉艷,張晨岳,朱俊潼

中醫藥獨特的理論體系使得其現代化研究面臨著巨大的困難。中醫藥循證需要的不僅是隨機對照試驗(RCT),而是多樣性的證據?;谌粘at療數據挖掘的醫療信息數據已經成為當今時代中醫學研究的主要證據源頭。中醫藥數據挖掘和其它商業類數據挖掘相似,整個過程需要計算機科學、統計學、中醫學等多個學科的交叉融合。受到計算機語言以及數據分析能力欠缺的限制,面對海量的數據,有80%的時間和精力是花費在數據預處理和預加工階段。目前雖有不少研究采用數據挖掘(DM)技術,借助中醫傳承輔助平臺/利用相關軟件進行關聯規則分析、聚類分析、主成分分析和因子分析等得到了有意義的結果[1-11],但總體大規模的病例數據挖掘較少,研究方法較為單一,創新性不足。如何快速高效的實現數據的預處理,降低中醫藥DM的門檻,是廣大中醫人普遍面臨的問題。

Python作為計算機編程語言,提供了高效的高級數據結構,還能簡單有效地面向對象編程[12]。Python相對易學易讀,且免費開源、用途廣泛,目前已成為非計算機專業人員最受歡迎的程序設計語言之一。筆者以本院高血壓病例的醫療信息系統數據層面的數據挖掘流程為例,重點展示如何利用Python高效快速的實現中醫藥數據挖掘中的標準數據集的加工。目前筆者尚未看到國內外該方面詳細的操作流程的文獻報道。

1 數據來源

利用日常診療數據來開展臨床研究,需從兩個維度考慮:數據獲得和研究方法。

1.1 數據庫的鏈接整合我院信息系統(HIS)、實驗室信息管理系統(LIS)、醫學影像存檔于通訊系統(PACS)和電子病歷系統(EMR)數據匯總,構建形成完整的醫院醫療信息數據倉庫。

1.2 數據來源選擇我院最近1年的高血壓住院和門診患者就醫的相關信息。包括患者基本信息、住院和門診電子病歷系統、用藥信息和輔助檢查信息。

1.3 確定研究目標和挖掘對象在選擇數據前,需明確DM目標。目的不同,所要構建的模型也不同。本研究以原發性高血壓作為第一主診斷的住院和門診患者為挖掘對象,分析高血壓患者的臨床流行病學特征、主要證型歸類、中藥處方和西藥處方的用藥規律及建立相關風險的預測模型。

1.4 數據挖掘的技術和工具數據挖掘有多種方法和工具,本文重點介紹重點應用Python語言實現數據集的預處理。

1.5 技術路線對于數據挖掘的完整流程要有個明確的思路,以下技術路線供參考,本文主要探討的內容是“數據預處理”階段(圖1)。

圖1 以行分布的中藥使用信息

圖1 數據挖掘技術路線圖

2 數據預提取及正式提取

數據正式提取前,需要明確篩選的重要的數據項目,以滿足后期數據挖掘的需要。Excel表格對行和列的存儲是有限度的,一個人的記錄可能就有上百行上百列的信息??梢韵炔捎妙A提取的方式,少量提取幾十人的信息,查看預提取出的表格信息并進行設計整理,在保證研究目標的需要的前提下盡量簡化數據條目,進一步明確要提取的病歷字段。這期間需要與負責數據庫系統的工程師反復溝通討論數據提取的形式,特別是中藥處方的信息,每個人的用藥有幾種到十幾種不等,具體可以按照行/列的形式抽取,以哪種形式抽取要看個人對后期對數據預處理的便利。預抽取數據明確后即可以正式提取。

3 中藥大數據的規范處理

數據提取的載體一般是Excel,剛抽取出來的數據是比較雜亂無章的(圖2),需針對數據的各種問題進行規范化的預處理。需要根據中醫藥大數據的特點,利用中醫藥專業知識門診和住院病歷的文本進行結構化信息提??;規范中藥名稱;規范高血壓的診斷證型;對四診和主訴相關術語進行規范和拆分等,直到對數據質量滿意為止。這是對中醫藥大數據預處理的重要工作。

圖2 中藥使用轉換后的數據格式

圖2 剛抽取出的原始數據集

3.1 對主訴和四診相關術語進行規范和拆分祖國醫學并沒有高血壓這一病名,根據臨床主要表現、病理機制、證候及轉歸,目前比較一致的認為,高血壓應屬祖國醫學“頭痛”、“眩暈”的范疇。因此根據《中醫內科學》對眩暈、頭痛的認識,認為高血壓主訴以“頭痛”、“頭脹”、“眩暈”為主癥,以“頭昏沉”、“胸悶”、“耳鳴”、“心悸”、“失眠”為次癥進行規范和拆分。高血壓四診和證型關系比較大,在提取術語方面建議作如下描述:以“面色潮紅”、“面紅耳赤”、“腰膝酸軟”、“急躁易怒”、“舌紅苔黃”、“舌紅苔少”、“脈弦”、“脈數”為主要相關術語。

3.2 電子病歷文本的結構化信息提取根據我院電子病歷系統模板,按照發病時間、誘發原因、主要癥狀、加重因素、緩解方式時間和伴發癥狀做分段提取,比如“近兩月”、“勞累后”、“頭脹痛”、“情緒波動后加重”、“休息后輕度緩解”、“伴頭昏沉、眩暈”。

3.3 對中藥名稱的規范處理根據《中國藥典》2020年版[13]對數據庫中的中藥名稱統一命名,對中藥材再加工后的名稱、炮制物及提取物統統以該中藥材名稱錄入。如“炒神曲”、“三七粉”、“茯苓皮”、“水牛角濃縮粉”等分別統一命名為“神曲”、“三七”、“茯苓”、“水牛角”等。

3.4 對高血壓診斷證型的規范參照眩暈?。ㄔl性高血壓)在《中醫內科臨床診療指南》[14]中對證型的分類,把多種辨證分型統一歸類到四個主要的分型包括肝火亢盛證、痰瘀互結證、陰虛陽亢證和腎氣虧虛證,不能歸入上面四類的歸入其他類。

3.5 數據庫的構建數據庫構建要兼顧全面與時效的平衡性,收集研究對象的相關記錄,關鍵變量優先收集。通過結構化的信息采集,把變量信息導入數據庫。用Epidata軟件和excel建立數據庫,變量維度遵循臨床問題結構化六要素原則(Population,研究對象 ;Intervention,干預措施;Comparison,對照措施; Outcome,結局;Study design,研究類型;Time frame,觀察時間;PICOST)。變量類別包括基線變量、隨訪變量和結局變量。

3.6 質量控制重視保證數據質量,這是把真實世界數據轉變為真實世界證據的前提。因此,質量控制應盡量前置且貫穿臨床研究的全過程。原始數據的采集及對混雜因素的處理是真實世界研究質量控制的關鍵。

3.6.1 研究設計階段①全面考慮確定的/潛在的影響因素、混雜因素:除考慮傳統的年齡、性別等混雜因素外,還需考慮病程、其它用藥、高血壓共病/合并癥等其它影響因素。②提前制定數據收集計劃、統計分析計劃:數據收集前提前制定計劃的主要目的是以防漏失重要變量,影響結果分析的真實性和可靠性。

3.6.2 研究實施階段數據采集前,制定研究者手冊,建立規范統一的數據采集方法明確操作流程,制定標準操作規范,培訓相關信息提取人員,確保提取方法一致,減少各種偏倚。①數據的規范性:對原始數據進行數據清理和預處理時,變量的記錄格式要統一;疾病的現病史、既往史、診斷、中醫證型的診斷要明確和統一,實驗室檢測方法要統一,中醫四診信息、用語的規范要參考標準等。②數據的準確性和真實性:采取雙人雙數據庫錄入原則,保證提取到的數據與既有數據庫中的數據一致。數據導出過程中,隨機抽取一定比例的數據與原始數據進行人工核對。③保證數據的可溯源性:保存最早導出的原始數據庫,保存數據處理的所有記錄,包括來源于文字信息提取的結構化處理過程證據鏈接。④準確的測量、收集暴露/結局并全面、準確的收集關注的影響因素、混雜因素。⑤研究方案要貫穿于研究實施的全過程,并在此過程中不斷修正和優化。

4 利用Python實現數據的預加工并構建適合DM的標準數據庫

數據的進一步加工是為了將其轉換成適合挖掘的形式,即建立起適合高血壓中醫藥數據挖掘相關算法的標準格式的各種存儲數據表,通常80%的精力都耗費在這一步。每例患者即幾百條數據,成千上萬條的大數據人工整理耗時太長,此時可以借助Python語言等計算機科學工具,將準備好的數據轉化為適合挖掘算法的分析模型。通過簡單模式化的代碼,即可以高效快速的建立適合數據挖掘相關算法的標準格式的多種存儲數據表。

提取出來的醫療信息包括基本信息、檢驗結果、診斷信息、中藥處方信息、西藥處方信息等幾個分開的表格。以下重點介紹如何有效利用Python語言快速實現中藥處方用藥的數據庫構建及表格合并的數據集的加工。如在做中藥處方用藥特征挖掘常用的關聯規則分析/聚類分析/因子分析等之前,首先需要把每一味中藥的文本數據轉換為數值型變量,需要在Excel中建立以高血壓患者ID號為行變量,中藥具體名稱為列變量,以0和1代替有無使用該中藥的二分類格式輸入單元格,建立共詞矩陣的數據表。

4.1 長表格數據的處理初始數據集見圖1。該中藥信息提取的信息特征是同一位患者不同的處方草藥單獨占一行,該表格中的中藥院內制劑和中藥飲片沒有分開,數據處理完再行篩選。

目標:列出每例患者用到的中藥名稱,并把同一列不同行的草藥名稱放在同一行中。

最終呈現:患者ID(門診號),所有提取出的中藥名稱(0表示未使用該種草藥,1表示使用該種草藥)。

代碼實現:

①把中草藥進行one-hot編碼,調用pandas模塊:import pandas as pd

# 導入數據

Data=pd.read_excel('E:\門診中藥.xlsx')

Data=pd.get_dummies(columns=['藥品'],data=data)

# data.head()

Columns=list(map(lambda x: x[3:] if '藥品' in x else

x,list(data.columns)))

data.columns =columns

# 輸出前5行,查看數據,圖2

data.head(5)

②整理數據為需要的格式(去掉“中藥名稱_”):

#=邏輯:如果列名中出現“中藥名稱”,就取第

5個字符后的內容,否則保留原列名。

Columns=list(map(lambda x: x[5:] if '中藥名稱' in x

else x,list(data.columns)))

data.columns=columns

③最終按“患者ID”分類,并匯總起來保存為csv文件,方便后續處理:

data.groupby(['患者ID']).sum()

Data=(data !=0)×1

dataxi=(dataxi !=0) ×1.to_csv('患者中藥使用情況

(01處理后).csv')

#輸出前5行,查看最終呈現的目標數據,圖3

圖3 中藥處方用藥的行呈現矩陣轉換數據

data.head(5)

4.2 表格合并因檢驗結果信息包括檢驗項目的分類和檢驗結果報告,屬于三維信息,無法和其它表格的二維信息合并,需單獨分析。另外中藥處方和西藥處方信息合并后數據龐大,表格無法承載,故中藥和西藥表格分別和基本信息及診斷合并,Python處理過程一致。以下以中藥為例,把高血壓門診患者基本信息、診斷信息和以上處理后的患者中藥使用情況合并到一個表格。

代碼實現:

病案號與中草藥01對應

import pandas as pd

data1=pd.read_excel('E:\門診診斷.xlsx')

# 輸出前5行,查看數據

data.head(5),圖4,圖中的NaN表示該單元格為空缺。

圖4 門診診斷信息

# 合并

data_ =data.merge(data1,on='門診號')

# 輸出前5行,查看數據

data.head(5),圖5

圖5 中藥信息和診斷信息的合并

Info=pd.read_excel('E:\門診基本信息.xlsx',index_

col =1)

# 輸出前5行,查看數據

data.head(5),圖6

圖6 門診基本信息

Newd=info.merge(data_, on ='門診號')

newd.to_csv('E:\合并中藥.csv')

最終呈現的合并后信息見圖7。

圖7 合并后信息

4.3 寬表格數據的處理初始數據集見圖8。該表格中藥提取的信息特征是同一例患者不同的處方中藥單獨占一列,一例患者的數據占據一行。

圖8 以列分布的中藥使用信息

目標:把組方中的每種中藥變為啞變量,one-hot編碼形式。

代碼實現:

import pandas as pd

import numpy as np

def maketable(sheet):

data=pd.read_excel('E:\高血壓.xlsx',sheet_

name=sheet)

drug=data.iloc[:,1:].T

data=data.applymap(lambda x: x.strip(' ') if

type(x)=str else x)

l=[ ]

for i in range(1,data.shape[1]):

l+=[i for i in set(data.iloc[:,i])]

l=list(set(l))

l.remove(np.nan)

dic={ }

for i in range(len(l)):

dic[l[i]]=i

mtx=np.zeros((drug.shape[1],len(l)))

drug=drug.applymap(lambda x: dic.get(x,-1))

for i in range(drug.shape[1]):

for j in filter(lambda x: x>0,drug[i].to_list()):

mtx[i,int(j)]=1

mtx=pd.DataFrame(mtx).astype(int)

mtx.columns=l

mtx.index=data['住院號']

mtx.to_csv('{}.csv'.format(sheet))

pass

sheet_list=['Sheet1']

for i in sheet_list:

maketable(i)

處理后最終呈現的中藥使用矩陣格式數據見圖9。

圖9 中藥使用情況的矩陣格式數據

以上Python處理過程中的代碼可以復制粘貼以實現其它類似數據集的加工,此過程可以大大節省中藥大數據的預處理時間,以最近提取的我院2020年全年的住院和門診上萬條中藥數據為例,只用幾分鐘即可處理完畢,若人工整理或需要幾個月的時間。

5 數據的初步分析

標準數據集構建后,首先要對數據進行初步的描述分析,很多中醫藥DM研究沒有對研究對象進行基本的人口學特征和臨床流行病學特征的初步分析,這是不合適的。任何研究的最終目的都要用到人身上,要善于總結規律,發現新問題,以便于臨床診療和預測,可以采用易學實用的SPSS軟件對數據源進行初步分析和統計量的計算??紤]到真實世界研究的混雜因素偏多,研究中可能需要用到回歸分析、廣義方程模型和傾向性評分等高級統計方法。此外,數據初步描述階段,可利用Excel的數據透視表進行頻數的統計等簡單的分析和數據透視圖的可視化分析,讓數據結果更為直觀。

6 數據挖掘

標準數據庫構建之后,就要對所得到的經過轉化的數據進行深度挖掘。借助中醫學和統計學專業知識,選擇恰當的算法即確定所用的數據挖掘模型,得出有價值的結果和結論,達到個人的研究目的。DM過程中可能會用到多種數據挖掘和統計的方法及工具,反復嘗試多種挖掘方法并在臨床中驗證以達到預期的最優結果。算法應用方面,logistic回歸、Cox回歸等常被用于數據的初步分析階段,用于疾病的相關病因分析及預測模型等;關聯規則分析的Appriori算法被廣泛應用于中醫的藥方規則提??;聚類分析、主成分分析、因子分析等常用作藥物處方的分類、證型的歸類和降維等;決策樹、人工神經網絡、貝葉斯網絡等常用于病情轉歸的預測。

7 結果分析及可視化呈現

結果分析是數據挖掘的重要環節,數據挖掘結果在實際運用中需要反復求證,以檢驗其合理性,需要與專家之間建立廣泛的交流,將各種挖掘的結論與他們的醫療經驗進行求證,以檢驗挖掘方法的合理性。結果出來后,利用可視化技術可以將結果顯示得更加清晰直觀,并對其進行解釋和評估,更加有利于預期的目標[15]。Python和R語言均提供了豐富的數據可視化庫,在數據可視化方面都有其獨特的優點。當前較為普遍的觀點認為Python在機器學習的數據挖掘方面優于R語言,而R在作圖方面則優于Python,其ggplot數據可視化包功能強大,其它工具如GraphPad、Excel等亦可實現簡單作圖。

8 討論

現今,我國醫療領域已經掀起了一場數據挖掘革命浪潮[16]。中醫藥的個體化診療特點使得循證中醫藥研究更多的開始轉向真實世界的臨床實踐。中醫藥的數據挖掘在中醫藥各領域的探索積極有效。有了信息技術,病歷和隨訪數據可以更高效地存儲和提取,從而實現更廣泛的數據挖掘。如從醫學數據中尋找潛在的關系或模式,獲得有關患者診斷和治療的有效信息;同時還可挖掘名老中醫用藥經驗、核心處方、用藥規律及對證候類型的規范聚類等;還可以對中藥進行衛生經濟學評價;考慮到中醫藥在慢病治療中的優勢,可以分析患者的流失率/二次/多次回歸保持治療的依從性的相關因素等等;通過醫療大數據的分析,還可以為政府決策提供依據。

目前數據挖掘技術發展水平和與中醫藥結合的深度和廣度還未能改變中醫藥數據難處理的大格局,盡管中醫藥的數據挖掘開展已經很久,但龐大復雜的臨床歷史數據依然是制約中醫藥快速發展的瓶頸。大部分的醫療信息數據挖掘還比較零散,數據量比較小,在大數據的預處理和深入分析能力方面十分欠缺。歸根結底還是因為臨床人員在統計學及人工智能方面技術的不足,希望本文提供的用Python編碼實現的數據預加工能給臨床數據挖掘提供幫助??傊?,數據挖掘只有在把握中醫特有的“整體觀”理論背景和“辨證論治”兩大特色的思維規律的前提下,才能在保證研究方向合理的同時,將真實世界研究的中醫藥數據處理能力提高到新的水平。數據挖掘的最終目的還是要為實現中醫學從“經驗醫學”走向“循證醫學”的現代化研究搭建起新的橋梁,把中醫藥學術提升到一個新階段,從而推動中醫藥事業高質量發展。

猜你喜歡
表格數據挖掘處方
《現代臨床醫學》來稿表格要求
《現代臨床醫學》來稿表格要求
探討人工智能與數據挖掘發展趨勢
人間處方
統計表格的要求
基于并行計算的大數據挖掘在電網中的應用
解決因病致貧 大小“處方”共用
一種基于Hadoop的大數據挖掘云服務及應用
處方
基于GPGPU的離散數據挖掘研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合