Pandas pd.qcut() 関数
pd.qcut()Pandas ライブラリで使用される、分位数によるビニングを行う関数です。データを等しい数のサンプルに分割し、各ビンにはほぼ同じ数のデータポイントが含まれます。
とpd.cut()(等幅ビニング)とは異なり、pd.qcut()各区间内のデータ量が等しくなるようにし、歪んだ分布のデータや、データの自然な分位数に従って分割する必要がある場合に非常に適しています。
単語の意味: qcut中で「q」は「quantile」(分位数)を表し、分位数に基づいてデータを「カット」するという意味です。
基本構文とパラメータ
pd.qcut()は Pandas ライブラリのトップレベル関数で、分位数に基づいて離散化するために使用されます。
構文形式
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
パラメータの説明
- パラメータ:
x- 型: リスト、Series、配列などの配列のようなオブジェクト。
- 説明: ビニングする連続的な数値データ。
- パラメータ:
q- 型: 整数または分位数の配列。
- 説明: ビンの数または具体的な分位数。整数 n の場合、データを n 個の等しいグループに分割します(各グループには約 1/n のデータが含まれます)。分位数の配列(例: [0, 0.25, 0.5, 0.75, 1.0])を指定することもできます。
- パラメータ:
labels- 型: 配列または None。
- 説明: 各ビンにカスタムラベルを指定します。指定しない場合は、分位数の表現(例: "(0, 25]")が使用されます。
- パラメータ:
retbins- 型: ブール値。
- 説明: もし
TrueTrue の場合、戻り値にはビンの境界値が含まれます。デフォルトはFalse。
- パラメータ:
duplicates- 型: 文字列('raise' または 'drop')。
- 説明: ビンの境界が重複している場合(区間の数が指定された q 値より少なくなる)、
'raise'例外がスローされ、'drop'重複した境界が削除されます。デフォルトは'raise'。
関数の説明
- 戻り値: Categorical 型の Series を返します。各値は、その値が属する分位数のグループに対応します。
- 効果: 連続する数値を分位数に基づいて離散的なカテゴリにマッピングし、各カテゴリにはほぼ同じ数のサンプルが含まれます。
例
簡単なものから複雑なものまでの一連の例を通じて、pd.qcut()の使い方を徹底的にマスターしましょう。
例1:基本の使い方 - 四分位数によるビニング(quartile)
例
import pandas as pd
import numpy as np
# 1. 偏りのある数値データを作成(大部分の値は小さい)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100) # 指数分布のデータ
# 読みやすくするために、データの一部を取得
scores = pd.Series(data[:20])
print("=== 元のデータ ===")
print(scores.sort_values().values)
# 2. pd.qcut() を使用してデータを4つの分位数グループ(四分位)に分割
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) 四分位ビニング ===")
print(result.value_counts().sort_index())
import numpy as np
# 1. 偏りのある数値データを作成(大部分の値は小さい)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100) # 指数分布のデータ
# 読みやすくするために、データの一部を取得
scores = pd.Series(data[:20])
print("=== 元のデータ ===")
print(scores.sort_values().values)
# 2. pd.qcut() を使用してデータを4つの分位数グループ(四分位)に分割
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) 四分位ビニング ===")
print(result.value_counts().sort_index())
実行結果の想定:
=== 原始数据 === [ 0.078 0.29 0.68 0.91 1.03 1.06 1.23 1.3 1.5 1.69 1.86 2.01 2.12 2.3 2.32 2.42 3.03 3.39 5.29 7.39] === pd.qcut(scores, q=4) 四分位分箱 === (0.0783, 1.547] 5 (1.547, 2.315] 5 (2.315, 3.151] 5 (3.151, 7.393] 5 dtype: int64
コードの解説:
- 指数分布のデータでは、等幅ビニングを使用すると、ほとんどのデータが1つのビンに集中します。
pd.qcut()各ビンにほぼ同じ数のサンプルが含まれるようにします(ここでは5個、ちょうど20/4です)。- 分位点はデータの実際の分布に基づいて計算され、均等に分割されるわけではありません。
例2:カスタム分位数を指定
を使用して、qパラメータで任意の分位数を指定できます。例えば、十分位数、百分位数などです。
例
import pandas as pd
import numpy as np
# 1. データを作成
df = pd.DataFrame({
'name': ['Student_' + str(i) for i in range(1, 11)],
'score': [65, 78, 82, 55, 90, 72, 68, 85, 45, 95]
})
print("=== 学生の成績データ ===")
print(df)
# 2. カスタム分位数 [0, 0.3, 0.7, 1.0] でビニング。30%、70%、100% を表します
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== 30% と 70% の分位数によるビニング ===")
print(result)
# 3. カスタムラベルを追加
labels = ['合格', '良好', '優秀']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== カスタムラベルを追加 ===")
print(result_labeled)
import numpy as np
# 1. データを作成
df = pd.DataFrame({
'name': ['Student_' + str(i) for i in range(1, 11)],
'score': [65, 78, 82, 55, 90, 72, 68, 85, 45, 95]
})
print("=== 学生の成績データ ===")
print(df)
# 2. カスタム分位数 [0, 0.3, 0.7, 1.0] でビニング。30%、70%、100% を表します
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== 30% と 70% の分位数によるビニング ===")
print(result)
# 3. カスタムラベルを追加
labels = ['合格', '良好', '優秀']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== カスタムラベルを追加 ===")
print(result_labeled)
実行結果の想定:
=== 学生成绩数据 ===
name score
0 Student_1 65
1 Student_2 78
2 Student_3 82
3 Student_4 55
4 Student_5 90
5 Student_6 72
6 Student_7 68
7 Student_8 85
8 Student_9 45
9 Student_10 95
=== 按 30% 和 70% 分位数分箱 ===
0 (44.999, 65.8]
1 (65.8, 86.4]
2 (65.8, 86.4]
3 (44.999, 65.8]
4 (86.4, 95.0]
5 (65.8, 86. 86.4]
6 (0.0, 44.999]
7 (44.999, 65.8]
8 (0.0, 44.999]
9 (65.8, 86.4]
10 (65.8, 86.4]
コードの解説:
q=[0, 0.3, 0.7, 1.0]0-30%(低得点)、30%-70%(中程度)、70%-100%(高得点)の3つの区間を定義しました。- を使用すると
labelsパラメータで各ビンに名前を付けることができ、デフォルトの区間表記の代わりになります。
例3:cut と qcut の比較
対比することでより明確に理解できるのは、cutとqcutその違いです。
例
import pandas as pd
import numpy as np
# 1. 偏りのあるデータを作成(大部分の値は小さい)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])
print("=== 元のデータ ===")
print(data.values)
# 2. 等幅ビニング (pd.cut)
print("\n=== pd.cut 等幅ビニング ===")
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())
# 3. 等量ビニング (pd.qcut)
print("\n=== pd.qcut 等量ビニング ===")
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())
import numpy as np
# 1. 偏りのあるデータを作成(大部分の値は小さい)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])
print("=== 元のデータ ===")
print(data.values)
# 2. 等幅ビニング (pd.cut)
print("\n=== pd.cut 等幅ビニング ===")
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())
# 3. 等量ビニング (pd.qcut)
print("\n=== pd.qcut 等量ビニング ===")
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())
実行結果の想定:
=== 原始数据 === [ 1 1 1 1 1 1 1 1 1 10 20 30 40 50] === pd.cut 等宽分箱 === (0.975, 13.25] 10 # 10 个值在这个区间 (13.25, 25.5] 1 (25.5, 37.75] 1 (37.75, 50.0] 2 # 2 个值在这个区间 dtype: 50 === pd.qcut 等量分箱 === (0.999, 7.75] 4 # 约 1/4 的数据 (7.75, 25.0] 4 (25.0, 42.5] 4 (10.0, 50.0] 4 # 约 1/4 的数据
コードの解説:
pd.cut()データ範囲を4等分しますが、データが非常に偏っているため、ほとんどの値(9つの1)が最初の区間に含まれます。pd.qcut()各区间に同じ数のデータポイント(4つ)が含まれるようにします。たとえ区間の幅が大きく異なっていても。
その他の拡張ヒント:
pd.cut()データ分布が均一な場合や、固定幅の区間が必要な場合に適しています。pd.qcut()データ分布が不均一な場合や、ランキング/パーセンテージで分割する必要がある場合に適しています。
Pandas よく使う関数