1. ホーム
  2. python

[解決済み] pandas.qcutとpandas.cutの違いは何ですか?

2022-10-05 02:59:51

質問

ドキュメントにはこう書かれています。

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

cut (値に基づくビン) および qcut (サンプル分位数に基づくビン) 関数を使用して連続値を離散化することができます。

とても抽象的に聞こえますが...。下の例のような違いはわかるのですが qcut (sample quantile)は実際に何をするのか、何を意味するのか?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]]`

どのように解決するのですか?

まず始めに、分位数とは、パーセンタイル、四分位数、中央値のようなものの最も一般的な用語であることに注意してください。 あなたの例では 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 個のレコードでかなりベル型になることが予想されます)。