ThinkStatsの進め方は、テキストをさらっと読んで、各章の演習問題をで復習する形式。
演習問題はIPython Notebook(Jupyter)を使って進めていく。
テキストではAnacondaを推奨していたので、ここらへん参考にしてpyenvからanaconda3-2.3.0をインストールした。
Pythonとパッケージのバージョンは以下。
更新頻度が速いので、すぐ変わりそう・・・
- python 3.4.3
- numpy 1.9.2
- scipy 0.15.1
- matplotlib 1.4.3
- pandas 0.16.2
- ipython 4.0.1
- ipython-notebook 4.0.4
演習問題のコードはgithubにあがっているためローカルに落としておく。
git clone https://github.com/AllenDowney/ThinkStats2.git
演習問題のコードが置いてあるディレクトリに移動しておく。
cd ThinkStats2/code/
ipython notebook()を起動する。
ブラウザが起動し、Jupyterというタイトルのページが表示される。
pip install ipython ipython notebook
ipython notebookに関して、–pylab=inline &をつけるよう書かれているが、最新版ではサポートされなくなったため、エラーが出る。
代わりに、以下を最初に実行。
%matplotlib inline
ブラウザには各章の演習問題で使われるファイルが表示されている。
chap01ex.ipynbを選択して演習問題を解いていこう。
- 演習問題1-1
1. 演習問題1-1
演習問題1-1はipytho notebookの操作になれてもらうためのような問題。
セルのプログラムの実行方法は、セルにカーソルをおき、Shift + Enter。
・セルにプログラムが書かれている部分は実行しなさい。
・空白のセルには指示に従ってプログラムを書き、実行させる。
セル1
一番最初のセルを試しに実行してみる。
下記のプログラムが既にセルに書かれていた。
import nsfg df = nsfg.ReadFemPreg() df
すると、以下の文言が追加で表示された。
(ページを開いた時は結果だけ表示されていて、エラーは表示されていなかったのに・・・)
/Users/runble1/work/books/ThinkStats2/code/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
まあプログラムの実行はできてそうだし、ここ参考にして次の記事で解決しよう・・・
一番最初のセルでは、nsfgというデータセットをdfに代入して、dfを表示している。
最初にデータセットを表示させておいて、後から参照するための気配りか。
dfは、nsfgデータセットをpandasで読み込んでおり、データ構造DataFrameとなる。
DataFrameは各レコードを表す行と各変数を表すカラムからなる(DBみたいなもん)。
また、pandasにはデータ構造として、Seriesなるものがある。
Seriesはindexからアクセス、DataFrameはカラムからアクセスする。
セル2
「Print value counts for birthord and compare to results published in the codebook」
上記の指示があり、セルにはプログラムが書かれている。
codebookと同じ表を作れということ。
※birthordは、nsfgデータセットにおける変数(カラム)で、「生児出生の場合の出生順序の整数」と定義されている。よくわからん。
df.birthord.value_counts().sort_index()
実行結果は下記。
1 4413 2 2874 3 1234 4 421 5 126 6 50 7 20 8 7 9 2 10 1 dtype: int64
DataFrameのdfから、Seriesオブジェクトのbirthhordを選び、各値の出現回数を数えるメソッドvalue_countsを使い、sort_indexでインデックス順にソートしている。
実行結果をcodebookと比較してみる。
トップにINAPPLICABLE 4445と書かれている以外正しそうだ。
・・・なにこれ?
null(nan)の出現回数らしい。
以下のプログラムで4445と出てくる。
df.birthord.isnull().sum()
セル3
「Print value counts for prglngth and compare to results published in the codebook」
セル2と同じように、codebookと同じ表を作る。ただしカラムはprglngthを使うこと。
このセルに関しては、解答用のプログラム(chap01soln.ipynb )では以下のように書かれている。
しかし下記の実行はcodebookの結果と一致しない。ミスってる?
df.prglngth.value_counts().sort_index()
一旦置いておこう・・・
コメント