パンダの cut() と qcut() 関数

Zeeshan Afridi 2023年6月21日
  1. パンダ cut() 関数
  2. パンダ qcut() 関数
  3. cut()qcut() 関数の違い
  4. まとめ
パンダの cut() と qcut() 関数

継続的な数値データをさまざまなバケットにバインドして追加の分析を行うと、そのようなデータを処理するときに役立つことがよくあります。 ビニングは、バケット化、離散ビニング、離散化、または量子化とも呼ばれます。

パンダ cut() 関数

配列要素は、Pandas cut() 関数を使用してさまざまなビンに分割されます。 cut 関数は、主にスカラー データの統計分析に使用されます。

構文:

cut(
    x,
    bins,
    right=True,
    labels=None,
    retbins=False,
    precision=3,
    include_lowest=False,
    duplicates="raise",
)

パンダ qcut() 関数

Pandas の説明によると、qcut()は分位数ベースの離散化関数です。 qcutは、基になるデータから同じサイズのビンを作成しようとすることを意味します。 ビンの実際の数値エッジを使用する代わりに、関数はデータの分布方法に応じてパーセンタイルを使用してそれらを決定します。

構文:

pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates="raise")

cut()qcut() 関数の違い

つまり、cut()qcut() の重要な違いです。 qcut() を使用してビン内のアイテムが均等に分散されるようにし、cut() を使用して独自のカスタマイズされた数値ビン範囲を作成します。

以下の例でこの違いを学びます。

コード例:

# import libraries
import numpy as np
import pandas as pd

# create a data frame
df = pd.DataFrame(
    {
        "column_x": np.random.randint(1, 50, size=50),
        "column_y": np.random.randint(20, 100, size=50),
        "column_z": np.random.random(size=50).round(2),
    }
)
df.head()

出力:

      column_x  column_y  column_z
0         6        68      0.70
1        30        83      0.50
2        35        64      0.41
3        28        98      0.73
4         5        24      0.79

最初の 2 列には、それぞれ 1 から 50 および 20 から 100 の範囲の数字があります。 3 番目の列の浮動小数点数は 0 から 1 までの範囲であり、numpy ルーチンを使用してこれらの値をランダムに生成しました。

ここで、cut() 関数が値の範囲全体を小さなビンに分配し、各ビンがカバーする範囲が同じになることがわかっています。 その結果、1 から 50 までの異なる整数を最初の列 (column x) に割り当てます。 まず、この列の最低値と最高値を確認しましょう。

コード例:

df.column_x.max(), df.column_x.min()

出力:

(49, 3)

たとえば、この列を 5 等分すると、各ビンのサイズは次のように 9.2 になります。

$$
(49 - 3) / 5 = 9.2
$$

このビニング プロセスは、各値を適切なビンに配置する cut() 関数によって実行されます。

コード例:

df["column_x_binned"] = pd.cut(df.column_x, bins=5)
df.column_x_binned.value_counts()

出力:

(21.4, 30.6]     16
(39.8, 49.0]     14
(12.2, 21.4]      8
(30.6, 39.8]      6
(2.954, 12.2]     6

ご覧のとおり、最も小さいものを除いて、すべてのビンのサイズは正確に 9.2 インチです。 下限には何も含まれません。

これを含めるには、最小ビンの下限が最小値 3 よりも若干小さくなければなりません。

ビンの境界を手動で指定することにより、ビンの外観を変更できます。 bins 引数は、エッジ値をリストとして受け取ります。

コード例:

pd.cut(df.column_x, bins=[0, 10, 40, 50]).value_counts()

出力:

(10, 40]    33
(40, 50]    13
(0, 10]      4

デフォルトでは、右端が含まれます。 ただし、これは変更できます。

コード例:

pd.cut(df.column_x, bins=[0, 10, 40, 50], right=False).value_counts()

出力:

[10, 40)    33
[40, 50)    13
[0, 10)      4

cut() 関数の使用中に各ビンに分類される値は、完全に制御できません。 ビンのエッジの定義に制限されています。

この時点で、qcut() 関数に慣れる必要があります。 ほぼ同じ値が各バケットに含まれるように、値をバケットに分割できます。

コード例:

pd.qcut(df.column_x, q=4).value_counts()

出力:

(40.75, 49.0]    13
(19.5, 25.0]     13
(2.999, 19.5]    13
(25.0, 40.75]    11

4 個のバケットのそれぞれは、ほぼ同じ値を保持しています。 バケットが 4つある場合、バケットは四分位数として知られることがあります。

最初の四分位数には値全体の 4 分の 1 が含まれ、最初の 2つのバケットには 50% が含まれます。

qcut() 関数でビンのエッジを制御しません。 それらは自動的に計算されます。

40 個の値 (40 行) を含む列を考えてみましょう。4 個のバケットが必要です。 最初のバケットの上限範囲は、最小値から始まる 10 個の値が含まれるように選択されます。

まとめ

cut() または qcut() 関数を使用して、一連の連続値を離散変数またはカテゴリ変数に変換できます。

cut() 関数は、ビンの値の範囲に関係します。 最小数と最大数の差を使用して、範囲全体を確立します。

次に、範囲全体が目的の数のビンに分割されます。 デフォルトでは、各ビンはほぼ同じサイズで、唯一の変数は下部ビンと上部ビンのエッジ間の距離です。

各ビンの値の量は、qcut() 関数の主な焦点です。 値は、値の降順に並べられます。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Pandas Function