Stata による単純集計 | 鍵山琢実のきまぐれウェブサイト“kagitaku.com”

はじめに

ここでは、Stata を用いて行う単純集計のやり方をメモしています。内容は、度数分布表、グラフィカルな度数分布の確認、要約統計量(平均値や標準偏差など)の算出です。

度数の分布を見る:「tabulate」コマンド

データを本格的に分析する前に、個々の変数がどのように分布しているかチェックする必要があります。コーディングミスや外れ値の発見にもつながりますし、仮に分布が偏っていた場合、分析に問題が生じることがあるからです。まずは、非常に簡単な度数分布を見ることから始めてみましょう。

  1. tabulate varName, options
  2. tab1 varList, options
  3.   * options: missing, nolabel, plot

「tabulate」コマンドは、Stata で度数分布を確認するときの最も基本的なコマンドです。「varName」で指定した変数の度数分布表が表示されます。オプションで「missing」を指定すると、欠損値のケース数も出してくれます。「nolabel」オプションは値に付与されたラベルを表示せずに本来の値を表示します。「plot」オプションは簡易ヒストグラムです。まとめてやりたいときは「tab1」コマンドを使います。

例として、僕の卒論の調査で実際にやってみます。僕は、検索エンジンに関する知識を測る項目の1つとして、以下のような問いを使いました。

問5(1)日本でトップのシェアを持つ検索エンジンは次のうちどれでしょうか。

  1. Baidu(百度)
  2. goo(グー)
  3. Google(グーグル)
  4. MSN(マイクロソフトネットワーク)
  5. Yahoo!(ヤフー)
  6. 知らない/意味がわからない

正解は5番の「Yahoo!(ヤフー)」です。世界では Google が圧倒的なシェアを誇りますが、日本での Google のシェアは数十%に過ぎず、逆に Yahoo! JAPAN がほとんど独占しています。ちなみに1番の「Baidu(百度)」は中国 No. 1 の検索エンジンで、最近日本にも進出してきました。さて、この問い、どれくらいの人が正解したのでしょうか。

  1. tab q5s1, missing

[画像] Stata「tab q5s1, missing」の実行結果:度数分布表

Freq.」欄に度数、「Percent」欄に相対度数(%)、「Cum.」欄に累積相対度数(%)が表示されています。

1番と2番を選んだ人が1人もいなかったので、表では「3」から始まっています。正解の「5」を選んだ人は58人で、70.7%ですね。みなさん意外とこういうこと知ってるんですね。それとも普段よく使うのが Yahoo! だから Yahoo! 選んだだけとかでしょうか? 何にせよ、非常に正答率の高い問いであったことがわかります。

ちなみに、きちんとしたヒストグラムを描きたい場合には以下でご紹介している「histogram」コマンドを利用したほうがいいと思いますが、簡単に度数を見たいというときには「tabulate」コマンドの「plot」オプションで簡易ヒストグラムを描いてみるのもいいでしょう。上の「q5s1」の簡易ヒストグラムを描くと次のようになります。

  1. tab q5s1, plot

[画像] Stata「tab q5s1, plot」の実行結果:簡易ヒストグラム

ヒストグラムの描画:「histogram」コマンド

分布をよりグラフィカルに見る方法として、ヒストグラムを描くというのはよく用いられる方法です。当然ながら Stata にもコマンドが用意されています。

  1. histogram varName, options
  2.   * options: discrete, frequency, addlabels

「histogram」コマンドは、「varName」で指定した変数のヒストグラムを描きます。デフォルトでは連続型の変数用になっているので、必要であれば離散型用の「discrete」オプションを指定しましょう。また、ヒストグラムは基本的に縦軸が密度になるのですが、「ちょっとわかりにくい。度数がいい」ということであれば「frequency」オプションを指定します。「addlabels」オプションはそれぞれのバーにラベルを追加します。

連続型の変数と離散型の変数

変数が「連続型」「離散型」という性質で分類されることがあります。例えば時間のように、間が途切れることのないものは連続型の変数と言われます。一方、アンケートで1、2、3、4点で測定した回答などは離散型の変数と言われます。このように、値が連続しているか、それともとびとびかで分類されるというわけです。

厳密な話をすると、概念的に連続型であっても都合上離散的になってしまうということはよくあります。測定できる細かさに限界があるからです。例えば身長ですが、基本的にミリよりも小さい単位で測定することはまれですし、かなり困難になってきます。厳密には離散型なのですが、概念的に連続だと考えるほうが自然だし、かなり細かい単位で測定できているという理由から連続型と考えることが多いようです。逆に、調査での回答のように連続的でないと思えるようなものであっても、便宜上連続型の変数として分析するということもよくあります。

さて、上で度数分布表を出した問5(1)のヒストグラムを描いてみましょう。度数分布表と同じ値になっているのがわかります。

  1. hist q5s1, discrete freq addlabels

[画像] Stata「hist q5s1, discrete freq addlabels」の実行結果:ヒストグラム

幹葉表示(Stem-and-Leaf Displays):「stem」コマンド

幹葉表示(かんようひょうじ、みきはひょうじ)とは、簡便なヒストグラムのようなものです。ある桁で数値を分類すると決めて、その桁(幹)にどんな数値(葉)がどれくらいいるのかを表します(言葉で説明するの難しいですね)。表計算ソフトや統計パッケージが使えない環境でも、手作業で簡単に度数を確認できます。

僕の力不足から言葉での説明に限界を感じるので、具体例を用いてみます。例えば僕の卒論の調査での回答者の年齢(q6s5)の幹葉表示を考えてみましょう。年齢なので、3桁の人はほぼいないだろう、また、10の位はけっこうばらけるだろうと予測できます。そして、下は10代から、上は60代まであれば十分かなと予想します。ということで、10の位を幹として分類するとします。

  1. 1*|
  2. 2*|
  3. 3*|
  4. 4*|
  5. 5*|
  6. 6*|

「1*」「2*」などが「幹」になります。「1*」が10代、「2*」が20代を表していて、「|」の横に個々の回答者の年齢の1の位の数値を書き込んでいきます。これらの1の位の数値が「葉」になるというわけです。

最初の回答者を見てみると、22歳でした。ということで幹が「2」の葉部分に「2」と書きます。次は21歳でした。最初の「2」の右に「1」と書きます。次が22歳なら隣に「2」、さらに24歳なら隣に「4」という風な感じです。イメージがつかめてきたでしょうか?

  1. 1*|
  2. 2*|2124
  3. 3*|
  4. 4*|
  5. 5*|
  6. 6*|

さらに進めると30歳の人がいました。幹が「3」の葉部分に「0」と書きます。22歳、21歳と続いて、19歳が出たので幹が「1」の葉部分に「9」を書きいれましょう。次にまた19歳が出たらその隣にもう1つ「9」です。

  1. 1*|99
  2. 2*|212421
  3. 3*|0
  4. 4*|
  5. 5*|
  6. 6*|

もう少し進めていくと、20代がべらぼうに多いこと、40代以上はいないことがわかってきます。なので20代の幹をいくつかにわけ、40代以上を削ります。最終的には以下のようになります。ちなみにこれは Stata の「stem」コマンドで出した幹葉表示です。

[画像] Stata「stem age」の実行結果:幹葉表示

21、22、23歳が多いことがわかります。コマンドは以下です。

  1. gen age = q6s5
  2. stem age
  1. stem varName

「stem」コマンドは、「varName」で指定した変数の幹葉表示を行います。

参考までに、年齢の度数分布表を以下に載せておきます。上の幹葉表示と見比べてみてください。

[画像] Stata「tab age」の実行結果:度数分布表

要約統計量を算出する:「summarize」コマンド

「summarize」コマンド

平均値、標準偏差などの要約統計量を算出したいときは「summarize」コマンドを使います。

  1. summarize varList
  2.   * options: detail

「detail」オプションで中央値や分散などの詳細な統計量まで算出してくれますが、少々見づらくなってしまうので、通常はオプションなしで問題ないでしょう。

では、幹葉表示で例として見た年齢の要約統計量を算出してみましょう。

  1. sum age

[画像] Stata「sum age」の実行結果:要約統計量

Obs」がケース数(回答者数)、「Mean」が平均値、「Std. Dev.」が標準偏差、「Min」が最小値、「Max」が最大値を表しています。

不偏推定量

「summarize」コマンドで算出される標準偏差は (n - 1) で割ったものとなっています。この標準偏差は「不偏標準偏差」と呼ばれます(ちなみに、(n - 1) で割られた分散は「不偏分散」と呼ばれます)。不偏標準偏差を使うことは、サンプリングされたデータの生の統計量が母集団の「真の」標準偏差よりも小さくなってしまう(母標準偏差を過小推定してしまう)ことを修正する意味を持っています。サンプリングに伴うバイアスを抑えるために、(n - 1) のような自由度(degrees of freedom)で割ることで不偏標準偏差のような不偏推定量(unbiased estimator)を算出するというわけです。この「不偏推定量を使う」という算出方法は「summarize」コマンドの標準偏差に限らず、あらゆるコマンド、あらゆる統計量にもあてはまります(平均値は不偏推定量なので n で割って OK です。詳細は割愛)。

グループや条件ごとの要約統計量の算出:「tabstat」コマンド

あるグループの要約統計量を算出したいということもあるでしょう。例えば、上の「日本でトップシェアの検索エンジンは?」という問い(q5s1)での回答別に要約統計量を見たいとかですね。簡単に思いつく方法は、「if」文と「summarize」コマンドを使ってやるものです。

  1. for num 3/6: sum age if q5s1==X

[画像] Stata「sum age if q5s1==5」他の実行結果:要約統計量

「tabstat」コマンドを使うと、ちょっとスマートにできます。

  1. tabstat varList, options
  2.   * options: by(varName), statistics(statName)

「tabstat」コマンドは、「varList」で指定した変数の要約統計量を「by(varName)」の値ごとに算出します。このとき算出される統計量は、「statistics(statName)」で指定したものになります。指定できる統計量はたくさんありますが、使用頻度が高いのは以下の6つでしょう。

  • n : ケース数、回答者数
  • mean : 平均値。指定なしだと平均値のみになる
  • median : 中央値(p50でも可)
  • sd : 標準偏差
  • min : 最小値
  • max : 最大値

試しに全部指定して、上で「if」と「summarize」でやったことを「tabstat」でやってみましょう。

  1. tabstat age, by(q5s1) s(n mean median sd min max)

[画像] Stata「tabstat age, by(q5s1) s(n mean median sd min max)」他の実行結果:要約統計量

結果は同じですが、こちらのほうがコマンドも出力結果もすっきりしていると思います。ただ、毎回「s(n mean median sd min max)」とオプション指定するのは非常に面倒なので、コピペしたほうがいいでしょう。基本的な統計量だけ集めたセットか何かで「s(simple)」とかできればいいのにと思う今日この頃です。


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