Qual'è la differenza tra pandas.qcut e pandas.cut?


94

La documentazione dice:

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

"I valori continui possono essere discretizzati utilizzando le funzioni cut (bin basati sui valori) e qcut (bin basati sui quantili campione)"

Mi sembra molto astratto ... posso vedere le differenze nell'esempio qui sotto, ma cosa significa / significa effettivamente qcut (sample quantile)? Quando useresti qcut rispetto a cut?

Grazie.

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

Risposte:


213

Per iniziare, nota che quantili è solo il termine più generico per cose come percentili, quartili e mediane. Hai specificato cinque contenitori nel tuo esempio, quindi stai chiedendo qcutquintili.

Quindi, quando chiedi quintili con qcut, i contenitori verranno scelti in modo da avere lo stesso numero di record in ogni contenitore. Hai 30 record, quindi dovresti averne 6 in ogni bin (il tuo output dovrebbe assomigliare a questo, anche se i breakpoint saranno diversi a causa dell'estrazione casuale):

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

Al contrario, perché cutvedrai qualcosa di più irregolare:

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

Questo perché cutsceglierà i contenitori in modo che siano equidistanti in base ai valori stessi e non alla frequenza di tali valori. Quindi, poiché hai disegnato da una normale casuale, vedrai frequenze più alte nei contenitori interni e meno in quelli esterni. Questa sarà essenzialmente una forma tabulare di un istogramma (che ti aspetteresti fosse abbastanza a forma di campana con 30 record).


Ottima risposta per quello che è. Potresti spiegare perché sceglieresti uno piuttosto che l'altro?
James Hulse

4
@JamesHulse è una domanda giusta ma non ho una risposta generale. dipende solo dal fatto che tu stia cercando una misura assoluta rispetto a una misura relativa (quantile) più di ogni altra cosa. Considera l'altezza, ad esempio: potresti essere interessato all'altezza relativa (oltre 6 piedi di altezza) e utilizzare cuto potresti interessarti di più al 5% più alto e utilizzareqcut
JohnE

15
  • crea il comando di taglio contenitori equispaziati ma la frequenza dei campioni non è uguale in ogni contenitore
  • Il comando qcut crea contenitori di dimensioni diverse ma la frequenza dei campioni è uguale in ogni contenitore.

inserisci qui la descrizione dell'immagine

    >>> 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) Questo è utile per ottenere bins
Dev_Man

9

Quindi qcut garantisce una distribuzione più uniforme dei valori in ogni bin anche se si raggruppano nello spazio campione. Ciò significa che è meno probabile che tu abbia un contenitore pieno di dati con valori molto vicini e un altro contenitore con valori 0. In generale, è migliore il campionamento.


-1

Pd.qcut distribuisce gli elementi di un array effettuando la divisione sulla base di ((no. Of elements in array) / (no. Of bins - 1)), quindi dividi questo numero. di elementi in serie in ogni contenitore.

Pd.cut distribuisce gli elementi di un array eseguendo la divisione sulla base di ((primo + ultimo elemento) / (n. Di bin-1)) e quindi distribuisce l'elemento secondo l'intervallo di valori in cui rientrano.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.