空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

%%stataを使った分析例


flying-spotted-garden-eel.hatenablog.com
前回はセットアップについて解説しましたが、今回は実際の解析について説明します。
とりあえず、Jupyter Notebookを起動して最初のセルに

STATA_SYSDIR = "自分のstataのpath"

import stata_setup
stata_setup.config(STATA_SYSDIR, 'mp')

までは読み込みが終わっているとして話を進めます。

%%stataってなんぞや

www.stata.com
の記載の通りです。

  • %stata:STATAコマンドを1行のみ使う場合
  • %%stata:STATAコマンドを複数行使う場合

という違いはありますがiPython上でSTATAコマンドを1行のみ使うことはほとんどないと思いますので、%%stataのみを使うと良いでしょう。
マジックコマンドを使ってから、stataのuseでデータをわざわざ読み込むのはわざわざpy_stataを使う意味もないとは思うので、データのインポートの仕方だけ覚えておけば大丈夫でしょう。
特にSTATAはSQL関係が使い勝手が悪いので、データサーバーからデータを引っ張ってくるところまではSQLAlchemy *1で処理した方がいいのでは? と常々思います。

データの読み込み

import pandas as pd
import io
import requests

#アドレスが変わっているので注意すること
url_data = "https://www.stata.com/python/pystata18/misc/nhanes2.csv"

data = requests.get(url_data).content
nhanes2 = pd.read_csv(io.StringIO(data.decode('utf-8')))
nhanes2

py_stataのセットアップが終わったら、pythonモジュール類を読み込みデータをpandasのデータフレームに読み込みます。
元のデータのアドレスがチュートリアルと変わっているので、アドレスを上記のものに変えてあげる必要があります。
データフレームが読み込めていることを確認したら、

%%stata -d nhanes2 -force
label define sex2 1 "Male" 2 "Female"
encode sex, generate(sex2) label(sex2)

label define agegrp 1 "20-29" 2 "30-39" 3 "40-49" 4 "50-59" 5 "60-69" 6 "70+"
encode agegrp, generate(agegrp2) label(agegrp)

label variable bpsystol "systolic blood pressure"
label variable agegrp2 "Age Group"
label variable sex2 "1=Male, 2=Female"

describe bpsystol agegrp2 sex2

%%stataコマンドからデータフレームをpy_stataに読み込まさせます。

%%stata -d データフレームの名前 -force

で読み込むことができます。
それから下の諸々は通常のSTATAのコマンドです。

回帰分析の例

%%stata -eret steret
// fit a regression model
regress bpsystol agegrp2##sex2

一旦、「%%stata」でデータをpy_stataに渡してしまえば、あとは「%%stata」を入力するだけで、渡されたデータに対して各種の処理をしてくれます。
例では回帰分析を行なっています。Jupyter Notebookの画面上に

といったSTATAのコンソールでよく見る重回帰分析の結果が表記されるはずです。

まとめ

マジックコマンド「%%stata」を使うことでSTATA上でpythonを動かすよりかは比較的シームレスにデータの操作を行うことができます。
pythonの方に使い勝手が良いライブラリーが揃っていることは多々ありますのでそこから処理をしたデータをSTATAで分析のみを行うには最適な方法だと言えます。