多重クロス集計は、3つ以上の項目をかけ合わせて回答を集計する方法です。「満足度を性別×年代で見る」なら3項目なので3重クロス、地域も加えれば4重クロスと呼びます。2軸のクロス集計では見えない層の違いを取り出せる一方で、軸を1本足すたびにセルの回答者数が減り、数字が不安定になります。この記事では、3重・4重の数え方、2軸の結論が3軸目で逆転した実データの例、セルに何人いれば読めるかの目安、Excel・Googleスプレッドシート・Python(pandas)での作り方を順に説明します。
まとめ:多重クロス集計の要点
- 多重クロス集計は3項目以上のかけ合わせです。観測したい設問も1本と数えるので、「満足度×性別×年代」は属性が2つでも3重クロスになります。
- 3軸目を足す目的の一つは、2軸の差が「別の項目の偏り」で生まれていないかを確かめることです。1973年のカリフォルニア大学バークレー校の大学院入試(志願者の多い6学科の合計)では、合格率は男性44.5%・女性30.4%でしたが、学科を3軸目に加えると6学科中4学科で女性の合格率が男性以上でした。
- セルの回答者数(n)が小さいと誤差が大きくなります。内閣府の標本誤差表では、比率50%のときn=100で±9.8ポイント、n=50で±13.9ポイントです。セルごとのnを必ず表に並べて読みます。
- Excelではピボットテーブルの「行」に2項目を重ねるか、COUNTIFSで条件を3つ指定します。GoogleスプレッドシートはQUERY関数の group by と pivot、Pythonは pd.crosstab に列を複数渡せば作れます。性別と年代を「性年代」の1列にまとめると、軸を1本減らして同じ表を作れます。
- 複数回答(MA)の設問は、選択肢ごとに0/1の列に分けて層ごとの平均を取ると、回答者数を分母にした選択率になります。選択率の合計は100%を超えるのが普通です。
- 回収数が少ない調査や、問いが2軸で答えられる場合は多重クロスにしない判断が正解です。軸を総当たりで試すと偶然の差を拾います。
多重クロス集計の定義と3重・4重クロスの数え方
クロス集計は2つの項目をかけ合わせ、「性別ごとの満足度」のように層の違いを見る集計です。項目を3つ以上に増やしたものを多重クロス集計と呼びます。設問1つだけを集計する単純集計(GT)から順に並べると、次の関係になります。
| 集計の種類 | かけ合わせる項目数 | 例 |
|---|---|---|
| 単純集計(GT) | 1 | 満足度の全体割合 |
| クロス集計 | 2 | 満足度 × 性別 |
| 3重クロス | 3 | 満足度 × 性別 × 年代 |
| 4重クロス | 4 | 満足度 × 性別 × 年代 × 地域 |
2項目のクロス集計の作り方や表の見方はアンケートのクロス集計とは?やり方・表の見方から単純集計との違い、カイ二乗検定まで解説、1項目の集計は単純集計(GT集計)とは?集計表の見方とExcelでの作り方で扱っています。この記事は3項目以上に絞ります。
観測する設問も1本に数える3重クロスの数え方
つまずきやすいのが「何をもって3重と数えるか」です。マクロミルの用語集は、サービスの満足度を性別と年代で見る例を「3つの項目を掛け合わせて集計するため、3重クロス」と説明しています。アンケート集計会社のトリムも、表側の「性別×年代」に質問項目をかけ合わせる集計を三重クロスとしています。つまり表側(表の左に並ぶ見出し)に属性を2つ重ね、表頭(上に並ぶ見出し)に設問を置いた表が3重クロスです。属性を3つ重ねたものだけを3重と呼ぶと、軸の本数を1つ少なく数えてしまいます。
統計学では同じ表を「3元分割表」(three-way contingency table)と呼びます。「3次元表」「3要素を組み合わせた表」と検索される表も、中身は3重クロスです。
表側に重ねる項目:属性と別の設問
3軸目には性別・年代・地域のような回答者の属性だけでなく、別の設問も置けます。「継続意向×価格満足度×年代」のように設問どうしをかけ合わせると、「価格に不満な人ほど解約しやすいか」という関係を年代別に確かめられます。属性を重ねるのは「誰が」を細かく知りたいとき、設問を重ねるのは設問どうしの関連を層ごとに確かめたいときです。ただし表で分かるのは関連までで、「価格への不満が解約の原因」という因果までは示せません。
3軸目を足す理由:2軸の結論が逆転したバークレー入試データ
多重クロスは、層を細かく見るためだけの道具ではありません。2軸で見えた差が、実は別の項目の偏りから生まれていないかを確かめるのが一番の使いどころです。よく引かれる実例が、1973年のカリフォルニア大学バークレー校の大学院入試データです。統計ソフトRには、志願者の多い6学科の4,526人分がUCBAdmissionsというデータとして収録されています(出典は Bickel, Hammel, O’Connell の1975年の論文「Sex Bias in Graduate Admissions: Data from Berkeley」)。
まず性別×合否の2軸で見ると、男性のほうが14ポイント以上合格しやすく見えます。
| 性別 | 志願者(n) | 合格者 | 合格率 |
|---|---|---|---|
| 男性 | 2,691 | 1,198 | 44.5% |
| 女性 | 1,835 | 557 | 30.4% |
ここに学科を3軸目として加え、学科×性別×合否の3重クロスにすると、見え方が変わります。
| 学科 | 男性 合格率(n) | 女性 合格率(n) |
|---|---|---|
| A | 62.1%(825) | 82.4%(108) |
| B | 63.0%(560) | 68.0%(25) |
| C | 36.9%(325) | 34.1%(593) |
| D | 33.1%(417) | 34.9%(375) |
| E | 27.7%(191) | 23.9%(393) |
| F | 5.9%(373) | 7.0%(341) |
6学科のうちA・B・D・Fの4学科で、女性の合格率は男性以上です。逆転の原因はnの列にあります。女性の志願は合格率の低いC〜Fの学科に集中し(1,835人中1,702人)、男性は合格率の高いA・Bに多く志願していました(2,691人中1,385人)。Rのドキュメントも、合否と性別の見かけの関連は男女で志願先の学科が違うことから生じていると説明しています。全体の集計と層ごとの集計で傾向が逆になるこの現象は、シンプソンのパラドックスと呼ばれます。
アンケートでも同じ構造は起こり得ます。たとえば女性の満足度が高く見えても、女性回答者に利用歴の長い人が多ければ、利用歴による差が性別の差として表れている可能性があります。2軸で差が出たら、その差を生みそうな項目(利用歴・地域・購入チャネルなど)を3軸目に置いて、層の中でも差が残るかを確かめてください。
学科をそろえた差の検定:コクラン=マンテル=ヘンツェル検定
層の中に差が残っているかを数字で判断するには、層ごとの2×2表をまとめて検定するコクラン=マンテル=ヘンツェル(CMH)検定を使います。上のデータで「学科をそろえた共通のオッズ比が1(性別で合格のしやすさに差がない)」を帰無仮説として連続性補正なしで検定すると p=0.217 で、5%水準では帰無仮説を棄却できません。ただしこれは、各学科に性別差が無いことを示す結果ではありません。オッズ比が学科間で等しいかを調べる一様性の検定は p=0.002 で、学科によってオッズ比が異なることを示しています。表を見ると、女性の合格率が男性を最も大きく上回るのは学科A(82.4%対62.1%)です。オッズ比が学科間でそろっていないときは、共通のオッズ比を1つにまとめた検定結果だけで結論を出さず、学科ごとの表も合わせて報告します。計算コードは後半のpandasの章に載せています。p値の読み方は有意差検定とは?有意差・p値の意味と検定の種類・やり方をわかりやすく解説を参照してください。
3重クロス集計表の読み方:横%・縦%とnの併記
上の学科別の表は、学科を行、性別を列に置き、合格率だけを抜き出した簡略版です。合否の選択肢をすべて並べる標準的な3重クロスでは、表側に学科と性別を入れ子に並べ(外側に学科、内側に性別)、表頭に合否を置きます。以下はこの標準形を前提に説明します。
- 横%(行%):表側の各行を100%にする。「学科Aの女性のうち何%が合格したか」を比べるときはこちら。3重クロスで層どうしを比べるときの標準です。
- 縦%(列%):表頭の各列を100%にする。「合格者全体のうち学科Aの女性が何%か」という構成比を見るときに使います。
- nの併記:割合の横に必ずその行の回答者数を書きます。学科Bの女性は68.0%ですが、nは25人しかいません。
外側と内側のどちらにどの項目を置くかで、読みやすさが変わります。比べたい層(ここでは男性と女性)を内側に置くと、隣り合う行どうしで差を読めます。
複数回答(MA)の設問の選択率と分母
「購入した経路をすべて選んでください」のような複数回答(MA)の設問を3重クロスの表頭に置くときは、割合の分母に注意します。分母は回答数の合計ではなく、その層の回答者数(n)です。内閣府は世論調査の集計表の注記で、M.T.(Multiple Total)を「回答数の合計を回答者数を示すnで割った比率であり、通常その値は100%を超える」と定義しています。行の合計が100%にならないのは誤りではありません。
集計しやすいのは、選択肢ごとに「選んだ=1、選ばなかった=0」の列を作る形です。1つのセルに「店舗,EC」のように区切って入れた形のままだと、ピボットテーブルではそれ自体が1つの区分として数えられます。集計対象者全員の値を0/1で埋めれば、層ごとの平均が選択率になります。未選択の0と、未回答・対象外の欠損値は区別し、分母に含める対象者を先に決めます。
- Excelのピボットテーブル:[行]に性別と年代を重ね、[値]に選択肢の列(店舗・EC・SNS)を並べて、[値フィールドの設定]の集計方法を[平均]にします。表示形式をパーセントにすれば選択率の表です。nは別に[データの個数]で出します。
- Excelの関数:A列に性別、B列に年代、D列に「店舗」の0/1があるなら、
=AVERAGEIFS($D:$D, $A:$A, $F3, $B:$B, $G3)で「男性・20代のうち店舗を選んだ人の割合」になります。 - pandas:
df.groupby(["性別", "年代"])[["店舗", "EC", "SNS"]].mean()で層ごとの選択率が出ます。下は8人のサンプルの集計例です。選択率は直前の式の結果を100倍し、nは層ごとの人数を別途集計して併記しています(各層n=2のため、この割合から母集団の傾向は判断しません)。
店舗 EC SNS n
性別 年代
女性 20代 50.0 100.0 100.0 2
30代 50.0 0.0 50.0 2
男性 20代 50.0 100.0 50.0 2
30代 100.0 50.0 0.0 2
女性20代の行は合計250%で、内閣府の注記どおり100%を超えています。MA設問の単純集計の作り方は単純集計(GT集計)とは?集計表の見方とExcelでの作り方で扱っています。
セルのnと標本誤差:数字を読むのに必要な人数の目安
多重クロスで避けたいのは、nの小さいセルの割合をそのまま結論にすることです。目安には、内閣府が世論調査結果に添えている標本誤差表が使えます。無作為抽出を仮定した場合の誤差(95%の範囲)で、回答比率が50%に近いほど、nが小さいほど大きくなります。
| セルのn | 比率10%(90%) | 比率50% |
|---|---|---|
| 1,000 | ±1.9 | ±3.1 |
| 500 | ±2.6 | ±4.4 |
| 100 | ±5.9 | ±9.8 |
| 50 | ±8.3 | ±13.9 |
単位はパーセントポイントです。内閣府は、n=500で比率50%なら真の値は45.6〜54.4%の範囲にあると推測でき、その推測が的中する確率は約95%だと説明しています。表に無いn=30・比率50%を同じ正規近似の式(1.96×√(比率×(1−比率)÷n))で計算すると約±17.9ポイントで、95%信頼区間はおよそ32〜68%です。ここでのnは割合の分母(その層の回答者数)です。nが小さく、比率が10%のように0%や100%に近いほど、この近似自体が粗くなるので、表の数字は参考値として扱います。2つのセルを比べる場合、差の誤差はさらに広がります。2つのセルが独立でn=50どうし、両方とも比率50%なら、差の95%信頼区間の幅は約±19.6ポイントです。差がこれより小さければ偶然の範囲と区別できないので、実際には2群の比率の差の検定で確かめます。
実務でよく見る「n=30未満は参考値」という線引きは、統計的に決まった基準ではなく、各社の慣行です。何ポイントの差を見分けたいかから必要なnを逆算してください。軸の数も同じ計算で決まります。全体n=400で満足度×性別2×年代4×地域3の4重クロスにすると、属性の組み合わせだけで24層に分かれ、満足度の割合の分母は1層平均約17人です。満足度の選択肢が5段階なら、表のセルは120個になります。主要なセルのnを先に確保したいなら、回収前にサンプル割付とは?アンケート調査の割付方法・決め方を解説で層ごとの目標数を決めておきます。回収後に構成比だけを補正するウェイトバック集計とは?計算式・やり方と有権者構成に合わせる補正の注意点では、セルの実際の回答者数は増えません。
Excelで多重クロス集計を作る手順
元データは、1行に回答者1人、1列に設問1つが並び、1行目に項目名がある形にそろえておきます。「男性」と「男」のような表記ゆれがあると、別の区分として数えられます。結合セルは解除し、各行に値を入れておきます。整え方はローデータ(raw data)とは?日本語の言い換えとアンケートの形式、Excelでの扱い方にまとめています。
ピボットテーブルの行に2項目を重ねる手順
- データ範囲を選び、[挿入]タブの[ピボットテーブル]を選ぶ。
- [行]に外側の項目(例:学科)、その下に内側の項目(例:性別)をドラッグする。この2つと次の列で3重クロスになる。
- [列]に観測したい設問(例:合否)を置く。
- [値]に回答者IDなどを置き、[値フィールドの設定]で集計方法を[データの個数]にする。
- 割合にするには[値フィールドの設定]の[計算の種類]で[行集計に対する比率](横%)を選ぶ。
- 報告書に貼るなら、[デザイン]タブの[レイアウト]グループで[レポートのレイアウト]から[表形式で表示]を選ぶ。初期のコンパクト形式では学科と性別が1列にインデントで重なるが、表形式では2列に分かれ、別のシートにコピーしやすくなる。
同じピボットテーブルをもう1つ作り、集計方法は[データの個数]、[計算の種類]は[計算なし]にすると人数の表になり、各行の[総計]がその層のnです。割合の表と並べて読みます。4軸目は[フィルター]かスライサーに置き、地域ごとに表を切り替えて見るほうが、行に3項目を重ねるより読みやすくなります。
COUNTIFSによる3条件の人数集計(ピボットテーブル以外の方法)
表の形を固定したい、報告書のテンプレートに直接数字を出したい、というときは関数で組みます。A列に学科、B列に性別、C列に合否が入っている場合、学科・性別・合否の3条件に一致する人数は次の式で数えます。
=COUNTIFS($A:$A, $F3, $B:$B, $G3, $C:$C, H$2)
F列に学科、G列に性別を縦に並べ、2行目に「合格」「不合格」を横に並べておくと、式をコピーするだけで表が埋まります。COUNTIFSは条件の範囲と条件の組を最大127組まで指定できるので、4重・5重でも条件を足すだけです。割合は、同じ行の人数の合計で割って出します。
性年代のような結合軸による軸の削減
市場調査の集計表では、性別と年代を「男性20代」「女性30代」のように1つの軸にまとめた「性年代」がよく使われます。中身は性別×年代の組み合わせなので、性年代×満足度の表は、性別×年代×満足度の3重クロスと同じ数字になります。外側と内側の入れ子が無くなる分、行の見出しが1列で済み、グラフにもしやすくなります。
作り方は、ローデータに結合した列を1本足すだけです。B列に性別、C列に年代があるなら、空いている列に次の式を入れて下までコピーします。
=B2&C2
あとはこの列を[行]に置けば、項目を1つ置いた普通のクロス集計の操作で3重クロスになります。pandasなら df["性年代"] = df["性別"] + df["年代"] です。集計ツールによっては、内訳に指定できる項目数に上限があります。たとえば販売管理クラウドの楽楽販売は、サポートサイトのFAQで内訳項目の上限を3つとしており、4項目以上を掛け合わせる方法として、項目を連結した列を作るか、CSVで書き出してExcelのピボットテーブルで集計するかを案内しています。結合しても層の数は変わらないので、各層のnが小さくなる点は同じです。
Googleスプレッドシートでの作り方:ピボットとQUERY関数
スプレッドシートでも、[挿入]の[ピボットテーブル]から[行]に2項目を追加すれば同じ3重クロスになります。割合にするには、ピボット テーブル エディタの[値]で[表示方法]を初期値の[デフォルト]から行の合計に対する割合に切り替えます。Excelでは[計算の種類]、スプレッドシートでは[表示方法]と、同じ設定の呼び名が違う点に注意してください。
関数で1セルから表を出すならQUERY関数です。A列に学科、B列に性別、C列に合否がある場合は次のように書きます。
=QUERY(A1:C, "select A, B, count(A) where A is not null group by A, B pivot C", 1)
group by に2列を並べると表側が「学科×性別」の入れ子になり、pivot に指定した合否が表頭に展開されます。Googleのクエリ言語の仕様では、pivot を使うときは select に並べる列を group by に入れるか集計関数で包む必要があり、pivot に指定した列は select や group by に書けません。そのため人数は、空欄を除外したA列を count(A) で数えています。pivot にも複数の列を並べられますが、表頭が「列の値の組み合わせ」ごとに増えるので、横に長くなりすぎない範囲にとどめます。回答者がいない組み合わせは空欄になるため、0と区別して読みます。
Python(pandas)による多重クロス集計とCMH検定
集計を繰り返す場合や、CMH検定まで一度に出したい場合は、Pythonで集計と検定を同じスクリプトにまとめられます。pd.crosstab の行に列のリストを渡すと、表側が入れ子になります。下のコードはRのUCBAdmissionsの度数を1行1志願者のデータに展開してから集計します。そのまま貼り付けて実行でき、pandas 2.3.3 と statsmodels 0.14.6 で前述の数字が出ることを確認しています。アンケートのCSVを使う場合は、展開部分を pd.read_csv に置き換え、列名も合わせます。CMH検定には各層で同じ順序の2×2表が必要なので、カテゴリの順序と欠けたカテゴリの補完を確認します。
import pandas as pd
from statsmodels.stats.contingency_tables import StratifiedTable
# R の UCBAdmissions の度数(学科, 性別, 合格者数, 不合格者数)
counts = [("A", "男性", 512, 313), ("A", "女性", 89, 19),
("B", "男性", 353, 207), ("B", "女性", 17, 8),
("C", "男性", 120, 205), ("C", "女性", 202, 391),
("D", "男性", 138, 279), ("D", "女性", 131, 244),
("E", "男性", 53, 138), ("E", "女性", 94, 299),
("F", "男性", 22, 351), ("F", "女性", 24, 317)]
# 1行=志願者1人のデータに展開する(アンケートのローデータと同じ形)
df = pd.DataFrame([(d, g, r) for d, g, a, b in counts
for r in ["合格"] * a + ["不合格"] * b],
columns=["学科", "性別", "結果"])
# 2軸:性別 × 結果(行ごとに100%)
print(pd.crosstab(df["性別"], df["結果"], normalize="index").round(3))
# 3重クロス:表側に「学科」と「性別」を重ねる
rate = pd.crosstab([df["学科"], df["性別"]], df["結果"], normalize="index")
n = pd.crosstab([df["学科"], df["性別"]], df["結果"]).sum(axis=1)
print(rate["合格"].round(3).to_frame("合格率").assign(n=n))
# 学科ごとの2×2表を束ねて検定する
tables = [pd.crosstab(g["性別"], g["結果"]).to_numpy() for _, g in df.groupby("学科")]
st = StratifiedTable(tables)
print(round(st.test_null_odds(correction=False).pvalue, 3)) # 0.217
print(round(st.test_equal_odds().pvalue, 3)) # 0.002
normalize="index" が横%、"columns" が縦%です。割合の表とnの表を別々に作って横に並べると、Excelでピボットを2つ並べるのと同じ形になります。test_null_odds が学科をそろえた共通のオッズ比が1かどうか、test_equal_odds が学科間でオッズ比が等しいかどうかの検定です。定期調査で毎回同じ軸の多重クロスを出すなら、回答の収集から集計表の出力までを自社のアンケート管理システムに組み込む方法もあります。
多重クロスを使わない判断と失敗パターン
多重クロスは、問いがはっきりしているときだけ役に立ちます。次の3つのどれかに当てはまるなら、軸を足すのをやめるか、手法を変えます。
- 主要セルのnが確保できない:比べたいセルが数十人しかいないなら、年代を「20〜30代」のように統合する、追加で回収する、結論を保留する、のいずれかを選びます。3軸目で確かめるべき偏りが疑われるのに、人数不足を理由に2軸の結果だけで結論を出すのは避けます。差がセルの誤差の幅に収まっていないかは、上の誤差表と差の検定で確かめます。
- 軸を総当たりで試している:互いに独立な比較を20回行うと、本当は差が無くても5%水準でどれかが有意になる確率は約64%(1−0.95の20乗)です。24セルの4重クロスでセルどうしを片っ端から比べれば、比較の回数は数百回になり、偶然の差を本物と取り違えやすくなります。どの軸で何を確かめるかは集計の前に決めます。
- 表を並べても関係を把握しきれない:項目が増えて表の枚数やセルが読み切れなくなり、多くの項目の関係をまとめて把握したいなら、表を重ねるより多変量解析とは?予測と要約で選ぶ手法一覧とビジネスでの使いどころで紹介している手法のほうが向きます。カテゴリどうしの対応を地図のように描くならコレスポンデンス分析とは?やり方・活用事例・主成分分析との違いを実装目線で解説が選択肢になります。
「多重クロスは3重までにする」という目安を見かけますが、限界を決めるのは軸の数ではなく各セルのnです。たとえば全体n=4,000で性別2×年代4×地域3の4重クロスにすると1層平均は約167人ですが、全体n=200で性別2×年代5の3重クロスにすると1層平均は20人です。回答者が特定の層に偏っていれば、平均より少ない層も出ます。軸を足す前に、層の数で全体のnを割って1層あたりの人数を見積もり、主要な層の実際のnも確かめてください。
逆に、2軸で出た差に「別の説明」がありそうなときは、迷わず3軸目を足してください。バークレーの例のように、2軸の結論をそのまま報告するほうが危険です。
よくある質問
多重クロス集計とは何ですか?
3つ以上の項目をかけ合わせて回答を集計する方法です。2項目のクロス集計を拡張したもので、3項目なら3重クロス、4項目なら4重クロスと呼びます。性別×年代×満足度のように条件を重ね、2軸では見えない層の違いを読み取ります。
クロス集計で3つ以上の項目を使うにはどうすればいいですか?
Excelのピボットテーブルなら[行]に2項目を上下に重ね、[列]に観測したい設問を置きます。関数ならCOUNTIFSに3つの条件を指定し、GoogleスプレッドシートならQUERY関数で group by に2列、pivot に1列を指定します。
3重クロスと4重クロスの違いは何ですか?
かけ合わせる項目の数です。3重は3項目、4重は4項目です。項目を1つ足すとセル数はその項目の区分数倍に増え、各セルのnが小さくなります。全体n=400で満足度×性別2×年代4×地域3の4重クロスにすると、属性の組み合わせは24層になり、1層平均約17人です。
多重クロス集計では1セルに何人必要ですか?
決まった基準はありません。内閣府の標本誤差表では、比率50%のときn=100で±9.8ポイント、n=50で±13.9ポイントの誤差があります。見分けたい差の大きさから逆算し、主要なセルがその誤差に収まるnを確保します。
多重クロス集計のデメリットは何ですか?
軸を1本足すたびに層が細かく分かれ、各セルの回答者数が減って誤差が大きくなる点です。表の枚数やセルも増えるため、軸を総当たりで比べると偶然の差を本物と取り違えやすくなります。どの軸で何を確かめるかを集計の前に決め、割合の横に必ずnを書きます。
3次元表や3元分割表は多重クロス集計と同じですか?
同じ表を指しています。統計学では3つのカテゴリ変数をかけ合わせた度数表を3元分割表(three-way contingency table)と呼び、市場調査では3重クロスと呼ぶのが一般的です。