¿Cuál es la diferencia entre pandas.qcut y pandas.cut?


94

La documentación dice:

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

"Los valores continuos se pueden discretizar utilizando las funciones cut (bins basados ​​en valores) y qcut (bins basados ​​en cuantiles de muestra)"

Suena muy abstracto para mí ... Puedo ver las diferencias en el siguiente ejemplo, pero ¿qué significa realmente qcut (cuantil de muestra)? ¿Cuándo usarías qcut versus cut?

Gracias.

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

Respuestas:


213

Para empezar, tenga en cuenta que cuantiles es el término más general para elementos como percentiles, cuartiles y medianas. Especificó cinco contenedores en su ejemplo, por lo que solicita qcutquintiles.

Entonces, cuando solicite quintiles con qcut, se elegirán los contenedores para que tenga el mismo número de registros en cada contenedor. Tiene 30 registros, por lo que debería tener 6 en cada contenedor (su salida debería verse así, aunque los puntos de interrupción diferirán debido al sorteo aleatorio):

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

Por el contrario, cutverá algo más desigual:

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

Eso es porque cutelegirá los contenedores para que estén espaciados uniformemente de acuerdo con los valores en sí mismos y no con la frecuencia de esos valores. Por lo tanto, debido a que extrajo de una normal aleatoria, verá frecuencias más altas en los contenedores internos y menos en los externos. Básicamente, será una forma tabular de un histograma (que esperaría que tenga una forma de campana con 30 registros).


Gran respuesta para lo que es. ¿Podría hablarnos de por qué elegiría uno sobre el otro?
James Hulse

4
@JamesHulse esa es una pregunta justa, pero no tengo una respuesta general. solo depende de si está buscando una medida absoluta frente a una medida relativa (cuantiles) más que cualquier otra cosa. Considere la altura, por ejemplo: es posible que le interese la altura relativa (más de 6 pies de altura) y el uso cuto puede que le interese más el 5% más alto y el usoqcut
JohnE

15
  • El comando de corte crea contenedores equiespaciados pero la frecuencia de las muestras es desigual en cada contenedor
  • El comando qcut crea contenedores de tamaño desigual pero la frecuencia de las muestras es igual en cada contenedor.

ingrese la descripción de la imagen aquí

    >>> 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) Esto es útil para obtener bins
Dev_Man

9

Por lo tanto, qcut asegura una distribución más uniforme de los valores en cada contenedor, incluso si se agrupan en el espacio muestral. Esto significa que es menos probable que tenga un contenedor lleno de datos con valores muy cercanos y otro contenedor con valores 0. En general, es mejor muestrear.


-1

Pd.qcut distribuye elementos de una matriz al hacer la división sobre la base de ((no. De elementos en la matriz) / (no. De bins - 1)), luego divide esta cantidad de no. de elementos en serie en cada bins.

Pd.cut distribuye elementos de una matriz al hacer la división sobre la base de ((primer + último elemento) / (no. De bins-1)) y luego distribuye el elemento de acuerdo con el rango de valores en el que se encuentran.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.