クロス集計とは?表の見方・作り方から分析・カイ二乗検定まで解説
クロス集計とは、性別×購入商品のように2つのカテゴリを掛け合わせ、交差するマスに人数や割合を並べて傾向を読む集計手法です。1つの項目だけを数える単純集計では見えない「どの層がどう違うか」を1枚の表で示せるため、アンケート分析やマーケティングの定番手法になっています。この記事では、クロス集計の定義と単純集計との違い、表側・表頭や縦横パーセントの見方、Excel・スプレッドシート・SQL・pandasでの作り方、そして差が偶然かどうかをカイ二乗検定で確かめる方法まで、実務の順番でまとめます。
まとめ
- クロス集計は、2つ以上のカテゴリ変数を掛け合わせ、交差セルに度数(人数)や構成比を表示する集計方法。1変数を数える単純集計の一歩先にある。
- 表は表側(左の分析軸)と表頭(上の比較項目)で構成し、割合は原則「横パーセント(行方向)」で読む。各行のn数が小さいセルの割合は参考値にとどめる。
- 作成手段はExcel・スプレッドシートのピボットテーブルと
COUNTIFS関数、大規模データならSQLのGROUP BYやpandasのpd.crosstab。 - クロス集計で差が見えても偶然かもしれない。カイ二乗検定(Excelなら
CHISQ.TEST)でp値を確認し、有意差かを判断する。 - 相関は因果ではない。シンプソンのパラドックスやn数の偏りに注意し、必要ならウエイトバック集計で補正する。
以下で、定義・見方・作り方・実装・検定・注意点の順に具体的な手順とサンプルを見ていきます。
クロス集計とは何か(単純集計との違い)
クロス集計は、名義尺度や順序尺度のカテゴリ変数を2つ以上組み合わせ、交差するセルに該当する回答者数や構成比を配置する集計方法です。クロス分析やクロス表とも呼ばれます。たとえば「性別」と「商品の購入有無」を掛け合わせると、男女それぞれの購入率を並べて比較でき、全体の購入率だけでは埋もれていた層ごとの差が浮かび上がります。
| 性別 | 購入した | 購入しなかった | 行計(n) |
|---|---|---|---|
| 男性 | 60(40%) | 90(60%) | 150 |
| 女性 | 105(70%) | 45(30%) | 150 |
| 全体 | 165(55%) | 135(45%) | 300 |
全体の購入率は55%ですが、横パーセント(各行を100%として読む割合)を見ると男性40%・女性70%。女性のほうが購入に結びつきやすいと分かります。この「層ごとの差」を1枚で示せる点がクロス集計の価値です。
クロス集計と単純集計の違い
単純集計は1つの変数だけを数える集計で、GT(グランドトータル)とも呼ばれます。「購入した人は全体で何人か」を出すのが単純集計、「購入した人は男女でどう違うか」を出すのがクロス集計です。3つ以上の変数を同時に掛け合わせる場合は多重クロス集計になり、切り口が細かくなる代わりに各セルのn数が急激に減ります。
| 集計方法 | 掛け合わせる変数 | 分かること |
|---|---|---|
| 単純集計 | 1つ | 全体の分布・傾向 |
| クロス集計 | 2つ | 層ごとの差 |
| 多重クロス集計 | 3つ以上 | 層を細分化した差 |
単純集計そのものの作り方は単純集計とは何か?アンケート集計の基礎をわかりやすく解説で、3重・4重に掛け合わせる読み方は多重クロス集計とは?3重・4重クロスの読み方とExcel・スプレッドシートでの作り方で詳しく扱っています。
属性クロスと設問間クロスの違い
クロス集計は、表側に置く軸によって大きく2種類に分かれます。属性クロスは、性別・年代・地域といった回答者属性を表側に置き、設問の回答を表頭に置く形です。もっとも一般的で、「どの層に響いたか」を見るのに向きます。一方の設問間クロスは、ある設問の回答を表側、別の設問の回答を表頭に置き、設問どうしの関係を見ます。たとえば「このサービスを知っているか」と「利用したことがあるか」を掛け合わせ、認知と利用の連動を確かめる、といった使い方です。属性で切っても差が出ないとき、設問間クロスに切り替えると回答者の行動の連鎖が見えることがあります。
クロス集計表の見方(表側・表頭・縦横パーセント)
クロス集計表は、数字を出すより「どこをどう読むか」でつまずきます。用語とパーセントの向き、そしてn数の3点を押さえれば、誤読はほぼ防げます。
表側・表頭・セル・ベースの用語
表側は表の左端に置く行の見出しで、分析の軸(多くは回答者属性)にあたります。表頭は上端に置く列の見出しで、比較したい項目を並べます。表側と表頭が交差するマスがセルで、ここに度数や割合が入ります。ベース(n)は各行の回答者数で、割合の分母になる最重要の数字です。どのパーセントも「何を分母にした割合か」で意味が変わるため、表を読む前にベースを確認する習慣をつけると読み違いが減ります。
縦パーセント・横パーセント・全体パーセントの使い分け
クロス集計表の割合には、行を分母にする横パーセント、列を分母にする縦パーセント、総数を分母にする全体パーセントの3種類があります。表側に分析軸(属性)を置いた一般的な表では、横パーセント(各行を100%とする)を読むのが基本です。先の例で「男性の40%が購入」と読むのがこれにあたります。縦パーセントは「購入者のうち何割が男性か」という逆向きの問いに答える割合で、目的が入れ替わると読む方向も入れ替わります。表に並ぶ数字の向きを取り違えると結論が反転するため、「知りたいのは行ごとの傾向か、列ごとの内訳か」を先に決めてから読み始めます。
信頼できるサンプルサイズ(n数)の目安
クロス集計は層を細かく切るほど、各セルのベースが小さくなります。目安として、1セルのnが30を下回ると1人の増減で割合が大きく動くため、その割合は参考値として扱い、断定を避けます。多重クロスで「20代女性かつ首都圏かつ会員」のように条件を重ねると、母数が一桁になることも珍しくありません。nが一桁のセルが並ぶ多重クロスは、割合がぶれすぎるため施策判断の根拠にはしない、と割り切るのが安全です。分析前に必要なサンプルをどう割り振るかはサンプル割付とは何か?アンケート調査における基本概念を解説が、回答者構成の偏りを母集団に合わせて補正する方法はウエイトバック集計とは?その概念と基本的な考え方が参考になります。
Excel・スプレッドシートでのクロス集計表の作り方
少量から中規模のデータなら、ExcelやGoogleスプレッドシートで十分にクロス集計表を作れます。手早く作るならピボットテーブル、表の形を固定して繰り返し使うならCOUNTIFS関数が向きます。
Excelピボットテーブルでの作成手順
- 回答データを1行1回答の形(表側にする属性、表頭にする設問がそれぞれ1列)に整える。
- データ範囲を選び、「挿入」→「ピボットテーブル」を選ぶ。
- 行に表側の項目(例:性別)、列に表頭の項目(例:購入有無)、値に「個数」を配置する。
- 値フィールドの設定→「計算の種類」→「行集計に対する比率」を選ぶと、そのまま横パーセントの表になる。
ピボットテーブルは元データを書き換えても更新ボタンひとつで再集計できるため、回答が追加される調査と相性が良い方法です。
COUNTIFS関数によるクロス集計
表のレイアウトを自分で決めて固定したいときは、COUNTIFS関数で各セルの度数を数えます。表側と表頭の条件を並べて指定するだけで、交差セルの人数が求まります。
=COUNTIFS(性別の列, "男性", 購入有無の列, "購入した")
この式を表の各セルにコピーし、行計で割れば横パーセントになります。条件が固定された定型レポートを毎月作るなら、関数方式のほうがレイアウト崩れが起きにくく管理しやすくなります。
Googleスプレッドシートでの作成
Googleスプレッドシートでも手順はExcelとほぼ同じで、「データ」→「ピボットテーブル」で行・列・値を設定します。COUNTIFS関数もそのまま使えるほか、QUERY関数を使えばSQLに近い記法(select A, count(B) group by A)で集計軸を柔軟に組み替えられます。クラウド上でリアルタイムに共同編集できるため、複数人で同じ集計表を見ながら分析を進めるチームに向いています。
SQL・pandasでの大規模データ実装
数万件を超えるログやデータベース上の回答をExcelに貼るのは現実的ではありません。データがデータベースやPython上で直接扱えるなら、SQLやpandasでそのままクロス集計したほうが速く、集計条件もコードとして残せます。マーケティングリサーチ系の解説では触れられないことが多い実装面を、ここで具体化します。
SQLのGROUP BY・CASEによる集計
標準SQLでは、GROUP BYで表側の軸をまとめ、表頭の値ごとにCASE式で数え分けることでクロス集計表を作ります。
SELECT
gender AS 性別,
COUNT(CASE WHEN purchased = 'yes' THEN 1 END) AS 購入した,
COUNT(CASE WHEN purchased = 'no' THEN 1 END) AS 購入しなかった
FROM survey
GROUP BY gender;
SQL ServerやOracleにはPIVOT句もありますが、CASE式なら方言に依存せずどのデータベースでも動くため、まずはこの形を覚えておくと応用が利きます。集計軸を増やしたいときはGROUP BYに列を足すだけで多重クロスに拡張できます。
pandasのpd.crosstabによる集計
Pythonで分析するなら、pandasのpd.crosstabが最短です。表側と表頭にする列を渡すだけで度数の表が返り、引数を足せば割合や合計も同時に出せます。
import pandas as pd
# 度数のクロス集計表
pd.crosstab(df["gender"], df["product"])
# 横パーセント(行方向の構成比)と行・列合計を付与
pd.crosstab(df["gender"], df["product"],
normalize="index", margins=True)
normalizeは"index"で横パーセント、"columns"で縦パーセント、"all"で全体パーセントに切り替わり、margins=Trueで合計行・列が付きます。前処理前の生データの扱いについてはローデータとは?意味・集計方法・分析手法から活用事例までわかりやすく解説も合わせて確認してください。
カイ二乗検定による有意差の判定
クロス集計で男性40%・女性70%のような差が出ても、それが本当の差なのか、たまたまのばらつきなのかは、表を眺めるだけでは判断できません。ここで使うのがカイ二乗検定(独立性の検定)です。手順は、まず「性別と購入は無関係」と仮定したときに期待される人数(期待度数)を求め、実測との食い違いの大きさをカイ二乗値として数値化し、そこからp値を計算します。
期待度数は「行合計×列合計÷総計」で求め、自由度は「(行数−1)×(列数−1)」です。Excelなら実測度数の表と期待度数の表を用意し、CHISQ.TEST関数でp値を直接求められます。
=CHISQ.TEST(実測度数の範囲, 期待度数の範囲)
Pythonでは、scipyのchi2_contingencyにクロス集計表を渡すだけで、カイ二乗値・p値・自由度・期待度数がまとめて返ります。
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(table)
print(p) # p が 0.05 未満なら有意差ありと判断する
p値が有意水準(一般に0.05)を下回れば「無関係」という仮定を棄却し、性別と購入には統計的に意味のある関連があると判断します。どのセルが差に効いているかまで見たいときは、調整済み残差を確認します。差を見つけたら、まず検定で裏を取る。この一手間が、思い込みでの施策決定を防ぎます。
クロス集計の注意点と誤読を避けるコツ
クロス集計は直感的に読める分、誤った結論に飛びつきやすい手法でもあります。特に次の2点は、分析の質を左右します。
相関と因果の混同への注意
クロス集計が示すのは変数どうしの関連(相関)であって、因果関係ではありません。「雨の日に傘が売れる」という表が出ても、「雨だから売れた」のか「セールを重ねていた」のかは、この表だけでは決められません。関連が見えたら、それは仮説の出発点であって結論ではない。この姿勢で次の検証に進みます。
シンプソンのパラドックスへの注意
全体で見ると傾向Aなのに、層別に分けると全ての層で逆の傾向が出る——これがシンプソンのパラドックスです。たとえば全体ではA施策の反応率が高く見えても、年代別に割るとどの年代でもB施策のほうが高い、という逆転が起こり得ます。原因は、層ごとにサンプルの構成比が偏っていることにあります。全体の1枚だけで意思決定せず、重要な属性で層別クロスをかけて逆転が起きていないか確かめるのが安全です。回答者の構成そのものが母集団とずれている場合は、ウエイトバック集計とは?その概念と基本的な考え方で補正してから読むと、偏りによる誤読を減らせます。
よくある質問
クロス集計とは何ですか?
2つ以上のカテゴリ変数を掛け合わせ、交差するセルに人数や割合を表示する集計方法です。性別×購入有無のように層ごとの差を1枚の表で比較でき、アンケート分析やマーケティングで広く使われます。
クロス集計と単純集計の違いは何ですか?
単純集計は1つの変数だけを数える集計(全体の分布)で、クロス集計は2つの変数を掛け合わせて層ごとの差を見る集計です。単純集計で全体像を、クロス集計で内訳の違いをつかむ、という役割分担になります。
クロス集計と多重クロス集計はどう違いますか?
2変数を掛け合わせるのがクロス集計、3変数以上を同時に掛け合わせるのが多重クロス集計です。多重にすると切り口は細かくなりますが各セルのn数が小さくなります。詳しくは多重クロス集計とは?3重・4重クロスの読み方とExcel・スプレッドシートでの作り方を参照してください。
Excelでクロス集計に使う関数は何ですか?
各セルの人数を数えるならCOUNTIFS関数、有意差を確かめるならカイ二乗検定のCHISQ.TEST関数を使います。表を手早く作るだけならピボットテーブルが便利です。
設問間クロスとは何ですか?
ある設問の回答を表側、別の設問の回答を表頭に置き、設問どうしの関係を見るクロス集計です。属性(性別・年代など)で切る属性クロスに対し、回答の連動(認知と利用など)を確かめたいときに使います。