[編者按] Python是大數據分析的常用技術之一,用Python進行數據分析的眾多優勢使得越來越多的人開始走上Python數據分析之路。後臺也常常有讀者來信,希望我們分享關於Python數據分析的知識。從本期開始,我們推出「小白學Python數據分析」專欄,本專欄邀請到一位Python數據分析的初學者小白,記錄他學習Python數據分析的歷程。大家可以和小白一起學習,並完成每期專欄中的實例,就可以掌握Python數據分析的常用方法和技術。教材方面,我們參考的是王宏志老師編著的《大數據分析原理與實踐》。由於小白也在學習過程中,所以文中難免會有認識和理解不當之處,歡迎大家批評指正,更歡迎大家通過後臺留言與我們進行討論交流,大家共同向Python數據分析高手的目標前進!
在本期專欄中,我們先熟悉一下Python,然後用Python的庫來實現一個t分布,這可是概率和統計學中的一個非常有用的知識哦!下面我們開始學習吧!
Python是一種面向對象的解釋型電腦程式設計語言,與其他解釋性語言相比,它擁有一個巨大而活躍的科學計算社區。Python擁有功能強大的庫,可以用來處理各種工作,而不需要再去做重複的工作,節約下來的時間就可以思考一些更高級的算法設計。在Python的學習中,對於庫的學習非常重要,掌握好這些庫的使用方法能讓你的編程的過程變得更加流暢輕鬆。小白我在剛開始學習的時候就總是陷入自己手動編底層操作的困局,走了很多彎路、浪費了很多時間,所以大家一定要吸取我的教訓,熟悉和掌握好Python的各種庫。
下面我們以Numpy和Scipy庫為例來說明庫的使用方法,請大家也跟隨本文的介紹自己動手嘗試一下。
Numpy庫是Python中的科學計算庫,是一個強大的N維數組對象ndarray,屬於廣播功能函數。其整合C/C++.fortran代碼的工具 ,更是Scipy、Pandas等的基礎。Numpy庫可以完成數組的維度變換、數組的類型變換、一維數組切片、多維數組索引、多維數組切片、數組的運算、數據的CSV文件存取、numpy隨機數函數、numpy的梯度函數、圖像的表示和變換等功能。後面我們採用Numpy庫來進行單個樣本的t分布具體算法的實施。
Scipy庫是基於Numpy庫的一種科學計算庫,是一個開源的Python算法庫和數學工具包。SciPy庫包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅立葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。後面我們採用Scipy庫中的stats模塊來進行t分布的相關計算。
接下來,我們就用這兩個庫來完成t分布的簡單實現。在概率論和統計學中,t分布用於根據小樣本來估計呈正態分布且方差未知的總體的均值。如果總體方差已知(例如在樣本數量足夠多時),則應該用正態分布來估計總體均值。t分布曲線形態與n(確切地說與自由度df)大小有關。與標準正態分布曲線相比,自由度df越小,t分布曲線愈平坦,曲線中間愈低,曲線雙側尾部翹得愈高;自由度df愈大,t分布曲線愈接近正態分布曲線,當自由度df=∞時,t分布曲線為標準正態分布曲線。
檢驗分為三種形式,單個樣本的檢驗、兩個獨立樣本均數檢驗和配對樣本均數檢驗。由於篇幅有限,我們利用Scipy庫進行了三種形式t檢驗的操作,同時,為了展示t檢驗的內部計算流程,我們寫了最原始的代碼來進行單個樣本的t檢驗。
單個樣本的檢驗
作用:檢驗總體均值是否與給定的值存在顯著差異(不相等)。
前提:只有一個總體,並且總體呈正態分布、
檢驗假設:
我們選取下列數據作為我們t分析的實例,其總體樣本的平均值為24。
Data1
22
20
19
23
25
29
27
33
26
25
原始方法計算:
隨後我們查t分布表,將t與比較大小。如果值較小,拒絕原本假設。
Scipy庫的方法計算:
Scipy庫提供了stats中的ttest_1samp函數計算單個樣本的檢驗。輸出如下:
Statistic值為t值,pvalue值為其內部參量,可不用討論。
兩個獨立樣本均數t檢驗
作用:考察兩個總體的均值是否存在顯著差異。
前提:兩樣本所代表的總體均服從正態分布,且兩總體方差相同,而兩組樣本數量可以不同。
檢驗假設:
H0:兩個樣本均值相同
H1:兩個樣本均值不同
Python實現的函數解釋:
兩個獨立樣本均數 t檢驗函數stats.ttest_ind(a, b, axis=0, equal_var=True)
其中:
a,b: 用以比較的數據
Axis:當a,b為多維數據時,選擇a,b中要用於比較的維度,計數由0開始;
equal_var:兩個樣本方差相同時值為True,不同為False,默認為True
方差比較函數:stats.levene(a,b)
應用實例
25例糖尿病患者隨機分成兩組,甲組單純用藥物治療,乙組採用藥物治療合併飲食療法,一個月後測空腹血糖 ,如下表所示,問兩種療法治療後患者血糖值是否相同?
代碼實現:
%導入數據
x1=np.array([8.4,10.5,12.0,12.0,13.9,15.3,16.7,18.0,18.7,20.7,21.1,15.2])
x2=np.array([5.4,6.4,6.4,7.5,7.6,8.1,11.6,12.0,13.4,13.5,14.8,15.6,18.7])
%先判斷兩總體方差是否相等,由於p值遠大於0.05,認為兩總體具有方差齊性
stats.levene(x1,x2)
LeveneResult(statistic=0.1871049399293495,pvalue=0.6693659851427802)
%進行t檢驗
stats.ttest_ind(x1,x2)
Ttest_indResult(statistic=2.640273284328294,pvalue=0.014625940879142462)
(代碼部分圖片格式)
配對樣本均數t檢驗
作用:考察兩個一一對應的總體均值是否存在顯著差異。
前提:兩樣本所代表的總體均服從正態分布,且兩總體方差相同,而且由於是一一對應的,兩組樣本數量必須相同。
檢驗假設: :均值相同; :均值不同
Python實現的函數解釋:
scipy.stats.ttest_rel(a,b, axis=0, nan_policy='propagate')
解釋:當輸入的樣本中缺失數據(該缺失數據顯示為nan)時的操作。該值取值為『progagate』時輸出nan,為『raise』時顯示該指令錯誤無法執行,為『omit』時程序將忽略樣本缺失的數據對其他數據進行計算。默認取值為『progagate』。
運用實例:
有12名接種卡介苗的兒童,8周後用兩批不同的結核菌素,一批是標準結核菌素,一批是新制結核菌素,分別注射在兒童的前臂,兩種結核菌素的皮膚侵潤反應平均直徑如下表所示,問兩種結核菌素的反應性有無差別。
代碼實現:
y1=np.array([12.0,14.5,15.5,12.0,13.0,12.0,10.5,7.5,9.0,15.0,13.0,10.5])
y2=np.array([10.0,10.0,12.5,13.0,10.0,5.5,8.5,6.5,5.5,8.0,6.5,9.5])
stats.ttest_rel(y1,y2)
Ttest_relResult(statistic=4.5197977198732495,pvalue=0.0008723321459379539)
(代碼部分圖片格式)
特別鳴謝:張興遠(14級機電學院)、何濤(15級計算機學院)
本文算例來自由哈爾濱工業大學計算機學院的王宏志老師編著的《大數據分析原理與實踐》
「大數據與數據科學家」公眾號
主編:王宏志
特邀副主編: 朱劼
副主編: 丁小歐
責任編輯: 齊志鑫,宋揚,萬曉瓏、魏龑,張榮恩
編輯: 陶穎安
-精彩內容,記得分享到朋友圈-
長按下圖並點擊 「識別圖中二維碼」,即可關注大數據與數據科學家微信公共號