パンダの 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