陳 都,徐 峰
1.蘇州大學(xué)附屬第一醫(yī)院重癥醫(yī)學(xué)科,江蘇 蘇州 215000;2.蘇州大學(xué)附屬第一醫(yī)院急診科,江蘇 蘇州 215000
創(chuàng)傷對(duì)社會(huì)及家庭造成巨大負(fù)擔(dān),對(duì)創(chuàng)傷流行病學(xué)的研究具有重要意義[1],創(chuàng)傷流行病學(xué)研究可以為衛(wèi)生行政部門制定相關(guān)的政策法規(guī)提供重要依據(jù)?;趧?chuàng)傷數(shù)據(jù)庫的創(chuàng)傷救治質(zhì)量提高計(jì)劃在國(guó)外已較成熟,國(guó)內(nèi)正處于快速發(fā)展階段[2-4]。
Python是一種高級(jí)腳本語言,相較于其他語言更容易學(xué)習(xí)且功能強(qiáng)大。伴隨Python相關(guān)第三方庫的不斷擴(kuò)充與改進(jìn),使其成為數(shù)據(jù)分析任務(wù)的一個(gè)優(yōu)選方案[5-6]。相較于臨床醫(yī)師常用的Excel、SPSS、Stata等數(shù)據(jù)分析工具,其在臨床大數(shù)據(jù)分析方面有突出優(yōu)勢(shì),目前已在眾多醫(yī)學(xué)學(xué)科的研究中得到應(yīng)用[7-12]。本文簡(jiǎn)要介紹其在創(chuàng)傷流行病學(xué)研究中的相關(guān)應(yīng)用,包括數(shù)據(jù)導(dǎo)入、數(shù)據(jù)清洗、統(tǒng)計(jì)分析、數(shù)據(jù)可視化以及模型建立等方面,為創(chuàng)傷流行病學(xué)研究提供參考。
Python語言是一種開源、免費(fèi)、跨平臺(tái)的高級(jí)計(jì)算機(jī)語言,由Guido van Rossum于1989年開發(fā)。Python語言具有入門快、簡(jiǎn)單高效、運(yùn)行可靠、數(shù)據(jù)處理能力強(qiáng)等特點(diǎn)[13]。近些年,Python從一個(gè)邊緣的科學(xué)計(jì)算語言,成為了數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、學(xué)界和工業(yè)界軟件開發(fā)最重要的語言之一?;跀?shù)量龐大的開源第三方庫,使其在數(shù)據(jù)分析、云計(jì)算、網(wǎng)絡(luò)爬蟲、自動(dòng)化運(yùn)維、Web開發(fā)、人工智能等領(lǐng)域得到了廣泛應(yīng)用。其中在數(shù)據(jù)分析領(lǐng)域,常用的第三方庫有NumPy、Pandas、Matplotlib等。
程序編寫需要使用代碼編輯器,在使用Python進(jìn)行數(shù)據(jù)分析時(shí)筆者推薦的代碼編輯器是Jupyter Notebook。作為一款交互式記事本,支持包括Python、R在內(nèi)的40多種編程語言,其實(shí)質(zhì)是一款開源Web 應(yīng)用程序。由于Jupyter Notebook交互式特性,使其成為一款執(zhí)行端到端數(shù)據(jù)科學(xué)工作流程的便捷工具,實(shí)時(shí)代碼和結(jié)果可視化集成展示的形式應(yīng)用于大數(shù)據(jù)分析,適合科研人員集中實(shí)現(xiàn)數(shù)據(jù)的清洗、轉(zhuǎn)換、分析、展示科研過程,也便于創(chuàng)建并共享代碼和文檔[14]。
對(duì)于初學(xué)者,可通過安裝Anaconda軟件包(https://www.anaconda.com)一步到位獲取上述Python庫及代碼編輯器,使用較為方便。下面對(duì)Python在創(chuàng)傷流行病學(xué)數(shù)據(jù)分析中主要涉及的第三方庫做簡(jiǎn)要介紹。
Pandas是Python核心數(shù)據(jù)分析支持庫,提供了快速、靈活、明確的數(shù)據(jù)結(jié)構(gòu),能夠簡(jiǎn)單、直觀地處理關(guān)系型數(shù)據(jù)。Pandas的主要數(shù)據(jù)結(jié)構(gòu)是序列(Series)和數(shù)據(jù)框(DataFrame),分別用于一維和二維數(shù)據(jù),這兩種數(shù)據(jù)結(jié)構(gòu)足以處理創(chuàng)傷流行病學(xué)中的相關(guān)研究數(shù)據(jù)。Pandas提供了大量數(shù)據(jù)分析函數(shù),通過直接調(diào)用這些函數(shù)可以快速高效地完成數(shù)據(jù)清洗、統(tǒng)計(jì)分析、數(shù)據(jù)可視化等數(shù)據(jù)分析工作。以下簡(jiǎn)單介紹該庫的使用方法以及其相較于其他分析工具的優(yōu)勢(shì)。
要使用Pandas提供的數(shù)據(jù)結(jié)構(gòu)和函數(shù),首先導(dǎo)入Pandas,使用代碼:import pandas as pd,表示導(dǎo)入Pandas并賦予別名pd,之所以取名pd只是一個(gè)約定俗成的習(xí)慣。導(dǎo)入Pandas后就可以調(diào)用其提供的處理結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),和函數(shù)完成數(shù)據(jù)的導(dǎo)入導(dǎo)出、篩選與排序、刪除、重塑、缺失值處理、類型轉(zhuǎn)換、合并與拆分、分組、數(shù)據(jù)透視、統(tǒng)計(jì)描述及作圖等眾多操作。例如,可以使用read_csv和to_csv函數(shù)完成csv格式數(shù)據(jù)文件的讀取和輸出,也可通過特定函數(shù)直接讀取包括Excel、Stata、SAS在內(nèi)的其他數(shù)據(jù)分析軟件的數(shù)據(jù)文件。Pandas還可以直接讀取JSON格式數(shù)據(jù),該數(shù)據(jù)格式目前被廣泛用在網(wǎng)絡(luò)應(yīng)用程序和服務(wù)器之間交換信息。另外,基于數(shù)據(jù)庫模塊,Python可以直接對(duì)數(shù)據(jù)庫進(jìn)行通信和操作,從數(shù)據(jù)庫的多個(gè)數(shù)據(jù)表中提取想要的特定數(shù)據(jù),通過Pandas轉(zhuǎn)為數(shù)據(jù)框格式進(jìn)一步處理,實(shí)現(xiàn)對(duì)大規(guī)模臨床數(shù)據(jù)的操作。Pandas兼具NumPy高性能的數(shù)組計(jì)算功能以及電子表格和關(guān)系型數(shù)據(jù)庫靈活的數(shù)據(jù)處理功能,提供復(fù)雜精細(xì)的索引功能,能更加便捷地完成重塑、切片和切塊、聚合以及選取數(shù)據(jù)子集等操作。Pandas操作數(shù)據(jù)的規(guī)模、速度、靈活性、可重復(fù)性大大優(yōu)于Excel等傳統(tǒng)數(shù)據(jù)分析工具。
Pandas不但可以輕松處理數(shù)值型數(shù)據(jù),對(duì)文本型、日期時(shí)間型等其他類型數(shù)據(jù)同樣提供了豐富的處理函數(shù)。對(duì)常規(guī)的數(shù)值型數(shù)據(jù),Pandas提供的處理函數(shù)可以方便地完成數(shù)值型數(shù)據(jù)的類型轉(zhuǎn)換、增刪改查、統(tǒng)計(jì)分析以及數(shù)據(jù)可視化等操作;借助文本處理函數(shù)、正則表達(dá)式可以高效地完成文本數(shù)據(jù)的匹配、提取、替換、拆分、拼接、大小寫轉(zhuǎn)換等操作;在流行病學(xué)研究中常會(huì)用到時(shí)間序列分析探索事物在時(shí)間維度上的趨勢(shì)和變化規(guī)律,進(jìn)一步可進(jìn)行預(yù)測(cè)建模的建立,然而很多時(shí)候獲得的時(shí)間數(shù)據(jù)常被保存為文本格式,Pandas通過 to_datetime()函數(shù)可將其轉(zhuǎn)為datetime64數(shù)據(jù)類型以方便重采樣等操作,重采樣是在時(shí)間維度上對(duì)數(shù)據(jù)進(jìn)行的特定周期的分類匯總,是將時(shí)間序列從一個(gè)頻率轉(zhuǎn)換至另一個(gè)頻率的過程,這是完成時(shí)間序列分析的常用基礎(chǔ)操作,可以通過resample()函數(shù)完成。在文本型、日期時(shí)間型數(shù)據(jù)的處理上,Pandas有著傳統(tǒng)分析工具難以匹及的靈活與高效。
流行病學(xué)研究中總會(huì)遇到缺失值的問題,處理缺失值是數(shù)據(jù)清洗的主要內(nèi)容之一,對(duì)缺失值的處理直接關(guān)系到研究結(jié)論的可靠性。處理缺失值可直接刪除或數(shù)據(jù)填補(bǔ),兩者均有不同的細(xì)分方法,具體選擇什么樣的方法最合適要結(jié)合數(shù)據(jù)缺失情況以及研究目的綜合分析。Pandas對(duì)各類型數(shù)據(jù)缺失值的處理提供了豐富靈活的處理函數(shù),可以高效完成缺失值的檢測(cè)、統(tǒng)計(jì)、刪除、替換、填補(bǔ)操作。刪除操作時(shí)可以在行或列的方向設(shè)定缺失值的數(shù)量閾值、填補(bǔ)操作時(shí)可以填補(bǔ)均數(shù)、中位數(shù)、眾數(shù)、固定值以及用前值、后值填補(bǔ),特別是在處理大規(guī)模數(shù)據(jù)時(shí)其效率優(yōu)勢(shì)更加明顯。Pandas的官方網(wǎng)站(https://pandas.pydata.org)提供了庫的下載及安裝教程,提示網(wǎng)站還提供了諸如官方說明文檔在內(nèi)的諸多學(xué)習(xí)資料,可以幫助研究者快速學(xué)習(xí)并掌握Pandas,使其成為科學(xué)研究中得力的生產(chǎn)力工具。
下面通過一個(gè)簡(jiǎn)單案例演示Pandas在創(chuàng)傷流行病學(xué)研究中的實(shí)際應(yīng)用,程序代碼及注釋如下(程序輸出內(nèi)容有省略):
# 導(dǎo)入Pandas庫并賦予別名,方便后續(xù)調(diào)用
import pandas as pd
# 從本地D盤讀入要分析的數(shù)據(jù)集并創(chuàng)建DataFrame對(duì)象,該數(shù)據(jù)集為某年蘇州市4萬名創(chuàng)傷患者的部分臨床數(shù)據(jù)
df=pd.read_csv(‘D:/Documents/sz4w.csv’)
# 查看數(shù)據(jù)集信息,了解行列數(shù)、列名及各列是否存在缺失值等信息
df.info()
# 查看前五條數(shù)據(jù)
df.head()
# 統(tǒng)計(jì)si列的缺失值數(shù)目
df.si.isna().sum()
# 統(tǒng)計(jì)得到si列的缺失值較少,使用ffill方法填補(bǔ)缺失值
df.si.fillna(method=‘ffill’,inplace=True)
# 對(duì)all_time進(jìn)行類型轉(zhuǎn)換:從object轉(zhuǎn)為datatime64,便于提取時(shí)間信息及行時(shí)間序列分析
df.call_time=pd.to_datetime(df.call_time)
# 從日期時(shí)間列call_time提取月份信息生成新列month
df[‘month’]=df.call_time.dt.month
完成了數(shù)據(jù)的獲取、清洗、轉(zhuǎn)換等基礎(chǔ)工作之后,往往還需要進(jìn)行數(shù)據(jù)可視化,通過圖形化的手段對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)潔高效地表達(dá),幫助研究者發(fā)現(xiàn)某種規(guī)律和特征。圖表為更好地探索、分析數(shù)據(jù)提供了一種直觀的方法,它對(duì)最終分析結(jié)果的展示具有重要作用。當(dāng)對(duì)一個(gè)數(shù)據(jù)集進(jìn)行分析時(shí),如果使用數(shù)據(jù)可視化的方式,會(huì)很容易地確定數(shù)據(jù)集的分類模式、缺失數(shù)據(jù)、離群值、變化趨勢(shì)等信息。在數(shù)據(jù)可視化方面,Pandas有三個(gè)優(yōu)秀的第三方庫,分別是:Matplotlib、Seaborn、Plotly。
Matplotlib是最流行的用于繪制圖表和其他二維數(shù)據(jù)可視化的Python庫,適合創(chuàng)建出版物上使用的圖表。雖然Python還有其他的實(shí)現(xiàn)數(shù)據(jù)可視化的庫,Matplotlib卻是應(yīng)用最廣泛的,并且它和其他生態(tài)工具配合也非常完美,可以使用它作為默認(rèn)的可視化庫。同時(shí)它也提供了一部分3D繪圖接口,Matplotlib通常與NumPy、Pandas一起使用,是數(shù)據(jù)分析中不可或缺的重要工具之一。Matplotlib提供了一個(gè)套面向繪圖對(duì)象編程的API接口,能夠很輕松地實(shí)現(xiàn)各種圖像的繪制,并且它可以配合Python GUI工具(如 PyQt、Tkinter等)在應(yīng)用程序中嵌入圖形。同時(shí) Matplotlib 也支持以腳本的形式嵌入到 IPython shell、Jupyter筆記本、Web應(yīng)用服務(wù)器中使用。通常只需幾行代碼就可以生成諸如散點(diǎn)圖、箱圖、直方圖、條形圖、餅圖、等高線圖、熱力圖在內(nèi)的各種統(tǒng)計(jì)圖,實(shí)現(xiàn)數(shù)據(jù)的可視化。
Seaborn是對(duì)Matplotlib進(jìn)行二次封裝。因?yàn)槭腔贛atplotlib,所以Seaborn的很多圖表接口和參數(shù)設(shè)置與其很接近。相比Matplotlib而言,Seaborn的幾個(gè)突出特點(diǎn):(1)繪圖接口更為集成,可通過少量參數(shù)設(shè)置實(shí)現(xiàn)大量封裝繪圖;(2)多數(shù)圖表具有統(tǒng)計(jì)學(xué)含義,如分布、關(guān)系、統(tǒng)計(jì)、回歸等;(3)對(duì)Pandas和NumPy數(shù)據(jù)類型支持非常友好;(4)風(fēng)格設(shè)置更為多樣,如風(fēng)格、繪圖環(huán)境和顏色配置等。正是由于上述特點(diǎn),在進(jìn)行探索性數(shù)據(jù)分析過程中,Seaborn往往更為高效。然而也需指出,Seaborn與Matplotlib的關(guān)系是互為補(bǔ)充而非替代。有些場(chǎng)合中Seaborn是繪圖首選,而在某些特定場(chǎng)景下則仍需用Matplotlib進(jìn)行更為細(xì)致的個(gè)性化定制。
不同于上述兩個(gè)可視化庫,Plotly功能更強(qiáng)大,且代碼更簡(jiǎn)潔,不僅與多個(gè)主流繪圖軟件良好對(duì)接,還可實(shí)現(xiàn)交互式制圖。Plotly圖表種類齊全,除了可以繪制常見的基本圖表,還可以繪制科學(xué)圖表、財(cái)務(wù)圖表、地圖、3D圖表、流動(dòng)圖表等。交互性:可以與R、Python、Matlab等軟件對(duì)接,并且是開源免費(fèi)的,Plotly與Python中Matplotlib、NumPy、Pandas等庫可以無縫集成,可以做出很多非常豐富的交互性圖表,創(chuàng)建圖形相對(duì)簡(jiǎn)單,申請(qǐng)了API密鑰后,還可以在線一鍵將統(tǒng)計(jì)圖形同步云端;制圖美觀:基于現(xiàn)代的配色組合、圖表形式,比R語言等的圖表更加現(xiàn)代、美觀。圖1展示了基于Plotly內(nèi)置數(shù)據(jù)集繪制的具有交互功能的動(dòng)態(tài)氣泡圖,該圖使用了很少量代碼全面展示了不同地區(qū)人均GDP與預(yù)期壽命的關(guān)系以及隨著時(shí)間的變化趨勢(shì)。此類圖表非常適合用來展示流行病學(xué)相關(guān)數(shù)據(jù)的時(shí)間變化趨勢(shì)。程序代碼及注釋如下:
圖1 Plotly繪制的具有交互功能的動(dòng)態(tài)氣泡圖
df=px.data.gapminder()#獲取數(shù)據(jù)集
px.scatter(df,x="gdpPercap", y="lifeExp",
size="pop", #氣泡大小反映人口數(shù)量
size_max=50,
color="continent", #顏色區(qū)分地區(qū)
hover_name="country", #設(shè)置鼠標(biāo)懸停信息
log_x=True, #設(shè)置對(duì)數(shù)坐標(biāo)
range_x=[100,100000],
range_y=[30,90],
animation_frame="year")
上述三個(gè)繪圖庫均可通過其官網(wǎng)進(jìn)行更深入的了解,網(wǎng)站中提供了詳細(xì)的教程及參考手冊(cè),參照網(wǎng)站中的舉例及相應(yīng)代碼,賦值手中的數(shù)據(jù)即可實(shí)現(xiàn)對(duì)創(chuàng)傷流行病學(xué)數(shù)據(jù)的可視化展示。相較于傳統(tǒng)數(shù)據(jù)分析工具,其繪圖功能更加強(qiáng)大,高效且美觀。
在創(chuàng)傷流行病學(xué)研究中,對(duì)于采集到的數(shù)據(jù)除了要進(jìn)行歸檔、整理、常規(guī)統(tǒng)計(jì)分析及可視化展示之外,很多時(shí)候還需要基于歷史數(shù)據(jù)建立預(yù)測(cè)模型,用于評(píng)估患者的預(yù)后、判斷是否為高危人群等,這就涉及到統(tǒng)計(jì)建模和機(jī)器學(xué)習(xí)。Python在這方面具備針對(duì)性的第三方庫及標(biāo)準(zhǔn)化的建模流程,可以幫助研究者快速建立并優(yōu)選最佳模型。其中Scikit-learn自2010年誕生已成為Python通用的機(jī)器學(xué)習(xí)工具包,其子模塊可以完成以下6大任務(wù):(1)分類:支持向量機(jī)、K近鄰、隨機(jī)森林、邏輯回歸等;(2)回歸:Lasso回歸、嶺回歸等;(3)聚類:K-均值、譜聚類等;(4)降維:主成分分析、特征選擇等;(5)模型選擇:網(wǎng)格搜索、交叉驗(yàn)證、度量;(6)預(yù)處理:特征提取、標(biāo)準(zhǔn)化。實(shí)際應(yīng)用時(shí)可以參考網(wǎng)站Scikit-learn算法選擇路徑圖(網(wǎng)址:https://scikit-learn.org/stable/tutorial/machine_learning_map/)進(jìn)行算法選擇,通過參考官方幫助文檔及實(shí)例演示完成機(jī)器學(xué)習(xí)模型的構(gòu)建及評(píng)價(jià)。區(qū)別于Scikit-learn,Statsmodels包含了經(jīng)典統(tǒng)計(jì)學(xué)和計(jì)量經(jīng)濟(jì)學(xué)算法,包括如下子模塊:回歸模型、方差分析、時(shí)間序列分析、統(tǒng)計(jì)模型結(jié)果可視化等。在機(jī)器學(xué)習(xí)方面,目前常用的工具除了Python還有R語言、Stata等,Python的優(yōu)勢(shì)在于其是通用編程語言、學(xué)習(xí)曲線平滑、大量的重要庫、更好的集成性以及更高的生產(chǎn)效率?;谶@些優(yōu)勢(shì)使得Python在機(jī)器學(xué)習(xí)領(lǐng)域有著廣泛的應(yīng)用[15-21]。
綜上所述,創(chuàng)傷流行病學(xué)研究對(duì)于創(chuàng)傷醫(yī)學(xué)的學(xué)科發(fā)展起到了基礎(chǔ)性支撐作用。隨著國(guó)家對(duì)各級(jí)創(chuàng)傷中心建設(shè)的大力投入,逐步有了較為規(guī)范且成規(guī)模的創(chuàng)傷臨床數(shù)據(jù)庫。這些數(shù)據(jù)庫為創(chuàng)傷流行病學(xué)研究提供了寶貴的臨床大數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行深入的整理、分析、建模能夠?yàn)閯?chuàng)傷學(xué)科的質(zhì)控、評(píng)價(jià)、發(fā)展提供客觀依據(jù),有力推進(jìn)創(chuàng)傷流行病學(xué)研究的深度和廣度。工欲善其事,必先利其器,要想充分利用這些臨床大數(shù)據(jù)推動(dòng)創(chuàng)傷流行病學(xué)研究進(jìn)入一個(gè)新高度,需要?jiǎng)?chuàng)傷醫(yī)師掌握更有力的數(shù)據(jù)分析工具。Python語言是繼R語言之后臨床醫(yī)師在數(shù)據(jù)分析、數(shù)據(jù)可視化和機(jī)器學(xué)習(xí)領(lǐng)域的又一有力武器[22-25],其在通用性、易用性等方面更具優(yōu)勢(shì),值得學(xué)習(xí)和掌握。
作者貢獻(xiàn)聲明:陳都:文章撰寫、代碼編寫及作圖;徐峰:文章立題、修改及定稿