活用テクニック2026年4月2日

二変量分析の完全ガイド — 2変数の関係を可視化と検定で深掘りする

散布図・箱ひげ図・クロス集計表——変数の型の組み合わせに応じた最適な可視化と検定手法を体系的に解説。Qastの自動二変量分析で得られるインサイトの読み方も紹介します。

Qast の二変量分析画面。散布図と箱ひげ図が並んで表示されている。

二変量分析(Bivariate Analysis)は、2つの変数の間にどのような関係があるかを調べる手法です。単変量分析が「各変数を個別に」見るのに対し、二変量分析は「変数同士の関係」に焦点を当てます。変数の型(数値・カテゴリ)の組み合わせによって、適切な可視化手法と統計検定が異なります。この記事では、すべてのパターンを体系的にカバーし、Qast の自動二変量分析の活用法を解説します。

二変量分析が必要な理由

単変量分析(ヒストグラム、基本統計量など)はデータの「個々の特性」を把握するのに有効ですが、変数間の関係は見えません。たとえば、「年齢」と「年収」のそれぞれの分布が分かっても、「年齢が高いほど年収が高いか」は二変量分析をしないと分かりません。機械学習では、特徴量とターゲット変数の関係を理解することが、モデルの精度向上と解釈性の向上に直結します。

二変量分析の結果は、特徴量エンジニアリング(新しい特徴量の作成)や特徴量選択(不要な変数の除外)の判断材料にもなります。ターゲットとの関係が弱い特徴量は除外候補ですし、特徴量同士が強く相関していれば片方を除外して多重共線性を回避できます。

変数の型による分類 — 3つのパターン

二変量分析では、2つの変数の型の組み合わせによって、使うべき可視化手法と統計検定が決まります。大きく分けて「数値×数値」「数値×カテゴリ」「カテゴリ×カテゴリ」の3パターンがあります。Qast は各変数のデータ型を自動推論し、最適な分析手法を自動選択します。

  1. 1

    数値 × 数値

    散布図で関係の形状を確認し、Pearson/Spearman 相関で関係の強さを数値化します。回帰直線やLOESSスムージングを追加して傾向線を可視化することもあります。

  2. 2

    数値 × カテゴリ

    箱ひげ図やバイオリンプロットでグループ間の分布差を可視化し、t検定/ANOVA でグループ間の平均差を検定します。

  3. 3

    カテゴリ × カテゴリ

    クロス集計表(分割表)で度数を整理し、カイ二乗検定で独立性を検定します。モザイクプロットやヒートマップで可視化します。

数値 × 数値 — 散布図と相関分析

2つの数値変数の関係を調べるとき、まず行うべきは散布図(Scatter Plot)の作成です。散布図は各データポイントを XY 平面上にプロットするだけのシンプルなグラフですが、線形関係・非線形関係・クラスター構造・外れ値の存在など、多くの情報を一目で伝えてくれます。数値だけを見ていると「相関係数 0.8」が何を意味するか分かりにくいですが、散布図を見れば直感的に理解できます。

散布図の上に回帰直線(線形フィット)を描くことで、関係の方向性と傾きを視覚化できます。さらに、LOESS(局所回帰)曲線を追加すれば、非線形な傾向も把握できます。Qast の二変量分析では、散布図に回帰直線と 95% 信頼区間が自動的に表示されます。

python
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

np.random.seed(42)
n = 300
age = np.random.uniform(22, 65, n)
income = age * 8000 + np.random.normal(0, 50000, n)

# 散布図 + 回帰直線
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(age, income, alpha=0.5, s=20)

# 線形回帰
slope, intercept, r, p, se = stats.linregress(age, income)
x_line = np.linspace(22, 65, 100)
ax.plot(x_line, slope * x_line + intercept, "r-", label=f"r={r:.3f}, p={p:.2e}")
ax.set_xlabel("年齢")
ax.set_ylabel("年収")
ax.set_title("年齢 vs 年収の散布図")
ax.legend()
plt.tight_layout()
plt.show()

print(f"Pearson r = {r:.4f}, p-value = {p:.2e}")
print(f"Spearman rho = {stats.spearmanr(age, income).statistic:.4f}")

数値 × カテゴリ — 箱ひげ図とグループ比較検定

数値変数とカテゴリ変数の関係を調べるケースは非常に多く現れます。「性別による年収の差」「地域ごとの売上の差」「施策A/B/Cの効果の差」などが典型例です。可視化には箱ひげ図(Box Plot)やバイオリンプロット(Violin Plot)を使い、統計検定で差が偶然ではないことを確認します。

箱ひげ図は、中央値(箱の中の線)、四分位範囲(箱の上端・下端)、外れ値(ヒゲの外のドット)を一目で表示します。複数グループの分布を横に並べて比較するのに最適です。バイオリンプロットは箱ひげ図にカーネル密度推定を追加したもので、分布の形状(二峰性など)も確認できます。

  1. 1

    2群の比較 — t 検定 / Mann-Whitney U 検定

    カテゴリが2値(例:男性/女性)の場合、Welch の t 検定で平均差を検定します。正規性が怪しい場合は Mann-Whitney U 検定(ノンパラメトリック)を使います。

  2. 2

    3群以上の比較 — ANOVA / Kruskal-Wallis 検定

    カテゴリが3つ以上(例:地域A/B/C)の場合、一元配置分散分析(ANOVA)で全グループの平均差を同時に検定します。正規性が成り立たない場合は Kruskal-Wallis 検定を使います。

  3. 3

    事後検定で詳細を特定

    ANOVA で有意差が出た場合、どのグループ間に差があるかを Tukey HSD や Bonferroni 補正付き t 検定で特定します。

python
import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(42)
# 3地域の売上データ
region_a = np.random.normal(500, 80, 100)
region_b = np.random.normal(550, 90, 100)
region_c = np.random.normal(480, 70, 100)

# 一元配置分散分析(ANOVA)
f_stat, p_value = stats.f_oneway(region_a, region_b, region_c)
print(f"ANOVA: F = {f_stat:.4f}, p = {p_value:.4e}")

# Kruskal-Wallis 検定(ノンパラメトリック版)
h_stat, p_kw = stats.kruskal(region_a, region_b, region_c)
print(f"Kruskal-Wallis: H = {h_stat:.4f}, p = {p_kw:.4e}")

# 2群比較: Welch の t 検定(地域A vs 地域B)
t_stat, p_t = stats.ttest_ind(region_a, region_b, equal_var=False)
print(f"Welch t-test (A vs B): t = {t_stat:.4f}, p = {p_t:.4e}")

# 効果量(Cohen's d)
def cohens_d(g1, g2):
    n1, n2 = len(g1), len(g2)
    s_pool = np.sqrt(((n1 - 1) * g1.std()**2 + (n2 - 1) * g2.std()**2) / (n1 + n2 - 2))
    return (g1.mean() - g2.mean()) / s_pool

print(f"Cohen's d (A vs B) = {cohens_d(region_a, region_b):.4f}")

p 値が有意(p < 0.05)でも、差が「実務的に意味のある大きさか」は効果量で判断しましょう。サンプルサイズが大きいと、ごく小さな差でも統計的に有意になります。Cohen's d = 0.2 は小さな効果、0.5 は中程度、0.8 は大きな効果の目安です。

カテゴリ × カテゴリ — クロス集計表とカイ二乗検定

2つのカテゴリ変数が「独立か、それとも関連があるか」を調べるには、クロス集計表(Contingency Table)を作成し、カイ二乗(χ²)独立性検定を実行します。クロス集計表は行に1つのカテゴリ変数のカテゴリ、列にもう1つのカテゴリ変数のカテゴリを配置し、各セルに該当するデータの度数(件数)を記録した表です。

カイ二乗検定は「もし2変数が完全に独立だったら、各セルの期待度数はどうなるか」を計算し、実際の観測度数との乖離を統計的に評価します。乖離が大きければ(p < 0.05)、2変数は独立ではない(何らかの関連がある)と判断します。関連の強さは Cramér's V で定量化します。

python
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency

np.random.seed(42)
n = 500

# 性別と購入カテゴリに意図的に関連性を持たせる
gender = np.random.choice(["男性", "女性"], n)
category = []
for g in gender:
    if g == "男性":
        category.append(np.random.choice(["電子機器", "スポーツ", "食品"], p=[0.5, 0.3, 0.2]))
    else:
        category.append(np.random.choice(["電子機器", "スポーツ", "食品"], p=[0.2, 0.2, 0.6]))

df = pd.DataFrame({"性別": gender, "購入カテゴリ": category})

# クロス集計表
ct = pd.crosstab(df["性別"], df["購入カテゴリ"])
print("クロス集計表:")
print(ct)

# カイ二乗独立性検定
chi2, p, dof, expected = chi2_contingency(ct)
print(f"\nχ² = {chi2:.4f}, p = {p:.4e}, 自由度 = {dof}")
print(f"\n期待度数:")
print(pd.DataFrame(expected, index=ct.index, columns=ct.columns).round(1))

効果量 — 差の「大きさ」を評価する

統計的検定の p 値は「差が偶然かどうか」を教えてくれますが、「差がどれくらい大きいか」は教えてくれません。サンプルサイズが十分に大きければ、実務的に無視できるほど小さな差でも統計的に有意になります。効果量(Effect Size)は、差の「大きさ」を標準化して評価する指標です。

  1. 1

    Cohen's d(2群の平均差)

    2群の平均差を標準偏差で割った値です。d = 0.2(小)、0.5(中)、0.8(大)が目安。t検定と組み合わせて使います。

  2. 2

    η²(イータ二乗)(ANOVA の効果量)

    全体の分散のうち、グループ間の差が説明する割合です。η² = 0.01(小)、0.06(中)、0.14(大)が目安。

  3. 3

    Cramér's V(カテゴリ変数の関連度)

    カイ二乗統計量を正規化した関連度指標です。V = 0.1(弱)、0.3(中)、0.5(強)が目安。

  4. 4

    相関係数 r(数値変数の関連度)

    そのもの自体が効果量としても使えます。|r| = 0.1(小)、0.3(中)、0.5(大)が目安。

可視化のベストプラクティス

二変量分析の可視化では、変数の型に合った適切なグラフを選ぶことが重要です。数値×数値には散布図、数値×カテゴリには箱ひげ図やバイオリンプロット、カテゴリ×カテゴリにはモザイクプロットやヒートマップが基本です。いずれの場合も、以下の点に注意しましょう。

まず、軸ラベルと単位を明記すること。次に、データ点数が多い散布図では透明度(alpha)を調整してオーバープロッティングを防ぐこと。そして、カテゴリ数が多すぎる場合は上位 N カテゴリに絞るか、「その他」にまとめること。Qast はこれらのベストプラクティスを自動的に適用してグラフを生成します。

検定手法の選び方フローチャート

二変量分析で使う統計検定を選ぶ際は、(1) 変数の型(数値 or カテゴリ)、(2) グループ数(2群 or 3群以上)、(3) データの正規性、(4) 分散の等質性、の4つの要素で判断します。正規性が成り立つ場合はパラメトリック検定(t検定、ANOVA)を、成り立たない場合はノンパラメトリック検定(Mann-Whitney U、Kruskal-Wallis)を使います。

  1. 1

    Step 1: 変数の型を確認する

    数値×数値なら相関検定、数値×カテゴリならグループ比較検定、カテゴリ×カテゴリならカイ二乗検定を選択します。

  2. 2

    Step 2: 正規性を確認する

    Shapiro-Wilk 検定やQ-Qプロットで各グループの正規性を確認します。p < 0.05 なら正規分布でないと判断し、ノンパラメトリック検定を使います。

  3. 3

    Step 3: 適切な検定を実行する

    正規なら t検定/ANOVA、非正規なら Mann-Whitney/Kruskal-Wallis を実行します。有意差がある場合は効果量も必ず計算しましょう。

Qast の二変量分析機能

Qast の EDA では、すべての変数ペアに対して変数の型を自動判定し、最適な可視化と統計検定を自動実行します。数値×数値のペアには散布図と Pearson/Spearman 相関検定、数値×カテゴリには箱ひげ図と t 検定/ANOVA、カテゴリ×カテゴリにはクロス集計表とカイ二乗検定が適用されます。効果量も自動計算され、検定結果と並べて表示されます。

Qast の二変量分析ダッシュボードでは、特徴量ペアのリストをターゲットとの関連度順でソートできるため、「予測に最も効きそうな特徴量」を素早く特定できます。また、特定のペアをクリックすると、詳細な可視化と検定結果がポップアップで表示されるインタラクティブな操作が可能です。

まとめ — 二変量分析を活用するコツ

二変量分析は、「数字だけでなく必ず可視化も確認する」「p 値だけでなく効果量も評価する」「変数の型に応じた適切な手法を選ぶ」の3原則を守ることで、データの関係構造を正しく把握できます。Qast はこれらの原則に基づいた分析を自動実行するため、統計の詳しい知識がなくても、変数間の重要な関係を見逃さずに発見できます。

二変量分析は EDA の中でも特にインサイトが得やすいステップです。ターゲット変数と各特徴量のペアを優先的に確認し、次に特徴量同士の関係を確認しましょう。Qast ではターゲットとの関連度が高い順に自動ソートされるため、効率的に分析を進められます。

Qast を導入してみませんか?

導入のご相談やデモのご依頼は、お気軽にお問い合わせください。