四分位数・箱ひげ図・IQR 完全ガイド — 五数要約と外れ値検出

健康診断の結果票に「あなたの値はこの集団の中で上位25%です」と書かれていたら、自分が全体のどのあたりにいるのかが一目でわかります。平均値だけでは「平均より上か下か」しかわかりませんが、「全体を4つに区切ったどのブロックにいるか」がわかると、ぐっと具体的になります。この「全体を4等分する目印」が四分位数(quartile) です。

四分位数は、データの中心だけでなく「広がり」と「形」と「外れ値」を同時に語れる、探索的データ分析(EDA)の主役です。たとえば次のような場面で活躍します。

  • 試験成績の分析 — クラスごとの成績分布を箱ひげ図で並べれば、平均が同じでも「ばらつきが大きいクラス」「極端に低い生徒がいるクラス」が一目で見分けられます。
  • 品質管理 — 製品寸法のばらつきを四分位範囲で監視し、フェンスを超えた測定値を「異常品の候補」として自動検出できます。

平均と標準偏差は「データが正規分布に近い」ことを暗黙に仮定しがちですが、四分位数とIQRは分布の形を仮定しない(ロバストな)統計量です。極端な外れ値が数個あっても中央値やIQRはほとんど揺らぎません。この頑健さこそ、実データに最初に向き合うときの強い味方になります。

本記事の内容

  • 四分位数 $Q_1, Q_2, Q_3$ の直感的な意味と厳密な計算手順
  • パーセンタイルと「補間方法」の流儀違い(linear / lower / higher / nearest / midpoint)
  • 四分位範囲 IQR と五数要約、箱ひげ図の各部位の読み方
  • $1.5 \times \mathrm{IQR}$ ルールによる外れ値検出の仕組みと根拠
  • バイオリンプロットとの比較、群間比較の実践
  • NumPy / pandas / Matplotlib による実装と、試験成績・品質管理・EDAへの応用

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

四分位数の直感 — データを4つに切り分ける

中央値(メジアン)は、データを小さい順に並べたとき「ちょうど真ん中」に来る値でした。データを半分に切り分ける目印です。では、その「半分に切る」操作をもう一段細かくして、データを4等分することを考えましょう。

イメージとしては、行列に並んだ人々を背の順に並ばせて、前から $\tfrac{1}{4}$、$\tfrac{2}{4}$、$\tfrac{3}{4}$ の地点に旗を立てるようなものです。

  • 第1四分位数 $Q_1$(25パーセンタイル)— 下から数えて4分の1の地点。これより小さい人が全体の25%。
  • 第2四分位数 $Q_2$(50パーセンタイル)— ちょうど真ん中。これが中央値そのもの。
  • 第3四分位数 $Q_3$(75パーセンタイル)— 下から数えて4分の3の地点。これより大きい人が全体の25%。

この3つの旗で、データは下位25%・25〜50%・50〜75%・上位25%という4つのブロックに区切られます。下の図は、11個のデータを小さい順に並べ、$Q_1, Q_2, Q_3$ がどこに立つかを示したものです。

データを小さい順に並べ4等分する位置に立つ四分位数Q1・Q2・Q3

この図から、四分位数の本質が読み取れます。四分位数は「値の大小」そのものではなく、「順位(並べたときの位置)」で定義される量です。だから一部のデータが極端に大きくても、旗の立つ位置はほとんど動きません。平均が外れ値に引っ張られて大きく動くのとは対照的で、ここに四分位数の頑健さの源があります。

四分位数が「順位で決まる位置の量」だとわかったところで、次はこの旗を正確にどこへ立てるかを数式で詰めていきましょう。実はここに、教科書や言語によって流儀が分かれる微妙な問題が潜んでいます。

四分位数の定義と計算

中央値からの自然な拡張

まず中央値の定義を思い出します。データ $x_1 \le x_2 \le \dots \le x_n$ を昇順に並べたとき、中央値 $Q_2$ は

$$ Q_2 = \begin{cases} x_{(n+1)/2} & (n \text{ が奇数}) \\[4pt] \dfrac{x_{n/2} + x_{n/2+1}}{2} & (n \text{ が偶数}) \end{cases} $$

で与えられます。奇数個ならど真ん中の1個、偶数個なら真ん中2個の平均、というおなじみのルールです。

四分位数も基本はこの延長線上にあります。素朴な方法(メジアン法、Tukeyの方法)はこうです。

  1. データを昇順に並べる。
  2. 中央値 $Q_2$ で全体を「下半分」と「上半分」に分ける。
  3. 下半分の中央値を $Q_1$、上半分の中央値を $Q_3$ とする。

ここで「中央値そのものを下半分・上半分に含めるか」で流派が分かれます。$n$ が奇数のとき、中央値の値を両側に含める流儀(Tukey)と、除外する流儀(Moore & McCabe)があります。この差は小さなデータでだけ問題になりますが、後で見るように計算結果が変わる原因の一つです。

パーセンタイルとしての定義

より一般的には、四分位数をパーセンタイル(百分位数) の特別な場合として定義します。$p$ パーセンタイルとは「データの $p\%$ がそれ以下になる値」です。$Q_1, Q_2, Q_3$ はそれぞれ25, 50, 75パーセンタイルにあたります。

パーセンタイルを計算するには、まず $p$ に対応する「順位の位置」を決めます。よく使われる線形補間法では、$n$ 個のデータに対して目標位置(0始まりインデックス)を

$$ h = (n – 1)\cdot \frac{p}{100} $$

で求めます。$h$ が整数なら $x_{(h)}$(0始まりで $h$ 番目)がそのままパーセンタイル値です。$h$ が小数なら、前後の2つのデータを線形に内挿します。$\lfloor h \rfloor$ を $h$ の整数部、$h – \lfloor h \rfloor$ を小数部 $f$ とすると、

$$ \mathrm{percentile}(p) = x_{(\lfloor h \rfloor)} + f \cdot \left( x_{(\lfloor h \rfloor + 1)} – x_{(\lfloor h \rfloor)} \right) $$

となります。これは NumPy の np.percentile がデフォルト(method="linear")で採用している式です。

具体例で確かめる

データ $\{10, 20, 30, 40, 50, 60, 70, 80\}$($n = 8$)の第1四分位数 $Q_1$ を線形補間法で求めてみましょう。$p = 25$ なので、目標位置は

$$ h = (8 – 1)\cdot \frac{25}{100} = 7 \times 0.25 = 1.75 $$

整数部は $\lfloor h \rfloor = 1$、小数部は $f = 0.75$ です。0始まりインデックスで $x_{(1)} = 20$、$x_{(2)} = 30$ なので、

$$ Q_1 = 20 + 0.75 \times (30 – 20) = 20 + 7.5 = 27.5 $$

と求まります。「順位1.75番目」という中途半端な位置を、20と30のあいだを0.75の比率で内挿したわけです。同じデータでも、補間の流儀を変えると $Q_1$ は20になったり30になったりします。次のセクションで、この流儀の違いを徹底的に見比べます。

ここまでで四分位数の計算手順がわかりました。しかし「順位1.75番目をどう扱うか」には実は何通りもの作法があり、ソフトウェアによって既定値が異なります。データ分析で再現性を確保するには、この違いを知っておく必要があります。

パーセンタイルと補間の流儀

なぜ流儀が複数あるのか

「順位1.75番目の値」は、データに実在しません。実在しない順位の値を「でっち上げる」ためのルールが補間方法です。NumPy の np.percentile には method 引数があり、代表的なものに次の5つがあります(同じ $p=25$、同じデータ $\{10, \dots, 80\}$ での結果を併記します)。

method 規則 $Q_1$
lower 位置 $h$ を切り下げ、下側の実データを採用 20
higher 位置 $h$ を切り上げ、上側の実データを採用 30
nearest $h$ に最も近い実データを採用 30
midpoint 前後2点の単純平均 25
linear 前後2点を $h$ の小数部で内挿(既定) 27.5

下の図は、この5つの方法が同じデータの上で異なる位置を指すことを可視化したものです。

n=8の同じデータで5つの補間方法が異なる第1四分位を返す比較図

この図から、3つの大事なことが読み取れます。第一に、同じデータ・同じ「25%」でも、補間方法が違えば答えが変わる(20〜30の幅で揺れる)こと。第二に、lower/higher/nearest は必ず実在のデータ点を返すのに対し、linear/midpoint はデータに無い中間値を作り出すこと。第三に、データ数 $n$ が大きくなるほどこの差は小さくなり、実務上は無視できる程度になることです。

Hyndman & Fan の9つの方法

統計学者 Hyndman と Fan は、1996年の論文で世の中の分位点推定法を9種類(type 1〜9)に整理しました。NumPy 1.22 以降では method にこれらの正式名("hazen", "weibull", "median_unbiased" など)も指定できます。たとえば R言語の quantile() の既定は type 7(NumPy の linear と同じ)、Excel の PERCENTILE.INC も type 7 相当です。一方 SAS や一部の統計教科書は別の type を既定にしています。

実務的な結論はシンプルです。

  • どの方法を使ったか必ず記録する。論文や報告書では「線形補間(NumPy既定)」のように明記する。
  • 大標本ではほぼ一致するので神経質になりすぎない。$n$ が数十以下の小標本でのみ差が顕在化する。
  • チーム内・プロジェクト内で統一する。同じデータから違う四分位数が出ると混乱の元になる。

補間方法の違いを押さえたところで、四分位数を使った最も重要な派生量 ——「データの広がり」を測る四分位範囲に進みましょう。

IQRと五数要約

四分位範囲 IQR

四分位範囲(Interquartile Range, IQR)は、第3四分位数と第1四分位数の差です。

$$ \mathrm{IQR} = Q_3 – Q_1 $$

これは「データの真ん中50%がどれだけの幅に収まっているか」を表します。$Q_1$ より下に25%、$Q_3$ より上に25%があるので、$Q_1$ と $Q_3$ のあいだにはちょうど中央の50%が入ります。その幅がIQRです。

IQRは標準偏差と並ぶ「ばらつきの指標」ですが、決定的な違いがあります。標準偏差は全データの値を使うため、極端な外れ値が1個あるだけで大きく膨らみます。一方IQRは中央50%だけを見るので、両端の極端な値に一切影響されません。データの25%までが汚染されても壊れない、という意味で「ブレークダウンポイント25%」の頑健な指標です。

五数要約

データの分布を最小限の数字で要約する古典的な方法が五数要約(five-number summary) です。次の5つの値でデータの「位置・広がり・形」をコンパクトに表します。

$$ (\,x_{\min},\ Q_1,\ Q_2,\ Q_3,\ x_{\max}\,) $$

それぞれ最小値・第1四分位数・中央値・第3四分位数・最大値です。たった5つの数字ですが、ここから多くが読み取れます。

  • $x_{\max} – x_{\min}$ は範囲(レンジ) — 全体の広がり。
  • $\mathrm{IQR} = Q_3 – Q_1$ は中央50%の広がり。
  • $Q_2 – Q_1$ と $Q_3 – Q_2$ の比較で歪みがわかる。下側が狭く上側が広ければ右に裾を引く分布。

下の図は、ヒストグラムと五数要約の対応を示したものです。

ヒストグラムと五数要約(最小・Q1・中央値・Q3・最大)の対応図

この図から、五数要約が「分布のスケッチ」になっていることが読み取れます。5つの目印さえあれば、ヒストグラムを描かなくても「中心はどこか、どれくらい広がっているか、左右対称か」がおおよそつかめます。この五数要約を1枚の図に凝縮したものこそ、次に解説する箱ひげ図です。

箱ひげ図の構造

5つの数字を1枚の絵にする

五数要約の5つの数字を、そのまま視覚化したのが箱ひげ図(box plot, box-and-whisker plot) です。1970年代に統計学者 John Tukey が考案しました。長所は「省スペースで分布を表現でき、複数群を横に並べて比較しやすい」ことです。

箱ひげ図の各部位は次の通りです。下の解剖図と対応させて読んでください。

箱ひげ図の各部位(箱・中央値・ひげ・外れ値)に注釈をつけた解剖図

  • 箱(box) — 左端が $Q_1$、右端が $Q_3$。箱の長さがそのまま IQR を表す。この図では $Q_1 = 45$, $Q_3 = 56$ なので $\mathrm{IQR} = 11$。
  • 箱の中の線 — 中央値 $Q_2$(この図では50)。箱の中での位置が分布の歪みを示す。
  • ひげ(whisker) — 箱から伸びる線。端点は「外れ値とみなされない範囲での最小・最大値」(この図では下ひげ端31、上ひげ端71)。
  • — ひげの外側にある外れ値。この図では両端のオレンジ点。

上の図から重要な読み取りができます。中央値の線が箱のほぼ中央にあり、左右のひげの長さも近いので、この分布はおおむね左右対称だと判断できます。もし中央値が箱の左寄りで右のひげが長ければ「右に裾を引く分布」と読めます。箱ひげ図は、こうした分布の形を瞬時に伝えてくれます。

ひげの端点はどう決まるのか

ここで素朴な疑問が生まれます。ひげの端点は単に「最小値・最大値」ではないのでしょうか? 実は違います。多くの統計ソフト(Matplotlib含む)では、ひげの端点を次のように決めます。

  1. まず $Q_1, Q_3$ から「フェンス」と呼ばれる境界を計算する。
  2. ひげの端点は、フェンス内に収まる実データの最小値・最大値とする。
  3. フェンスの外側にあるデータ点を、独立した点(外れ値)として描く。

つまりひげは「外れ値を除いたデータの範囲」を示します。このフェンスの定義こそが、次に解説する $1.5 \times \mathrm{IQR}$ ルールです。

1.5×IQR による外れ値検出

フェンスの定義

外れ値(outlier)とは「他のデータから大きく離れた異常な値」です。しかし「大きく離れた」を主観で決めると人によってブレます。Tukey が提案した客観的な基準が $1.5 \times \mathrm{IQR}$ ルールです。下側フェンスと上側フェンスを次で定義します。

$$ \begin{aligned} \text{下側フェンス} &= Q_1 – 1.5 \times \mathrm{IQR} \\ \text{上側フェンス} &= Q_3 + 1.5 \times \mathrm{IQR} \end{aligned} $$

この2本のフェンスの外側にあるデータ点を、外れ値とみなします。下の図は、$Q_1 = 40$, $Q_3 = 60$($\mathrm{IQR} = 20$)のときのフェンスの位置を示したものです。

1.5×IQRルールによる下フェンス・上フェンスの位置を示す数直線図

この図から、フェンスが「箱の両端から、箱の長さ(IQR)の1.5倍だけ外へ伸ばした位置」にあることが読み取れます。$\mathrm{IQR} = 20$ なので、下フェンスは $40 – 30 = 10$、上フェンスは $60 + 30 = 90$ です。箱(中央50%)を基準に、その左右に1.5倍の「余裕」を取り、それを超えたら外れ値、というシンプルで頑健な発想です。

なぜ「1.5」なのか

「1.5」という数字には根拠があります。データが正規分布に従うと仮定すると、四分位数は標準偏差 $\sigma$ を使って $Q_1 \approx \mu – 0.6745\sigma$, $Q_3 \approx \mu + 0.6745\sigma$ と書けます。したがって

$$ \mathrm{IQR} \approx 2 \times 0.6745\,\sigma = 1.349\,\sigma $$

となります。すると上側フェンスは

$$ Q_3 + 1.5 \times \mathrm{IQR} \approx \mu + 0.6745\sigma + 1.5 \times 1.349\sigma = \mu + 2.698\sigma $$

おおよそ $\mu + 2.7\sigma$ の位置です。正規分布で $|z| > 2.7$ となる確率は片側およそ0.35%、両側で約0.7%です。つまり正規分布なら、約0.7%のデータだけが外れ値として拾われる——稀すぎず、敏感すぎない、ちょうどよい閾値として「1.5」が選ばれているのです。より極端な外れ値だけを拾いたいときは「3.0倍」を使い、これを超えるものを「極端な外れ値(far out)」と呼ぶこともあります。

外れ値検出の実例

下の図は、正常な測定値の集団に4つの極端な値を混ぜたデータに、$1.5 \times \mathrm{IQR}$ ルールを適用した結果です。

IQR法による外れ値検出例。フェンス外の点をオレンジで強調表示

この図から、緑の帯(フェンス内)に大多数の正常値が収まり、その外側に置いた極端な値だけがオレンジの大きな点として正しく検出されていることが読み取れます。閾値を人間が決めるのではなく、データ自身の四分位構造から自動的にフェンスが決まる点が、この手法の実用的な強みです。品質管理やセンサ異常検知で、ラベルなしデータの一次スクリーニングによく使われます。

外れ値の検出ができるようになりました。しかし箱ひげ図には弱点もあります。それは「分布の形(山が1つか2つか)」を隠してしまうことです。これを補うのが、次に紹介するバイオリンプロットです。

バイオリンプロットなどの発展

箱ひげ図が見落とすもの

箱ひげ図は五数要約という「5つの数字」に分布を圧縮します。コンパクトな反面、その途中の形 ——たとえば「山が1つなのか2つなのか」—— は捨象されてしまいます。中央値とIQRが同じでも、データが1か所に集中している場合と、2つの塊に分かれている場合とで、箱ひげ図は同じ姿に見えてしまうのです。

この弱点を補うのがバイオリンプロット(violin plot) です。バイオリンプロットは、箱ひげ図の骨格にカーネル密度推定(KDE)による分布の形を重ねたものです。左右対称に密度曲線を描くため、楽器のバイオリンのような輪郭になります。下の図で両者を比べてみましょう。

単峰性と二峰性データを箱ひげ図とバイオリンプロットで比較した図

この図から、決定的な違いが読み取れます。左の箱ひげ図では「単峰性」と「二峰性」のデータがほとんど見分けがつきません。ところが右のバイオリンプロットでは、二峰性データがくびれた「ひょうたん型」になり、2つの山がはっきり見えます。データの本当の形を確認したいときは、箱ひげ図だけに頼らず、バイオリンプロットやヒストグラム、あるいは個々の点を重ねたスウォームプロットを併用するのが安全です。

正規分布と歪んだ分布の箱ひげ図

箱ひげ図の形と分布の関係を、典型的な2つのケースで確認しておきましょう。まず正規分布です。

正規分布の四分位数と箱ひげ図。IQR≈1.349σの対応を示す図

この図から、正規分布では中央値が箱の中央にあり、左右のひげがほぼ対称になることが読み取れます。理論値どおり $Q_1 \approx -0.674$, $Q_3 \approx +0.674$(標準化値)で、$\mathrm{IQR} \approx 1.349\sigma$ という関係が成り立っています。下段の箱ひげ図のひげの外に散らばる点は、$\pm 2.7\sigma$ を超えたデータで、前述の「約0.7%」におおむね一致します。

対照的に、右に裾を引く分布(対数正規分布など)はどう見えるでしょうか。

右に歪んだ分布の箱ひげ図。中央値<平均で上ひげが長い様子

この図から、右歪み分布の特徴が明確に読み取れます。中央値(赤破線)は平均(黒実線)より左に位置し、上側のひげが下側より長く伸び、外れ値も上側にだけ集中しています。中央値 < 平均という関係は右歪みの典型的なサインです。収入・滞在時間・故障までの時間など、ゼロ以上で右に裾を引くデータでは、平均値より中央値とIQRのほうが「典型的な値」を素直に表します。

分布ごとの箱ひげ図の見え方がわかったところで、これらをすべてPythonで再現してみましょう。

Pythonでの実装

四分位数とIQRを計算する

まずは NumPy で四分位数・IQR・五数要約を計算します。補間方法を切り替えて、結果がどう変わるかも確認します。

import numpy as np

data = np.array([10, 20, 30, 40, 50, 60, 70, 80])  # n=8

# 既定(線形補間)での四分位数
q1, q2, q3 = np.percentile(data, [25, 50, 75])
iqr = q3 - q1
print(f"Q1={q1}, Q2(中央値)={q2}, Q3={q3}, IQR={iqr}")

# 五数要約
five = np.percentile(data, [0, 25, 50, 75, 100])
print("五数要約 (min, Q1, Q2, Q3, max):", five)

# 補間方法ごとの Q1 を比較
for m in ["lower", "higher", "nearest", "midpoint", "linear"]:
    val = np.percentile(data, 25, method=m)
    print(f"method={m:>9s}: Q1={val}")

出力は次のようになります。

Q1=27.5, Q2(中央値)=45.0, Q3=62.5, IQR=35.0
五数要約 (min, Q1, Q2, Q3, max): [10. 27.5 45. 62.5 80.]
method=    lower: Q1=20.0
method=   higher: Q1=30.0
method=  nearest: Q1=30.0
method= midpoint: Q1=25.0
method=   linear: Q1=27.5

この出力から、本文の手計算(線形補間で $Q_1 = 27.5$)と完全に一致していることが確認できます。そして補間方法を変えると $Q_1$ が20〜30のあいだで揺れる ——これも図05で見た通りです。実務では method を明示し、チーム内で統一しておくべきだと改めてわかります。

外れ値を検出する関数

次に、$1.5 \times \mathrm{IQR}$ ルールで外れ値を検出する関数を書きます。閾値(既定1.5)を引数にして、極端な外れ値の判定(3.0)にも使えるようにします。

import numpy as np

def detect_outliers(x, k=1.5):
    """IQR法で外れ値のインデックスとフェンスを返す。"""
    x = np.asarray(x, dtype=float)
    q1, q3 = np.percentile(x, [25, 75])
    iqr = q3 - q1
    lo_fence = q1 - k * iqr
    hi_fence = q3 + k * iqr
    mask = (x < lo_fence) | (x > hi_fence)
    return np.where(mask)[0], (lo_fence, hi_fence)

rng = np.random.default_rng(3)
data = np.concatenate([rng.normal(100, 15, 120), [180, 195, 30, 20]])

idx, (lo, hi) = detect_outliers(data, k=1.5)
print(f"フェンス: [{lo:.1f}, {hi:.1f}]")
print(f"外れ値の数: {len(idx)}")
print("外れ値:", np.round(np.sort(data[idx]), 1))

出力例は次の通りです。

フェンス: [58.1, 142.0]
外れ値の数: 6
外れ値: [ 20.   30.   57.6 149.8 180.  195. ]

この出力から、意図的に混入させた4つの極端な値(20, 30, 180, 195)に加えて、正常集団の中でたまたまフェンスをわずかに超えた2点(57.6 と 149.8)も外れ値として拾われたことがわかります。これは外れ値検出の本質をよく表しています。$1.5 \times \mathrm{IQR}$ ルールは「真の異常か、たまたま端に来た正常値か」を区別しません。あくまで機械的なスクリーニングであり、検出された点が本当に異常かどうかは、ドメイン知識で最終判断する必要があります。より極端な値だけに絞りたければ、閾値 k を3.0に上げて「far out」の基準を使います。

pandasのdescribeで一括計算

実データ分析では pandas の describe() が便利です。五数要約に加えて件数・平均・標準偏差をまとめて返します。

import pandas as pd
import numpy as np

rng = np.random.default_rng(5)
df = pd.DataFrame({
    "A組": np.clip(rng.normal(62, 12, 60), 0, 100),
    "B組": np.clip(rng.normal(70, 8, 60), 0, 100),
    "C組": np.clip(rng.normal(75, 18, 60), 0, 100),
})

print(df.describe().round(1))

# グループごとのIQRを手動で計算
for col in df.columns:
    q1, q3 = df[col].quantile([0.25, 0.75])
    print(f"{col}: IQR = {q3 - q1:.1f}")

describe() の出力には 25%, 50%, 75% の行が含まれ、これがそのまま $Q_1, Q_2, Q_3$ です。出力から、3クラスの中央値はB組・C組が高めでも、C組はIQR(ばらつき)が最も大きい、といった「平均だけでは見えない違い」が読み取れます。pandas.Series.quantile() の既定も NumPy と同じ線形補間なので、結果は一致します。

Matplotlibで箱ひげ図とバイオリンプロットを描く

最後に、群間比較の箱ひげ図とバイオリンプロットを描きます。日本語ラベルを付け、図06・図07と同じ見た目を再現します。

import numpy as np
import matplotlib.pyplot as plt

# 日本語フォント設定
import matplotlib
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

rng = np.random.default_rng(5)
groups = [np.clip(rng.normal(m, s, 60), 0, 100)
          for m, s in [(62, 12), (70, 8), (75, 18)]]

fig, ax = plt.subplots(figsize=(8, 5))
bp = ax.boxplot(groups, tick_labels=["A組", "B組", "C組"], patch_artist=True)
for box in bp["boxes"]:
    box.set(facecolor="#aec7e8", edgecolor="#333")
for med in bp["medians"]:
    med.set(color="#d62728", linewidth=2)
ax.set_ylabel("試験点数")
ax.set_title("3クラスの試験成績を箱ひげで比較")
ax.grid(True, axis="y", alpha=0.3)
plt.tight_layout()
plt.show()

3クラスの試験成績を並べた群間比較の箱ひげ図

このコードで生成される箱ひげ図(上の図)から、3クラスの成績を一目で比較できます。箱の高さ(IQR)の違いでばらつきの大小が、中央値の線の位置で典型的な点数が、ひげの外の点で極端に低い(または高い)生徒の有無がわかります。C組は中央値が高い一方で箱が最も縦長 ——つまりばらつき(IQR)が大きく、下側に外れ値も見られる、という「平均だけでは見えない違い」がはっきり読み取れます。tick_labels 引数は Matplotlib 3.9 以降の名前で、それ以前は labels を使う点に注意してください。

群ごとの分布の形まで確認したいときは、同じデータに ax.violinplot(groups, showmedians=True) を使えばバイオリンプロットになります。図07で見たように、二峰性などの隠れた構造を見抜けます。これで理論から実装まで一通りそろいました。最後に、四分位統計が実際の現場でどう使われるかを見ておきましょう。

応用 — 試験成績・品質管理・EDA

試験成績の分析

複数クラスや複数年度の試験成績を比較するとき、箱ひげ図は強力です。平均点だけを並べると「A組68点、B組70点」のように僅差に見えても、箱ひげ図にすれば「A組は得点が広く散らばる(IQRが大きい)」「B組は中央に固まっている」といったばらつきの違いが見えます。さらにひげの外の点で「極端に低い生徒(追加指導が必要)」を機械的に拾えます。中央値で比較すれば、数人の0点が平均を押し下げる影響を受けずに「典型的な学力」を比較できます。

品質管理と異常検知

製造ラインの寸法・重量・電圧などの測定値は、ほとんどが正常範囲に収まり、ごく一部に異常値が混じります。$1.5 \times \mathrm{IQR}$ ルールは、正規性を仮定せずに異常値の候補を自動抽出できるため、ラベルなしデータの一次スクリーニングに向いています。管理図(control chart)が平均±3σを使うのに対し、IQR法は外れ値自体に頑健なので、「異常値が混じったデータから正常範囲を推定する」局面で特に有効です。

探索的データ分析(EDA)の第一歩

新しいデータセットを手にしたとき、最初にやるべきは分布の俯瞰です。df.describe() で五数要約を眺め、各変数を箱ひげ図やバイオリンプロットにすれば、(1) 中心はどこか、(2) どれくらい広がっているか、(3) 左右対称か歪んでいるか、(4) 外れ値はあるか —— が一気につかめます。平均と標準偏差だけに頼ると、外れ値や歪みに足をすくわれます。四分位ベースの頑健な統計量を併用することが、信頼できる分析の出発点になります。

これらの応用を支えているのは、本記事で見てきた「順位に基づく頑健な要約」という共通の発想です。最後に全体を振り返りましょう。

まとめ

本記事では、四分位数・箱ひげ図・IQRと、それらを使った外れ値検出について解説しました。

  • 四分位数 $Q_1, Q_2, Q_3$ は、データを順位で4等分する目印。値ではなく順位で決まるため、外れ値に頑健。
  • パーセンタイルの補間方法(linear / lower / higher / nearest / midpoint など)は流儀が複数あり、小標本では結果が変わる。使った方法を必ず記録する。
  • IQR $= Q_3 – Q_1$ は中央50%の幅。標準偏差と違い極端値に影響されない頑健なばらつき指標。
  • 五数要約(最小・$Q_1$・中央値・$Q_3$・最大)を1枚に凝縮したのが箱ひげ図
  • $1.5 \times \mathrm{IQR}$ ルールでフェンスを引き、その外側を外れ値とする。「1.5」は正規分布で約0.7%だけを拾うちょうどよい閾値。
  • バイオリンプロットは箱ひげ図にKDEを重ね、二峰性など分布の形まで見せる。

四分位数とIQRは、平均・標準偏差の「正規分布前提」を外して分布の実像に迫るための、最も基本的で頑健な道具です。ここで身につけた「順位ベースの頑健な要約」という考え方は、ノンパラメトリック統計や順位検定、さらには分位点回帰(quantile regression)へとつながっていきます。

次のステップとして、以下の記事も参考にしてください。