パンダの 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 is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.
LinkedIn