効率的な実証分析のための手引きを読んだ
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