歴史研究者が学ぶべき最も重要な統計手法は「カイ二乗検定」といわれます。
カイ二乗検定などの意義については、過去の記事で紹介しました。
統計学まなびはじめ(『人文学のための計量分析入門』『基礎から学ぶ統計学』)
かつては手計算するしかなかった統計検定も、現代ではオンライン上で必要なデータを入れれば自動的に計算される時代です。
高等数学や統計学を修めた一部の人々しか扱えなかった検定が、今は門外漢でも利用できるということです。
では、歴史学でカイ二乗検定を扱う場合、どのような手順を踏んで算出まで導けばいいか?
書籍『自然石祭祀遺構の基礎的研究―巨石遺跡・磐座遺跡の時代を越えて―』で統計検定を使用した私が、実際にどのような試行錯誤を経て使用ツールとプロンプトを用いたか、備忘録と今後利用したいと考えている皆様へ向けて記録を残しておきます。
※2026年5月時点の情報です。めまぐるしく変わるweb環境のため、永久に使える方法とは限らないことをご了承ください。
【前提作業】データから分割表を作っておく
大前提として、検定で使用する「分割表」は事前に作っておいてください。
分割表は、何かの群ともう一つの別の群の数値を比較するために作られます。
たとえば、行を時代や場所などで設定すると、ある時代とある時代の何かを比べたり、ある場所とある場所の何かを比べたりできます。列は、単純な「あり/なし」や「Yes/No」などの二列分類でもいいですし、比較するに足る複数の項目を並べてもいいわけです。
分割表は基本的には2行×2列から構成されますが、別に3列・3行以上でもOKです(ただし検定後の評価に他の統計学的知識が必要になります)。
これらの分割表によって、何かの群ともう一つの群の間に、データ差や相関を見出しやすくなります。カイ二乗検定に使う場合は、ある群とある群の数値に相関関係があるか逆に独立関係にあるかを示すことになります。
どんな分割表を作るかは、まさに歴史研究をするあなたのオリジナリティーが発揮される部分です。数値化するために、件数を数えられる項目やカテゴリーがないかを探してみましょう。
歴史学における注意点を挙げるなら、同一線上で比較できないような不統一な群同士を比較することに意味はないでしょう。
また、分割表自体は百分率で表されることが多いですが、カイ二乗検定に用いる場合は百分率にせず、実際の数値(件数)で入力したままの表とすることに注意してください。
表1:2つの時代の遺跡において、ある要素が認められるか認められないかを2行×2列分割表にしたもの(表内の数値は集計件数)
オンライン上の統計計算ツール
統計学の専門をかじっていない歴史研究者でも扱いやすいツールはあるのでしょうか。
一番かんたんなのは、インストール・ダウンロード作業をしなくてもブラウザ上の計算で完結するオンラインサイトです。
私が推奨するサイトとしては、エミュイン合同会社が運営する Reactive stat です。下にリンクを掲載します。
https://www.emuyn.net/stats/features
キャッチフレーズは「ブラウザだけで使える無料統計ソフト~信頼性の高い R で統計解析し、その結果を AI が解説します!」
サイトのコンセプトなどの詳細は上のリンク内をご確認いただきたいですが、一言で言えば、理数系に弱い私でも直感的に理解できるサービスでした。AI解説なしで統計解析するだけなら無料で利用できます。
怪しいサイトではなく、医学論文などでも対応できるように工夫が凝らされた設計です。統計検定の根拠も信頼性の高いと言われるR言語に基づいて行われており、サイト内の各記述を読む限り信頼が置けるサイトだと思います。
Reactive stat でカイ二乗検定ができるページは下のURLです。
https://www.emuyn.net/stats/enter_and_analyze_two-way_table
ページ内にすでに分割表の欄が用意されているので、後はあらかじめ作成している分割表の数値を入力すれば、リアルタイムで検定結果が即算出されます。
元の分割表をExcelなどで作成している場合、コピペでうまくいける時とうまく貼れない時があります。元の分割表と見比べて誤りがないかよく確認しましょう。
先に例示した表1の分割表を Reactive stat に入力した場合、下のようになります。
![]() |
| Reactive stat にて作成 |
![]() |
| Reactive stat におけるカイ二乗検定結果例 |
カイ二乗検定の場合、次の3つの数値が算出されます。
- Chi-Square 統計量 3.00
- 自由度 1
- p値 0.083
Chi-Square 統計量はカイ二乗統計量のことで、統計検定をする時に出される検定統計量です。この統計量の数値がいくつかによって、その分割表の群同士が相関か独立かを示唆する根拠となります。統計量が大きくなればなるほど、有意差があるという評価をします。
自由度は分割表の行数と列数で自動的に決まる数値ですが、その意味を理解して適切に取り扱うには正直、歴史研究者としては若干手に余る指標であり割愛します。
一番重要な指標は、最後のp値です。p値=確率であり、カイ二乗検定の場合はその分割表の数値の分布が偶然でも成立するものかどうかの確率を算出します。表1の例の場合、p値は0.083で8.3%という意味です。なにが8.3%なのかというと、この分割表は統計学的に8.3%の確率で偶然できあがる数値の分布ということです。
では、8.3%は確率的に高いのか低いのか。統計学では慣例的に有意差があるかどうかを判断する有意水準というものがあり、それは一般的に5%といわれています。
つまり、5%以上が出た場合は「有意差なし」、5%未満となった場合は「有意差あり」とみなします。どうやらこの有意差を5%で区分することが望ましいかどうかには多くの議論があるようですが、門外漢の歴史研究者にはどうしようもなく、現状通説的見解とされる5%有意水準を採用しておくのが妥当でしょう。
ということで、表1の場合は「有意差なし」の判定となります。A時代よりB時代のほうが「なし」の数が増えたように思えますが、統計学的には有意差があるとは言えない、という言いかたになります。
しかし、仮に表1の数値がこのように変わったらどうでしょうか。
![]() |
| 表2:Reactive stat にて作成 |
A時代の「なし」を144から134に変えました。それ以外は同じ数値です。
表2でカイ二乗検定を実施した結果が下です。
- Chi-Square 統計量 4.68
- 自由度 1
- p値 0.0305
検定統計量がさっきより増えて、p値は0.0305と小さくなりました。これは3.05%ということで有意水準5%未満になり、統計学的には「有意差あり」の判定となります。偶然起こるとは言いにくい、見逃せない数値の偏りなのです。
この、主観的に見れば「わずか」にも見える数値(件数)の違いを、統計学の根拠に基づいてp値という形で数量的な根拠を示してくれるのがカイ二乗検定です。
歴史研究者がやりがちな、大体これくらいの数値が出れば「高い割合」「低い割合」と評価してしまうのを、統計学的根拠に基づいて論ずることができるようになります。このことをクレール・ルメルシエ、クレール・ザルク[著] 長野壮一[訳]『人文学のための計量分析入門―歴史を数量化する―』(人文書院 2025年)は述べているのです。
カイ二乗検定が使えないならフィッシャー正確確率検定
しかし、これだけではまだ歴史研究者は安心して統計検定を使用できません。次は、カイ二乗検定を使えないケースがあることに注意が必要です。
それは、分割表の数値が少ない場合です。具体的な基準も決まっていて、分割表のセルに入る期待値が5件未満の場合です(最近は1件未満とする説もあるようですが、私には統計学領域の議論の判断がつかないため通説的見解の5件未満を採用します)。
![]() |
| Reactive stat で表1を期待度数表示した場合 |
![]() |
| 表3をReactive stat で作成 |
![]() |
| Reactive stat におけるフィッシャー検定結果例 |
あり なしA時代 0 5B時代 0 52C時代 7 46D時代 5 43E時代 4 39F時代 3 19#### Fisher の正確確率検定Fisher's Exact Test for Count Datadata: .Tablep-value = 0.068alternative hypothesis: two.sided--------------------------------------------------------------Analysis is conducted using R version 4.5.2 (2025-10-31)The script uses the following packages and versions:
フィッシャー検定で計算エラーが出る場合はモンテカルロ法を使用
Reactive stat が万能かというと、そうではありません。
たとえば下のような分割表の場合は、計算量の限界を超えたようでエラーが出ました。
![]() |
| 表4:期待度数5未満があるのでフィッシャー検定を行うべき分割表の例(Reactive stat で作成) |
表4のフィッシャー検定「Rの出力結果」は次のとおりです。
列A 列B行1 0 5行2 19 33行3 25 28行4 34 14行5 30 13行6 14 8#### Fisher の正確確率検定fisher.test(.Table) でエラー:FEXACT error 7(location). LDSTP=18630 is too small for this problem,(pastp=64.2946, ipn_0:=ipoin[itp=71]=742, stp[ipn_0]=65.205).Increase workspace or consider using 'simulate.p.value=TRUE'実行が停止されました
- 計算に充てるコンピュータのメモリを増やす
- モンテカルロ法(モンテカルロシミュレーション)を用いる
最終的にEZRの運用を推奨
Reactive stat のサイトにも書いてありますが、統計の世界で信頼性があるのはR言語に基づいたプログラムです。
Reactive stat はその最も簡便なツールでしたが、フィッシャー検定を使いたいのに計算エラーが出る場合、もう一段階、専門寄りのツールに切り替える必要があります。
それがEZR(Easy R)です。
フリーソフトです。
Easyの名を冠するだけあって、これでもR言語プログラムを使いやすくしたというコンセプトですが、こちらはインストールが必要なアプリであり、Reactive stat サイトの言を借りると「統計解析の初心者には難しいという声も聞かれ」るそうです(だからReactive stat を公開した)。
私も最初ちんぷんかんぷんでしたが、フィッシャー検定のところだけ理解できればいいという心持ちで操作に慣れていきました。その手順をこちらにまとめます。
EZRのダウンロードページ
自治医科大学のHP内でダウンロードできます↓
https://www.jichi.ac.jp/usr/hema/EZR/statmed.html
なぜならEZRの開発者は、自治医科大学附属さいたま医療センター血液科教授(2026年5月時点)の神田善伸氏だからです。
Reactive stat もそうでしたが、EZRも含めて統計解析ソフトは主に医療統計分野で発展してきた経緯があります。医師や医学者が医学論文で用いるための統計解析を、統計に疎い人でも利用できるようにという思いで無償で公開しているものです。
だからといって医療分野限定の仕様ではなく、当然ながら統計学は数学の世界ですから、数量を扱うあらゆる分野の統計において活用できます。歴史学もありがたくこの恩恵にあずかりましょう。
Window版、Mac OS版、LINUX版が公開されているので、ご使用の機種に合わせてダウンロードしてください。
ダウンロード前に、HPに書いてある留意事項などは一通り読んでおいてください。注意点としては、無料で使用できますが、EZRを使って算出した結果はEZRを使用したことを出典として示すことが条件づけられています(当たり前ですが)。
その出典の記載方法もHPに例示されているのでご確認をお願いします。
インストール後の使用方法
ウインドウの指示どおりにインストールを終えると、ローカルのインストールフォルダ内に「EZR簡易マニュアル」(EZRman.pdf)があるはずです。まずはそちらをご一読ください。
マニュアルの一番下に解析可能な検定のチェックリストが画像に示されており、その中に「カイ2乗検定」「フィッシャーの正確検定」の項目があるのを見つけられるでしょう。EZRにこれらの検定機能が搭載されていることがわかります。
では、起動してからフィッシャー検定するまでの流れをスクリーンショット画像掲載で紹介しましょう。
しばらく時間がかかりますが、このウインドウをそのまま放置しておくと別のもう1つのウインドウがさらに出てきます。それが下画面です。
上画像のウインドウが検定作業をする画面となるのでご注意ください。
まず通常の検定方法を説明します。
ツールバーの「統計解析」▶「名義変数の解析」▶「分割表の直接入力と解析」をクリックします。
すると下のウインドウが出てきます。
分割表を直接入力できます。
自分で用意した分割表の行数・列数に増やして数値を入力し、「フィッシャーの正確検定」にチェックを入れた状態で「OK」ボタンを押せばRプログラムが働いて自動的にp値結果を算出してくれます。
が、Reactive stat と同様に、表4のようなデータ数の分割表ではエラーが返ってきます。
見た感じ、このウインドウではモンテカルロ法の設定が見当たりません。
ということで、EZRの「Rスクリプト」画面に、直接スクリプトを打ってモンテカルロ法を用いることを指示しなければなりません。
先に紹介した井口豊氏の記述を参考にして色々試した結果、下のスクリプトであれば正常に検定できました。
dat<- matrix(c(
0, 5,
19, 33,
25, 28,
34, 14,
30, 13,
14, 8
), ncol=2, byrow=T)
fisher.test(dat,
simulate.p.value = TRUE, B = 1000000)
分割表の行数・列数に応じてスクリプト内のテキストを変える必要があるので、応用できるように、このスクリプトのそれぞれの意味を説明します。
dat<- matrix(c(
マトリックス(分割表)のデータであることをRに指示するコードです。
0, 5,
19, 33,
25, 28,
34, 14,
30, 13,
14, 8
表4の分割表をスクリプト画面に打つ時の形がこうです。
行ごとに列のセルの数値をコンマと半角スペースで区切りながら入力していきます。
表4は6行×2列なのでこうしていますが、3列や4列なら行の右側にコンマで区切りながらセルの数値を入力していってください。
要注意点は、一番最後の行・列(一番右下)の数値の後にはコンマを入力しないこと。私は当初ここにコンマを打ったことでひたすらエラーが出て悩まされました。
), ncol=2, byrow=T)
「ncol=2」は2列という意味。Rに列数がわかるように指示しています。ですので、3列や4列なら「ncol=3」「ncol=4」のように変更しておいてください。
「byrow=T」は、行の横方向の順番で読み込んで表データを作成するようにRに指示するコードです。
つまり、これによって2列の分割表を行の横方向に読み込めるようになるということです。
fisher.test(dat,
フィッシャー検定を実施するためのコード。
simulate.p.value = TRUE, B = 1000000)
これがモンテカルロ法で近似的なp値を算出するためのコードです。
「B = 1000000」は、試行回数を1,000,000回に指定するという意味です。
モンテカルロ法で試行回数を何回に指定するかは、用いるデータや目指す研究目標によって様々だそうです。
私は、エラーが出なかった分割表を使って、EZRでこの試行回数を「B = 1000」「B = 10000」「B = 100000」…と数値を変えながら算出されるp値を見比べて、最終的に1,000,000回計算すれば実際のフィッシャー検定結果のp値と近似すると判断して、このようにしました。
皆さんも、用いるデータや調査精度に合わせて試行回数を調整してください。
ということで、このスクリプトをEZRの画面に入れてみましょう。
要注意点は、入力したスクリプトを「すべて選択」した状態にして「実行」ボタンを押すことです。選択してスクリプト範囲を青くした状態にしないとエラーとなります。
正常に実行された結果が下画像です。
「出力」欄に「p-value = 0.000157」の文字が確認できました。
有意確率0.0157%ということで、表4の分割表の数値の分布は、極めて0%に近い強い有意差が示されました。
2×2分割表なら、1行目と2行目に有意差があるということを明確に示しますが、3行以上や3列以上となると、どの行・列のセルに有意差が認められるのか(有意に多いのか/有意に少ないのか)を特定する作業が別途必要です。
カイ二乗検定やフィッシャー検定は、分割表全体を見て有意差があるかないか自体を検定するものであり、表のどことどこに有意差があるのかまでは示してくれないからです。
どのセルに有意差があるのかを評価する方法に「調整済み標準化残差」の分析があり、この値が1.96を超えるセルはp値が5%未満で有意差があると判定しますが、このあたりまでいくと本記事の目的のさらに先の内容に突入するので、説明はここまでとします。
数名の読者の方のお役に立てばそれでよいと考えて書きました。
『自然石祭祀遺構の基礎的研究―巨石遺跡・磐座遺跡の時代を越えて―』の補遺として、本記事も大きな仕事ができたと思っています。
参考文献(EZR出典)
Kanda Y. Investigation of the freely-available easy-to-use software “EZR” (Easy R) for medical statistics. Bone Marrow Transplant. 2013:48,452-458. advance online publication 3 December 2012; doi: 10.1038/bmt.2012.244


.png)
.png)
.png)








0 件のコメント:
コメントを投稿
記事にコメントができます。または、本サイトのお問い合わせフォームからもメッセージを送信できます。