モザイクプロットでカテゴリの交差割合を面積で表す

中級

6.7.32

モザイクプロットでカテゴリの交差割合を面積で表す

最終更新 2026-03-06 読了時間 2 分
まとめ
  • 2つのカテゴリ変数の分割表を矩形の面積で可視化し、変数間の関連を直感的に読み取る。
  • statsmodels.graphics.mosaicplot.mosaic で分割表データから直接描画できる。
  • アンケート分析やカイ二乗検定の結果を視覚的に補足したいときに使う。

モザイクプロットは分割表(クロス集計表)を面積で表現するチャート。横幅が行カテゴリの周辺度数、高さが列カテゴリの条件付き割合を表す。セルの面積が観測度数に比例するため、カテゴリ間の関連の有無をひと目で判断できる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.mosaicplot import mosaic

rng = np.random.default_rng(42)

n = 500
age_group = rng.choice(["20代", "30代", "40代", "50代"], size=n, p=[0.25, 0.30, 0.25, 0.20])
# 年代によって好みが異なるように設定
prefs = {
    "20代": [0.45, 0.30, 0.15, 0.10],
    "30代": [0.25, 0.35, 0.25, 0.15],
    "40代": [0.15, 0.25, 0.35, 0.25],
    "50代": [0.10, 0.15, 0.30, 0.45],
}
product = np.array([
    rng.choice(["SNSアプリ", "動画配信", "ニュース", "EC"], p=prefs[ag])
    for ag in age_group
])

df = pd.DataFrame({"年代": age_group, "利用サービス": product})

# 色の設定
color_map = {
    ("20代", "SNSアプリ"): "#93c5fd", ("20代", "動画配信"): "#86efac",
    ("20代", "ニュース"): "#fde68a", ("20代", "EC"): "#fca5a5",
    ("30代", "SNSアプリ"): "#60a5fa", ("30代", "動画配信"): "#4ade80",
    ("30代", "ニュース"): "#fbbf24", ("30代", "EC"): "#f87171",
    ("40代", "SNSアプリ"): "#3b82f6", ("40代", "動画配信"): "#22c55e",
    ("40代", "ニュース"): "#f59e0b", ("40代", "EC"): "#ef4444",
    ("50代", "SNSアプリ"): "#2563eb", ("50代", "動画配信"): "#16a34a",
    ("50代", "ニュース"): "#d97706", ("50代", "EC"): "#dc2626",
}

fig, ax = plt.subplots(figsize=(10, 6))
mosaic(
    df, ["年代", "利用サービス"], ax=ax,
    properties=lambda key: {"color": color_map.get(key, "#cccccc")},
    gap=0.015,
    title="年代 × 利用サービスの構成(モザイクプロット)",
)
ax.set_xlabel("年代")
ax.set_ylabel("利用サービス")

fig.tight_layout()
plt.show()

年代と利用サービスの構成を示すモザイクプロット

読み方のポイント #

  • 横幅が年代の周辺度数(全体に占める割合)を表す。30 代の幅が最も広ければ、サンプル数が最も多い。
  • 各列の中の高さの比率が、その年代における利用サービスの条件付き割合を示す。
  • もし変数間に関連がなければ、すべての列で高さの比率が同じになる。比率がずれているほど変数間に関連がある。

いつ使うか #

  • 適している場面: 2つのカテゴリ変数の関連性をカイ二乗検定とセットで見せたいとき。アンケートの年代別嗜好や、A/B テストのセグメント別結果など。
  • 不向きな場面: カテゴリ数がそれぞれ 6 以上あるとセルが小さすぎて判読困難。3 変数以上のクロス集計には向かない。
  • 代替手段: カテゴリが少なければグループ化棒グラフ、独立性の検定結果を色で見せたいなら残差ヒートマップ。

よくある失敗パターン #

  • ラベルの重なり: セルが小さいとラベルが読めない。フォントサイズを下げるか、少数カテゴリをまとめて「その他」に集約する。
  • 色の意味の不統一: 同じサービスなのに列によって色が変わると混乱する。1 つの変数に色を割り当て、もう 1 つの変数は軸で区別するのが基本。