书名:Python医学数据分析入门
ISBN:978-7-115-57543-2
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
编 著 赵 军 刘文婷
责任编辑 王峰松
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
数据分析是当今大数据时代最关键的技术,其广泛应用于包括医学在内的各个领域。Python语言简单易用,第三方库功能强大,提供了完整的数据分析框架,深受广大数据分析人员的青睐。
本书涵盖传统的统计分析方法和较为复杂的机器学习算法,结合大量精选的实例,使用Python进行数据分析,对常用分析方法进行深入浅出的介绍,以帮助读者解决数据分析中的实际问题。
本书强调实战和应用,尽量淡化分析方法的推导和计算过程,大量的Python程序示例是本书的亮点。阅读本书,读者不仅能掌握使用Python及相关库快速解决实际问题的方法,还能更深入地理解数据分析。
本书不仅适合临床医学、公共卫生及其他医学相关专业的本科生和研究生使用,亦可作为其他专业的学生和科研人员学习数据分析的参考书。
随着我国医疗卫生事业的发展与壮大,广大医学工作者对数据分析方法的需求也越来越大。医疗健康领域的从业人员往往具有较强的专业知识,但缺乏对数据分析和人工智能技术的认知和运用能力,无法充分发挥和利用医疗数据的价值。在数据分析领域,Python语言简单易用,第三方库功能强大,提供了完整的数据分析框架,深受广大数据分析人员的青睐。因此,编写本书的主要目的是结合医学数据系统地介绍如何利用Python进行数据分析,以帮助读者解决数据分析中的实际问题。本着让非专业读者易于理解的原则,本书强调实战和应用,着重介绍数据分析的思路和方法及其实质、特点、应用条件和结果,尽量淡化分析方法的推导和计算。
本书各个章节的内容按照由浅入深的顺序进行安排。全书可以分为三部分。
第一部分包括第1~6章。其中前3章介绍了Python语言的基本用法;第4章和第5章分别介绍了数据分析的两个基本库——NumPy和Pandas,涵盖了基本数据操作和数据预处理的方法;第6章介绍了如何用Python进行数据可视化操作,重点介绍了Matplotlib库和Seaborn库。
虽然大多数统计学检验也可以使用统计学模型的方法来完成,但是在很多情况下,统计模型并不是所有生物医学研究所必需的。因此,本书第二部分介绍了常用统计分析方法,包括基本的统计描述和统计推断。其中,第7章介绍了描述性统计分析和各种单因素分析方法;第8章结合实际数据介绍了医学研究中最常用的4种回归模型,即线性模型、Logistic回归模型、Poisson回归模型和Cox回归模型。
第三部分由第9~11章组成,主要讲述机器学习算法。第9章介绍了如何使用Scikit-learn实现简单高效的数据挖掘和机器学习算法,第10章介绍了如何使用TensorFlow建立和验证深度学习模型,第11章介绍了如何使用卷积神经网络模型对图像进行分类。
全书共计11章,并且各章自成体系。读者可以从头至尾逐章学习,也可以根据自己在实际中遇到的问题有选择地在相应章节寻找解决方案。书中配有大量的案例解析和程序示例,以及使用Python绘制的图形,所有代码均在Python 3.8.5环境下运行通过。书中每一章都配有习题,书末附有习题参考答案。书中所有的示例数据和代码均可以从异步社区(https://www.epubit.com)下载。
本书不仅适合临床医学、公共卫生及其他医学相关专业的本科生或研究生使用,亦可作为其他专业的学生和科研人员学习数据分析的参考书。希望本书能够让读者更深入地理解数据分析,并进一步促进开源软件在医学领域的应用。
本书参阅了许多国内外教材和资料,并引用了部分示例数据,在此向相关作者表示衷心的感谢。本书得到了湖北医药学院公共卫生与健康学院和研究生院的支持,在此也表示诚挚的谢意。此外,特别感谢人民邮电出版社的王峰松编辑在本书出版过程中给予的支持和协助。
本书前8章由赵军编写,后3章由刘文婷编写。由于编者水平有限,书中难免存在不妥和谬误之处。读者可以将书中的错误及遇到的任何问题反馈给我们,欢迎发送邮件至邮箱zhaojun@hbmu.edu.cn。
编 者
2021年7月
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
示例代码;
书中彩图。
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入错误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/contribute即可)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社数十年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。
异步社区
微信服务号
本章主要介绍为什么要使用Python语言进行数据分析,以及初次使用Python时的一些基本操作,包括相关软件的安装与配置、Python命令的基本语法和基本操作等。
在IEEE Spectrum发布的2020年编程语言排行榜中,Python高居榜首,这是Python连续第四年夺冠。Python语言是Guido van Rossum在20世纪90年代初开发的一种高级编程语言。作为一种面向对象的解释型语言,Python的设计哲学强调代码的可读性和语法的简洁性。相比于C++或Java语言,Python能让开发者用更少的代码表达想法。Python支持模块和软件包,鼓励模块化和代码重用。
Python有Python 2和Python 3两个版本。Python官方在2020年宣布停止Python 2的更新和维护,全面进入Python 3时代。因此,本书的代码以Python 3为基础。
医学数据分析是统计学与医学专业知识的结合。而无论是统计计算还是数据的可视化都离不开计算机软件。市面上有很多流行的统计和做图软件,如SPSS、SAS、Stata、R等,为何要选择Python呢?具体来讲,Python有如下优势:
Python拥有大量的软件包/库,下面几个库广泛运用于数据分析领域。
用户可以从Python的官方网站免费下载Python的安装程序。根据不同的计算机操作系统下载相应版本的安装程序,然后执行该安装程序,按照提示进行操作即可完成安装。近年来,Python的发行版Anaconda越来越流行。使用Anaconda安装Python有助于安装数据分析领域的常用库。此外,Anaconda还附带了集成开发环境Jupyter notebook和Spyder。因此,笔者推荐使用免费的发行版Anaconda安装Python的最新版本。
在Windows或MacOS操作系统中安装Anaconda非常简单。以Windows系统为例,首先从Anaconda官网网站下载个人版的安装文件。请注意根据不同的计算机处理器选择下载不同的版本(64位或者32位)。下载完成后双击该exe执行文件就可以进行安装。安装过程中全程默认即可。最后把Anaconda设置为系统的默认Python环境。
在Linux操作系统中安装Anaconda时,首先从Anaconda官网网站(/products/individual)下载.sh文件,然后从命令行运行它。如果处在服务器上,可以使用wget命令。假设.sh文件位于downloads文件夹下,输入下面的命令:
cd ~/downloads
bash Anaconda3-2021.06-Linux-x86_64.sh
请注意,Anaconda的版本号会随时间发生变化。因此,上面命令中的.sh文件名可能不同。
安装过程中可以保持默认设置不变,出现安装提示时按回车键或者单击“Yes”。当最后安装程序提示是否将Anaconda写到PATH时,输入“Yes”。这样Anaconda就设置为系统中默认的Python环境了。
安装Anaconda后,除了Python的标准库之外,1.3节介绍的几个重要的库就已经安装到系统中了。Anaconda提供了Anaconda Prompt(位于“开始”菜单中),它类似于常见的Windows命令提示符,是为Anaconda Python版本定制的。在Anaconda Prompt提示符下输入下面的命令可以安装默认存储库conda中的包:
conda install package_name
如果用户还想安装Anaconda中没有的包,可以使用pip包管理工具进行安装:
pip install package_name
用户还可以使用如下命令更新某一个包:
conda update package_name
下面的命令可以更新conda环境中所有的包:
conda update –all
Anaconda安装完成后会在主目录创建一个“anaconda3”的文件夹。这个文件夹的根目录里有可执行文件“python.exe”,双击该文件即可打开Python,如图1-1所示。
图1-1 Python界面
图1-1中的第一行显示的是Python的版本号和该版本发布的时间。第二行给出了帮助、版权和许可等信息的查询方式。第三行的符号“>>>”是命令输入提示符,用户可以在其后面直接输入命令。Python提供的是一种交互式的运行环境,用户输入需要执行的命令,然后按回车键就可以执行该命令。如果命令符合语法规则,Python就会执行该命令,并将输出结果直接显示在后面。例如:
>>> print("Hello, world")
Hello, world
上面的命令调用了print函数。函数是Python中最重要的代码组织和代码复用方式。调用函数只需用函数名加括号,括号里可以设定参数以控制函数的输出。
库以有组织和打包的方式提供了额外的功能。除了使用Python标准库,用户经常需要导入其他库。导入库的方法有多种,最基本的方法就是直接使用库的名称。例如,我们想要导入NumPy库,可以在控制台输入下面的命令:
>>> import numpy
导入之后,就可以通过点操作符使用其中的函数了。例如:
>>> numpy.sqrt(4)
2.0
Python支持为库起别名,这样就可以使用较短的名称来代替较长的库名了。起别名时,需要用到关键字as,别名跟在as之后。例如:
>>> import numpy as np
上面的语句为numpy起了别名np,这样就可以在代码中使用np来指定NumPy库了。例如,上面求平方根的命令等价于:
>>> np.sqrt(4)
有时只需要使用某个库的某一个或某几个函数,用户可以用下面的语句导入特定的函数:
>>> from pandas import read_csv
这样就可以在代码中直接使用read_csv函数,而无须在其前指明它所属的库了。但是,需要注意的是,很多库包含同名的函数,例如numpy库和math库都包含名为sqrt的函数。如果不指明函数所属的库,用户可能不知道最后调用的是哪一个库的函数了。所以,写成numpy.sqrt和math.sqrt这样会使代码更清晰。
Python社区对一些常用的库采用了命名的约定,本书中导入这些库时也将采用这种约定:
>>> import numpy as np
>>> import pandas as pd
>>> import matplotlib.pyplot as plt
>>> import seaborn as sns
>>> import statsmodels as sm
在进行数据分析时,通常需要输入很多代码来完成一项工作。虽然Python终端和文本编辑器都可以编写Python代码,但会很不方便。Anaconda提供了Jupyter notebook和一个集成开发环境(IDE)——Spyder。
Jupyter notebook会在Web浏览器中打开一个Python界面,它会在计算机的某个位置打开,而不需要网络连接。打开后的界面如图1-2所示。
用户可以单击右上角的“New”按钮并选择“Python3”来创建一个新的“notebook”。打开“notebook”后可以在其中键入python命令,如图1-3所示。每个单元格都提供一个区域,可以在其中输入代码。输入一行后,用户可以使用“Cell”菜单栏中的命令来运行单元格,或者使用快捷键“Ctrl+Enter”运行当前单元格。而快捷键“Shift+Enter”不仅会运行当前单元格,还会在该单元格下面新建一个单元格。
图1-2 本地浏览器的Jupyter notebook主页
图1-3 Jupyter notebook界面
熟悉Matlab或者RStudio的用户可能会更加青睐Spyder。它除了具有高亮显示代码、自动补全命令等基本功能,还提供了图形设备、对象管理器、调试工具等高级功能。Spyder的启动界面如图1-4所示,由代码编辑区(左)、环境资源栏(右上)和命令控制台(右下)组合而成。
图1-4 Spyder界面
代码编辑区可以进行代码的编辑和调试。代码运行后会在右下方的命令控制台(IPython console)显示相应的代码和返回结果,命令控制台也可以单独输入和运行命令,还可以显示命令的历史记录(History)。环境资源栏可以显示当前工作环境下的全部变量(Variable explorer)、帮助文档(Help)、图形输出(Plots)、文件管理(Files)等。
最上面的菜单栏与其他常用软件类似,包括文件(File)、编辑(Edit)、搜索(Search)、运行(Run)、工具(Tools)和帮助(Help)等。其中,最常用的是工具下面的偏好(Preferences)菜单设置,里面包含了很多关于文件管理和代码编辑的设置。这里可以将其中的当前工作目录(Current working directory)设为自己定义的一个文件夹。菜单栏最右边的帮助(Help)里面可以获取关于Spyder的帮助文档,还给出了代码编辑的快捷键。使用常用的快捷键会大幅提高代码编辑的效率。
在使用Python时,帮助文档是非常有用的,尤其是对于初学者来说。使用命令help可以进入help帮助文档界面:
>>> help()
Welcome to Python 3.8's help utility!
If this is your first time using Python, you should definitely check out
the tutorial on the Internet. . .
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".
help>
继续键入相应关键词进行查询。例如,继续键入“modules”可以列出当前所有安装的模块,包括库。使用help函数也可以查看某个库或者函数的帮助文档。例如,要查看math库的帮助文档,可以输入:
>>> import math
>>> help(math)
Help on built-in module math:
NAME
math
DESCRIPTION
This module provides access to the mathematical functions
defined by the C standard.
FUNCTIONS
acos(x, /)
Return the arc cosine (measured in radians) of x.
...
要查看函数round的帮助文档,可以输入:
>>> help(round)
Help on built-in function round in module builtins:
round(number, ndigits=None)
Round a number to a given precision in decimal digits.
The return value is an integer if ndigits is omitted or None. Otherwise
the return value has the same type as the number. ndigits may be negative.
或者,更简单地,输入:
>>> ?round
注意,如果要查看帮助的对象不在Python标准库而在第三方库里,需要先导入库。例如,要查看numpy库里的函数mean的帮助文档,可以输入以下命令:
>>> import numpy as np
>>> help(np.mean)
Help on function mean in module numpy:
mean(a, axis=None, dtype=None, out=None, keepdims=<no value>)
Compute the arithmetic mean along the specified axis.
Returns the average of the array elements. The average is taken over
the flattened array by default, otherwise over the specified axis.
'float64' intermediate and return values are used for integer inputs.
Parameters
----------
a : array_like
Array containing numbers whose mean is desired. If 'a' is not an
array, a conversion is attempted.
...
在后面的章节我们会看到,有些函数与特定对象绑定使用,用点操作符“.”连接,称之为方法。要获取方法的帮助,需要加上特定对象的属性。例如,用下面的命令可以获取列表(list)的pop方法的使用帮助:
>>> help(list.pop)
Help on method_descriptor:
pop(self, index=-1, /)
Remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.
Python一个最基本但又很有用的功能是进行简单的数值计算。Python有3种数值类型,即整数型、浮点型和复数型。
表1-1列出了Python中常用的算术运算符。
表1-1 算术运算符
运算符 |
描述 |
---|---|
+ |
加法 |
− |
减法 |
* |
乘法 |
/ |
除法 |
** |
求幂 |
% |
求余 |
// |
整数除法 |
下面是简单数值计算的示例:
>>> 1 + 1
2
>>> 2 * 3
6
>>> 4 / 2
2.0
>>> 2 ** 3
8
>>> 3.2 * 2.4
7.68
>>> (3 + 5j) + (4 - 2j)
(7+3j)
注意,用“/”对整数做除法,得到的结果是浮点型数值。
除了运算符,用户还可以用Python中的内置函数操作数值。例如,求绝对值:
>>> abs(-2)
2
对于稍微复杂一些的数值计算,需要导入math库后使用其中的函数。表1-2列举了math库中的一部分常用函数。
表1-2 math库中的一部分常用的函数
函数 |
描述 |
---|---|
math.sqrt(x) |
求x的平方根 |
math.sin(x)、math.cos(x)、math.tan(x) |
求x的正弦、余弦、正切 |
math.asin(x)、math.acos(x)、math.atan(x) |
求x的反正弦、反余弦、反正切 |
math.exp(x) |
求e的x次方 |
math.log(x)、math.log2(x)、math.log10(x) |
求x的自然对数、以2为底的对数、以10为底的对数 |
math.ceil(x) |
求不小于x的最小整数 |
math.floor(x) |
求不大于x的最大整数 |
math.trunc(x) |
截取x的整数部分 |
尝试输入并运行下面的命令:
>>> import math # 导入math包
>>> math.sqrt(4) # 计算4的平方根
2.0
>>> math.exp(2) # 计算e的平方
7.38905609893065
>>> math.log(10) # 计算10的自然对数
2.302585092994046
>>> math.ceil(3.48) # 计算不小于3.48的最小整数
4
>>> math.floor(3.48) # 计算不大于3.48的最大整数
3
在上面的代码中,符号“#”后面的文字是注释,Python会自动忽略每行命令里面“#”后面所有的输入。对比较复杂的代码添加注释是一个很好的习惯。
在math库中还包括两个常数值,即圆周率和自然常数。
>>> math.pi
3.141592653589793
>>> math.e
2.718281828459045
如果想把圆周率四舍五入,只保留两位小数,可以使用函数round:
>>> round(math.pi, ndigits = 2)
3.14
其中,“ndigits”是函数round里的一个参数,我们可以改变它的值以得到不同的输出效果。此外,因为这个参数位于该函数所有参数的第二个位置,所以参数名在这里可以省略,Python会自动将第二个输入的值赋给该参数。例如:
>>> round(math.pi, 4)
3.1416
Python是面向对象的编程语言。在Python中,“一切皆对象”。数据分析包括很多步骤,从数据整理、探索、建模到可视化,每个步骤都需要处理不同的对象,例如列表、数据集、函数、模型等。
对于一些简单的计算,可以把计算结果直接显示在屏幕上而不存储。但更多的时候,我们需要把结果存储在某个对象中。例如:
>>> a = 3 + 5
>>> print(a)
8
符号“=”用于赋值。函数print用于打印输出,直接输入对象名等价于调用函数print作用于对象。
>>> a
8
Python区分大小写,字符“a”与“A”的意义是不同的。这点对于初学者来说是非常值得注意的。
>>> A
NameError: name 'A' is not defined
现在创建第二个对象“b”:
>>> b = -2
然后,把两个对象相加:
>>> a + b
6
对象的名字可以由一个或一个以上的字符组成。对象名可以以字母或下划线“_”开头,后面可以连接字母、数字或下划线。例如:
>>> x1 = 1
>>> x1
1
>>> hours_per_day = 24
>>> hours_per_day
24
前面定义的都是数值型对象,Python中还有字符型和逻辑型对象等。
字符型对象由字符串构成,用引号来指定,可以是单引号、双引号、三引号,但必须要配对使用。例如,人的名字、地址、邮政编码等都需要用字符串表示。字符串对象不能进行算术运算。
>>> A = "Hubei University of Medicine"
>>> A
"Hubei University of Medicine"
字符串中的反斜杠表示转义字符,即有特殊含义的字符。表1-3列出了常用的转义字符。
表1-3 常用的转义字符
转义字符 |
含义 |
---|---|
\n |
换行符 |
\ |
反斜杠 |
\" |
双引号 |
\t |
制表符 |
Python还允许使用r" "的方式表示" "内的字符串默认不转义。例如:
>>> print("Data\nAnalysis")
Data
Analysis
>>> print(r"Data\nAnalysis")
Data\nAnalysis
逻辑型对象常常是一些关系运算或逻辑运算的结果,其取值为True或False。表1-4列出了常用的关系和逻辑运算符。
表1-4 常用的关系和逻辑运算符
运算符 |
描述 |
---|---|
a > b |
a大于b则为True,否则为False |
a < b |
a小于b则为True,否则为False |
a == b |
a与b相等则为True,否则为False |
a != b |
a与b不相等则为True,否则为False |
a >= b |
a大于或等于b则为True,否则为False |
a <= b |
a小于或等于b则为True,否则为False |
a & b |
a与b |
a | b |
a或b |
输入下面几个命令并观察输出结果:
>>> 3*3 == 3**2
True
>>> 3*2 == 3**2
False
>>> 3*2 < 3**2
True
注意,检查等价性需要用双等号,一个等号表示赋值。
“&”(逻辑与)和“|”(逻辑或)可以用于连接多个逻辑型对象,其连接结果为True或False。
>>> (3*3 == 3**2) & (3*2 == 3**2)
False
>>> (3*3 == 3**2) | (3*2 == 3**2)
True
另外,逻辑型对象的取值True和False分别对应于整数1和0,可以进行数值运算。
>>> True == 1
True
>>> False == 0
True
>>> (3*3 == 3**2) + (5 > 4)
2
除了数值、字符串、逻辑型等标准类型对象之外,Python还有一种特殊的数据类型,即空值None。在Python中只有一个None对象。None通常被用作占位符,用于指示数据结构中某个位置的数据是有意义的但尚未计算出来。
工作目录(working directory)用于向程序指明“大本营”或引用位置所在。每当Python运行时,有一个当前工作目录(current working directory)的概念。输入的Python代码将在当前工作目录保存为“.py”的文件。
Python中的os库提供了非常丰富的方法用来处理文件和工作目录。os是Python的标准库,无须单独安装,可直接导入使用。例如,要想查看当前的工作目录,可以用函数os.getcwd。
>>> import os
>>> os.getcwd()
注意,调用函数os.getcwd时是不带参数的,以强调返回值不是固定不变的。用户还可以使用函数os.chdir修改当前的工作目录。把某个分析项目的所有文件保存在一个文件夹里会给项目管理带来便利,分析效率会提高。因此,在一个代码脚本文件的第一行,通常可以先设定工作目录。例如:
>>> os.chdir("C:/myprojects/project1")
注意,这里的指定路径下必须存在文件夹“project1”,如果没有,可以用函数os.mkdir创建,或者在计算机系统里面手动创建。
1.请在Python的控制台依次输入以下命令,理解Python的交互过程。
>>> 2 + 3 * 5
>>> import math
>>> x = 4 - math.pi/2
>>> y = x + 1
>>> round(y, 2)
>>> math.floor(y)
2.请使用Anaconda Prompt安装“NumPy”库和“Pandas”库。
3.请导入NumPy库,并查看其中的函数arange的帮助文档。
4.在患病率调查研究中,计算样本量的公式为:
其中为样本量,为总体的患病率,δ为估计的精确度(置信区间长度的一半)。如果患病率估计为20%,并且95%置信区间不超过估计的患病率的30%,试用Python计算所需的样本量。