Exercise from Think Stats, 2nd Edition (thinkstats2.com)
Allen Downey
In [10]:
%matplotlib inline
import nsfg
df = nsfg.ReadFemPreg()
df
Out[10]:
caseid
pregordr
howpreg_n
howpreg_p
moscurrp
nowprgdk
pregend1
pregend2
nbrnaliv
multbrth
...
laborfor_i
religion_i
metro_i
basewgt
adj_mod_basewgt
finalwgt
secu_p
sest
cmintvw
totalwgt_lb
0
1
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3410.389399
3869.349602
6448.271112
2
9
NaN
8.8125
1
1
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3410.389399
3869.349602
6448.271112
2
9
NaN
7.8750
2
2
1
NaN
NaN
NaN
NaN
5
NaN
3
5
...
0
0
0
7226.301740
8567.549110
12999.542264
2
12
NaN
9.1250
3
2
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
7226.301740
8567.549110
12999.542264
2
12
NaN
7.0000
4
2
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
7226.301740
8567.549110
12999.542264
2
12
NaN
6.1875
5
6
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4870.926435
5325.196999
8874.440799
1
23
NaN
8.5625
6
6
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4870.926435
5325.196999
8874.440799
1
23
NaN
9.5625
7
6
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4870.926435
5325.196999
8874.440799
1
23
NaN
8.3750
8
7
1
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
3409.579565
3787.539000
6911.879921
2
14
NaN
7.5625
9
7
2
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
3409.579565
3787.539000
6911.879921
2
14
NaN
6.6250
10
12
1
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
3612.781968
4146.013572
6909.331618
1
31
NaN
7.8125
11
14
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2418.069494
2810.302771
3039.904507
2
56
NaN
7.0000
12
14
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2418.069494
2810.302771
3039.904507
2
56
NaN
4.0000
13
14
3
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
2418.069494
2810.302771
3039.904507
2
56
NaN
NaN
14
15
1
NaN
NaN
NaN
NaN
1
NaN
NaN
NaN
...
0
0
0
1667.816099
3200.862017
5553.495599
1
33
NaN
NaN
15
15
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
1667.816099
3200.862017
5553.495599
1
33
NaN
7.6875
16
15
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
1667.816099
3200.862017
5553.495599
1
33
NaN
7.5000
17
18
1
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
2957.257457
3404.403067
4153.371741
2
14
NaN
6.3125
18
18
2
NaN
NaN
NaN
NaN
1
NaN
NaN
NaN
...
0
0
0
2957.257457
3404.403067
4153.371741
2
14
NaN
NaN
19
21
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3408.342437
3965.763949
7237.122630
1
48
NaN
8.7500
20
21
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3408.342437
3965.763949
7237.122630
1
48
NaN
8.1875
21
23
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
6210.373020
8120.841310
13533.382043
2
64
NaN
5.5625
22
23
2
NaN
NaN
NaN
NaN
1
NaN
NaN
NaN
...
0
0
0
6210.373020
8120.841310
13533.382043
2
64
NaN
NaN
23
24
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3409.573258
4068.628645
7424.840414
1
27
NaN
6.7500
24
24
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3409.573258
4068.628645
7424.840414
1
27
NaN
7.3750
25
24
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3409.573258
4068.628645
7424.840414
1
27
NaN
6.8125
26
28
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3407.794208
3808.343516
6949.846082
2
57
NaN
8.1250
27
31
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3405.679025
4272.084519
5211.943113
1
2
NaN
7.1250
28
31
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3405.679025
4272.084519
5211.943113
1
2
NaN
6.0625
29
31
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3405.679025
4272.084519
5211.943113
1
2
NaN
7.4375
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
13563
12547
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3453.545517
6628.022524
11499.619080
1
52
NaN
7.6875
13564
12547
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3453.545517
6628.022524
11499.619080
1
52
NaN
7.6250
13565
12550
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3080.452699
3745.326058
5268.550165
1
79
NaN
8.1250
13566
12551
1
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
2418.538866
3653.453268
3951.940400
2
75
NaN
7.5000
13567
12554
1
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
1914.676604
2177.957240
2764.045534
2
75
NaN
NaN
13568
12554
2
NaN
NaN
NaN
NaN
4
NaN
NaN
NaN
...
0
0
0
1914.676604
2177.957240
2764.045534
2
75
NaN
NaN
13569
12556
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2474.619764
3250.573384
3965.699528
1
44
NaN
5.8125
13570
12556
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2474.619764
3250.573384
3965.699528
1
44
NaN
6.6875
13571
12556
3
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2474.619764
3250.573384
3965.699528
1
44
NaN
6.0000
13572
12556
4
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2474.619764
3250.573384
3965.699528
1
44
NaN
5.8125
13573
12561
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2418.089703
2698.650781
4497.301527
1
10
NaN
6.5625
13574
12561
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2418.089703
2698.650781
4497.301527
1
10
NaN
6.1250
13575
12564
1
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
1820.850938
2129.214067
2768.191208
2
44
NaN
NaN
13576
12565
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
3195.641221
3834.241709
6652.409365
1
78
NaN
6.4375
13577
12565
2
35
1
8
NaN
NaN
NaN
NaN
NaN
...
0
0
0
3195.641221
3834.241709
6652.409365
1
78
NaN
NaN
13578
12566
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2080.317155
2422.820274
2627.548587
2
2
NaN
6.0000
13579
12566
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2080.317155
2422.820274
2627.548587
2
2
NaN
7.0000
13580
12568
1
NaN
NaN
NaN
NaN
1
NaN
NaN
NaN
...
0
0
0
2734.687353
4258.980140
7772.212858
2
28
NaN
NaN
13581
12568
2
NaN
NaN
NaN
NaN
5
NaN
1
NaN
...
0
0
0
2734.687353
4258.980140
7772.212858
2
28
NaN
6.3750
13582
12568
3
NaN
NaN
NaN
NaN
4
NaN
NaN
NaN
...
0
0
0
2734.687353
4258.980140
7772.212858
2
28
NaN
NaN
13583
12569
1
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
2580.967613
2925.167116
5075.164946
2
61
NaN
NaN
13584
12569
2
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
2580.967613
2925.167116
5075.164946
2
61
NaN
6.3750
13585
12570
1
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
5181.311509
6205.829154
11325.017623
2
40
NaN
NaN
13586
12570
2
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
5181.311509
6205.829154
11325.017623
2
40
NaN
NaN
13587
12570
3
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
5181.311509
6205.829154
11325.017623
2
40
NaN
NaN
13588
12571
1
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4670.540953
5795.692880
6269.200989
1
78
NaN
6.1875
13589
12571
2
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
4670.540953
5795.692880
6269.200989
1
78
NaN
NaN
13590
12571
3
NaN
NaN
NaN
NaN
3
NaN
NaN
NaN
...
0
0
0
4670.540953
5795.692880
6269.200989
1
78
NaN
NaN
13591
12571
4
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4670.540953
5795.692880
6269.200989
1
78
NaN
7.5000
13592
12571
5
NaN
NaN
NaN
NaN
6
NaN
1
NaN
...
0
0
0
4670.540953
5795.692880
6269.200989
1
78
NaN
7.5000
13593 rows × 244 columns
Print value counts for birthord and compare to results published in the codebook
In [6]:
df.birthord.value_counts().sort_index()
Out[6]:
1 4413
2 2874
3 1234
4 421
5 126
6 50
7 20
8 7
9 2
10 1
Name: birthord, dtype: int64
Print value counts for prglngth and compare to results published in the codebook
In [7]:
df.prglngth.value_counts().sort_index()
Out[7]:
0 15
1 9
2 78
3 151
4 412
5 181
6 543
7 175
8 409
9 594
10 137
11 202
12 170
13 446
14 29
15 39
16 44
17 253
18 17
19 34
20 18
21 37
22 147
23 12
24 31
25 15
26 117
27 8
28 38
29 23
30 198
31 29
32 122
33 50
34 60
35 357
36 329
37 457
38 609
39 4744
40 1120
41 591
42 328
43 148
44 46
45 10
46 1
47 1
48 7
50 2
Name: prglngth, dtype: int64
Print value counts for agepreg and compare to results published in the codebook.
Looking at this data, please remember my comments in the book about the obligation to approach data with consideration for the context and respect for the respondents.
In [38]:
df.agepreg.hist(by=df.birthord)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-bb18c8e2a91b> in <module>()
----> 1 df.agepreg.hist(by=df.birthord)
/Users/nathankiner/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in hist_series(self, by, ax, grid, xlabelsize, xrot, ylabelsize, yrot, figsize, bins, **kwds)
2909 axes = grouped_hist(self, by=by, ax=ax, grid=grid, figsize=figsize, bins=bins,
2910 xlabelsize=xlabelsize, xrot=xrot, ylabelsize=ylabelsize, yrot=yrot,
-> 2911 **kwds)
2912
2913 if hasattr(axes, 'ndim'):
/Users/nathankiner/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in grouped_hist(data, column, by, ax, bins, figsize, layout, sharex, sharey, rot, grid, xlabelsize, xrot, ylabelsize, yrot, **kwargs)
2950 fig, axes = _grouped_plot(plot_group, data, column=column,
2951 by=by, sharex=sharex, sharey=sharey, ax=ax,
-> 2952 figsize=figsize, layout=layout, rot=rot)
2953
2954 _set_ticks_props(axes, xlabelsize=xlabelsize, xrot=xrot,
/Users/nathankiner/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in _grouped_plot(plotf, data, column, by, numeric_only, figsize, sharex, sharey, layout, rot, ax, **kwargs)
3061 if numeric_only and isinstance(group, DataFrame):
3062 group = group._get_numeric_data()
-> 3063 plotf(group, ax, **kwargs)
3064 ax.set_title(com.pprint_thing(key))
3065
/Users/nathankiner/anaconda/lib/python2.7/site-packages/pandas/tools/plotting.pyc in plot_group(group, ax)
2944 """
2945 def plot_group(group, ax):
-> 2946 ax.hist(group.dropna().values, bins=bins, **kwargs)
2947
2948 xrot = xrot or rot
/Users/nathankiner/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
5598 elif len(flat) == 1 and not binsgiven:
5599 raise ValueError(
-> 5600 "x has only one data point. bins or range kwarg must be given")
5601
5602 # Massage 'x' for processing.
ValueError: x has only one data point. bins or range kwarg must be given
In [ ]:
Compute the mean birthweight.
In [5]:
df.totalwgt_lb.mean()
Out[5]:
7.265628457623368
Create a new column named totalwgt_kg that contains birth weight in kilograms. Compute its mean. Remember that when you create a new column, you have to use dictionary syntax, not dot notation.
In [12]:
df['totalwgt_kg'] = df.totalwgt_lb / 2.20462
df.totalwgt_kg.mean()
Out[12]:
3.295637550971785
Look through the codebook and find a variable, other than the ones mentioned in the book, that you find interesting. Compute values counts, means, or other statistics.
In [13]:
df.finalwgt.value_counts().sort_index()
Out[13]:
118.656790 1
149.179094 1
260.900498 1
374.737005 5
398.852225 3
579.500779 4
604.847445 4
610.200501 1
610.638556 3
649.341376 4
804.935269 4
944.952181 1
970.180387 1
1067.636070 8
1093.033956 2
1102.001039 4
1112.184547 5
1131.645848 4
1143.983665 1
1158.805974 1
1238.519553 2
1264.292128 2
1340.710511 1
1354.303784 1
1366.499601 1
1374.122385 1
1380.991135 14
1398.317430 2
1399.252895 2
1409.059829 5
..
48440.790633 4
48685.726642 2
49692.877093 4
49890.682653 2
49928.160343 6
51702.824860 1
51840.354621 6
52849.068802 4
52882.262360 4
52885.250453 5
53159.806737 3
54130.405297 2
54733.175009 2
56717.972209 4
57623.969745 3
59616.730305 3
59955.527127 2
60473.286527 2
60541.339661 4
61959.225611 3
63633.129525 7
64180.462924 4
65152.308279 2
65502.800561 6
68375.710204 3
76356.689648 3
78196.162962 4
82311.946129 1
89086.582781 2
261879.953864 6
Name: finalwgt, dtype: int64
Create a boolean Series.
In [4]:
df.outcome == 1
Out[4]:
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
10 True
11 True
12 True
13 False
14 False
...
13578 True
13579 True
13580 False
13581 True
13582 False
13583 False
13584 True
13585 False
13586 False
13587 False
13588 True
13589 False
13590 False
13591 True
13592 True
Name: outcome, Length: 13593, dtype: bool
Use a boolean Series to select the records for the pregnancies that ended in live birth.
In [15]:
live = df[df.outcome == 1]
len(live)
Out[15]:
9148
Count the number of live births with birthwgt_lb between 0 and 5 pounds (including both). The result should be 1125.
In [6]:
len(live[(live.birthwgt_lb >= 0) & (live.birthwgt_lb <= 5)])
Out[6]:
1125
Count the number of live births with birthwgt_lb between 9 and 95 pounds (including both). The result should be 798
In [16]:
len(live[(live.birthwgt_lb >= 9) & (live.birthwgt_lb <= 95)])
Out[16]:
798
Use birthord to select the records for first babies and others. How many are there of each?
In [17]:
firsts = df[df.birthord==1]
others = df[df.birthord>1]
len(firsts), len(others)
Out[17]:
(4413, 4735)
Compute the mean weight for first babies and others.
In [18]:
firsts.totalwgt_lb.mean()
Out[18]:
7.201094430437772
In [19]:
others.totalwgt_lb.mean()
Out[19]:
7.325855614973262
Compute the mean prglngth for first babies and others. Compute the difference in means, expressed in hours.
In [20]:
fln = firsts.prglngth.mean()
oln = others.prglngth.mean()
hdiff = (fln - oln) * (7*24)
print "First baby's average pregnancy weeks: %.2f" % fln
print "Not first baby's average pregnancy weeks: %.2f" % oln
print "Average hours of difference: %.2f" % hdiff
First baby's average pregnancy weeks: 38.60
Not first baby's average pregnancy weeks: 38.52
Average hours of difference: 13.11
Content source: Nathx/think_stats
Similar notebooks: