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