點擊關注 異步圖書,置頂公眾號
每天與你分享 IT好書 技術乾貨 職場知識
參與文末話題,得異步新書
在我自己的研究工作中,當我進行數據分析時,有兩件事情經常讓我深陷泥沼:(1)我了解的統計學知識不夠多;(2)市面上的書籍大多是理論性的,缺少一些實踐上的幫助。
你手上拿著的(或者在你的平板電腦或筆記本電腦上的)這本書就是要解決這兩個關鍵問題。這本書將為你提供足夠的統計學領域知識,這樣你就不會迷失,與此同時,這本書也會教你使用統計學分析所需要的工具。
我認為Python提供的解決方案能夠解決生物學家、物理學家、醫學博士們在他們的工作中遇到的90%的問題。如果你正在攻讀研究生學位,或者是一個正在分析最近實驗數據的醫學研究者,那麼你將會在本書中找到你所需要的工具和它們的使用說明及原始碼。
基於上述原因,本書將重點講解統計學的基礎知識和假設檢驗,並簡單地介紹其他的統計學方法。
我明白本書中介紹的大多數統計學檢驗也可以使用統計學建模的方法來完成。但是在大多數情況下,統計學建模並不是生命科學領域的期刊所使用的方法論。高級的統計分析超出了本書的範圍,並且坦率地說,也超出了我對統計學的了解。
1.1.1 慣例在這本書中,將會使用下面一些慣例。
命令行語句中的可選文字將會以方括號加下劃線的形式表示,例如,[_InstallationDir_]\bin。(我額外加上了下劃線是因為有時候方括號會在命令語句中使用。)
本書所有示例代碼都可以免費使用。完整的程序列表、生成圖表的Python代碼可以在github的這個倉庫找到:https://github.com/thomas-haslwanter/statsintro_python.git。在目錄ISP(代表「Introduction to Statistics with Python」的縮寫)下面有這些子目錄。
Exercise_Solutions包含了書中練習的解答,也被印刷在本書的末尾。Listings包含了在本書中明確列出的程序。Figures列出了所有生成本書中圖表的代碼。
Code_Quantlets包含了按照章節組織的,所有帶有「代碼」標誌的代碼。
在github上的包被叫作「倉庫」,它很容易就能複製到你的電腦上。如果你電腦上安裝了git,只需要簡單地輸入:
git clone [_RepositoryName_]
這樣,整個「倉庫」——代碼和數據都會被「克隆」到你的系統裡。
1.1.2 發行版和包1.關於統計學的Python包Python的核心發行版只包含了通用編程的基礎特性。例如,它竟然沒有包含一個專門為高效率處理向量和矩陣的模塊!這些專業化的包是由有奉獻精神的志願者開發的。這些和統計應用有關的最重要的包之間的關係如圖1.1所示。
圖1.1 關於統計應用的最重要的Python包的結構關係
為了方便Python的使用,一些Python發行版會匯總一些相匹配版本的重要包,我強烈建議你一開始就使用這些發行版中的一個,否則的話你會很快淹沒在大量可用的Python包的海洋中。
我最喜歡的Python發行版有以下這些。
這兩個發行版都不需要管理員權限。我目前正在用的是WinPython,它不僅免費而且方便定製。Anaconda最近變得非常流行,而且出於教育需要的話是免費的。
除非你對64位版本有特殊需求,你最好還是安裝32位版本的Python:這會讓你在許多需要彙編各個模塊的時候更容易一些,例如,貝葉斯統計(PyMC)或者你想要用Cython加速你的程序。
由於本課程中用到的Python包都支持Python 3.x,所以我在本書中會使用Python 3。然而,本書中包含的所有代碼也能在Python 2.7下工作。
確保你使用了最新版的IPython/Jupyter(4.x),因為本書中提供的Jupyter Notebook不能在IPython 2.x下工作。
本書中用到的程序都在Windows和Linux平臺的Python 2.7.10和Python 3.5.1環境測試通過,這些程序的版本信息如下。
IPython 4.1.2用於交互式工作。
numpy 1.11.0用於向量和數組。
scipy 0.17.1所有基礎的科學算法,包括基礎的統計學。
matplotlib 1.5.1繪圖和可視化的事實標準。
pandas 0.18.0給Python加上數據框(想像成一個強大的電子表格)。
patsy 0.4.1用於統計學公式。
statsmodels 0.8.0用於統計學建模和高級分析。
seaborn 0.7.0針對統計數據進行可視化。
除了上面這些相當常規的包之外,本書中也使用了下面這些專門的包。
xlrd 0.9.4用於讀寫微軟Excel文件。
PyMC 2.3.6用於貝葉斯統計,包括馬爾可夫鏈蒙特卡洛模擬。
scikit-learn 0.17.1用於機器學習。
scikits.bootstrap 0.3.2為scipy提供自助法置信區間算法。
lifelines 0.9.1.0在Python中進行生存分析。
rpy 2.7.4提供一個在Python中運行R函數的包裝器。
大部分這些包都隨WinPython和Anaconda發行版提供,或者能夠很容易用pip或conda進行安裝。
要讓PyMC運行,你可能需要安裝一個C編譯器。在我的Windows平臺上,我安裝了Visual Studio 15,並且把環境變量設置為SET VS90COMNTOOLS=%VS14COMNTOOLS%。
為了在Python中使用R的函數,你需要安裝R。像Python一樣,R也是免費的,可以在Comprehensive R Archive Network上下載,我寫本書時最新的版本是R-3.3.0。
2.PyPI:Python包目錄Python包目錄(PyPI)是Python程式語言的軟體倉庫,目前它有超過80000個包!
在Windows的命令提示符(cmd)或Linux的終端下,用下面的命令可以很容易地安裝來自PyPI的包:
pip install [_package_]
想要更新包,用這個命令:
pip install [_package_] -U
列出安裝在你電腦上的所有Python包,輸入:
pip list
Anaconda使用了一個更強大的安裝管理器,叫conda。不過pip也能和Anaconda兼容使用。
1.1.3 安裝Python1.在Windows下無論WinPython還是Anaconda的安裝都不需要管理員權限。
WinPython
在下文中,我假定[_WinPythonDir_]是WinPython的安裝目錄。
從https://winpython.github.io/ 下載WinPython。
運行下載的exe文件,並將WinPython安裝到你選擇的[_WinPythonDir_]文件夾下。
安裝完成後,通過輸入Win -> env -> Edit environment variables for your account改變你的Windows環境變量。
將[_WinPythonDir_]\python-3.5.1; [_WinPythonDir_]\python-3.5.1\Scripts\加入你的PATH環境變量(這可以讓你從標準命令行訪問Python和IPython)
如果你有管理員權限,你應該通過下面命令激活環境:[\_WinPythonDir\_]\WinPython Control Panel.exe -> Advanced -> Register Distribution(這會把py文件和Python發行版關聯起來)。
Anaconda
從https://store.continuum.io/cshop/anaconda/下載Anaconda。
根據網頁上的指示進行安裝。在安裝期間,同意Anaconda建議的對你的環境變量PATH的修改。
在安裝結束後,在Anaconda啟動器中,點擊「更新」(包括軟體本身),這樣能確保你運行的是最新的版本。
2.在Linux下下面的流程在Linux Mint 17.1下能正常運行。
下載Anaconda for Python 3.5(我用的是64位的版本,因為我安裝的是64位的Linux Mint)。
打開終端(terminal),切換到你下載文件的位置。
用bash Anaconda3-4.0.0-Linux-x86.sh命令安裝Anaconda。
用sudo apt-get update更新你的Linux系統。
在Mac OS X下下載Anaconda是很簡單的,你只需要:
訪問continuum.io/downloads;
選擇Mac安裝器(確保你選擇的是Mac OS X Python 3.x圖形安裝器),然後根據按鈕旁邊列出的指示操作;
安裝之後,在Anaconda啟動器中,單擊update(包括軟體本身),確保你運行的是最新版本的Anaconda。
安裝之後,Anaconda應該會出現在你的桌面上。我們不需要管理員密碼。下載好的Anaconda版本裡包括了Jupyter Notebook、Jupyter qtconsole和IDE(集成開發環境)Spyder。
想看哪些包(比如numpy、scipy、matplotlib和pandas等)在安裝的時候添加好了,可以去Anaconda Package List查看對應Python版本的列表。
1.1.4 安裝R和rpy2如果你之前沒有使用過R,你可以安全地跳過這個部分。然而,如果你是一個熱情的R使用者,那麼下面這部分的配置將通過rpy2這個包,給你的Python賦予R強大的能力。
1.在Windows下同樣,安裝R也不需要管理員權限。你可以在http://cran.r-project.org/下載到最新版本的R,並且安裝到你選擇的[RDir]安裝目錄。
WinPython
在安裝R之後,將下面兩個變量加入Windows環境,你可以通過鍵入下面的命令完成:
Win -> env -> Edit environment variables for your account:
– R_HOME=[_RDir_]\R-3.3.0
– R_USER=[_YourLoginName_]
第一條是使用rpy2必需的,第二個並不是必需的,只是為了更好看。
Anaconda
Anaconda並沒有自帶rpy2。所以在安裝了Anaconda和R之後,你應該:
從http://www.lfd.uci.edu/~gohlke/pythonlibs/下載rpy2,Christoph Gohlkes的Unofficial Windows Binaries for Python Extension Packages是Python社區的中堅力量之一——多謝了,Christoph!
打開Anaconda command prompt(命令提示符)
用pip安裝rpy2。我安裝的時候,用的是這個命令:
pip rpy2-2.6.0-cp35-none-win32.whl
2.在Linux下在安裝Anaconda後,用下面的命令安裝R和rpy2:
conda install -c https://conda.binstar.org/r rpy2
Python命令行
Python是一門解釋性語言。打開Python最簡單的方法就是在命令行中輸入python。(當我說命令行的時候,我指的是Windows下用cmd命令打開的命令提示符,以及Linux或Mac OS X下的terminal)。
接下來你就已經可以執行Python的命令了。比如將「Hello World」輸出到屏幕的命令:print(『Hello World』)。在我的Windows電腦上,該命令輸出如下:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25)
[MSC v. 1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello World')
Hello World
>>>
然而,我從未用過這個基本的Python命令行,但經常從IPythn/Jupyter qtconsole開始著手(詳見2.3部分)。
Qt console是一個有很多優點的交互式編程環境。比方說,當你在Qt console中輸入print後,你會立即看到print命令的可能的輸入參數的信息。
Python模塊
我們經常會想把命令存在一個文件中以供後續使用。Python文件的後綴是.py,代表著Python的模塊。讓我們創建一個名為helloWorld.py的文件,包含下面這行代碼:
print('Hello World')
在命令行輸入python helloWorld.py可以執行這個文件。
在Windows系統下,你還可以直接雙擊該文件就能運行,或者,如果.py後綴和你電腦中安裝的Python程序關聯起來了,直接輸入helloWorld.py也能運行。在Linux和Mac OS X下,該過程更複雜一點。
在這兩個系統下,你需要在文件的開頭加上額外的一行,在這行中指明安裝好的Python的路徑。
#! \usr\bin\python
print('Hello World')
在這兩個系統中,在你執行helloWorld.py之前,你還需要輸入chmod +x helloWorld.py來讓這個文件可以被執行。
2.SquareMe(將我平方)為了提升複雜度,讓我們寫一個模塊,這個模塊會輸出從0到5的數字的平方。我們將這個文件命名為squareMe.py,這個文件由下面的代碼組成。
清單1.1 squareMe.py
1 # 該文件展示0~5的平方
2
3 def squared(x):
4 return x**2
5
6 for ii in range(6):
7 print(ii, squared(ii))
8
9 print('Done')
讓我們逐行地解釋這個文件中都發生了什麼。
1 以#開頭的第一行,代表的是注釋行。
3~4 這兩行定義了一個squared函數,該函數將變量x作為輸入,返回該變量的平方。
6~7 這個程序在最開始的6個數字裡循環。同樣,for循環的範圍也由代碼的縮進確定。在第7行中,每一個數字和它的對應的平方都被輸出了。
9 這行代碼沒有縮進,所以在for循環結束後被執行。
2.1.1 Python數據類型Python提供了許多功能強大且易於使用的數據結構,你可以使用如下數據結構。
元組(Tuple) 一個不同類型對象的集合,元組是「不可變的」。也就是說,在創建之後無法更改其中的元素。
In [1]: import numpy as np
In [2]: myTuple = ('abc', np.arange(0,3,0.2), 2.5)
In [3]: myTuple[2]
Out[3]: 2.5
列表(List) 不同於元組,列表是「可變的」。也就是說列表的元素是可以被更改的,因此,列表經常被用來收集相同類型的元素(例如數字、字符串等)。 注意我們可以使用「+」來連接多個列表。
In [4]: myList = ['abc', 'def', 'ghij']
In [5]: myList.append('klm')
In [6]: myList
Out[6]: ['abc', 'def', 'ghij', 'klm']
In [7]: myList2 = [1,2,3]
In [8]: myList3 = [4,5,6]
In [9]: myList2 + myList3
Out[9]: [1, 2, 3, 4, 5, 6]
數組(Array) 向量和矩陣是在numpy中定義的用來對數字操作的數據結構。注意向量和一維數組是有區別的: 向量不能被轉置!在數組中,「+」將對應的元素相加。數組類型的一個方法「.dot」可以對兩個數組進行點乘操作(在Python 3.5之後,該操作也可以使用」@」操作符完成)。
In [10]: myArray2 = np.array(myList2)
In [11]: myArray3 = np.array(myList3)
In [12]: myArray2 + myArray3
Out[12]: array([5, 7, 9])
In [13]: myArray2.dot(myArray3)
Out[13]: 32
字典(Dictionary) 字典是無序的(鍵/值對)內容集合。取用字典中的內容可以使用dict['key']語句來操作。我們可以使用dict命令或者大括號 {...} 來創建字典。
In [14]: myDict = dict(one=1, two=2, info='some information')
In [15]: myDict2 = {'ten':1, 'twenty':20,'info':'more information'}
In [16]: myDict['info']
Out[16]: 'some information'
In [17]: myDict.keys()
Out[17]: dict_keys(['one', 'info', 'two'])
數據框(DataFrame) 一種在pandas中定義的數據類型,主要用於帶有列名的統計數據。
2.1.2 索引和切片從Python的列表和元組或numpy的數組中取出元素是件很容易的事情。Greg Hewgill在stackoverflow上進行了非常好的總結。
a[start:end] # 取出從start開始直到end-1結束的所有元素
a[start:] # 取出從start開始直到末尾的所有元素
a[:end] # 取出從開頭開始直到end-1的所有元素
a[:] #複製整個數組
此外上面的代碼中還可以使用第3個參數「step」。
a[start:end:step] # 從start開始,以step為步長直到end結束
值得注意的一點是:索引從0開始,而不是1,而且end表示的是沒有被選為切片的第一個元素。所以end–start的差就是切片選擇的元素的數量(如果step保持默認值1的話)
另一個特性是,如果start或者end是負數,那就意味著我們不是從數組開頭進行計數,而是從末尾開始。
a[-1] # 數組中最後一個元素
a[-2:] # 數組中最後兩個元素
a[:-2] # 數組中除了最後兩個元素外的所有元素
結果就是,a[:5]將返回數組a的前5個元素(字符串「Hello」,如圖2.2所示),而a[-5:]將返回最後5個元素(字符串「World」)。
圖2.1 從0開始索引,並且切片不包括最後一個值
[奧地利]託馬斯·哈斯爾萬特 著
點擊封面購買紙書
本書是斯普林格「統計和計算」系列從書之一。介紹了開源軟體Python在統計數據分析當中的應用,涵蓋了常見的連續、離散和分類數據的統計測試,以及線性回歸分析、生存分析和貝葉斯統計等主題。每個示例淺顯易懂,提供Python代碼和數據,可以讓讀者動手操作,並加深理解。