统计思维:程序员数学之概率统计(第2版):第1章 探索性数据分析
第1章 探索性數(shù)據(jù)分析
如果能將數(shù)據(jù)與實(shí)際方法相結(jié)合,就可以在存在不確定性時(shí)解答問題并指導(dǎo)決策,這就是本書的主題。
舉個(gè)例子。我的妻子在懷第一胎時(shí),我聽到了一個(gè)問題:第一胎是不是經(jīng)常晚于預(yù)產(chǎn)期出生?下面所給出的案例研究就是由這個(gè)問題引出的。
如果用谷歌搜索這個(gè)問題,會(huì)看到大量的討論。有人認(rèn)為第一胎的生產(chǎn)日期確實(shí)經(jīng)常晚于預(yù)產(chǎn)期,有人認(rèn)為這是無稽之談,還有人認(rèn)為恰恰相反,第一胎常常會(huì)早產(chǎn)。
在很多此類討論中,人們會(huì)提供數(shù)據(jù)來支持自己的觀點(diǎn)。我發(fā)現(xiàn)很多論據(jù)是下面這樣的。
“我有兩個(gè)朋友最近都剛生了第一個(gè)孩子,她們都是超過預(yù)產(chǎn)期差不多兩周才出現(xiàn)臨產(chǎn)征兆或進(jìn)行催產(chǎn)的。”
“我的第一個(gè)孩子是過了預(yù)產(chǎn)期兩周才出生的,我覺得第二個(gè)孩子可能會(huì)早產(chǎn)兩周!”
“我認(rèn)為這種說法不對(duì),因?yàn)槲医憬闶穷^生子,而且是早產(chǎn)兒。我還有好些表兄妹也是這樣。”
這些說法都是基于未公開的數(shù)據(jù),通常來自個(gè)人經(jīng)驗(yàn),因此稱為軼事證據(jù)(anecdotal evidence)。在閑聊時(shí)講講軼事當(dāng)然無可厚非,所以我并不是要批評(píng)以上那幾個(gè)人。
但是,我們可能需要更具說服力的證據(jù)以及更可靠的回答。如果按照這個(gè)標(biāo)準(zhǔn)進(jìn)行衡量,軼事證據(jù)通常都靠不住,原因有如下幾點(diǎn)。
- 觀測(cè)值數(shù)量較小
如果第一胎的孕期的確偏長(zhǎng),這個(gè)時(shí)間差與正常的偏差相比可能很小。在這種情況下,我們可能需要比對(duì)大量的孕期數(shù)據(jù),才能確定這種時(shí)間差確實(shí)存在。 - 選擇數(shù)據(jù)時(shí)存在偏倚
人們之所以參與這個(gè)問題的討論,有可能是因?yàn)樽约旱牡谝粋€(gè)孩子出生較晚。這樣的話,這個(gè)選擇數(shù)據(jù)的過程就會(huì)對(duì)結(jié)果產(chǎn)生影響。 - 確認(rèn)數(shù)據(jù)時(shí)存在偏倚
贊同這種說法的人也許更可能提供例子進(jìn)行佐證。持懷疑態(tài)度的人則更可能引用反例。 - 不精確
軼事通常都是個(gè)人經(jīng)驗(yàn),經(jīng)常會(huì)記錯(cuò)、誤傳或者誤解等。
那我們?cè)撊绾胃玫鼗卮疬@個(gè)問題呢?
1.1 統(tǒng)計(jì)學(xué)方法
為了解決軼事證據(jù)的局限性,我們將使用以下統(tǒng)計(jì)學(xué)工具。
- 數(shù)據(jù)收集
我們將使用大型的全國(guó)性調(diào)查數(shù)據(jù),這個(gè)調(diào)查專門設(shè)計(jì)用于對(duì)美國(guó)人口進(jìn)行有效的統(tǒng)計(jì)推斷。 - 描述性統(tǒng)計(jì)
得出統(tǒng)計(jì)量,對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)要的匯總,并評(píng)估可視化數(shù)據(jù)的不同方法。 - 探索性數(shù)據(jù)分析
尋找各種模式、差異,以及其他能夠解決我們感興趣的問題的特征,同時(shí)還將檢查數(shù)據(jù)的不一致性,發(fā)現(xiàn)局限性。 - 估計(jì)
使用樣本數(shù)據(jù)來估計(jì)一般總體的統(tǒng)計(jì)特征。 - 假設(shè)檢驗(yàn)
如果看到明顯的效應(yīng),例如兩個(gè)群組之間存在差異,將衡量該效應(yīng)是否是偶然產(chǎn)生的。
謹(jǐn)慎執(zhí)行上面的步驟,并避免各種錯(cuò)誤,我們就可以獲得合理性和準(zhǔn)確性更高的結(jié)論。
1.2 全國(guó)家庭增長(zhǎng)調(diào)查
從1973年起,美國(guó)疾病控制和預(yù)防中心(CDC)就開始進(jìn)行全國(guó)家庭增長(zhǎng)調(diào)查(NSFG,http://cdc.ogv/nchs/nsfg.htm),以收集“與家庭生活、婚姻狀況、妊娠情況、生育情況、避孕情況,以及兩性健康相關(guān)的信息。此項(xiàng)調(diào)查的結(jié)果用于……進(jìn)行健康服務(wù)和健康教育項(xiàng)目的規(guī)劃,以及對(duì)家庭、生育及健康情況進(jìn)行統(tǒng)計(jì)研究”。
我們將使用這項(xiàng)調(diào)查收集到的數(shù)據(jù)研究第一胎是否出生較晚,并解答一些其他問題。為了有效地使用這些數(shù)據(jù),我們必須理解這項(xiàng)研究是如何設(shè)計(jì)的。
全國(guó)家庭增長(zhǎng)調(diào)查是一項(xiàng)橫截面(cross-sectional)研究,也就是說該研究捕獲的是一個(gè)群組在某一時(shí)刻的快照。在橫截面研究之外,最常見的是縱向(longitudinal)研究,指在一個(gè)時(shí)間段內(nèi)重復(fù)觀察一個(gè)群組。
全國(guó)家庭增長(zhǎng)調(diào)查進(jìn)行過7次,每一次都稱為一個(gè)周期(cycle)。我們將使用第6次的數(shù)據(jù),其時(shí)間段為2002年1月至2003年3月。
這項(xiàng)調(diào)查的目的是對(duì)一個(gè)總體(population)得出結(jié)論。全國(guó)家庭增長(zhǎng)調(diào)查的目標(biāo)總體是居住在美國(guó)、年齡在15~44歲的人。理想情況下,調(diào)查要收集這個(gè)總體中每個(gè)成員的數(shù)據(jù),但這是不可能實(shí)現(xiàn)的。實(shí)際上,我們收集了這個(gè)總體的一個(gè)子集的數(shù)據(jù),這個(gè)子集稱為樣本(sample)。參與調(diào)查的人稱為調(diào)查參與者(respondent)。
通常來說,橫截面研究應(yīng)該是有代表性(representative)的,也就是說目標(biāo)總體中每個(gè)成員參與調(diào)查的機(jī)會(huì)均等。這種理想條件在實(shí)踐中很難實(shí)現(xiàn),但是進(jìn)行調(diào)查的人員會(huì)竭盡所能滿足這個(gè)條件。
全國(guó)家庭增長(zhǎng)調(diào)查不具有代表性,而是特意進(jìn)行過度抽樣(oversample)。這項(xiàng)研究的設(shè)計(jì)者招募了拉美裔美國(guó)人、非洲裔美國(guó)人和青少年3個(gè)群組的參與者,每個(gè)群組的招募比例都超過其在美國(guó)人口中所占的比例,以確保各群組的參與者數(shù)量足夠多,從而進(jìn)行有效的統(tǒng)計(jì)推斷。
當(dāng)然,過度抽樣也有缺點(diǎn),那就是不容易從調(diào)查的統(tǒng)計(jì)數(shù)據(jù)中得出關(guān)于總體的結(jié)論。我們稍后會(huì)對(duì)此進(jìn)行討論。
在使用這種調(diào)查數(shù)據(jù)時(shí),我們必須熟悉代碼本(codebook),這一點(diǎn)非常重要。代碼本記錄了一項(xiàng)研究的設(shè)計(jì)、使用的調(diào)查問題,以及調(diào)查中響應(yīng)變量的編碼。你可以從美國(guó)疾病控制和預(yù)防中心的網(wǎng)站(http://www.cdc.gov/nchs/nsfg/nsfg_cycle6.htm)下載全國(guó)家庭增長(zhǎng)調(diào)查數(shù)據(jù)的代碼本和使用手冊(cè)。
1.3 數(shù)據(jù)導(dǎo)入
本書所用的代碼和數(shù)據(jù)都可以通過GitHub(https://github.com/AllenDowney/ThinkStats2)獲取。前言中介紹了如何下載和使用這些代碼。
下載代碼后,你會(huì)得到一個(gè)名為ThinkStats2/code的文件夾,其中包含一個(gè)名為nsfg.py的文件。運(yùn)行nsfg.py會(huì)讀取數(shù)據(jù)文件,執(zhí)行測(cè)試,然后打印出一條消息,例如“All test passed”。
讓我們看看這個(gè)文件所執(zhí)行的工作。第6次全國(guó)家庭增長(zhǎng)調(diào)查的妊娠數(shù)據(jù)保存在名為2002FemPreg.dat.gz的文件中,這是一個(gè)純文本(ASCII碼)形式的gzip壓縮文件,有固定寬度的列。這個(gè)文件中的每一行都是一個(gè)記錄(record),包含一次妊娠的數(shù)據(jù)。
2002FemPreg.dct是一個(gè)Stata字典文件,記錄了數(shù)據(jù)文件的格式。Stata是一個(gè)統(tǒng)計(jì)軟件。Stata“字典”是由變量名、變量類型及標(biāo)識(shí)變量位置的索引值組成的列表。
下面幾行摘自2002FemPreg.dct:
infile dictionary { _column(1) str12 caseid %12s "RESPONDENT ID NUMBER" _column(13) byte pregordr %2f "PREGNANCY ORDER (NUMBER)" }這個(gè)字典描述了兩個(gè)變量:caseid是一個(gè)長(zhǎng)度為12的字符串,代表調(diào)查參與者的ID;pregorder是一個(gè)單字節(jié)整數(shù),說明這條記錄描述的是這位調(diào)查參與者的第幾次妊娠。
下載的代碼包含一個(gè)thinkstats2.py文件,這是一個(gè)Python模塊,包含了本書中用到的很多類和函數(shù),其中有讀取Stats字典和全國(guó)家庭增長(zhǎng)調(diào)查數(shù)據(jù)文件的函數(shù)。這兩個(gè)函數(shù)在nsfg.py中的用法如下:
def ReadFemPreg(dct_file='2002FemPreg.dct', dat_file='2002FemPreg.dat.gz'): dct = thinkstats2.ReadStataDct(dct_file) df = dct.ReadFixedWidth(dat_file, compression='gzip') CleanFemPreg(df) return dfReadStataDct的參數(shù)是字典文件名,返回值dct是一個(gè)FixedWidthVariables對(duì)象,其中包含從字典文件中得到的信息。dct對(duì)象提供ReadFixdWidth方法進(jìn)行數(shù)據(jù)文件的讀取。
1.4 DataFrame
ReadFixedWidth方法返回一個(gè)DataFrame對(duì)象。DataFrame是pandas提供的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。pandas是一個(gè)Python數(shù)據(jù)和統(tǒng)計(jì)包,它的使用會(huì)貫穿本書。在DataFrame中,每個(gè)記錄為一行(在我們的例子中就是每個(gè)妊娠數(shù)據(jù)為一行),每個(gè)變量為一列。
除了數(shù)據(jù),DataFrame還包含變量名和變量類型信息,并提供訪問和修改數(shù)據(jù)的方法。
如果打印df對(duì)象,你會(huì)看到其中行列的部分?jǐn)?shù)據(jù)和DataFrame的大小:13 593行/記錄,244列/變量。
>>> import nsfg >>> df = nsfg.ReadFemPreg() >>> df ... [13593 rows x 244 columns]df的columns屬性將列名返回為一列Unicode字符串。
>>> df.columns Index([u'caseid', u'pregordr', u'howpreg_n', u'howpreg_p', ... ])df.columns的結(jié)果是一個(gè)Index對(duì)象,Index也是一個(gè)pandas數(shù)據(jù)結(jié)構(gòu)。我們稍后會(huì)詳細(xì)介紹Index,現(xiàn)在可以暫時(shí)將其視為一個(gè)列表。
>>> df.columns[1] 'pregordr'要訪問DataFrame中的一列,你可以將列名作為鍵值。
>>> pregordr = df['pregordr'] >>> type(pregordr) <class 'pandas.core.series.Series'>其結(jié)果是一個(gè)Series對(duì)象,這又是一個(gè)pandas數(shù)據(jù)結(jié)構(gòu)。Series與Python列表類似,還能提供一些附加功能。打印一個(gè)Series對(duì)象會(huì)得到索引和對(duì)應(yīng)的數(shù)值。
>>> pregordr 0 1 1 2 2 1 3 2 ... 13590 3 13591 4 13592 5 Name: pregordr, Length: 13593, dtype: int64這個(gè)示例中的索引是從0到13 592的整數(shù),但通常索引可以使用任何可排序的數(shù)據(jù)類型。這個(gè)示例中的元素也是整數(shù),但元素可以是任何類型的。
示例中的最后一行列出了變量名、Series長(zhǎng)度和數(shù)據(jù)類型。int64是NumPy提供的類型之一。如果在32位機(jī)器上運(yùn)行這個(gè)示例,得到的數(shù)據(jù)類型可能是int32。
你可以使用整數(shù)的index和slice值訪問Series中的元素。
>>> pregordr[0] 1 >>> pregordr[2:5] 2 1 3 2 4 3 Name: pregordr, dtype: int64index操作符的結(jié)果是int64,slice的結(jié)果還是一個(gè)Series。
你也可以使用點(diǎn)標(biāo)記法來訪問DataFrame中的列。
>>> pregordr = df.pregordr只有當(dāng)列名為合法的Python標(biāo)識(shí)符時(shí)(即以字母開頭,不包含空格等),才能使用這種寫法。
1.5 變量
我們已經(jīng)使用了全國(guó)家庭增長(zhǎng)調(diào)查數(shù)據(jù)集中的兩個(gè)變量——caseid和pregordr,還看到數(shù)據(jù)集中共有244個(gè)變量。本書的探索性分析用到如下變量。
- caseid:調(diào)查參與者的整數(shù)ID。
- prglength:妊娠周數(shù),是一個(gè)整數(shù)。
- outcome:懷孕結(jié)果的整數(shù)代碼。1代表成功生產(chǎn)。
- pregordr:妊娠的順序號(hào)。例如,一位調(diào)查參與者的第一次妊娠為1,第二次為2,以此類推。
- birthord:成功生產(chǎn)的順序號(hào),一位調(diào)查參與者的第一個(gè)孩子代碼為1,以此類推。對(duì)沒有成功生產(chǎn)的其他妊娠結(jié)果,此字段為空。
- birthwgt_lb和birthwgt_oz:新生兒體重的磅部分?jǐn)?shù)值和盎司部分?jǐn)?shù)值。
- agepreg:妊娠結(jié)束時(shí)母親的年齡。
- finalwgt:調(diào)查參與者的統(tǒng)計(jì)權(quán)重。這是一個(gè)浮點(diǎn)數(shù),表示這位調(diào)查參與者在全美人口中代表的人數(shù)。
如果你仔細(xì)閱讀了代碼本,就會(huì)發(fā)現(xiàn)這些變量中很多都是重編碼(recode),也就是說這些不是調(diào)查收集的原始數(shù)據(jù)(raw data),而是使用原始數(shù)據(jù)計(jì)算得到的。
例如,如果成功生產(chǎn),prglngth的值就與原始變量wksgest(妊娠周數(shù))相等;否則,prglngth的值估算為mosgest * 4.33(妊娠月數(shù)乘以一個(gè)月的平均周數(shù))。
重編碼通常都基于一定的邏輯,這種邏輯用于檢查數(shù)據(jù)的一致性和準(zhǔn)確性。一般情況下,如果數(shù)據(jù)中存在重編碼,我們就直接使用,除非有特殊的原因需要自己處理原始數(shù)據(jù)。
1.6 數(shù)據(jù)變換
導(dǎo)入調(diào)查數(shù)據(jù)時(shí),經(jīng)常需要檢查數(shù)據(jù)中是否存在錯(cuò)誤,處理特殊值,將數(shù)據(jù)轉(zhuǎn)換為不同的格式并進(jìn)行計(jì)算。這些操作都稱為數(shù)據(jù)清洗(data cleaning)。
nsfg.py包含一個(gè)CleanFemPreg函數(shù),用于清洗計(jì)劃使用的變量。
def CleanFemPreg(df): df.agepreg /= 100.0na_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.0agepreg包含母親在妊娠結(jié)束時(shí)的年齡。在數(shù)據(jù)文件中,agepreg是以百分之一年為單位的整數(shù)值。因此CleanFemPreg的第一行將每個(gè)agepreg除以100,從而獲得以年為單位的浮點(diǎn)數(shù)值。
birthwgt_lb和birthwgt_oz包含成功生產(chǎn)時(shí)的新生兒體重,分別是磅和盎司的部分。這兩個(gè)變量還使用幾個(gè)特殊的代碼。
97 NOT ASCERTAINED 98 REFUSED 99 DON'T KNOW用數(shù)字編碼特殊值是一種危險(xiǎn)的做法,因?yàn)槿绻麤]有進(jìn)行正確的處理,這些數(shù)字可能產(chǎn)生虛假結(jié)果,例如,99磅重的新生兒。replace方法可以將這些值替換為np.nan,這是一個(gè)特殊的浮點(diǎn)數(shù)值,表示“不是數(shù)字”。replace方法使用inplace標(biāo)識(shí),說明直接修改現(xiàn)有的Series對(duì)象,而不是創(chuàng)建新對(duì)象。
IEEE浮點(diǎn)數(shù)表示法標(biāo)準(zhǔn)中規(guī)定,在任何算術(shù)運(yùn)算中,如果有參數(shù)為nan,結(jié)果都返回nan。
>>> import numpy as np >>> np.nan / 100.0 nan因此使用nan進(jìn)行計(jì)算會(huì)得到正確的結(jié)果,而且大部分的pandas函數(shù)都能恰當(dāng)?shù)靥幚韓an。但我們經(jīng)常需要處理數(shù)據(jù)缺失的問題。
CleanFemPreg函數(shù)的最后一行生成一個(gè)新列totalwgt_lb,將磅和盎司值結(jié)合在一起,得到一個(gè)以磅為單位的值。
需要注意的是,向DataFrame添加新列時(shí),必須使用如下字典語法:
# 正確 df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0而不是使用點(diǎn)標(biāo)記:
# 錯(cuò)誤! df.totalwgt_lb = df.birthwgt_lb + df.birthwgt_oz / 16.0使用點(diǎn)標(biāo)記的寫法會(huì)給DataFrame對(duì)象添加一個(gè)新屬性,而不是創(chuàng)建一個(gè)新列。
1.7 數(shù)據(jù)驗(yàn)證
當(dāng)數(shù)據(jù)從一個(gè)軟件環(huán)境導(dǎo)出,再導(dǎo)入另一個(gè)環(huán)境時(shí),可能會(huì)產(chǎn)生錯(cuò)誤。如果不熟悉新數(shù)據(jù)集,可能會(huì)對(duì)數(shù)據(jù)進(jìn)行不正確的解釋,或者引入其他的誤解。如果能抽出一些時(shí)間進(jìn)行數(shù)據(jù)驗(yàn)證,就可以節(jié)省后續(xù)可能花費(fèi)的時(shí)間,避免可能出現(xiàn)的錯(cuò)誤。
驗(yàn)證數(shù)據(jù)的一種方法是計(jì)算基本的統(tǒng)計(jì)量,并與已發(fā)布的結(jié)果進(jìn)行比較。例如,全國(guó)家庭增長(zhǎng)調(diào)查的代碼本為每個(gè)變量提供了概要表。outcome變量對(duì)每個(gè)妊娠結(jié)果進(jìn)行了編碼,其概要表如下:
value label Total 1 LIVE BIRTH 9148 2 INDUCED ABORTION 1862 3 STILLBIRTH 120 4 MISCARRIAGE 1921 5 ECTOPIC PREGNANCY 190 6 CURRENT PREGNANCY 352Series類提供了一個(gè)value_counts方法,可用于計(jì)算每個(gè)值出現(xiàn)的次數(shù)。如果得到DataFrame中的outcome?Series,我們可以使用value_counts方法,將結(jié)果與已發(fā)布的數(shù)據(jù)進(jìn)行比較。
>>> df.outcome.value_counts().sort_index() 1 9148 2 1862 3 120 4 1921 5 190 6 352value_counts返回的結(jié)果是一個(gè)Series對(duì)象。sort_index方法將Series對(duì)象按索引排序,使結(jié)果按序顯示。
我們將得到的結(jié)果與官方發(fā)布的表格進(jìn)行對(duì)比,outcome變量的值似乎沒有問題。類似地,已發(fā)布的關(guān)于birthwgt_lb的概要表如下:
value label Total . INAPPLICABLE 4449 0-5 UNDER 6 POUNDS 1125 6 6 POUNDS 2223 7 7 POUNDS 3049 8 8 POUNDS 1889 9-95 9 POUNDS OR MORE 799birthwgt_lb的value_counts結(jié)果如下:
>>> df.birthwgt_lb.value_counts(sort=False) 0 8 1 40 2 53 3 98 4 229 5 697 6 2223 7 3049 8 1889 9 623 10 132 11 26 12 10 13 3 14 3 15 1 51 1數(shù)值6、7、8的出現(xiàn)次數(shù)是正確的。如果計(jì)算出0~5和9~95的次數(shù),結(jié)果也是正確的。但是,如果再看仔細(xì)些,你會(huì)發(fā)現(xiàn)有一個(gè)數(shù)值肯定是錯(cuò)的——一個(gè)51磅的新生兒!
為了處理這個(gè)錯(cuò)誤,可以在CleanFemPreg中加入一行代碼。
df.birthwgt_lb[df.birthwgt_lb > 20] = np.nan這行代碼將非法值替換為np.nan。方括號(hào)中的表達(dá)式產(chǎn)生一個(gè)bool類型的Series對(duì)象,值為True表示滿足該條件。當(dāng)一個(gè)布爾Series用作索引時(shí),它只選擇滿足該條件的元素。
1.8 解釋數(shù)據(jù)
要想有效使用數(shù)據(jù),就必須同時(shí)在兩個(gè)層面上思考問題:統(tǒng)計(jì)學(xué)層面和上下文層面。
例如,讓我們看一看幾位調(diào)查參與者的outcome序列。由于數(shù)據(jù)文件的組織方式,我們必須進(jìn)行一些處理才能得到每位調(diào)查參與者的妊娠數(shù)據(jù)。以下函數(shù)實(shí)現(xiàn)了我們需要的處理:
def MakePregMap(df): d = defaultdict(list) for index, caseid in df.caseid.iteritems(): d[caseid].append(index) return ddf是包含妊娠數(shù)據(jù)的DataFrame對(duì)象。iteritems方法遍歷所有妊娠記錄的索引(行號(hào))和caseid。
d是將每個(gè)caseID映射到一列索引的字典。如果你不熟悉defaultdict,可以到Python的collections模塊中查看其定義。使用d,我們可以查找一位調(diào)查參與者,獲得其妊娠數(shù)據(jù)的索引。
下面的示例就查找了一位調(diào)查參與者,并打印出其妊娠結(jié)果列表:
>>> caseid = 10229 >>> indices = preg_map[caseid] >>> df.outcome[indices].values [4 4 4 4 4 4 1]indices是調(diào)查參與者10229的妊娠記錄索引列表。
以這個(gè)列表為索引可以訪問df.outcome中指定的行,獲得一個(gè)Series。上面的示例沒有打印整個(gè)Series對(duì)象,而是選擇輸出values屬性,這個(gè)屬性是一個(gè)NumPy數(shù)組。
輸出結(jié)果中的代碼1表示成功分娩。代碼4表示流產(chǎn),即自發(fā)終止的妊娠,終止原因通常未知。
從統(tǒng)計(jì)學(xué)上看,這位調(diào)查參與者并無異常。流產(chǎn)并不少見,其他一些調(diào)查參與者的流產(chǎn)次數(shù)相同或者更多。
但是考慮到上下文,這個(gè)數(shù)據(jù)說明一位婦女懷孕6次,每次都以流產(chǎn)告終。她第7次也是最近一次懷孕成功產(chǎn)下了孩子。如果我們抱著同情心看待這些數(shù)據(jù),就很容易被數(shù)據(jù)背后的故事感動(dòng)。
全國(guó)家庭增長(zhǎng)調(diào)查數(shù)據(jù)集中的每一條記錄都代表一位參與者,這些參與者誠(chéng)實(shí)地回答了很多非常私密而且難以回答的問題。我們可以使用這些數(shù)據(jù)解答與家庭生活、生育和健康相關(guān)的統(tǒng)計(jì)學(xué)問題。同時(shí),我們有義務(wù)思及這些數(shù)據(jù)所代表的參與者,對(duì)他們心存敬意和感謝。
1.9 練習(xí)
-
練習(xí)1.1
你下載的代碼中應(yīng)該有一個(gè)名為chap01ex.ipynb的文件,這是一個(gè)IPython記事本。你可以用如下命令從命令行啟動(dòng)IPython記事本:
$ ipython notebook &
如果系統(tǒng)安裝了IPython,會(huì)啟動(dòng)一個(gè)在后臺(tái)運(yùn)行的服務(wù)器,并打開一個(gè)瀏覽器查看記事本。如果你不熟悉IPython,我建議你從IPython網(wǎng)站(http://ipython.org/ipython-doc/stable/notebook/notebook.html)開始學(xué)習(xí)。
你可以添加一個(gè)命令行選項(xiàng),使圖片在“行內(nèi)”(即在記事本中)顯示,而非彈出窗口:
$ ipython notebook --pylab=inline &
打開chap01ex.ipynb。記事本中一些單元已經(jīng)填好了代碼,可以直接執(zhí)行。其他單元列出了你應(yīng)該嘗試的練習(xí)。
本練習(xí)的參考答案在chap01soln.ipynb中。
-
練習(xí)1.2
創(chuàng)建一個(gè)名為chp01ex.py的文件,編寫代碼,讀取參與者文件2001FemResp.dat.gz。你可以復(fù)制nsfg.py文件并對(duì)其進(jìn)行修改。
變量pregnum是一個(gè)重編碼,用于說明每位調(diào)查參與者有過多少次妊娠經(jīng)歷。打印這個(gè)變量中不同值的出現(xiàn)次數(shù),將結(jié)果與全國(guó)家庭增長(zhǎng)調(diào)查代碼本中發(fā)布的結(jié)果進(jìn)行比較。
你也可以將每位調(diào)查參與者的pregnum值與妊娠文件中的記錄數(shù)進(jìn)行比較,對(duì)調(diào)查參與者文件和妊娠文件進(jìn)行交叉驗(yàn)證。
你可以使用nsfg.MakePregMap生成一個(gè)字典,將每個(gè)caseid映射到妊娠DataFrame的索引列表。
本練習(xí)的參考答案在chp01soln.py中。
-
練習(xí)1.3
學(xué)習(xí)統(tǒng)計(jì)學(xué)的最好方法是使用一個(gè)你感興趣的項(xiàng)目。你想研究“第一胎是否都會(huì)晚出生”這樣的問題嗎?
請(qǐng)思考一些你個(gè)人感興趣的問題,可以是傳統(tǒng)觀點(diǎn)、爭(zhēng)議話題或影響政局的問題,看是否可以構(gòu)想出一個(gè)能以統(tǒng)計(jì)調(diào)查進(jìn)行驗(yàn)證的問題。
尋找能幫助你回答這個(gè)問題的數(shù)據(jù)。公共研究的數(shù)據(jù)經(jīng)常可以免費(fèi)獲取,因此政府網(wǎng)站是很好的數(shù)據(jù)來源,如http://www.data.gov/和http://www.science.gov/。如果想獲得英國(guó)的數(shù)據(jù),可以訪問http://data.gov.uk/。
我個(gè)人最喜愛的兩個(gè)數(shù)據(jù)集是General Social Survey(http://www3.norc.org/gss+website/)和European Social Survey(http://www.europeansocialsurvey.org)。
如果有人看似已經(jīng)解答了你的問題,那么仔細(xì)檢查該回答是否合理。數(shù)據(jù)和分析中可能存在的缺陷都會(huì)使結(jié)論不可靠。如果發(fā)現(xiàn)別人的解答存在問題,你可以對(duì)同樣的數(shù)據(jù)進(jìn)行不同的分析,或者尋找更好的數(shù)據(jù)來源。
如果有一篇論文解答了你的問題,那么你應(yīng)該能夠獲得論文使用的原始數(shù)據(jù)。很多論文作者會(huì)把數(shù)據(jù)放在網(wǎng)上供大家使用,但如果涉及敏感信息,你可能需要向作者寫信索要,提供你計(jì)劃如何使用這些數(shù)據(jù)的信息,或者同意某些使用條款。堅(jiān)持就是勝利!
1.10 術(shù)語
-
軼事證據(jù)(anecdotal evidence)
隨意收集,而非通過精心設(shè)計(jì)的研究獲得的證據(jù),通常是個(gè)人證據(jù)。
-
總體(population)
在研究中,我們感興趣的群組。“總體”經(jīng)常指一組人,但這個(gè)詞也可以用于其他對(duì)象。
-
橫截面研究(cross-sectional study)
收集一個(gè)總體在某個(gè)特定時(shí)間點(diǎn)的數(shù)據(jù)的研究。
-
周期(cycle)
在重復(fù)進(jìn)行的橫截面研究中,每次研究稱為一個(gè)周期。
-
縱向研究(longtitudinal study)
在一段時(shí)間內(nèi)跟蹤一個(gè)總體的研究,從同一個(gè)群體重復(fù)收集數(shù)據(jù)。
-
記錄(record)
在數(shù)據(jù)集中,關(guān)于單個(gè)人或其他對(duì)象的信息集合。
-
調(diào)查參與者(respondent)
參與調(diào)查的人。
-
樣本(sample)
總體中用于數(shù)據(jù)收集的一個(gè)子集。
-
有代表性(representative)
如果總體中的每個(gè)成員被選入樣本的機(jī)會(huì)都均等,那么這個(gè)樣本就是有代表性的。
-
過度抽樣(oversampling)
一種通過增加一個(gè)子總體的樣本數(shù)來避免因樣本規(guī)模過小產(chǎn)生錯(cuò)誤的技術(shù)。
-
原始數(shù)據(jù)(raw data)
沒有經(jīng)過或只經(jīng)過少許檢查、計(jì)算或解釋,直接收集和記錄的值。
-
重編碼(recode)
通過計(jì)算和應(yīng)用于原始數(shù)據(jù)的其他邏輯生成的值。
-
數(shù)據(jù)清洗(data cleaning)
數(shù)據(jù)處理過程,包括數(shù)據(jù)驗(yàn)證、錯(cuò)誤檢查,以及數(shù)據(jù)類型和表示的轉(zhuǎn)換等。
總結(jié)
以上是生活随笔為你收集整理的统计思维:程序员数学之概率统计(第2版):第1章 探索性数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普林斯顿微积分读本:第 25 章 如何求
- 下一篇: 《精通Hadoop》:第 1 章 Had