効率的な実証分析のための手引きを読んだ

Stataでのデータハンドリングについて言及されたnoteを見つけた。
note.com

著者の方が、反応が無かったとおっしゃっていたので何か書いてみる。
shun takagi on Twitter: "stata での生データ整形とかは昔書いたけど特に反響なかったなー
https://t.co/uObll5EWeT

詳しい人誰か書いてくれないものか"



気になったのは2点。

1. データの読み込み範囲

元のExcelファイルは必要な都道府県別情報以外にも、地域別や整形のための無駄な行が多い。上のnoteの方は、こまかくdropしているけど、全体を読み込んでから都道府県名が書かれている行だけに限定しても良いかもしれない。
たとえば、

import excel using f005-01-049.xls, clear cellrange(A9) 
* 都道府県名のついた行だけに限定する。
** 都道府県名がついていたら1のつくフラグ(keep_rows)を作成する。ただこの方法だと北海道と沖縄は、地域別計と都道府県ごとに2回掲載されているのでよろしくない。
gen keep_rows = .
foreach pref_name in 北海道  青森 岩手 宮城 秋田 山形 福島  茨城 栃木 群馬 埼玉 千葉 東京 神奈川  新潟 富山 石川 福井  山梨 長野  岐阜 静岡 愛知 三重  滋賀 京都 大阪 兵庫 奈良 和歌山  鳥取 島根 岡山 広島 山口  徳島 香川 愛媛 高知  福岡 佐賀 長崎 熊本 大分 宮崎 鹿児島  沖縄{
    replace keep_rows = 1 if A == "`pref_name'"
}
keep if keep_rows==1
drop keep_rows

今回のデータの面倒なところは、北海道と沖縄が地域別計と都道府県ごとに2回掲載されている点。そのためにこのあとに重複の削除を行っている。

duplicates, drop 

上のは長ったらしいので、都道府県の範囲が分かっているならimport時にレンジを指定したほうが良いかもしれない。

import excel using f005-01-049.xls, clear cellrange(A9:K87) 

2.  欠損値の置き換え

処理としては2-1 欠損値を("n.a."から"."に)置換、2-2文字列から数値に置換、の2つ。

2-1 欠損値を("n.a."から"."に)置換

欠損値の処理はループを使った方がよさそう。たとえば、以下の感じ。なお元noteでは変数名を書き換えてるけど、ここでは面倒なのでしていません。

foreach var in C    D    E    F    G    H    I    J    K{
    replace `var' = "" if `var' == ""
    replace `var' = "" if `var' == "nc"
}

foreach文で対象の変数名を書くのが億劫な場合は、(強引だけど)、すべての変数に対して欠損値処理を行うという手もある。ただこの場合は、2列目(B列)が数値の変数なのでエラーが出る。必要ないのであらかじめdropする。

drop B
unab foo: _all
foreach var of lobal foo{
    replace `var' = "" if `var' == ""
    replace `var' = "" if `var' == "nc"
}
2-2文字列から数値に置き換え

はじめにdestringのほうから。destringは複数の変数にも対応できるので、なんども書かなくてもloopが終わった後に一度すればOK。

destring, replace

まとめ

すべてをまとめると以下の感じ。ループを使ってるんで行数は少なくなったと思われます。

import excel using f005-01-049.xls, clear cellrange(A9) 

* 都道府県名のついた行だけに限定する。
** 都道府県名がついていたら1のつくフラグ(keep_rows)を作成する。ただこの方法だと北海道と沖縄は、地域別計と都道府県ごとに2掲載されているのでよろしくない。
gen keep_rows = .
foreach pref_name in 北海道  青森 岩手 宮城 秋田 山形 福島  茨城 栃木 群馬 埼玉 千葉 東京 神奈川  新潟 富山 石川 福井  山梨 長野  岐阜 静岡 愛知 三重  滋賀 京都 大阪 兵庫 奈良 和歌山  鳥取 島根 岡山 広島 山口  徳島 香川 愛媛 高知  福岡 佐賀 長崎 熊本 大分 宮崎 鹿児島  沖縄{
    replace keep_rows = 1 if A == "`pref_name'"
}
keep if keep_rows==1
drop keep_rows

duplicates drop // 2回出現している北海道と沖縄の重複削除。今回のデータだとOKだけど似たような形式のデータを複数扱うときはミスにつながる可能性が。

* 欠損値の置き換え
foreach var in C    D    E    F    G    H    I    J    K{
    replace `var' = "" if `var' == ""
    replace `var' = "" if `var' == "nc"
}
** destringは一括で。
destring , replace // destring *, replace でもOK。
br se// リボンから確認しなくてもbrowseでデータを確認できる。

sum