クロス集計表をカイ二乗(χ2)検定するためのxchi
1. xchiの目的・特徴
- xchiは、クロス集計表に対してカイ二乗(χ2)検定を行い、その結果を出力します。クロス集計表は、csvなどで与えます。
χ2検定は、例えば、男女間で生活満足度に差があるかなどを検証する時に用いる統計手法の1つです。クロス集計表の数値の差が、統計的に意味のある差なのか、無視してもかまわない程度の差なのかを確認できます。 - 検定結果として、χ2値、自由度、P値のほか、調整残差の表なども出力します。
- Excelで扱えるxmlスプレッドシート(xmlss)およびテキストファイルの両方を書き出します。chitest.xml, chitest.txt の2つ。
- xchiは、rubyスクリプトで書かれていますが、rubyが動く環境であればOSを問わず利用可能です。
- xchi.exeは、rubyスクリプトをexerbで実行ファイル化したものです。MS-Windows上で、rubyのない環境でも実行できます。
- 期待値が別途与えられる適合度検定をxchiで行うことはできません。
- 表中の欄の数値が小さい時の補正は行いません。
2. 起動方法および結果
(1) xchi.exe
検定したい集計表が data01.csv, data02.csv に書かれているものとします。
MS-Windowsのコマンドプロンプトにおいて
xchi.exe data01.csv data02.csv ↓
のように実行すると、chitest.txt および chitest.xml がカレントフォルダに書き出されます。
(2) xchi.rb
rubyが実行可能な状態で、かつ、同梱の exlap_s.rb, qchi.rb がカレンドディレクトリにあれば、
ruby xchi.rb data01.csv data02.csv ↓
のように実行すると、chitest.txt および chitest.xml がカレントディレクトリに書き出されます。
3. 出力ファイルに書き出される情報
出力ファイル chitest.txt および chitest.xml には同じ情報が書き出されます。書き出されるのは次のものです。
- 与えられたクロス集計表(いわば素材表)
- 素材表に合計欄を加えた表(合計付加)
- χ2値、自由度、P値
- 横方向に足し算した時の各欄のパーセンテージの表(構成比)
- 各欄の期待値を算出した表(期待値)
- 各欄の残差を算出した表(残差)
- 各欄の調整残差を算出した表(調整残差)
- 各欄のχ2値を算出した表(χ2値)
xmlssファイルの場合、1つの素材表の検定結果を1つのワークシートに書き出します。
テキストファイルの方では、1つの素材表について書き出す時に、その先頭に ##1 とか ##2 など、半角シャープ記号2つと数字を置きます。検索の手がかりにして下さい。
実は、2.〜8.をxmlssに書き出す際、セルに数値や文字列をセットしていません。"=B8" とか "=SUM(B8:F8)" などのように、セル参照や計算式をセットしています。
例外は「自由度」で、この欄には数値をセットします。
このようにしておくと、xmlssをExcelで開いてGUI操作している最中、素材表の数値を変更すると、それに応じて 2.〜8.が総てリアルタイムで変化します。
素材表の行数や列数を変更すると正しい結果が得られませんが、行数と列数が同じであるかぎりは、中身を書き換えた時に、それに応じた各種の結果が表示されます。数値だけでなく見出しを変更してもOKです。
4. 素材表の抽出の仕方
検定の材料となる素材表は、data.csvなどのcsvファイルで与えることができるほか、data.xml(xmlssファイル)、data.htm(htmlファイル)で与えることもできます。
これらファイルの中にある表を検出する際、xchiは、次のように処理を行います。
- 2×2よりも大きいクロス集計表を対象とします。見出し(各欄の項目名)を含めると3×3以上です。見出しは縦・横ともに必須です。要するに、3×3よりも小さい表は取り上げません。
- 見出しは、半角数字以外を含むものとします。半角数字だけからなる欄は、見出しとしては認識しません。
- 半角数字だけから構成される欄を数値データとみなします。つまり整数のみを対象とします。小数点(ピリオド)あるいはプラス記号やマイナス記号を含むものは、数値データと見なしません。
- 見出しおよび数値データが同じ個数だけ並んでいる一連の行を素材表と見なします。
- 素材表は、必ずしも左上端から始まっている必要はありません。上記の条件に合致する領域を素材表と捕らえます。
- 素材表は、合計欄がないことを前提にします。縦または横の合計欄がある場合、それを除いた部分を素材表と見なします。
縦または横の合計欄のどちらか一方しかない時は、その一方を外したものを素材表と見なします。両方の合計欄がある時は、両方を外した領域を素材表と見なします。
合計欄か否かの判定は次のように行います。
a. 表の右上端の欄に「計」あるいはアルファベット大文字のN(全角・半角は問わない)が含まれていると、各行の右端の欄が合計欄である可能性があると捕らえます。
その上で、各行について横方向に足し算を行い、その結果が右端欄の値と合致すれば、右端が合計欄であると認識します。合致しない行が1行でもあると、合計欄とは見なしません。
b. 表の左下端の欄に「計」あるいはアルファベット大文字のN(全角・半角は問わない)が含まれていると、各列の下端の欄が合計欄である可能性があると捕らえます。
その上で、各列について縦方向に足し算を行い、その結果が下端欄の値と合致すれば、下端が合計欄であると認識します。合致しない行が1列でもあると、合計欄とは見なしません。
以上の基準で素材表を抽出しますが、ファイルによって、いくつの表を抽出するかが異なります。
- csvファイルの場合、1つのファイルから1つの素材表を取り出します。2つ以上を抽出することはありません。
- xmlssファイルの場合、1つのワークシートから1つの表を取り出します。ワークシートが複数ある時は、複数の素材表を抽出します。1つのワークシートから複数の表を抽出することはありません。
- htmlファイルの場合、その中のtableタグで囲まれた部分を素材表として取り出します。複数あれば複数抽出します。
5. 浮動小数点数の扱い
構成比や期待値等の表において、浮動小数点数は、基本的に小数点以下2桁までを有効桁数とします。
ただし、調整残差の表では、概ね小数点以下3桁までを表示します。
検定結果のχ2値とP値については、有効桁数を設けません。
6. カイ二乗検定に関する参考情報
アンケート結果をクロス集計表にしたとき、そこからどんな傾向を読み取れるのか分かりにくいケースがあります。
例えば、2008年の国民性に関する意識動向調査で、男女別に生活満足度を尋ねた結果は次のようになっています。
満足 | やや満足 | やや不満 | 不満 | 不明 | 合計 | |
男 | 193 | 403 | 151 | 36 | 5 | 788 |
女 | 299 | 440 | 114 | 32 | 3 | 888 |
合計 | 492 | 843 | 265 | 68 | 8 | 1676 |
上の表を見ると、「やや満足」が男女とも多いことは分かりますが、男女別で満足度に違いがあるのかなど、よく分かりません。
そこで、観測値でなくパーセンテージで見ると次のとおり。
満足 | やや満足 | やや不満 | 不満 | 不明 | 合計 | |
男 | 24.5 | 51.1 | 19.2 | 4.6 | 0.6 | 100.0 |
女 | 33.7 | 49.5 | 12.8 | 3.6 | 0.3 | 100.0 |
合計 | 29.4 | 50.3 | 15.8 | 4.1 | 0.5 | 100.0 |
観測値に比べると、少し分かりやすくなりました。
「満足」の割合は、男より女が多い傾向。
一方、「やや不満」は、女より男が多い傾向が窺えます。
ただ、そうした傾向が「無視してかまわない程度」なのか、「意味のある差(有意差)」なのかは、やはり統計検定を行ってみないと分かりません。
こうしたクロス集計表の検定によく用いる方法がカイ二乗(χ2)検定です。
仮に男女の間で満足度に違いがないとしたら、論理的にどんな値になるか(期待値)を算出し、それと観測値との差の大きさを手がかりにして検定します。
例えば、男の「満足」の期待値は、231.32です(観測値は 193)。観測値が期待値よりも小さいので、男女で差がないと仮定した時に比べると、実際の値が小さいと分かります。つまり男の満足度は小さい。
期待値算出の考え方は次のとおり。
回答者総計が1,676人、うち男が788人です。男が占める割合は 788/1,676=47%となります。回答者総数の男女比が 47:53 となるわけですが、男女間に違いがないとすれば、どの回答もこの男女比に従うはずです。
一方、「満足」と回答した人の合計は 492人ですから、これに男が占める割合47%を掛け合わせると、男女間に違いがないと仮定した時の男の「満足」の値(期待値)が出ます。これを式で書くと下のようになります。
「男の総数」÷「回答者総数」×「満足と回答した人の総数」
これを他のセルにも適用できるように抽象化して書くなら次のとおり。
「注目セルの行の合計」 × 「注目セルの列の合計」 ÷ 「総計」
上のような手順で各セルの期待値を算出すると、Excelにおいてχ2検定を行うことができます。
Excelでは、観測値が書かれた領域と期待値が書かれた領域が分かっていれば、CHITEST()関数でχ2検定の結果を得ることができます。
例えば、観測値が A1:C3、期待値が A11:C13 に書かれていたとすれば、
=CHITEST(A1:C3,A11:C13)
によってχ2検定の結果(P値)を得ることができます。
関数 CHITEST() で得られたP値が 0.05未満であれば、「性別によって満足度が違うといったことはない。」(男女とも満足度は同じ)という仮説が棄却されます。つまり「性別によって満足度に違いがある」という結論になります。
ただし、この結論が誤っている確率が5%程度あります。P値が 0.01未満であれば、結論が誤っている確率は1%くらい。
なお、前掲の表のP値は、約6.4e-005という、ごく小さな値でした。e-005は10万分の1です。
さて、男女間で満足度に違いがあることは検定できましたが、どの辺に違いがあるのかがまだ分かりません。
パーセンテージの表を見れば、それなりに傾向を読み取れますが、例えば、「やや満足」の男女間での差が有意なのか誤差の範囲なのか、判断できません。
P値が0.05未満で、全体的に「違いがある」と検定された時に、更にセルごとにどうなのかを見るためには、各セルの調整残差を求めます。
残差(調整残差でなく残差)は、観測値から期待値を差し引いた値です。その大小でそれなりの傾向を読み取ることができます。
ただし、残差の大きさは、調査の規模や項目の数によって様々な値になります。なので、それが大きいからといって有意に大きいと判断することはできません。そこで、残差を所定の手続きで基準化して、調整残差を求めます。
調整残差は、次の式で求めることができます。
(観測値−期待値)÷SQRT(期待値×(1−行計÷総計)×(1−列計÷総計))
SQRT(x) は、xの平方根(ルート)を求める関数です。
「行計」と「列計」は、該当セルが属する行の合計、列の合計のことです。
こうして求めた調整残差が1.96より大きければ(または -1.96より小さければ)、そのセルの値が有意に大きい(または小さい)と結論できます。ただし、その結論が誤っている確率が5%程度あります。
調整残差が2.58より大きければ(または -2.58より小さければ)、そのセルの値が有意に大きい(または小さい)と結論できますが、結論が誤っている確率は1%程度です。
[補足]
- 生活の満足度について「不明」という項目を上げましたが、これは、元々の表の「その他」と「わからない」を合わせたものです。この2つの実測値がごく少数だったため、2つを合わせました。
- χ2検定の結果であるP値を算出するためのrubyメソッド qchi() は、同梱のqchi.rbに書かれています。これに記述されているメソッドは、次のサイトにあるC言語プログラムをruby用に書き換えたものです。なるべく原本に忠実に書き換えたつもりです。
確率分布ライブラリ http://www5.airnet.ne.jp/tomy/cpro/sslib11.htm - 同梱の exlap_s.rb は、xmlss生成用ライブラリです。筆者が作ったものです。
以上。
Copyright (C) T. Yoshiizumi, 2011 All rights reserved.
Keyword(s):
References: