PandasのデータフレームやSeriesでは、パーセンタイルを取得してデータの特徴を把握したり、外れ値となるようなデータを除外することができます。
今回は、対象データのパーセンタイルを取得する方法を紹介します。
パーセンタイルについて
パーセンタイルとは?について確認しておきます。その前に、中央値について触れておきます。
中央値とは
中央値とは、データを値の小さいものから大きいものに並べたとき、ちょうど中央に位置するデータです。たとえば以下のようなデータがあったとします。
2, 10, 15, 22, 50
このように5つのデータがあったとき、中央値は小さいほう(大きいほう)から3番目の値です。なので、中央値は15となります。
蛇足ですが、例の場合は中央値=平均値とならない例です(平均は19.8)
また、データ数が偶数の場合は中央の値が2つ出てきてしまいます。その場合は、その2つの値を足して2で割った値が中央値になります。
2, 10, 15, 17, 22, 50
例の場合、中央値は15と17を足して2で割った値である16が中央値になります。
パーセンタイルとは
パーセンタイルとは中央値の考え方を拡張したものです。パーセンタイルでは、データを小さい(大きい)順に並べ、100等分します。分割した値は99個あり、小さいものから1%パーセンタイル、2%パーセンタイル…といった具合に呼びます。
例えば1~100までの100個のデータがあったとき、25%パーセンタイルは25、50%パーセンタイルは50になります。同じように1~200までの200個のデータがあったとき、25%パーセンタイルは50、50%パーセンタイルは100となります。
Pandasでパーセンタイルを求める
以降では実際にPandasでパーセンタイルを求めていきます。まず今回使うデータですが、ボストン住宅価格データセットを用います。
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
quantile()を使う
pandasでパーセンタイルを求めるにはquantile()を用います。データフレームに対して使った場合、各数値列のパーセンタイル値がSeriesで返されます。
引数に何も与えなかった場合、各列の中央値が返されます。
#中央値
df.quantile()
>>
CRIM 0.25651
ZN 0.00000
INDUS 9.69000
CHAS 0.00000
NOX 0.53800
RM 6.20850
AGE 77.50000
DIS 3.20745
RAD 5.00000
TAX 330.00000
PTRATIO 19.05000
B 391.44000
LSTAT 11.36000
パーセンタイルは引数で指定する
先ほどのquantile()に対して、取得したいパーセントを第一引数qとして渡すことでパーセンタイル値を取得できます。引数は0.0~1.0の範囲で指定します。
#25%パーセンタイル
df.quantile(0.25)
>>
CRIM 0.082045
ZN 0.000000
INDUS 5.190000
CHAS 0.000000
NOX 0.449000
RM 5.885500
AGE 45.025000
DIS 2.100175
RAD 4.000000
TAX 279.000000
PTRATIO 17.400000
B 375.377500
LSTAT 6.950000
リストでパーセントを複数指定することも可能です。この場合はデータフレームが返されます。
#配列で各パーセンタイルを指定
df.quantile([0, 0.25, 0.5, 0.75, 1.0])
Seriesに対してもパーセンタイルを指定して値を取得できます。
#"CRIM"の25%パーセンタイル
df["CRIM"].quantile(0.25)
>>
0.08204499999999999
ユースケース
パーセンタイル値の使い道ってどんなところにあるのでしょうか。例えば、外れ値が混ざってくることが想定されるデータでは、外れ値を考慮外とするために値の上下〇%のデータを除外するといった場合があります。
実際にやってみます。”CRIM”列の上下5%(5%、95%)の値を取得し、それより外側のデータを除外してみます。
#パーセンタイル値の取得
per_under = df["CRIM"].quantile(0.05)
per_top = df["CRIM"].quantile(0.95)
#5%以上95%未満のデータのみ抽出
df_trimed = df[(df["CRIM"] > per_under)&(df["CRIM"] < per_top)]
データ件数も506件から454件になり、10%のデータがそぎ落とされていることがわかります。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
初学者の方にはこちらもオススメです^^
まとめ
パーセンタイルの意味とPandasの実装について紹介しました。
ルールとして外れ値となりうる値を除外する場合等に使われたりします。また、純粋にデータの分布を知る手掛かりにもなるので、活用してください。
ではでは👋