UpSetプロットで集合の交差を正確に比較

上級

6.7.31

UpSetプロットで集合の交差を正確に比較

最終更新 2026-03-06 読了時間 1 分
まとめ
  • 3つ以上の集合の交差パターンを行列+棒グラフで可視化し、ベン図の限界を超える。
  • upsetplot ライブラリで MultiIndex の value_counts を渡すだけで描画できる。
  • スキルセット分析、機能の組み合わせ、遺伝子セットの重複など「何と何が同時に該当するか」を知りたいときに使う。

UpSet プロットはベン図の代替として 2014 年に提案された手法。集合の交差パターンを下部の接続マトリクスで示し、上部の棒グラフで各パターンの件数を比較する。5 セット以上でもパターンを正確に読み取れる。

 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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from upsetplot import UpSet

rng = np.random.default_rng(42)
n = 200

skills = pd.DataFrame({
    "Python": rng.random(n) < 0.65,
    "SQL": rng.random(n) < 0.55,
    "機械学習": rng.random(n) < 0.35,
    "統計": rng.random(n) < 0.40,
    "可視化": rng.random(n) < 0.50,
})

# upsetplot 用の MultiIndex 形式に変換
skills_mi = skills.set_index(list(skills.columns))
counts = skills_mi.index.value_counts()

upset = UpSet(
    counts,
    subset_size="auto",
    show_counts=True,
    sort_by="cardinality",
    min_subset_size=3,
    facecolor="#2563eb",
)

fig = plt.figure(figsize=(12, 6))
upset.plot(fig=fig)
fig.suptitle("社員スキルセットの組み合わせ分析(UpSet プロット)", fontsize=13, y=1.02)

plt.show()

社員スキルセットの組み合わせを示すUpSetプロット

読み方のポイント #

  • 上部の棒グラフの高さが各交差パターンの件数を表す。もっとも多いパターンがどの組み合わせかを最初に確認する。
  • 下部のマトリクスで黒い点が入っているスキルが「同時に持っている」組み合わせ。点が 1 つだけならそのスキル単独の保有者数。
  • 右側(または左側)のバーは各スキル単体の保有者数(セットサイズ)を示す。

いつ使うか #

  • 適している場面: 3〜7 セットの交差パターンを定量的に比較したいとき。ベン図では 4 セット以上で面積が不正確になるが、UpSet プロットは正確な件数比較が可能。
  • 不向きな場面: セット数が 2 以下なら通常のベン図で十分。セット数が 15 以上になるとパターン数が爆発し、意味のある読解が困難。
  • 代替手段: 集合の包含関係だけ見たいならオイラー図。セット間の流入・流出にはサンキーダイアグラムが適切。

よくある失敗パターン #

  • パターン数の爆発: 5 セットで最大 $2^5 = 32$ パターンが出現するため、min_subset_size で少数パターンをフィルタしないと図が横に伸びすぎる。
  • ソート順の不適切: デフォルトでカーディナリティ(件数)順にソートされるが、度数(セットの組み合わせ数)順にした方が見やすい場合もある。sort_by パラメーターで切り替える。