【Pandasデータ分析】DataFrame・Seriesを「順位付け」するrank()メソッドでランキングを生成 🏆


 

データ分析において、「特定の基準に基づいてデータを順位付けしたい」というニーズは非常に一般的です。例えば、売上高の高い順に商品を並べ替えたり、試験の点数で生徒に順位をつけたり、ウェブサイトのアクセス数でページをランキングしたりする際に、順位付けは欠かせない処理です。

Pandasの**rank()メソッド**は、DataFrameやSeriesの数値データに対して、この順位付けを効率的に行うための強力なツールです。重複する値の扱い方や、昇順・降順の指定など、柔軟なオプションを提供します。この記事では、rank()メソッドの基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

rank()メソッドとは?なぜ順位付けが必要なのか?

 

rank()メソッドは、SeriesまたはDataFrame内の各要素に対して、その値の相対的な順位を返します。

なぜデータ分析で順位付けが必要なのでしょうか?

  • 相対的な位置の把握: 個々の値がデータセット全体の中でどの程度の位置にあるのかを視覚的に、または数値的に把握できます。

  • パフォーマンス評価: 売上、スコア、パフォーマンス指標などに基づいて、最も成績の良い(悪い)項目を特定できます。

  • データの比較: 異なるデータセットやグループ間で、相対的な順位を比較することで、より深い洞察を得られます。

  • 機械学習の前処理: 特徴量エンジニアリングにおいて、数値データを順位に変換することで、線形モデルなどにおける外れ値の影響を軽減したり、非線形な関係を捉えやすくしたりできる場合があります。


 

1. Seriesの順位付けの基本

 

Seriesにrank()を適用すると、そのSeries内の値に基づいて順位が計算されます。

 

基本的な使い方と重複値のデフォルト処理

 

デフォルトでは、rank()は値を昇順に並べ(小さい値が低い順位)、重複する値には平均順位method='average')を与えます。

Python
 
import pandas as pd
import numpy as np

# サンプルSeriesの作成 (試験の点数)
s_scores = pd.Series([85, 92, 78, 92, 65, 95], index=['A', 'B', 'C', 'D', 'E', 'F'])
print("元のSeries (スコア):\n", s_scores)

# Seriesの順位を取得 (デフォルト設定)
# 小さい値が低い順位、重複値は平均順位
s_ranked = s_scores.rank()
print("\nSeriesの順位 (デフォルト、昇順、平均順位):\n", s_ranked)

解説:

  1. s_scores.rank(): Series s_scoresの各要素に順位を割り当てます。

  2. 65が最小なので順位1.0。

  3. 78が次に小さいので順位2.0。

  4. 85が順位3.0。

  5. 92が2つありますが、もし重複がなければそれぞれ4位と5位になるはずでした。その平均である(4+5)/2 = 4.5が両方に割り当てられます。

  6. 95が最大なので順位6.0。


 

2. DataFrameの順位付け

 

DataFrameにrank()を適用すると、デフォルトで列ごとに順位が計算されます。

 

列ごとの順位付け (axis=0 またはデフォルト)

 

各列(例: 各教科の点数)において、各行(例: 各生徒)が何位かを知りたい場合に利用します。

Python
 
# サンプルDataFrameの作成 (生徒の科目別点数)
df_grades = pd.DataFrame({
    '数学': [85, 92, 78, 92, 65],
    '理科': [70, 85, 90, 85, 75],
    '英語': [90, 80, 70, 90, 60]
}, index=['生徒A', '生徒B', '生徒C', '生徒D', '生徒E'])
print("\n元のDataFrame (科目別点数):\n", df_grades)

# 各科目(列)で生徒の順位を取得
df_ranked_cols = df_grades.rank()
print("\nDataFrameの列ごとの順位 (デフォルト):\n", df_ranked_cols)

解説:

df_grades.rank()は、各列(’数学’, ‘理科’, ‘英語’)ごとに独立して順位を計算します。例えば’数学’列では、92が2つあるため、その平均順位4.5が割り当てられています。

 

行ごとの順位付け (axis=1)

 

各行(例: 各生徒)において、科目間(列)でどの科目が何位かを知りたい場合に利用します。

Python
 
# 各生徒(行)で科目の順位を取得
df_ranked_rows = df_grades.rank(axis=1)
print("\nDataFrameの行ごとの順位:\n", df_ranked_rows)

解説:

df_grades.rank(axis=1)は、各行ごとに独立して(例: 生徒Aの数学、理科、英語の点数の中で)順位を計算します。


 

3. 順位付けのオプション:methodascending

 

rank()メソッドは、重複する値の扱い方や順位の方向を柔軟に制御できます。

 

重複値の処理方法 (method引数)

 

  • 'average' (デフォルト): 重複する値に平均順位を割り当てる。

  • 'min': 重複する値に最も低い(小さい)順位を割り当てる。

  • 'max': 重複する値に最も高い(大きい)順位を割り当てる。

  • 'first': 重複する値が出現する順序に基づいて順位を割り当てる。

  • 'dense': 重複する値に同じ順位を割り当て、次の異なる値には連続した順位を割り当てる(ギャップなし)。

Python
 
# 重複値のあるSeries
s_dup = pd.Series([10, 20, 15, 20, 5])
print("\n元のSeries (重複あり):\n", s_dup)

print("\nMethod: 'average' (デフォルト):\n", s_dup.rank(method='average'))
print("Method: 'min':\n", s_dup.rank(method='min'))
print("Method: 'max':\n", s_dup.rank(method='max'))
print("Method: 'first':\n", s_dup.rank(method='first'))
print("Method: 'dense':\n", s_dup.rank(method='dense'))

解説:

20という値が2つあります。

  • 'average'203.534の平均)を割り当てます。

  • 'min'203.0(重複する値の中での最低順位)を割り当てます。

  • 'max'204.0(重複する値の中での最高順位)を割り当てます。

  • 'first'は最初の203.0、次の204.0を割り当てます。

  • 'dense'203.0を割り当て、次の値(10, 15の次) 203を与え、それ以降にギャップを作りません。

 

順位の方向 (ascending引数)

 

  • True (デフォルト): 小さい値が低い順位(昇順)。

  • False: 小さい値が高い順位(降順)。(例: 売上高の高い方が1位)

Python
 
# スコアを降順で順位付け (高いスコアほど順位が低い = 良い順位)
s_ranked_desc = s_scores.rank(ascending=False)
print("\nスコアの降順順位付け (高いスコアが低い順位):\n", s_ranked_desc)

解説:

ascending=Falseとすることで、値が大きいほど低い順位(例: 1位)が割り当てられます。


 

4. 欠損値(NaN)の扱い

 

デフォルトでは、NaNは順位計算から除外され、NaNの位置にはNaNが割り当てられます。na_option引数で制御できます。

  • 'keep' (デフォルト): NaNはNaNのまま。

  • 'top': NaNを最も低い順位(ascending=Trueなら1位、ascending=Falseなら最下位)として扱う。

  • 'bottom': NaNを最も高い順位(ascending=Trueなら最下位、ascending=Falseなら1位)として扱う。

Python
 
s_nan_scores = pd.Series([85, np.nan, 78, 92, 65, 95])
print("\nNaNを含むSeries:\n", s_nan_scores)

print("\nNaNを'keep' (デフォルト):\n", s_nan_scores.rank(na_option='keep'))
print("NaNを'top' (昇順でNaNが1位):\n", s_nan_scores.rank(na_option='top'))
print("NaNを'bottom' (昇順でNaNが最下位):\n", s_nan_scores.rank(na_option='bottom'))

 

まとめ

 

Pandasのrank()メソッドは、DataFrameやSeriesの数値データを基準に、柔軟な順位付けを行うための非常に強力なツールです。重複値の処理方法(method)や順位の方向(ascending)、そして欠損値の扱い方(na_option)を細かく制御できるため、様々な分析ニーズに対応できます。

データセット内で特定の要素の相対的な位置を特定したり、パフォーマンスを評価したり、ランキングを作成したりする際に、rank()メソッドは不可欠な存在となるでしょう。このメソッドをマスターし、あなたのデータ分析の精度と洞察力をさらに高めましょう!