pandas.qcutとpandas.cutの違いは何ですか?


94

ドキュメントは言う:

http://pandas.pydata.org/pandas-docs/dev/basics.html

"連続値は、カット(値に基づくビン)およびqcut(サンプル変位値に基づくビン)関数を使用して離散化できます。"

私には非常に抽象的に聞こえます...以下の例で違いを見ることができますが、qcut(サンプル変位値)は実際に何をする/意味するのですか?qcutとcutのどちらを使用しますか?

ありがとう。

factors = np.random.randn(30)

In [11]:
pd.cut(factors, 5)
Out[11]:
[(-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (0.575, 1.561], ..., (-0.411, 0.575], (-1.397, -0.411], (0.575, 1.561], (-2.388, -1.397], (-0.411, 0.575]]
Length: 30
Categories (5, object): [(-2.388, -1.397] < (-1.397, -0.411] < (-0.411, 0.575] < (0.575, 1.561] < (1.561, 2.547]]

In [14]:
pd.qcut(factors, 5)
Out[14]:
[(-0.348, 0.0899], (-0.348, 0.0899], (0.0899, 1.19], (0.0899, 1.19], (0.0899, 1.19], ..., (0.0899, 1.19], (-1.137, -0.348], (1.19, 2.547], [-2.383, -1.137], (-0.348, 0.0899]]
Length: 30
Categories (5, object): [[-2.383, -1.137] < (-1.137, -0.348] < (-0.348, 0.0899] < (0.0899, 1.19] < (1.19, 2.547]]`

回答:


213

まず、分位数は百分位数、四分位数、中央値などの最も一般的な用語にすぎないことに注意してください。例では5つのビンを指定したのでqcut、五分位数を求めています。

したがって、で五分位数を要求するとqcut、各ビンに同じ数のレコードが含まれるようにビンが選択されます。レコードは30個あるので、各ビンに6個あるはずです(ランダムな描画のためにブレークポイントは異なりますが、出力は次のようになります)。

pd.qcut(factors, 5).value_counts()

[-2.578, -0.829]    6
(-0.829, -0.36]     6
(-0.36, 0.366]      6
(0.366, 0.868]      6
(0.868, 2.617]      6

逆に、cutあなたはより不均一なものを見るでしょう:

pd.cut(factors, 5).value_counts()

(-2.583, -1.539]    5
(-1.539, -0.5]      5
(-0.5, 0.539]       9
(0.539, 1.578]      9
(1.578, 2.617]      2

これcutは、ビンが値の頻度ではなく値自体に従って等間隔に配置されるように選択するためです。したがって、ランダムな法線から描画したため、内側のビンの周波数が高くなり、外側のビンの周波数が少なくなります。これは、基本的にヒストグラムの表形式になります(これは、30のレコードでかなりベル型になると予想されます)。


それが何であるかについての素晴らしい答え。なぜどちらを選ぶのか、話してもらえますか?
James Hulse、2018

4
@JamesHulseそれは公正な質問ですが、一般的な答えはありません。それは、絶対メジャーと相対(分位)メジャーのどちらを探しているかによって異なります。たとえば、高さを検討します。相対的な高さ(6フィート以上)に興味を持って使用するcutか、最も高い5%にもっと注意して使用しますqcut
JohnE

15
  • cutコマンドは等間隔のビンを作成しますが、サンプルの頻度は各ビンで等しくありません
  • qcutコマンドはサイズの異なるビンを作成しますが、サンプルの頻度は各ビンで等しくなります。

ここに画像の説明を入力してください

    >>> x=np.array([24,  7,  2, 25, 22, 29])
    >>> x
    array([24,  7,  2, 25, 22, 29])

    >>> pd.cut(x,3).value_counts() #Bins size has equal interval of 9
    (2, 11.0]        2
    (11.0, 20.0]     0
    (20.0, 29.0]     4

    >>> pd.qcut(x,3).value_counts() #Equal frequecy of 2 in each bins
    (1.999, 17.0]     2
    (17.0, 24.333]    2
    (24.333, 29.0]    2

1
x、bins = pd.cut(list_of_values、bins = 10、labels = list(range(10,0、-1))、retbins = True)これは、ビンを取得するのに役立ちます
Dev_Man

9

したがって、qcutは、サンプル空間にクラスター化されている場合でも、各ビンの値の分布をより均一にします。これは、非常に近い値を持つデータでいっぱいのビンと、値が0の別のビンを持つ可能性が低くなることを意味します。一般に、サンプリングの方が優れています。


-1

Pd.qcutは、((配列内の要素の数)/(ビンの数-1))に基づいて除算を行う際に配列の要素を分散し、それからこれだけ除算します。各ビンの要素のシリアル。

Pd.cutは、((最初+最後の要素)/(ビンの数-1))に基づいて除算を行うときに配列の要素を分散し、要素が含まれる値の範囲に従って要素を分散します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.