У чому різниця між pandas.qcut та pandas.cut?


94

Документація говорить:

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

"Неперервні значення можна дискретизувати за допомогою функцій cut (bins на основі значень) та qcut (bins на основі зразків квантилів)"

Для мене це звучить дуже абстрактно ... Я бачу відмінності у наведеному нижче прикладі, але що насправді означає / означає 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

Для початку зауважте, що квантилі - це лише найзагальніший термін для таких речей, як процентиль, квартиль та медіана. Ви вказали у своєму прикладі п’ять смітників, тож просите 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

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)), а потім розподіляє елемент відповідно до діапазону значень, в який вони потрапляють.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.