Stata によるデータ処理 | 鍵山琢実のきまぐれウェブサイト“kagitaku.com”

はじめに

ここでは、Stata を使ったデータハンドリングの方法を書いていきます。欠損値処理、反転処理、新変数の作成、ラベル機能の説明がその内容です。

欠損値処理

調査や実験をしていると、とりわけ社会科学では、どうしても欠損値が生じます。「9」や「99」とコーディングされた欠損値をそのままの値で扱ってしまっては、本来のデータの姿とはかけ離れた分析結果が得られてしまいます。したがって、これらの欠損値を分析から除外する必要があります。Stata では、値をピリオド「.」にすることで、そのデータは欠損値として扱われ、分析から除外されます。

欠損値とは

調査が実施されたとき、回答者によっては、「ちょっと年収は答えたくないな……」といったようにある質問に答えなかったり、「“1〜4の番号に○”とあるけど、どうしても甲乙つけがたいから2と3の両方に○をつけよう」といったように研究者にとってはコーディングの際に面倒な答え方をしたりすることがあります。また、何か機器を用いて実験をしようというときにそれが故障してしまうなどでデータが一部欠けてしまうということがあります。

こういった欠落した値を「欠損値(missing value)」と呼びます。社会科学系の調査や実験では、欠損値を「正しい値」と区別するために、普通はありえない「9」や「99」などの値を付与することが多いようです。

Stata による欠損値処理:「recode」コマンド

Stata で「9」や「99」などの値を欠損値「.」に置換するとき、また、もっと一般的に数値を置換するときには基本的に「recode」コマンドを使います。

  1. recode varList (rules), options
  2.   * rules: old# = new#,
               nonmissing = new#,
               missing = new#,
               else = new#
  3.   * options: generate(newVar)

この「recode」コマンドは、欠損値処理に限らずあらゆる置換場面で役立つコマンドです。「varList」に置換対象の変数を並べ、「old#」に置換前の数値、「new#」に置換後の数値を入力します。「old#」の代わりに「nonmissing」「missing」「else」を使うこともできます。「nonmissing」は、欠損値「.」以外の値を置換し、「missing」すべての欠損値「.」を置換し、「else」は指定されなかった残りの値を置換します。なお、「generate」オプションは、「recode」コマンドで置換された値を持った新たな変数「newVar」を作るというものです。このページの下のほうで述べている「もう1つのダミー変数作成方法」も併せてご覧ください。

例えば、「q1」という変数の欠損値が「99」だとしたら、以下のコマンドで欠損値処理が可能です。

  1. recode q1 (99 = .)

複数の変数を対象に置換したい場合は、「varList」にそれらを並べることで一気に置換できます。普通、変数を並べる際は変数を半角スペース「 」で区切ります。例えば、q1、q2、q3、q4、q5 と変数があったとき、q4 以外の変数を置換したい、つまり、q1 から q3、そして q5 を置換したいとすると、以下のコマンドになります。

  1. recode q1-q3 q5 (99 = .)

変数を結ぶハイフン

このコマンドでは、q1 と q3 をハイフン「-」で結んでいます。Stata では、このように変数をハイフンで結ぶと「変数●●から変数××まで」といった表現が可能です。数値を結ぶスラッシュと一緒に覚えるといいでしょう。

また、「99」だけでなく「88」も一緒に欠損値としたいというときには、以下のようにすれば可能です。

  1. recode q1-q3 q5 (88 99 = .)
  1. recode q1-q3 q5 (88 = .) (99 = .)

なお、「varList」の変数が1つの場合には「(99 = .)」部分のかっこは必要ないのですが、複数の変数を同時に置換するときには必要になります。「varList」が複数であることが多い人は、常にかっこをつける癖をつけておくと無難です。

「for varlist/numlist」を使った一括置換

「for varlist」文、「for numlist」文を使って一括置換することも可能です。

  1. for varlist varList: recode X (99 = .)
  1. for numlist #: recode qX (99 = .)

「for varlist」文は、「varList」で指定したすべての変数に対してコロン「:」以降のコマンドを実行します。このとき、「varList」で指定された変数が順番に「X」に代入されます(ということは、変数名に大文字の「X」を使っている場合には注意が必要です)。つまり、次のコマンドは、q4 以外の変数を置換するという上のコマンドと同じ結果を返します。

  1. for varlist q1-q3 q5: recode X (99 = .)

もう1つの「for numlist」文は、「#」で指定されたすべての数に対してコロン「:」以降のコマンドを実行します。このとき、「#」で指定された数が順番に「X」に代入されます。「qX」の部分は「varX」(var1、var2、……)でも「factorX」(factor1、factor2、……)でも「hensuX」(hensu1、hensu2、……)でもとにかく「X」を含んでいればよく、「X」の部分に数が代入されます。したがって、次のコマンドもまた上のコマンドと同じ結果を返します。

  1. for numlist 1/3 5: recode qX (99 = .)

数値を結ぶスラッシュ

このコマンドでは、「1/3」のようにスラッシュ「/」を使っています。Stata では、このように数値をスラッシュで結ぶと「数値●●から数値××まで」といった表現が可能です。変数を結ぶハイフンと一緒に覚えるといいでしょう。

なお、「for varlist」文、「for numlist」文は当然ながら「recode」以外のコマンドでも使えます。以下でご紹介する反転処理によく使う「replace」コマンドは「for varlist/numlist」文と一緒に使うことの最も多いコマンドの1つです。

反転処理:「replace」コマンド

例えば政治関心を測定する質問を作るとき、「あなたは政治に関心がありますか」という質問に対して、以下のように答えてもらうことがあります(本格的に政治関心を尋ねるときはもう少し慎重に尋ねますが)。

  1. 関心がある
  2. どちらかと言えば関心がある
  3. どちらかと言えば関心がない
  4. 関心がない

これをそのままコーディングすると、「数値が低いほど政治関心が高い」という、直感にそぐわない変数になってしまいます。したがって、値を反転させて、「数値が高いほど政治関心も高い」とすることが多いです。こちらのほうが直感的にわかりやすいですね。反転も上でご紹介した「recode」コマンドを使って地道にやれるといえばやれますが、「replace」コマンドを使ったほうがスマートにできます。

  1. replace varName = exp

「replace」コマンドは、「varName」で指定した変数に対して、「exp」の数式・関数を適用します。上の政治関心の例の場合、「polInt」という変数名だとすると、以下のコマンドで反転処理可能です。

  1. replace polInt = 5 - polInt

これは、個々の回答者の「polInt」の得点を5から引くということを表しています。5から引くので、1点の人は4点、2点の人は3点、3点の人は2点、4点の人は1点になります。つまり、反転処理を施したいときは、「取りうる最大の数値 + 1 から当該変数を引く」ということになりますね。

さて、ここで「replace」コマンドを「for varlist」文とともに使った例を1つ。q1s1、q1s2、……q2s1、q2s2、……q3s1、q3s2、q3s3 という変数があって、全部1〜7点で測定したとしましょう。これを全部反転させたいときは、以下のコマンドです。

  1. for var q1s1-q3s3: replace X = 8 - X

ついでに「recode」コマンドでガリガリやる例も載せておきましょうw

  1. for var q1s1-q3s3: recode X (1 = 7) (2 = 6) (3 = 5) (4 = 4) (5 = 3) (6 = 2) (7 = 1)
  1. recode q1s1-q3s3 (1 = 7) (2 = 6) (3 = 5) (4 = 4) (5 = 3) (6 = 2) (7 = 1)

「1」を「7」に置換して「2」を「6」に置換して……「7」を「1」に置換してと、コマンドを見ただけで「うぇっ」となりますw ただし、いつも「replace」コマンドのほうがスマートかというとそうでもなく、逆に「recode」コマンドのほうがすっきりすることもあります。たいていのことは「recode」でも「replace」でも可能なので、状況に応じて使いわけるといいでしょう。

Stata における四則演算、数学関数

「引く」という表現が出てきたので、Stata における四則演算およびよく使う数学関数についてまとめておきます。これらは単体で使用することはなく、何らかのコマンド、もしくは「if」文とともに用います。

  1. x = y : x に y を代入する
  2. x==y : x と y が等しい
  3. x + y : x に y を足す
  4. x - y : x から y を引く
  5. x * y : x に y を掛ける
  6. x / y : x を y で割る
  7. x^y : x の y 乗
  8. log(x) : x の自然対数
  9. log10(x) : x の常用対数
  10. sqrt(x) : x の平方根、√x
  11. exp(x) : e の x 乗

「等しい」ことを表すときにはイコール「=」が2つ必要という点にご注意ください。イコールが1つだと、「y を x に代入する」「y で x を定義する」といった意味になります。ソフトウェアによっては「<-」「<=」といった表現を見かけますね。

新変数の作成:「generate」コマンド

新しい変数を作りたいというときには、「generate」コマンドを使います。

  1. generate newVar = exp

「generate」コマンドは、「exp」の数式・関数を適用した新しい変数「newVar」を作成します(複雑な数式・関数を適用した変数を作成する「egen」というコマンドもあります。これについては適宜解説するとします)。仮に、アンケートを行って、問20(q20)が年齢の項目だったとしましょう。今「q20」となっていてわかりづらい変数を「age」というわかりやすい変数にするには、以下のコマンドを実行すれば OK です。

  1. gen age = q20

なお、Stata には「rename」コマンドといって変数名を変更するコマンドが用意されていますが、後々のことを考えると、「q20」などの元の変数はそのまま残しておいたほうが無難です。今の年齢の例ではさほど問題ありませんが、分析を進めるうちに元の変数を使いたくなるということはよくあります。そういったときのことを考えて、できるだけ新しく変数を作るようにすることをお勧めします。ちなみに「rename」コマンドは、以下のように元々の変数名「old_varName」を新しい変数名「new_varName」に置き換えるものです。

  1. rename old_varName new_varName

変数のブレークダウン

年齢という量的な変数を「10代」「20代」「30代以上」というようにカテゴリ化したいことがあるでしょう。このような変数のブレークダウンには、「generate」コマンドと「replace」コマンドを「if」文とともに用いることで対処します。

量的変数と質的変数

ある変数が「量的」か「質的」かで分類されることがあります。これは一般には以下のように定義できます。

  • 量的変数:変数値を連続量とみなしうる変数(e.g., 年齢、収入、身長など)
  • 質的変数:一般に数や量で測れない変数(e.g., 性別、職業、配偶者の有無など)

一般的な定義は上記のようなものですが、その境界は一部曖昧です。実際に統計的な分析を行う際には、量的とみなすのが妥当か怪しい変数であっても量的変数として分析に投入することがあります。

「量的/質的」という定義は厳密には尺度水準の話に通じます。一般に尺度(変数)は以下の4つに分類されます。下に行くに従って情報量が増えていきます。

  • 名義尺度
  • 順序尺度
  • 間隔尺度
  • 比尺度(比率尺度、比例尺度)

1つ目の名義尺度は完全にカテゴリカル(質的)な尺度で、その値に順序はありませんし値を足したり引いたりすることもできません。職業、選挙で投票した政党などが該当します。

2つ目の順序尺度は、その値が順序だけの意味を持つ尺度です。値が等しいかどうか、大きいか小さいかということには意味がありますが、足したり引いたりといった演算はできません。一般的な調査での「あてはまる」〜「あてはまらない」というデータは厳密には順序尺度ですが(数値間の間隔が一定である保証がないため)、実際の多くの研究では下の間隔尺度として扱われています(「間隔は一定ではないが、ほぼ等しい」という立場)。この順序尺度は量的か質的か微妙なところですが、一般的には質的な変数に分類されます。

3つ目の間隔尺度は、数値の大小に意味があり、また、差が等しいことが間隔の等しさを意味します。したがって、大小比較に留まらず、数値の加減が可能です。ただし、「0」の基準が任意であるため、掛けたり割ったりすることはできません。例としては摂氏や華氏で測る温度が該当します。30℃は15℃の2倍暑いかというと、そんなことはないですね。この間隔尺度と次の比尺度が量的変数です。

最後の比尺度は、数値に完全な意味のある尺度です。数値の大小比較、加減、乗除のいずれも可能です。比にも意味があり、10は5の2倍の意味、50は10倍の意味を持ちます。重さや長さ、絶対温度で測る温度などは比尺度に当たります。

まずは、1行目で「age_c」という変数を新しく作成します(年齢「age」をカテゴリ化「categorize」するということで「age_c」としました)。値は何でもいいのですが、ここではとりあえず「1」としておきます。このとき、「if」文を使って「0歳から19歳まで」の回答者に限定します。次に2行目で「20歳から29歳まで」の場合は「age_c」に「2」を代入します。3行目で「30歳から100歳まで」は「age_c」を「3」とし(100歳以上の人がいないという想定です)、最後に、「age」が欠損値の場合は「age_c」も欠損値とします。これで、「10代」は「1」、「20代」は「2」、「30代以上」は「3」という新しい変数ができました。

  1. gen age_c = 1 if age>=0 & age<=19
  2. replace age_c = 2 if age>=20 & age<=29
  3. replace age_c = 3 if age>=30 & age<=100
  4. replace age_c = . if age==.

もちろん数値ではなく文字列を値として代入したいということもあるでしょう。例えば「10代」「20代」「30代以上」を「0to19」「20to29」「30to100」というような感じです。これももちろん可能です。その場合には「age_c = "0to19"」のように引用符「"」でくくってあげましょう。ただ、値を文字列にしてしまうと、数値の意味が失われてしまいます。したがって、個人的にはラベル機能を使うことをお勧めします。

「if」文を使わずに変数のブレークダウンを行う方法として、「egen」コマンドを使うこともできます。「egen」コマンドは非常に多くの関数を扱えますが、変数のブレークダウンには「cut」という関数を使います。

  1. egen newVar = cut(varName), options
  2.   * options: at(# [, #,..., #]), group(#)

上記のコマンドは、「varName」で指定した変数のブレークダウンして新しい変数「newVar」を作ります。「at」オプションで数値「#」を指定すれば、指定した数値で区切られます。上記の年代の例などでは「at」オプションが適当です。一方の「group」オプションは、「#」で指定した数のグループに回答者を均一に分類します。例えば中央値で2群にわけたい場合などに用いるといいでしょう。

以下のコマンドは、上で実行したように「age」という年齢の変数から「age_c」という年代の変数を作成します。

  1. egen age_c = cut(age), at(0, 10, 20, 30, 100)

「if」文を使う際の注意点

条件を指定するときに注意しなければならないのは、「範囲は閉じる」必要があるということです。例えば上の例では、「30歳から100歳まで」ではなく「30歳以上」と考えて「if age>=30」と書けそうな気がします。しかし、Stata はこの点に関してはちょっとおバカさんで、範囲を閉じないと欠損値もその範囲に含めてしまいます(「.」を「非常に大きい数」とみなしてしまうようです)。欠損が1つもないなら問題ありませんが、そういうデータというのはあまりないでしょうから、基本的に条件の範囲は閉じるよう癖をつけておきましょう。

さて、ここで「if」文の条件式をまとめておきます。

  1. if x==y : x と y が等しいとき
  2. if x!=y : x と y が等しくないとき(~=でも OK)
  3. if x > y : x が y より大きいとき
  4. if x < y : x が y より小さいとき
  5. if x>=y : x が y 以上のとき
  6. if x<=y : x が y 以下のとき
  7. if exp1 & exp2 : exp1 かつ exp2 のとき
  8. if exp1 | exp2 : exp1 または exp2 のとき

ダミー変数の作成

社会調査などでは職業を分析に投入したいということがあります。また、政治研究では、何党に投票したかを分析したいということがあるでしょう。はたまた、性別の効果を見たいということがあります。こうした変数はカテゴリカルな変数であり、仮に「会社員」が「1」、「自営業」が「2」のように数値が付与されていたとしても、その数値に意味はありません。

カテゴリカルな変数を独立変数(説明変数)として分析するときは、一般的には2群の平均値差の検定(いわゆる t 検定)や分散分析が用いられます。しかし、重回帰分析の統制変数として分析に投入したいということも社会調査においてはよくあります。その際には、本来カテゴリカルな変数を量的な変数と一緒に分析できるように、「0」か「1」の2値しかとらないダミー変数を利用します。

このダミー変数も、変数のブレークダウンと同様の方法で作ることができます。まずは性別のように2択のものについて考えてみましょう。仮に調査で性別の項目を次のように尋ねたとします。

問30. あなたの性別はどちらですか。

  1. 男性
  2. 女性

すると、コーディング段階では男性なら「1」、女性なら「2」となっているはずです。重回帰分析に投入するだけなら「1 or 2」のままでも問題ありませんが、あとでカテゴリが3つ以上あるものを扱うことの練習として、これも「0 or 1」に変換してみます。以下のコマンドで完了です。

  1. gen sex = q30
  2. recode sex (2 = 0)

このコマンドは、まず1行目で「q30」とまったく同じ値を持つ新変数「sex」を作成しています。この時点ではまだ男性が「1」、女性が「2」のままです。続いて2行目で、「sex」が「2」の人の値を「0」に置換しています。これで、女性が「0」、男性が「1」という変数が完成しました。

ダミー変数のベースと比較

ダミー変数で値が「0」のものを「ベースカテゴリ」と呼びます。女性が「0」、男性が「1」のダミー変数の場合は、「女性であること」がベースカテゴリです。「値が『0』のほうがベースになっている」ということで、性別の例では「女性に比べて男性は〜」「女性よりも男性のほうが〜」という議論が可能になります。

このように、2択の変数のダミー化はかなり容易にできます(そもそも必要ないことも多いです)。ちょっと厄介なのが、例えば職業のようにカテゴリ数の多いダミー変数です。仮に職業について次のように尋ねたとしましょう。

問35. あなたの職業を教えてください。

  1. 会社員
  2. 自営業
  3. 公務員
  4. パート/アルバイト
  5. 働いていない

このとき、「会社員」なら「1」、「自営業」なら「2」という風に数値が割り振られるわけですが、すでに述べたように、この数値には意味がありません。自営業のほうが会社員よりも「職業ポイント」のようなものが高いのかというと、そんなことはありませんから。さて、この例のようにたくさんのカテゴリがあるときのダミー化はどうすればいいでしょうか。

ダミー化の方法は2つあります(実は第3の方法もあります。「もう1つのダミー変数作成方法」参照)。まずはすぐに思いつく、基本的なコマンドで地道にガリガリやる方法をご紹介します。以下のコマンドです。「replace」の行が字下げされているのは見やすくするためなので気にしないでください。「//」以降も見やすくするためのコメントアウトです。

  1. gen job_office = 0 //会社員
  2.   replace job_office = 1 if q35==1
  3.   replace job_office = . if q35==.
  4. gen job_indep = 0 //自営業
  5.   replace job_indep = 1 if q35==2
  6.   replace job_indep = . if q35==.
  7. gen job_public = 0 //公務員
  8.   replace job_public = 1 if q35==3
  9.   replace job_public = . if q35==.
  10. gen job_arbeit = 0 //パート/アルバイト
  11.   replace job_arbeit = 1 if q35==4
  12.   replace job_arbeit = . if q35==.
  13. gen job_none = 0 //働いていない
  14.   replace job_none = 1 if q35==5
  15.   replace job_none = . if q35==.

上のコマンドでは、はじめにみんな「0」の値を持つ新変数を作っています(変数名は好きなように決めていいのですが、ここでは、頭に「job_」と付けて、そのあとに職業を端的に表すと思われる単語(の一部)を加えてみました)。そして該当するカテゴリにあてはまる場合にはダミー変数の値が「1」になり、欠損値なら欠損値になるというわけです。「recode」を使って以下のようにもできます。

  1. gen job_office = q35 //会社員
  2.   recode job_office (1 = 1) (2 = 0) (3 = 0) (4 = 0) (5 = 0)
  3. gen job_indep = q35 //自営業
  4.   recode job_indep (1 = 0) (2 = 1) (3 = 0) (4 = 0) (5 = 0)
  5. gen job_public = q35 //公務員
  6.   recode job_public (1 = 0) (2 = 0) (3 = 1) (4 = 0) (5 = 0)
  7. gen job_arbeit = q35 //パート/アルバイト
  8.   recode job_arbeit (1 = 0) (2 = 0) (3 = 0) (4 = 1) (5 = 0)
  9. gen job_none = q35 //働いていない
  10.   recode job_none (1 = 0) (2 = 0) (3 = 0) (4 = 0) (5 = 1)

こちらは、まず「q35」と同じ値で新変数を作成し、続いて対応する値を「1」に、それ以外の値を「0」に置換するということをやっています。どちらもぐちゃぐちゃしていてスマートじゃないですね。もしも変数名を「dummy_job_1」のように番号で表してもかまわないのであれば、次のような簡潔なコマンドでもダミー変数作成が可能です。

  1. for num 1/5: gen dummy_job_X = 0
  2. for num 1/5: replace dummy_job_X = 1 if q35==X
  3. for num 1/5: replace dummy_job_X = . if q35==.

このコマンドを実行すると、「dummy_job_1」「dummy_job_2」「dummy_job_3」「dummy_job_4」「dummy_job_5」の5つの変数ができます。それぞれ「会社員」「自営業」「公務員」「パート/アルバイト」「働いていない」に対応します。

これならコマンドは簡単ですが、変数名を番号で表すのなら、実は Stata にはダミー変数作成用のコマンドが用意されています。

  1. xi i.varName, options
  2.   * options: pre(prefix), noomit

この「xi」コマンドはダミー変数作成専用コマンドです。「varName」で元の変数名を指定します。「pre(prefix)」は、できあがるダミー変数の接頭辞です。「dummy_」なんかを指定してあげるとわかりやすいかもしれません。そして、最終的にできあがる変数名は「『prefix』『varName』_値」となります。「noomit」オプションについては例のあとに説明します。ちょっとわかりにくいと思うので、上の職業の例で実際にやってみましょう。

  1. gen job = q35
  2. xi i.job, pre(dummy_) noomit

これでできあがる変数は、「dummy_job_1」「dummy_job_2」「dummy_job_3」「dummy_job_4」「dummy_job_5」の5つです。それぞれ「会社員」「自営業」「公務員」「パート/アルバイト」「働いていない」に対応します。こちらのほうがすっきりと簡単にできるので簡単で便利かと思います。ただし、変数名が「接頭辞+番号」になってしまうので、それぞれが何を表しているのかわかりにくいという問題があります。この問題を避けるには、「xi」コマンドを使わずにダミー変数を作るしかありません。

ちなみに、オプションとして「noomit」を指定しない場合は、値の最小値のカテゴリ、この例だと「会社員」カテゴリのダミー変数が作られません。あとで使う可能性もあるので念のため「noomit」オプションを指定してすべてのカテゴリの分を作っておいたほうが無難です。

ダミー変数をいくつ作るか

実はカテゴリすべてのダミー変数を作る必要はありません。「xi」コマンドにわざわざ「noomit」オプションが用意されているのはそのためです。仮に「会社員」をベースカテゴリにするとしたら、「会社員」以外の4カテゴリ分を作れば事足ります。というのも、重回帰分析に投入できるのはベースカテゴリ以外のダミー変数だけだからです。ベースカテゴリ合わせて5つとも投入しようとすると、「1ついらないよ」と Stata に怒られてしまいます。この場合、Stata が勝手にベースカテゴリを判断します。

ただ、上で「noomit」オプションのところで軽く触れたように、実際に分析に投入するつもりのないカテゴリ(=ベースカテゴリ)であっても、後々投入したくなる可能性はあります。したがって、変数作成時点で不要だと思っても、念のため作成だけはしておいたほうが、後々の手間が省けるかもしれません。個人的には念のために作成しておくことをお勧めします。

なお、多カテゴリの際の解釈は、「会社員」がベースカテゴリだとすると、「会社員に比べて自営業は〜」「会社員より公務員のほうが〜」のようになります。つまり、ベースカテゴリと比較した解釈しかできないということです。「パート/アルバイト」と「働いていない」の違いを見たいと思ったら、このどちらかを新たにベースカテゴリとして分析し直す必要があります。これがまたダミー変数のちょっと厄介なところです。

もう1つのダミー変数作成方法

「xi」コマンドを使えば簡単なコマンドでダミー変数が作成できます。ただ、それぞれの変数の名前がわかりにくいという問題が残ってしまいます。「xi」コマンドより少し煩雑になり、また、ちょっと複雑になってしまいますが、「recode」コマンドを工夫するという方法もあります(上の2つの方法について書いたあとしばらくして知りました! なので追記ということになります)。これについても簡単に触れておきましょう。

その方法というのは、「recode」コマンドの「nonmissing」ルールと「generate」オプションを組み合わせるというものです(上記の「recode」コマンド解説を参照)。上の職業ダミーをこの方法で作ってみましょう。以下のコマンドです。

  1. recode q35 (1 = 1) (nonm = 0), gen(job_office) //会社員
  2. recode q35 (2 = 1) (nonm = 0), gen(job_indep) //自営業
  3. recode q35 (3 = 1) (nonm = 0), gen(job_public) //公務員
  4. recode q35 (4 = 1) (nonm = 0), gen(job_arbeit) //パート/アルバイト
  5. recode q35 (5 = 1) (nonm = 0), gen(job_none) //働いていない

これで「job_office」「job_indep」「job_public」「job_arbeit」「job_none」というダミー変数ができました。それぞれ「会社員」「自営業」「公務員」「パート/アルバイト」「働いていない」に対応していて、あてはまる回答者はダミー変数の値が「1」になっています。これならそれぞれのダミー変数がどの職業を表しているのか変数名からわかりますし、コマンドもそれほど大変ではありません。個人的にはこの方法をお薦めします。

Stata のラベル機能

Stata では、ラベル機能を使って変数や数値に説明を加えることができます。

ある変数の名前を付けるとき、「わかりやすい変数名にするとものすごく長くなってしまう。短くしたいけど、そうすると今度は何を表している変数かわからなくなりそうだ」ということ、ありますよね。そこそこ短い変数名で何を表しているか判断できるのがベストですが、変数名からは何を表しているかわかりにくかったとしても説明を加えることができれば、それはそれで1つの解決策になります。例えば、上の職業ダミーの「自営業」を表す変数は「job_indep」としましたが、これに「Jieigyou」とか「自営業」のような説明を付加できたらわかりやすくなると思います。

また、「ある変数の値は数値のままにしておきたいけれど、『1』が何を表していて、『2』が何を表していて、……というのが簡単にわかればいいのに」と考えることもけっこうありますよね。「変数のブレークダウン」のところで軽く触れたように引用符「"」でくくれば文字列を値とすることができますが、統計的な処理を施す際には数値のままにしておいたほうが何かと便利です。例えば、上で年齢の変数をブレークダウンして「age_c」という変数を作りましたが、これは「1」は「10代」、「2」は「20代」、「3」は「30代」を表していました。数値のままにしておけば量的な変数として分析できますが(カテゴリが3しかないというツッコミは措いておいて)、これを仮に「age_c = "0to19"」のように文字列にしてしまうと、もはや量的な変数として扱うことはできません。かといって「1」「2」「3」では何を表しているのかわかりづらいですね。これも「数値『1』は『10代』ということを表している」のような説明を加えることができればわかりやすくなります。

変数にラベルを付ける

まずは変数にラベルを付けるコマンドです。

  1. label variable varName "label"

「label variable」コマンドは、「varName」で指定した変数に「label」というラベルを付与します。ラベルは日本語も OK です(最近のバージョンから)。ただし、日本語ラベルはフォントを日本語にしていないと文字化けしてしまいます。フォント変更方法については「Stata の基本的な使い方」の「Stata のインターフェイス」のショートコラムをご覧ください。

こうしてラベルを付けると、ラベルを Variables ウィンドウで確認できます。当該変数の「Label」列でラベルが付いていることを確認してください。ラベルを付けると、「Stata による単純集計」でご紹介する「tabulate」コマンドなどのアウトプットで変数名の代わりにラベルが表示されるようになります。

上で作成した「age_c」という変数に「年代」というラベルを付けてみましょう。

  1. label variable age_c "年代"

Variables ウィンドウを見てみると、確かに変数「age_c」にはラベル「年代」が付与されています。

[画像] Variables ウィンドウ:ラベル付与の確認

次は「tabulate」コマンドで度数分布を見てみましょう。

  1. tab age_c

ラベル付けをしていないと以下のように表示されます。

[画像] 「tabulate」コマンド:ラベル付け前

「年代」とラベル付けをすると以下のように表示されます。「age_c」という変数名だった部分が「年代」というラベルになっているのがおわかりですね。

[画像] 「tabulate」コマンド:変数のラベル付け後

「generate」コマンドで変数を作ったら「label variable」コマンドでラベル付けしてあげるといいでしょう。ちなみに、「generate」コマンドのオプションか何かで「変数の作成とラベル付けを同時に」というコマンドを探しているのですが、見つけることができません。もしご存知の方がいらしたらご教授いただけると幸いです。

数値にラベルを付ける

数値にラベルを付ける場合には2ステップを踏みます。まずラベルのルール「『1』を『10代』、『2』を『20代』、……」を定義し、それから目的の変数に定義したルールを適用させるという2ステップです。

  1. label define labelName # "label" [# "label" ...], options
  2.   * options: add, modify
  3. label values varList labelName

「label define」コマンドは「labelName」という名前のルールを定義します。そのルールは、「# "label"」と記述し、数値「#」にラベル「label」を付与します。こうしてルールを定義したら、「label values」コマンドで、「varList」で指定した変数に対してルール「labelName」を適用します。なお、「label define」コマンドの「add」オプションはあとで新たなルールを追加するとき、「modify」オプションはあとから変更するときに使います。基本はオプションなしでいいでしょう。

具体的に、年代を表す「age_c」という変数で見てみましょう。「1」は「10代」、「2」は「20代」、「3」は「30代以上」という風にラベルを付けるとすると、次のコマンドを実行します。「labelName」は仮に「nendai」としましょう。

  1. label define nendai 1 "10代" 2 "20代" 3 "30代"
  2. label values age_c nendai

数値にラベルを付与すると、「tabulate」コマンドなどでの表示が数値でなくラベルになります。以下の画像と上のラベル付け前の画像を見比べてみてください。

  1. tab age_c

[画像] 「tabulate」コマンド:変数と数値のラベル付け後

こうして数値にラベル付けをすると、いろいろなコマンドで数値ではなくラベルが表示されるようになります。わかりやすくてとても便利なのですが、逆にもとの数値を見たいこともあるでしょう(特に二次分析を行うときなんかは、個々のラベルにどんな数値が振られているのか確認しないと大変なことになります)。そのときには、コマンドに「nolabel」オプションを付けてあげれば解決です。

  1. tab age_c, nolabel

[画像] 「tabulate」コマンド:「nolabel」オプション

ちなみに、上でご紹介した「recode」コマンドを次のように記述すると、「varList」で指定した変数に対して「old#」を「new#」に置換して「label」というラベルを付与します。

  1. recode varList (old# = new# "label")

Copyright © 2008-2012 鍵山琢実 (KAGIYAMA, Takumi). All rights reserved.

This page was last updated at 15:36:15 on July 27, 2010.

This site's design was checked by IE 6.0+, Firefox 3.5+, GChrome 2.0+, Safari 4.0+, Opera 10.0+, and Sleipnir 2.8+ (all for Windows).
And JavaScript is used for some details. I am so sorry if your browser is not supported.

正当なCSSです! 私はチーム・マイナス6%です

↓ Today's My Favorite Phrase ↓

「きさま──いったい何人の命をその傷のために吸い取った!?」
「おまえは今まで食ったパンの枚数をおぼえているのか?」

From: 荒木飛呂彦 『ジョジョの奇妙な冒険』第3巻 p. 149