Exercise from Think Stats, 2nd Edition (thinkstats2.com)
Allen Downey


In [2]:
import nsfg
df = nsfg.ReadFemPreg()
df


nsfg.py:42: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  df.birthwgt_lb[df.birthwgt_lb > 20] = np.nan
Out[2]:
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 [3]:
df.birthord.value_counts().sort_index()


Out[3]:
1     4413
2     2874
3     1234
4      421
5      126
6       50
7       20
8        7
9        2
10       1
dtype: int64

Print value counts for prglngth and compare to results published in the codebook


In [19]:
df.prglngth.value_counts().sort_index()


Out[19]:
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
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 [23]:
print df.agepreg.value_counts().sort_index()


10.33     1
10.50     1
10.83     1
10.91     1
11.08     1
11.41     1
11.50     1
11.75     2
12.08     1
12.25     1
12.41     2
12.50     1
12.66     2
12.75     1
12.83     2
12.91     1
13.00     2
13.08     1
13.16     1
13.25     4
13.33     1
13.50     3
13.58     2
13.66     5
13.75     4
13.83     5
13.91     5
14.00     5
14.08     7
14.16    12
         ..
40.50     6
40.58     4
40.66     4
40.75     2
40.83     4
40.91     4
41.00     2
41.08     2
41.16     2
41.25     6
41.33     1
41.41     2
41.58     4
41.75     3
41.83     1
41.91     4
42.08     2
42.16     1
42.25     1
42.33     1
42.41     1
42.50     2
42.58     2
42.75     2
43.00     3
43.16     1
43.25     4
43.58     3
43.91     1
44.08     1
dtype: int64

Compute the mean birthweight.


In [3]:
df.totalwgt_lb.mean()


Out[3]:
7.2656284576233681

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 [25]:
df['totalwgt_kg'] = df.totalwgt_lb * 0.453592
df.totalwgt_kg.mean()


Out[25]:
3.2956309433503437

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 [48]:
# FMAROUT5 - Formal marital status at pregnancy outcome
%matplotlib inline
print df.fmarout5.plot(kind='hist')


Axes(0.125,0.125;0.775x0.775)

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.

Atleast two methods are there. sum() or len() can be used.


In [53]:
(df.outcome == 1).sum()


Out[53]:
9148

In [5]:
live = df[df.outcome == 1]
len(live)


Out[5]:
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 [66]:
live_births = df[df.outcome == 1]
len(live_births[(live_births.birthwgt_lb >= 9) & (live_births.birthwgt_lb <= 95) ])


Out[66]:
798

Use birthord to select the records for first babies and others. How many are there of each?


In [67]:
firsts = df[df.birthord==1]
others = df[df.birthord>1]
len(firsts), len(others)


Out[67]:
(4413, 4735)

Compute the mean weight for first babies and others.


In [8]:
firsts.totalwgt_lb.mean()


Out[8]:
7.201094430437772

In [9]:
others.totalwgt_lb.mean()


Out[9]:
7.3258556149732623

Compute the mean prglngth for first babies and others. Compute the difference in means, expressed in hours.


In [71]:
(firsts.prglngth.mean() - others.prglngth.mean())*7*24


Out[71]:
13.110260818628319