浅谈Python在创伤流行病学数据分析中的应用

2022-08-17 06:48都,徐
创伤外科杂志 2022年7期
关键词:绘图流行病学代码

陈 都,徐 峰

1.苏州大学附属第一医院重症医学科,江苏 苏州 215000;2.苏州大学附属第一医院急诊科,江苏 苏州 215000

创伤对社会及家庭造成巨大负担,对创伤流行病学的研究具有重要意义[1],创伤流行病学研究可以为卫生行政部门制定相关的政策法规提供重要依据。基于创伤数据库的创伤救治质量提高计划在国外已较成熟,国内正处于快速发展阶段[2-4]。

Python是一种高级脚本语言,相较于其他语言更容易学习且功能强大。伴随Python相关第三方库的不断扩充与改进,使其成为数据分析任务的一个优选方案[5-6]。相较于临床医师常用的Excel、SPSS、Stata等数据分析工具,其在临床大数据分析方面有突出优势,目前已在众多医学学科的研究中得到应用[7-12]。本文简要介绍其在创伤流行病学研究中的相关应用,包括数据导入、数据清洗、统计分析、数据可视化以及模型建立等方面,为创伤流行病学研究提供参考。

1 Python语言简介

Python语言是一种开源、免费、跨平台的高级计算机语言,由Guido van Rossum于1989年开发。Python语言具有入门快、简单高效、运行可靠、数据处理能力强等特点[13]。近些年,Python从一个边缘的科学计算语言,成为了数据科学、机器学习、学界和工业界软件开发最重要的语言之一。基于数量庞大的开源第三方库,使其在数据分析、云计算、网络爬虫、自动化运维、Web开发、人工智能等领域得到了广泛应用。其中在数据分析领域,常用的第三方库有NumPy、Pandas、Matplotlib等。

程序编写需要使用代码编辑器,在使用Python进行数据分析时笔者推荐的代码编辑器是Jupyter Notebook。作为一款交互式记事本,支持包括Python、R在内的40多种编程语言,其实质是一款开源Web 应用程序。由于Jupyter Notebook交互式特性,使其成为一款执行端到端数据科学工作流程的便捷工具,实时代码和结果可视化集成展示的形式应用于大数据分析,适合科研人员集中实现数据的清洗、转换、分析、展示科研过程,也便于创建并共享代码和文档[14]。

对于初学者,可通过安装Anaconda软件包(https://www.anaconda.com)一步到位获取上述Python库及代码编辑器,使用较为方便。下面对Python在创伤流行病学数据分析中主要涉及的第三方库做简要介绍。

2 基于Pandas库对创伤流行病学数据的获取、清洗及基础数据分析

Pandas是Python核心数据分析支持库,提供了快速、灵活、明确的数据结构,能够简单、直观地处理关系型数据。Pandas的主要数据结构是序列(Series)和数据框(DataFrame),分别用于一维和二维数据,这两种数据结构足以处理创伤流行病学中的相关研究数据。Pandas提供了大量数据分析函数,通过直接调用这些函数可以快速高效地完成数据清洗、统计分析、数据可视化等数据分析工作。以下简单介绍该库的使用方法以及其相较于其他分析工具的优势。

要使用Pandas提供的数据结构和函数,首先导入Pandas,使用代码:import pandas as pd,表示导入Pandas并赋予别名pd,之所以取名pd只是一个约定俗成的习惯。导入Pandas后就可以调用其提供的处理结构化数据的数据结构,和函数完成数据的导入导出、筛选与排序、删除、重塑、缺失值处理、类型转换、合并与拆分、分组、数据透视、统计描述及作图等众多操作。例如,可以使用read_csv和to_csv函数完成csv格式数据文件的读取和输出,也可通过特定函数直接读取包括Excel、Stata、SAS在内的其他数据分析软件的数据文件。Pandas还可以直接读取JSON格式数据,该数据格式目前被广泛用在网络应用程序和服务器之间交换信息。另外,基于数据库模块,Python可以直接对数据库进行通信和操作,从数据库的多个数据表中提取想要的特定数据,通过Pandas转为数据框格式进一步处理,实现对大规模临床数据的操作。Pandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库灵活的数据处理功能,提供复杂精细的索引功能,能更加便捷地完成重塑、切片和切块、聚合以及选取数据子集等操作。Pandas操作数据的规模、速度、灵活性、可重复性大大优于Excel等传统数据分析工具。

Pandas不但可以轻松处理数值型数据,对文本型、日期时间型等其他类型数据同样提供了丰富的处理函数。对常规的数值型数据,Pandas提供的处理函数可以方便地完成数值型数据的类型转换、增删改查、统计分析以及数据可视化等操作;借助文本处理函数、正则表达式可以高效地完成文本数据的匹配、提取、替换、拆分、拼接、大小写转换等操作;在流行病学研究中常会用到时间序列分析探索事物在时间维度上的趋势和变化规律,进一步可进行预测建模的建立,然而很多时候获得的时间数据常被保存为文本格式,Pandas通过 to_datetime()函数可将其转为datetime64数据类型以方便重采样等操作,重采样是在时间维度上对数据进行的特定周期的分类汇总,是将时间序列从一个频率转换至另一个频率的过程,这是完成时间序列分析的常用基础操作,可以通过resample()函数完成。在文本型、日期时间型数据的处理上,Pandas有着传统分析工具难以匹及的灵活与高效。

流行病学研究中总会遇到缺失值的问题,处理缺失值是数据清洗的主要内容之一,对缺失值的处理直接关系到研究结论的可靠性。处理缺失值可直接删除或数据填补,两者均有不同的细分方法,具体选择什么样的方法最合适要结合数据缺失情况以及研究目的综合分析。Pandas对各类型数据缺失值的处理提供了丰富灵活的处理函数,可以高效完成缺失值的检测、统计、删除、替换、填补操作。删除操作时可以在行或列的方向设定缺失值的数量阈值、填补操作时可以填补均数、中位数、众数、固定值以及用前值、后值填补,特别是在处理大规模数据时其效率优势更加明显。Pandas的官方网站(https://pandas.pydata.org)提供了库的下载及安装教程,提示网站还提供了诸如官方说明文档在内的诸多学习资料,可以帮助研究者快速学习并掌握Pandas,使其成为科学研究中得力的生产力工具。

下面通过一个简单案例演示Pandas在创伤流行病学研究中的实际应用,程序代码及注释如下(程序输出内容有省略):

# 导入Pandas库并赋予别名,方便后续调用

import pandas as pd

# 从本地D盘读入要分析的数据集并创建DataFrame对象,该数据集为某年苏州市4万名创伤患者的部分临床数据

df=pd.read_csv(‘D:/Documents/sz4w.csv’)

# 查看数据集信息,了解行列数、列名及各列是否存在缺失值等信息

df.info()

# 查看前五条数据

df.head()

# 统计si列的缺失值数目

df.si.isna().sum()

# 统计得到si列的缺失值较少,使用ffill方法填补缺失值

df.si.fillna(method=‘ffill’,inplace=True)

# 对all_time进行类型转换:从object转为datatime64,便于提取时间信息及行时间序列分析

df.call_time=pd.to_datetime(df.call_time)

# 从日期时间列call_time提取月份信息生成新列month

df[‘month’]=df.call_time.dt.month

3 基于Matplotlib等绘图库对创伤流行病学数据的可视化

完成了数据的获取、清洗、转换等基础工作之后,往往还需要进行数据可视化,通过图形化的手段对数据进行简洁高效地表达,帮助研究者发现某种规律和特征。图表为更好地探索、分析数据提供了一种直观的方法,它对最终分析结果的展示具有重要作用。当对一个数据集进行分析时,如果使用数据可视化的方式,会很容易地确定数据集的分类模式、缺失数据、离群值、变化趋势等信息。在数据可视化方面,Pandas有三个优秀的第三方库,分别是:Matplotlib、Seaborn、Plotly。

Matplotlib是最流行的用于绘制图表和其他二维数据可视化的Python库,适合创建出版物上使用的图表。虽然Python还有其他的实现数据可视化的库,Matplotlib却是应用最广泛的,并且它和其他生态工具配合也非常完美,可以使用它作为默认的可视化库。同时它也提供了一部分3D绘图接口,Matplotlib通常与NumPy、Pandas一起使用,是数据分析中不可或缺的重要工具之一。Matplotlib提供了一个套面向绘图对象编程的API接口,能够很轻松地实现各种图像的绘制,并且它可以配合Python GUI工具(如 PyQt、Tkinter等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter笔记本、Web应用服务器中使用。通常只需几行代码就可以生成诸如散点图、箱图、直方图、条形图、饼图、等高线图、热力图在内的各种统计图,实现数据的可视化。

Seaborn是对Matplotlib进行二次封装。因为是基于Matplotlib,所以Seaborn的很多图表接口和参数设置与其很接近。相比Matplotlib而言,Seaborn的几个突出特点:(1)绘图接口更为集成,可通过少量参数设置实现大量封装绘图;(2)多数图表具有统计学含义,如分布、关系、统计、回归等;(3)对Pandas和NumPy数据类型支持非常友好;(4)风格设置更为多样,如风格、绘图环境和颜色配置等。正是由于上述特点,在进行探索性数据分析过程中,Seaborn往往更为高效。然而也需指出,Seaborn与Matplotlib的关系是互为补充而非替代。有些场合中Seaborn是绘图首选,而在某些特定场景下则仍需用Matplotlib进行更为细致的个性化定制。

不同于上述两个可视化库,Plotly功能更强大,且代码更简洁,不仅与多个主流绘图软件良好对接,还可实现交互式制图。Plotly图表种类齐全,除了可以绘制常见的基本图表,还可以绘制科学图表、财务图表、地图、3D图表、流动图表等。交互性:可以与R、Python、Matlab等软件对接,并且是开源免费的,Plotly与Python中Matplotlib、NumPy、Pandas等库可以无缝集成,可以做出很多非常丰富的交互性图表,创建图形相对简单,申请了API密钥后,还可以在线一键将统计图形同步云端;制图美观:基于现代的配色组合、图表形式,比R语言等的图表更加现代、美观。图1展示了基于Plotly内置数据集绘制的具有交互功能的动态气泡图,该图使用了很少量代码全面展示了不同地区人均GDP与预期寿命的关系以及随着时间的变化趋势。此类图表非常适合用来展示流行病学相关数据的时间变化趋势。程序代码及注释如下:

图1 Plotly绘制的具有交互功能的动态气泡图

df=px.data.gapminder()#获取数据集

px.scatter(df,x="gdpPercap", y="lifeExp",

size="pop", #气泡大小反映人口数量

size_max=50,

color="continent", #颜色区分地区

hover_name="country", #设置鼠标悬停信息

log_x=True, #设置对数坐标

range_x=[100,100000],

range_y=[30,90],

animation_frame="year")

上述三个绘图库均可通过其官网进行更深入的了解,网站中提供了详细的教程及参考手册,参照网站中的举例及相应代码,赋值手中的数据即可实现对创伤流行病学数据的可视化展示。相较于传统数据分析工具,其绘图功能更加强大,高效且美观。

4 基于Scikit-learn库对创伤流行病学数据的机器学习及建模

在创伤流行病学研究中,对于采集到的数据除了要进行归档、整理、常规统计分析及可视化展示之外,很多时候还需要基于历史数据建立预测模型,用于评估患者的预后、判断是否为高危人群等,这就涉及到统计建模和机器学习。Python在这方面具备针对性的第三方库及标准化的建模流程,可以帮助研究者快速建立并优选最佳模型。其中Scikit-learn自2010年诞生已成为Python通用的机器学习工具包,其子模块可以完成以下6大任务:(1)分类:支持向量机、K近邻、随机森林、逻辑回归等;(2)回归:Lasso回归、岭回归等;(3)聚类:K-均值、谱聚类等;(4)降维:主成分分析、特征选择等;(5)模型选择:网格搜索、交叉验证、度量;(6)预处理:特征提取、标准化。实际应用时可以参考网站Scikit-learn算法选择路径图(网址:https://scikit-learn.org/stable/tutorial/machine_learning_map/)进行算法选择,通过参考官方帮助文档及实例演示完成机器学习模型的构建及评价。区别于Scikit-learn,Statsmodels包含了经典统计学和计量经济学算法,包括如下子模块:回归模型、方差分析、时间序列分析、统计模型结果可视化等。在机器学习方面,目前常用的工具除了Python还有R语言、Stata等,Python的优势在于其是通用编程语言、学习曲线平滑、大量的重要库、更好的集成性以及更高的生产效率。基于这些优势使得Python在机器学习领域有着广泛的应用[15-21]。

综上所述,创伤流行病学研究对于创伤医学的学科发展起到了基础性支撑作用。随着国家对各级创伤中心建设的大力投入,逐步有了较为规范且成规模的创伤临床数据库。这些数据库为创伤流行病学研究提供了宝贵的临床大数据,对这些数据进行深入的整理、分析、建模能够为创伤学科的质控、评价、发展提供客观依据,有力推进创伤流行病学研究的深度和广度。工欲善其事,必先利其器,要想充分利用这些临床大数据推动创伤流行病学研究进入一个新高度,需要创伤医师掌握更有力的数据分析工具。Python语言是继R语言之后临床医师在数据分析、数据可视化和机器学习领域的又一有力武器[22-25],其在通用性、易用性等方面更具优势,值得学习和掌握。

作者贡献声明:陈都:文章撰写、代码编写及作图;徐峰:文章立题、修改及定稿

猜你喜欢
绘图流行病学代码
小儿手足口病的流行病学特征及预防分析
编辑部故事
斯诺医生——流行病学调查基本方法创立者
健康体检常见慢性病及指标异常流行病学分析
细菌性食物中毒的流行病学调查分析
叮咚鸟
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
绘图机器人