quantileとは?分位点・四分位数の求め方をpandas・NumPyで解説

Pythonでデータ分析をしていると、「quantile」という関数やメソッドを見かけることがあります。

quantileは、データを小さい順に並べたとき、指定した割合の位置にある値(分位点)を求めるための機能です。

統計分析では、平均値だけでは分かりにくいデータのばらつきや分布を把握するために利用されます。特に、中央値や四分位数、外れ値の分析などで重要です。

この記事では、Pythonにおけるquantileについて、以下の内容を初心者向けに解説します。

  • quantileとは何か

  • Pythonで分位点を求める方法

  • NumPyのquantile()

  • pandasのquantile()

  • 四分位数・中央値の求め方

  • 複数の分位点を一度に求める方法

  • DataFrameでquantileを使う方法

  • 外れ値の判定方法

  • 実務での活用例


quantileとは?

quantile(クォンタイル)とは、日本語で「分位点」と呼ばれる統計量です。

データを小さい順に並べたとき、全体の何%の位置に相当する値なのかを表します。

例えば、次のデータがあるとします。

data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

quantile(0.5)を求めると、データの50%地点、つまり中央値に相当する値を取得できます。

0%       50%       100%
|---------|---------|
10        55       100

Pythonでは、分位点を0~1の範囲で指定するのが一般的です。

指定値 意味
0 最小値
0.25 第1四分位数
0.5 中央値
0.75 第3四分位数
1 最大値

Pythonでquantileを使う方法

Pythonで分位点を求める場合、代表的なのが以下の2つです。

  • NumPyのnumpy.quantile()

  • pandasのSeries.quantile() / DataFrame.quantile()

データ分析では、pandasを利用する機会が多いため、pandasのquantile()は特に重要です。


NumPyのquantile()とは?

NumPyでは、numpy.quantile()を使って分位点を計算できます。

基本構文は以下のとおりです。

numpy.quantile(a, q)

aには対象となるデータ、qには求めたい分位点を指定します。

基本的な使い方

import numpy as np

data = [10, 20, 30, 40, 50]

result = np.quantile(data, 0.5)

print(result)

実行結果:

30.0

0.5を指定しているため、中央値を求めています。


25%点を求める

25%地点の分位点を求めるには、0.25を指定します。

import numpy as np

data = [10, 20, 30, 40, 50]

result = np.quantile(data, 0.25)

print(result)

結果:

20.0

この値は第1四分位数(Q1)と呼ばれます。


75%点を求める

75%地点は0.75です。

import numpy as np

data = [10, 20, 30, 40, 50]

result = np.quantile(data, 0.75)

print(result)

結果:

40.0

これは第3四分位数(Q3)です。


NumPyで複数のquantileを求める

qにリストを指定すると、複数の分位点を一度に計算できます。

import numpy as np

data = [10, 20, 30, 40, 50]

result = np.quantile(data, [0.25, 0.5, 0.75])

print(result)

結果:

[20. 30. 40.]

これによって、

  • Q1 = 20

  • Q2 = 30

  • Q3 = 40

を一度に取得できます。


pandasのquantile()とは?

pandasでは、SeriesやDataFrameに対してquantile()を使用できます。

例えば、次のようなSeriesを作ります。

import pandas as pd

data = pd.Series([10, 20, 30, 40, 50])

print(data.quantile(0.5))

結果:

30.0

pandasでは、

Series.quantile()

という形で利用します。


pandasで中央値を求める

quantile(0.5)は中央値を求める処理として利用できます。

import pandas as pd

data = pd.Series([10, 20, 30, 40, 50])

median = data.quantile(0.5)

print(median)

結果:

30.0

なお、中央値だけであれば、pandasにはmedian()もあります。

median = data.median()

そのため、中央値を求めるだけならmedian()のほうが意図が分かりやすい場合があります。


四分位数を求める

quantileで特に重要なのが四分位数です。

データを4つのグループに分けるための境界値を四分位数と呼びます。

主に以下の3つを使用します。

  • 第1四分位数(Q1)

  • 第2四分位数(Q2)

  • 第3四分位数(Q3)

Pythonでは次のように求められます。

import pandas as pd

data = pd.Series([10, 20, 30, 40, 50, 60, 70, 80])

q1 = data.quantile(0.25)
q2 = data.quantile(0.50)
q3 = data.quantile(0.75)

print("Q1:", q1)
print("Q2:", q2)
print("Q3:", q3)

まとめて四分位数を求める

以下のように書くと、Q1~Q3をまとめて取得できます。

quartiles = data.quantile([0.25, 0.5, 0.75])

print(quartiles)

出力例:

0.25    27.5
0.50    45.0
0.75    62.5
dtype: float64

データ分析では、この方法が非常に便利です。


DataFrameでquantileを使う

quantile()はDataFrameにも使用できます。

例えば、次のようなデータを作ります。

import pandas as pd

df = pd.DataFrame({
    "数学": [60, 70, 80, 90, 100],
    "英語": [50, 65, 75, 85, 95],
    "国語": [55, 70, 80, 85, 90]
})

print(df.quantile(0.5))

結果は、各列について中央値が計算されます。

数学    80.0
英語    75.0
国語    80.0

つまり、DataFrameのquantile()では、列ごとの分位点を計算することができます。


DataFrameで四分位数をまとめて取得する

result = df.quantile([0.25, 0.5, 0.75])

print(result)

結果は次のような形式になります。

       数学    英語    国語
0.25  70.0  65.0  70.0
0.50  80.0  75.0  80.0
0.75  90.0  85.0  85.0

行の0.25、0.5、0.75が、それぞれQ1、中央値、Q3を表します。


quantileとpercentileの違い

quantileと似た機能にpercentile(パーセンタイル)があります。

大きな違いは、指定する値の範囲です。

quantile

通常、0~1で指定します。

np.quantile(data, 0.25)

percentile

0~100で指定します。

np.percentile(data, 25)

つまり、

np.quantile(data, 0.25)

と

np.percentile(data, 25)

は、同じ25%地点を求める処理です。


quantileとmedianの違い

中央値を求めるだけなら、次の2つは同じ結果になります。

data.quantile(0.5)
data.median()

ただし、用途には違いがあります。

メソッド 用途
quantile(0.25) 第1四分位数
quantile(0.5) 中央値
quantile(0.75) 第3四分位数
median() 中央値

複数の分位点を分析したい場合はquantile()が便利です。


quantileを使った外れ値の判定

quantileは外れ値の検出にも利用できます。

代表的な方法が、四分位範囲(IQR)を使った方法です。

IQRは以下の式で求めます。

IQR = Q3 - Q1

Pythonでは次のように書けます。

q1 = df["数学"].quantile(0.25)
q3 = df["数学"].quantile(0.75)

iqr = q3 - q1

print(iqr)

さらに、一般的なルールでは以下の範囲を外れ値判定に利用します。

下限 = Q1 - 1.5 × IQR
上限 = Q3 + 1.5 × IQR

Pythonでは次のように実装できます。

q1 = df["数学"].quantile(0.25)
q3 = df["数学"].quantile(0.75)

iqr = q3 - q1

lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr

print("下限:", lower)
print("上限:", upper)

quantileで外れ値を抽出する

例えば、次のデータがあるとします。

import pandas as pd

df = pd.DataFrame({
    "売上": [100, 120, 130, 140, 150, 160, 170, 1000]
})

1000が他の値と比較してかなり大きいため、外れ値の可能性があります。

四分位数を使って判定してみましょう。

q1 = df["売上"].quantile(0.25)
q3 = df["売上"].quantile(0.75)

iqr = q3 - q1

lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr

outliers = df[
    (df["売上"] < lower) |
    (df["売上"] > upper)
]

print(outliers)

このように、quantileはデータクレンジングにも活用できます。


quantileで上位10%・下位10%を調べる

quantileは「上位何%か」を分析するときにも便利です。

例えば、上位10%に入る境界値を求める場合は、

threshold = data.quantile(0.9)

print(threshold)

とします。

この値以上のデータを抽出すれば、上位10%程度のデータを調べられます。

top_10 = data[data >= data.quantile(0.9)]

print(top_10)

マーケティングデータや売上データなどで、上位顧客を分析するときにも利用できます。


quantileで欠損値がある場合

pandasのquantile()では、欠損値NaNを含むデータを扱うケースがあります。

例えば、

import pandas as pd

data = pd.Series([10, 20, 30, None, 50])

print(data.quantile(0.5))

このようなデータでも、通常は欠損値を除外して分位点が計算されます。

ただし、実際のデータ分析では、欠損値をどのように扱うかを事前に確認することが重要です。


quantileの補間方法

分位点を計算するとき、指定した位置がデータとデータの間になることがあります。

例えば、データ数が少ない場合などです。

NumPyやpandasでは、補間方法を指定できます。

NumPyではmethodを指定できます。

np.quantile(
    data,
    0.25,
    method="linear"
)

データ分析で計算結果が想定と違う場合は、どの補間方法が採用されているかを確認するとよいでしょう。


quantileを使うときの注意点

1. quantileの指定値は0~1

quantile()では、基本的に次のように指定します。

data.quantile(0.25)

25%なので、

data.quantile(25)

としないように注意してください。

25%点を求めるなら0.25です。


2. percentileとは指定方法が異なる

percentileでは、

np.percentile(data, 25)

のように25を指定します。

一方、quantileでは、

np.quantile(data, 0.25)

です。

quantileは0~1、percentileは0~100と覚えておくと分かりやすいでしょう。


3. データの意味を確認する

quantileは単純に値を計算するだけでなく、「その分位点が何を意味するのか」を理解することが重要です。

例えば売上データの場合、

df["売上"].quantile(0.5)

は「売上の中央値」を意味します。

一方、

df["売上"].quantile(0.9)

は「売上データの90%地点の値」です。


NumPyとpandasのquantileの使い分け

NumPyとpandasのどちらでもquantileを計算できます。

項目 NumPy pandas
関数 np.quantile() Series.quantile()
DataFrame対応 △ ○
配列計算 ○ ○
データ分析 ○ ◎
欠損値を含む表形式データ △ ◎

単純なNumPy配列の計算ならnp.quantile()、表形式のデータ分析ならpandasのquantile()が使いやすいでしょう。


quantileの実践例:売上データを分析する

最後に、実務を想定して売上データを分析してみましょう。

import pandas as pd

sales = pd.Series([
    120000,
    150000,
    180000,
    200000,
    210000,
    250000,
    280000,
    300000,
    350000,
    500000
])

print("25%:", sales.quantile(0.25))
print("50%:", sales.quantile(0.50))
print("75%:", sales.quantile(0.75))
print("90%:", sales.quantile(0.90))

このようにすると、売上データの分布を複数の視点から確認できます。

平均値だけを見るよりも、

  • 下位25%の境界

  • 中央値

  • 上位25%の境界

  • 上位10%の境界

などを確認できるため、データの特徴を把握しやすくなります。


Pythonのquantileまとめ

Pythonのquantileは、データの分布を把握するために重要な統計処理です。

特にpandasでは、

df["列名"].quantile(0.25)

のように簡単に第1四分位数を求められます。

代表的な指定値は以下のとおりです。

0       # 最小値
0.25    # 第1四分位数
0.5     # 中央値
0.75    # 第3四分位数
1       # 最大値

また、複数の分位点をまとめて取得することもできます。

df["売上"].quantile([0.25, 0.5, 0.75])

さらに、quantileは四分位範囲(IQR)を利用した外れ値検出や、上位10%・下位10%のデータ分析などにも応用できます。

Pythonでデータ分析や機械学習を行うのであれば、quantile()はぜひ覚えておきたいpandas・NumPyの基本機能の一つです。


pandas|集計・グループ化の関連記事

groupbyや各種集計関数で、データを要約する操作の記事です。

pandas全体の使い方は「pandasの使い方を初心者向けに解説」でまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら