В чем разница между pandas.qcut и pandas.cut?


97

В документации говорится:

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

«Непрерывные значения могут быть дискретизированы с использованием функций cut (интервалы на основе значений) и 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]]`

Ответы:


223

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


Отличный ответ для того, что это такое. Не могли бы вы рассказать, почему вы предпочли бы одно другому?
Джеймс Халс

5
@JamesHulse, это справедливый вопрос, но у меня нет общего ответа. это просто зависит от того, ищете ли вы абсолютную меру или относительную (квантильную) меру больше, чем что-либо еще. Рассмотрим, например, рост: вас может интересовать относительный рост (более 6 футов) и использовать cutили вас могут больше заботить самые высокие 5% и использоватьqcut
JohnE

19
  • Команда 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.