1. 程式人生 > >統計思維:程式設計師數學之概率統計(第2版):第1章 探索性資料分析

統計思維:程式設計師數學之概率統計(第2版):第1章 探索性資料分析

第1章 探索性資料分析

如果能將資料與實際方法相結合,就可以在存在不確定性時解答問題並指導決策,這就是本書的主題。

舉個例子。我的妻子在懷第一胎時,我聽到了一個問題:第一胎是不是經常晚於預產期出生?下面所給出的案例研究就是由這個問題引出的。

如果用谷歌搜尋這個問題,會看到大量的討論。有人認為第一胎的生產日期確實經常晚於預產期,有人認為這是無稽之談,還有人認為恰恰相反,第一胎常常會早產。

在很多此類討論中,人們會提供資料來支援自己的觀點。我發現很多論據是下面這樣的。

“我有兩個朋友最近都剛生了第一個孩子,她們都是超過預產期差不多兩週才出現臨產徵兆或進行催產的。”

“我的第一個孩子是過了預產期兩週才出生的,我覺得第二個孩子可能會早產兩週!”

“我認為這種說法不對,因為我姐姐是頭生子,而且是早產兒。我還有好些表兄妹也是這樣。”

這些說法都是基於未公開的資料,通常來自個人經驗,因此稱為軼事證據(anecdotal evidence)。在閒聊時講講軼事當然無可厚非,所以我並不是要批評以上那幾個人。

但是,我們可能需要更具說服力的證據以及更可靠的回答。如果按照這個標準進行衡量,軼事證據通常都靠不住,原因有如下幾點。

  • 觀測值數量較小
    如果第一胎的孕期的確偏長,這個時間差與正常的偏差相比可能很小。在這種情況下,我們可能需要比對大量的孕期資料,才能確定這種時間差確實存在。
  • 選擇資料時存在偏倚
    人們之所以參與這個問題的討論,有可能是因為自己的第一個孩子出生較晚。這樣的話,這個選擇資料的過程就會對結果產生影響。
  • 確認資料時存在偏倚
    贊同這種說法的人也許更可能提供例子進行佐證。持懷疑態度的人則更可能引用反例。
  • 不精確
    軼事通常都是個人經驗,經常會記錯、誤傳或者誤解等。

那我們該如何更好地回答這個問題呢?

1.1 統計學方法

為了解決軼事證據的侷限性,我們將使用以下統計學工具。

  • 資料收集
    我們將使用大型的全國性調查資料,這個調查專門設計用於對美國人口進行有效的統計推斷。
  • 描述性統計
    得出統計量,對資料進行簡要的彙總,並評估視覺化資料的不同方法。
  • 探索性資料分析
    尋找各種模式、差異,以及其他能夠解決我們感興趣的問題的特徵,同時還將檢查資料的不一致性,發現侷限性。
  • 估計
    使用樣本資料來估計一般總體的統計特徵。
  • 假設檢驗

    如果看到明顯的效應,例如兩個群組之間存在差異,將衡量該效應是否是偶然產生的。

謹慎執行上面的步驟,並避免各種錯誤,我們就可以獲得合理性和準確性更高的結論。

1.2 全國家庭增長調查

從1973年起,美國疾病控制和預防中心(CDC)就開始進行全國家庭增長調查(NSFG,http://cdc.ogv/nchs/nsfg.htm),以收集“與家庭生活、婚姻狀況、妊娠情況、生育情況、避孕情況,以及兩性健康相關的資訊。此項調查的結果用於……進行健康服務和健康教育專案的規劃,以及對家庭、生育及健康情況進行統計研究”。

我們將使用這項調查收集到的資料研究第一胎是否出生較晚,並解答一些其他問題。為了有效地使用這些資料,我們必須理解這項研究是如何設計的。

全國家庭增長調查是一項橫截面(cross-sectional)研究,也就是說該研究捕獲的是一個群組在某一時刻的快照。在橫截面研究之外,最常見的是縱向(longitudinal)研究,指在一個時間段內重複觀察一個群組。

全國家庭增長調查進行過7次,每一次都稱為一個週期(cycle)。我們將使用第6次的資料,其時間段為2002年1月至2003年3月。

這項調查的目的是對一個總體(population)得出結論。全國家庭增長調查的目標總體是居住在美國、年齡在15~44歲的人。理想情況下,調查要收集這個總體中每個成員的資料,但這是不可能實現的。實際上,我們收集了這個總體的一個子集的資料,這個子集稱為樣本(sample)。參與調查的人稱為調查參與者(respondent)。

通常來說,橫截面研究應該是有代表性(representative)的,也就是說目標總體中每個成員參與調查的機會均等。這種理想條件在實踐中很難實現,但是進行調查的人員會竭盡所能滿足這個條件。

全國家庭增長調查不具有代表性,而是特意進行過度抽樣(oversample)。這項研究的設計者招募了拉美裔美國人、非洲裔美國人和青少年3個群組的參與者,每個群組的招募比例都超過其在美國人口中所佔的比例,以確保各群組的參與者數量足夠多,從而進行有效的統計推斷。

當然,過度抽樣也有缺點,那就是不容易從調查的統計資料中得出關於總體的結論。我們稍後會對此進行討論。

在使用這種調查資料時,我們必須熟悉程式碼本(codebook),這一點非常重要。程式碼本記錄了一項研究的設計、使用的調查問題,以及調查中響應變數的編碼。你可以從美國疾病控制和預防中心的網站(http://www.cdc.gov/nchs/nsfg/nsfg_cycle6.htm)下載全國家庭增長調查資料的程式碼本和使用手冊。

1.3 資料匯入

下載程式碼後,你會得到一個名為ThinkStats2/code的資料夾,其中包含一個名為nsfg.py的檔案。執行nsfg.py會讀取資料檔案,執行測試,然後打印出一條訊息,例如“All test passed”。

讓我們看看這個檔案所執行的工作。第6次全國家庭增長調查的妊娠資料儲存在名為2002FemPreg.dat.gz的檔案中,這是一個純文字(ASCII碼)形式的gzip壓縮檔案,有固定寬度的列。這個檔案中的每一行都是一個記錄(record),包含一次妊娠的資料。

2002FemPreg.dct是一個Stata字典檔案,記錄了資料檔案的格式。Stata是一個統計軟體。Stata“字典”是由變數名、變數型別及標識變數位置的索引值組成的列表。

下面幾行摘自2002FemPreg.dct:

infile dictionary { 
  _column(1) str12 caseid %12s"RESPONDENT ID NUMBER" 
  _column(13)byte pregordr %2f"PREGNANCY ORDER (NUMBER)"}

這個字典描述了兩個變數:caseid是一個長度為12的字串,代表調查參與者的ID;pregorder是一個單位元組整數,說明這條記錄描述的是這位調查參與者的第幾次妊娠。

下載的程式碼包含一個thinkstats2.py檔案,這是一個Python模組,包含了本書中用到的很多類和函式,其中有讀取Stats字典和全國家庭增長調查資料檔案的函式。這兩個函式在nsfg.py中的用法如下:

defReadFemPreg(dct_file='2002FemPreg.dct', 
                dat_file='2002FemPreg.dat.gz'): 
    dct = thinkstats2.ReadStataDct(dct_file) 
    df = dct.ReadFixedWidth(dat_file, compression='gzip')CleanFemPreg(df)return df

ReadStataDct的引數是字典檔名,返回值dct是一個FixedWidthVariables物件,其中包含從字典檔案中得到的資訊。dct物件提供ReadFixdWidth方法進行資料檔案的讀取。

1.4 DataFrame

ReadFixedWidth方法返回一個DataFrame物件。DataFrame是pandas提供的基礎資料結構。pandas是一個Python資料和統計包,它的使用會貫穿本書。在DataFrame中,每個記錄為一行(在我們的例子中就是每個妊娠資料為一行),每個變數為一列。

除了資料,DataFrame還包含變數名和變數型別資訊,並提供訪問和修改資料的方法。

如果列印df物件,你會看到其中行列的部分資料和DataFrame的大小:13 593行/記錄,244列/變數。

>>>import nsfg
>>> df = nsfg.ReadFemPreg()>>> df
...[13593 rows x 244 columns]

dfcolumns屬性將列名返回為一列Unicode字串。

>>> df.columns
Index([u'caseid', u'pregordr', u'howpreg_n', u'howpreg_p',...])

df.columns的結果是一個Index物件,Index也是一個pandas資料結構。我們稍後會詳細介紹Index,現在可以暫時將其視為一個列表。

>>> df.columns[1]'pregordr'

要訪問DataFrame中的一列,你可以將列名作為鍵值。

>>> pregordr = df['pregordr']>>> type(pregordr)<class'pandas.core.series.Series'>

其結果是一個Series物件,這又是一個pandas資料結構。Series與Python列表類似,還能提供一些附加功能。列印一個Series物件會得到索引和對應的數值。

>>> pregordr
01122132...135903135914135925Name: pregordr,Length:13593, dtype: int64

這個示例中的索引是從0到13 592的整數,但通常索引可以使用任何可排序的資料型別。這個示例中的元素也是整數,但元素可以是任何型別的。

示例中的最後一行列出了變數名、Series長度和資料型別。int64是NumPy提供的型別之一。如果在32位機器上執行這個示例,得到的資料型別可能是int32

你可以使用整數的index和slice值訪問Series中的元素。

>>> pregordr[0]1>>> pregordr[2:5]213243Name: pregordr, dtype: int64

index操作符的結果是int64,slice的結果還是一個Series。

你也可以使用點標記法來訪問DataFrame中的列。

>>> pregordr = df.pregordr

只有當列名為合法的Python識別符號時(即以字母開頭,不包含空格等),才能使用這種寫法。

1.5 變數

我們已經使用了全國家庭增長調查資料集中的兩個變數——caseidpregordr,還看到資料集中共有244個變數。本書的探索性分析用到如下變數。

  • caseid:調查參與者的整數ID。
  • prglength:妊娠週數,是一個整數。
  • outcome:懷孕結果的整數程式碼。1代表成功生產。
  • pregordr:妊娠的順序號。例如,一位調查參與者的第一次妊娠為1,第二次為2,以此類推。
  • birthord:成功生產的順序號,一位調查參與者的第一個孩子程式碼為1,以此類推。對沒有成功生產的其他妊娠結果,此欄位為空。
  • birthwgt_lbbirthwgt_oz:新生兒體重的磅部分數值和盎司部分數值。
  • agepreg:妊娠結束時母親的年齡。
  • finalwgt:調查參與者的統計權重。這是一個浮點數,表示這位調查參與者在全美人口中代表的人數。

如果你仔細閱讀了程式碼本,就會發現這些變數中很多都是重編碼(recode),也就是說這些不是調查收集的原始資料(raw data),而是使用原始資料計算得到的。

例如,如果成功生產,prglngth的值就與原始變數wksgest(妊娠週數)相等;否則,prglngth的值估算為mosgest * 4.33(妊娠月數乘以一個月的平均週數)。

重編碼通常都基於一定的邏輯,這種邏輯用於檢查資料的一致性和準確性。一般情況下,如果資料中存在重編碼,我們就直接使用,除非有特殊的原因需要自己處理原始資料。

1.6 資料變換

匯入調查資料時,經常需要檢查資料中是否存在錯誤,處理特殊值,將資料轉換為不同的格式並進行計算。這些操作都稱為資料清洗(data cleaning)。

nsfg.py包含一個CleanFemPreg函式,用於清洗計劃使用的變數。

defCleanFemPreg(df): 
    df.agepreg /=100.0

    na_vals =[97,98,99]
    df.birthwgt_lb.replace(na_vals, np.nan, inplace=True)
    df.birthwgt_oz.replace(na_vals, np.nan, inplace=True)

    df['totalwgt_lb']= df.birthwgt_lb + df.birthwgt_oz /16.0

agepreg包含母親在妊娠結束時的年齡。在資料檔案中,agepreg是以百分之一年為單位的整數值。因此CleanFemPreg的第一行將每個agepreg除以100,從而獲得以年為單位的浮點數值。

birthwgt_lbbirthwgt_oz包含成功生產時的新生兒體重,分別是磅和盎司的部分。這兩個變數還使用幾個特殊的程式碼。

97 NOT ASCERTAINED 
98 REFUSED 
99 DON'T KNOW

用數字編碼特殊值是一種危險的做法,因為如果沒有進行正確的處理,這些數字可能產生虛假結果,例如,99磅重的新生兒。replace方法可以將這些值替換為np.nan,這是一個特殊的浮點數值,表示“不是數字”。replace方法使用inplace標識,說明直接修改現有的Series物件,而不是建立新物件。

IEEE浮點數表示法標準中規定,在任何算術運算中,如果有引數為nan,結果都返回nan

>>>import numpy as np
>>> np.nan /100.0
nan

因此使用nan進行計算會得到正確的結果,而且大部分的pandas函式都能恰當地處理nan。但我們經常需要處理資料缺失的問題。

CleanFemPreg函式的最後一行生成一個新列totalwgt_lb,將磅和盎司值結合在一起,得到一個以磅為單位的值。

需要注意的是,向DataFrame新增新列時,必須使用如下字典語法:

# 正確 
df['totalwgt_lb']= df.birthwgt_lb + df.birthwgt_oz /16.0

而不是使用點標記:

# 錯誤!
df.totalwgt_lb = df.birthwgt_lb + df.birthwgt_oz /16.0

使用點標記的寫法會給DataFrame物件新增一個新屬性,而不是建立一個新列。

1.7 資料驗證

當資料從一個軟體環境匯出,再匯入另一個環境時,可能會產生錯誤。如果不熟悉新資料集,可能會對資料進行不正確的解釋,或者引入其他的誤解。如果能抽出一些時間進行資料驗證,就可以節省後續可能花費的時間,避免可能出現的錯誤。

驗證資料的一種方法是計算基本的統計量,並與已釋出的結果進行比較。例如,全國家庭增長調查的程式碼本為每個變數提供了概要表。outcome變數對每個妊娠結果進行了編碼,其概要表如下:

value label       Total1 LIVE BIRTH          91482 INDUCED ABORTION    18623 STILLBIRTH           1204 MISCARRIAGE         19215 ECTOPIC PREGNANCY    1906 CURRENT PREGNANCY    352

Series類提供了一個value_counts方法,可用於計算每個值出現的次數。如果得到DataFrame中的outcome Series,我們可以使用value_counts方法,將結果與已釋出的資料進行比較。

>>> df.outcome.value_counts().sort_index()191482186231204192151906352

相關推薦

統計思維程式設計師數學概率統計21 探索性資料分析

第1章 探索性資料分析 如果能將資料與實際方法相結合,就可以在存在不確定性時解答問題並指導決策,這就是本書的主題。 舉個例子。我的妻子在懷第一胎時,我聽到了一個問題:第一胎是不是經常晚於預產期出生?下面所給出的案例研究就是由這個問題引出的。 如果用谷歌搜尋這個問題,

統計思維程序員數學概率統計1

隨機 解決問題 第一章 個數字 檢驗 對象 特點 總結 clas 第一章: 經驗之談: 觀察的數量太少、選擇偏差、確認偏差、不準確 更好的做法-統計方法: 收集數據,使用大型全國性調查的數據 描述性統計,計算能總結數據的統計量 探索性數據分析,尋找模式、差異和其他能解決問題

統計思維程序員數學概率統計2》中英文PDF+數據代碼+《面向數據科學家的實用統計學》中英文PDF+源代碼+學習總結

方法 有趣的 使用 可視化 發現 方式 概率分布 times tis 作為一個程序員,我認為,不需要把數學全部學完,要選擇合適自己的資料。 《統計思維:程序員數學之概率統計(第2版)》以程序模擬的方式而不是數學教材上毫無來由的定理解釋了大多數統計上的基本概念。《統計思維:

下載篇程式設計師修煉道+從小工到專家高清、免費

百度網盤:https://pan.baidu.com/s/1CSAdni_jgGdD6WVtmN5FFg資源名稱:   程式設計師修煉之道+從小工到專家 較高清(咳咳,比我開始看的好多了)如果連結失效,請回復! 專注於:免費、共享的網路資源!

Ruby程式設計師修煉2.epub

【下載地址】 這是一本深受好評的書。它不僅是一本純Ruby的書,也不僅是一本純Rails的書,而是一本為Rails程式設計師“優化”過的Ruby書。 本書從Ruby程式語言的基礎開始一直講到動態特性,其中包含大量的真實程式碼示例並附有詳細的註解,對日常使用Ruby進行程

不吐不快程式設計師到底有沒有前途一位前輩寫的

早上到單位,看昨天晚上QQ群裡的內容,有人在問做程式設計師怎麼樣。馬上就有人跳出來告訴他程式設計師又苦、又累,要求又高、賺得也不比人多,而且30歲以後肯定失業那一套。對程式設計師的前途,自己有自己的想法,但這沒什麼好說的,而且每個人都有適合本人的路,也不想拿自己的想法來影響別

以前寫的兩本書《安全Web滲透技術及實戰案例解析2》和《黑客攻防實戰加密與解密》

Web滲透技術及實戰案例解析 黑客攻防實戰加密與解密 應一些朋友的要求,我重新將書封面和購買地址發一下說明一下:www.antian365.com原來域名轉移到國外去了。現在國家對境外域名在國內訪問必須實名制,進行備份啥的,情況你懂的。最近正在制作《黑客攻防實戰加密與解密》的視頻課程,對黑客攻防過程遇

某課實戰專為程式設計師設計的線性代數雲盤下載

第1章 歡迎大家來到《專給程式設計師設計的線性代數》 歡迎大家來到《專給程式設計師設計的線性代數》,在這個課程中,我們將使用程式設計的方式,學習線性代數,這個近現代數學發展中最為重要的分支。學懂線性代數,是同學們深入學習人工智慧,機器學習,深度學習,圖形學,影象學,密碼學

精通CSS高級Web標準解決方式2

avi css dsm table 段落 空元素 支持 :after med 精通CSS:高級Web標準解決方式(第2版) 跳轉至: 導航、 搜索 層疊重要度:(也就是說。用戶!important能夠覆蓋inline style)

《黑客攻防技術寶典Web實戰篇@2》讀書筆記1了解Web應用程序

金融 主機 border ket 邊界 輕量 在線 讀書 目的 讀書筆記第一部分對應原書的第一章,主要介紹了Web應用程序的發展,功能,安全狀況。 Web應用程序的發展歷程 早期的萬維網僅由Web站點構成,只是包含靜態文檔的信息庫,隨後人們發明了Web瀏覽器用來檢索和

Python資料分析基礎教程NumPy學習指南2 pdf 下載

罕見的NumPy中文入門教程,Python資料分析優選從基礎的知識講起,手把手帶你進入大資料探勘領域囊括大量具有啟發性與實用價值的實戰案例。 內容簡介   《圖靈程式設計叢書;Python資料分析基礎教程:NumPy學習指南(第2版)》是NumPy的入門教程,主要介紹NumPy以及相關

知識儲備Spring中Bean的生命週期基於註解

一:前言 在Spring專案中,通常配置Spring都是使用XML的形式進行配置,配置bean是通過<bean></bean>標籤將bean加入IOC容器中,但在Spring註解版中,可以通過Java程式碼進行配置,即建立一個java類在其類頭上標註@Configurat

分享《OpenCV 3計算機視覺Python語言實現2》中文PDF+英文PDF+原始碼

下載:https://pan.baidu.com/s/1gGgEk8Y6X58gfvsmD8U8Xw 更多資料分享:https://www.cnblogs.com/javapythonstudy/ 《OpenCV 3計算機視覺:Python語言實現(第2版)》中文PDF+英文PDF+原始碼中文PDF,20

[分享]《Flask Web開發基於Python的Web應用開發實戰2》中文PDF+源代碼

全面介紹 flask 技術 ESS nfs 圖片 ges web應用開發 復制粘貼 下載:Flask Web開發第二版《Flask Web開發:基於Python的Web應用開發實戰》第二版中文PDF,324頁,帶目錄和書簽,文字能夠復制粘貼;配套源代碼;經典書籍第二版,講解

《C語言程式設計現代方法2K.N.King 著》學習筆記一C語言概述

1.1 C語言的歷史 1.1.1 起源 C語言是美國貝爾實驗室的 Dennis Ritchie、Ken Thompson 等人為開發 UNIX 作業系統而於 1972 年設計的一種計算機程式語言。

《C語言程式設計現代方法2K.N.King 著》學習筆記三C語言基本概念2

2.3 註釋 每一個程式都應該包含識別資訊,即程式名、編寫日期、作者、程式的用途以及其他相關資訊。C語言把這類資訊放在註釋(comment)中。 符號 /* 標記註釋的開始,而符號 */ 則標記註釋

《C語言程式設計現代方法2K.N.King 著》學習筆記四C語言基本概念3

2.5 讀入輸入 為了獲取輸入,就要用到 scanf 函式。它是C函式庫中與 printf 相對應的函式。scanf 中的字母 f 和 printf 中的字母 f 含義相同,都是表示“格式化”的意思

《C語言程式設計現代方法2K.N.King 著》學習筆記五C語言基本概念4

2.7 識別符號 在編寫程式時,需要對變數、函式、巨集和其他實體進行命名。這些名字稱為識別符號(identifier)。在C語言中,識別符號可以含有字母、數字和下劃線,但是必須以字母或者下劃線開頭。

《C語言程式設計現代方法2K.N.King 著》學習筆記六C語言基本概念5

問與答 GCC 最初是 GNU C Compiler 的簡稱。現在指 GNU Compiler Collection,這是因為最新版本的 GCC 能夠編譯用 Ada、C、C++、Fortran、Ja

《C語言程式設計現代方法2K.N.King 著》學習筆記九格式化輸入/輸出2

3.2 scanf 函式 就如同 printf 函式用特定的格式顯示輸出一樣,scanf 函式也根據特定的格式讀取輸入。像 printf 函式的格式串一樣,scanf 函式的格式串也可以包含普通字元