Apa perbedaan antara pandas.qcut dan pandas.cut?

93

Dokumentasinya mengatakan:

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

"Nilai kontinu dapat dipisahkan menggunakan fungsi cut (nampan berdasarkan nilai) dan qcut (nampan berdasarkan jumlah sampel)"

Kedengarannya sangat abstrak bagi saya ... Saya dapat melihat perbedaannya pada contoh di bawah ini, tetapi apa sebenarnya arti / arti qcut (sample quantile)? Kapan Anda akan menggunakan qcut versus cut?

Terima kasih.

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]]`
WillZ
sumber

Jawaban:

215

Untuk memulai, perhatikan bahwa kuantil hanyalah istilah paling umum untuk hal-hal seperti persentil, kuartil, dan median. Anda menentukan lima tempat sampah dalam contoh Anda, jadi Anda bertanyaqcut kuintil.

Jadi, saat Anda meminta kuintil dengan qcut, nampan akan dipilih sehingga Anda memiliki jumlah record yang sama di setiap nampan. Anda memiliki 30 record, jadi harus memiliki 6 record di setiap bin (keluaran Anda akan terlihat seperti ini, walaupun breakpoint akan berbeda karena penarikan acak):

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

Sebaliknya, karena cutAnda akan melihat sesuatu yang lebih tidak seimbang:

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

Itu karena cutakan memilih tempat sampah untuk diberi jarak yang sama sesuai dengan nilai itu sendiri dan bukan frekuensi nilai tersebut. Karenanya, karena Anda menggambar dari normal acak, Anda akan melihat frekuensi yang lebih tinggi di nampan dalam dan lebih sedikit di nampan luar. Ini pada dasarnya akan menjadi bentuk tabel dari histogram (yang Anda harapkan berbentuk lonceng dengan 30 rekaman).

JohnE
sumber
Jawaban bagus untuk apa itu. Bisakah Anda berbicara tentang mengapa Anda memilih salah satu dari yang lain?
James Hulse
4
@JamesHulse itu pertanyaan yang wajar tapi saya tidak punya jawaban umum. itu hanya tergantung pada apakah Anda mencari ukuran absolut vs ukuran relatif (kuantitatif) lebih dari apa pun. Pertimbangkan tinggi, misalnya: Anda mungkin tertarik dengan tinggi relatif (lebih dari 6 kaki tinggi) dan menggunakannya cutatau Anda mungkin lebih peduli tentang yang tertinggi 5% dan gunakanqcut
JohnE
15
  • Perintah cut menciptakan tempat sampah yang sama tetapi frekuensi sampel tidak sama di setiap tempat sampah
  • Perintah qcut membuat ukuran nampan yang tidak sama tetapi frekuensi sampel sama di setiap nampan.

masukkan deskripsi gambar di sini

    >>> 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
Ashish Anand
sumber
1
x, bins = pd.cut (list_of_values, bins = 10, labels = list (range (10,0, -1)), retbins = True) Ini berguna untuk mendapatkan bins
Dev_Man
9

Jadi qcut memastikan distribusi nilai yang lebih merata di setiap bin bahkan jika mereka mengelompok di ruang sampel. Ini berarti Anda cenderung tidak memiliki satu bin penuh data dengan nilai yang sangat dekat dan bin lain dengan nilai 0. Secara umum, ini pengambilan sampel yang lebih baik.

Mir H.
sumber
-1

Pd.qcut mendistribusikan elemen-elemen dari sebuah array untuk membuat pembagian berdasarkan ((jumlah elemen dalam array) / (jumlah bin - 1)), kemudian bagi sebanyak ini tidak. elemen secara berurutan di setiap nampan.

Pd.cut mendistribusikan elemen dari sebuah array untuk membuat pembagian berdasarkan ((elemen pertama + terakhir) / (no. Of bins-1)) dan kemudian mendistribusikan elemen sesuai dengan rentang nilai di mana mereka berada.

Aditya Anand
sumber