Was ist der Unterschied zwischen pandas.qcut und pandas.cut?

94

Die Dokumentation sagt:

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

"Kontinuierliche Werte können mithilfe der Funktionen cut (Bins basierend auf Werten) und qcut (Bins basierend auf Stichprobenquantilen) diskretisiert werden."

Klingt für mich sehr abstrakt ... Ich kann die Unterschiede im folgenden Beispiel sehen, aber was bedeutet qcut (Beispielquantil) tatsächlich? Wann würden Sie qcut versus cut verwenden?

Vielen Dank.

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
quelle

Antworten:

212

Beachten Sie zunächst, dass Quantile nur der allgemeinste Begriff für Dinge wie Perzentile, Quartile und Mediane sind. Sie haben in Ihrem Beispiel fünf Fächer angegeben, also fragen Sie qcutnach Quintilen.

Wenn Sie also nach Quintilen mit fragen qcut, werden die Fächer so ausgewählt, dass Sie in jedem Fach die gleiche Anzahl von Datensätzen haben. Sie haben 30 Datensätze, sollten also 6 in jedem Bin haben (Ihre Ausgabe sollte so aussehen, obwohl sich die Haltepunkte aufgrund der zufälligen Ziehung unterscheiden):

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

Umgekehrt cutsehen Sie etwas Unebeneres:

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

Dies liegt daran cut, dass die Bins so ausgewählt werden, dass sie gleichmäßig nach den Werten selbst und nicht nach der Häufigkeit dieser Werte verteilt sind. Da Sie aus einer zufälligen Normalen gezogen haben, sehen Sie höhere Frequenzen in den inneren Behältern und weniger in den äußeren. Dies wird im Wesentlichen eine tabellarische Form eines Histogramms sein (von dem Sie erwarten würden, dass es mit 30 Datensätzen ziemlich glockenförmig ist).

JohnE
quelle
Tolle Antwort für das, was es ist. Könnten Sie mit Ihnen sprechen, warum Sie einen über den anderen wählen würden?
James Hulse
4
@ JamesHulse das ist eine faire Frage, aber ich habe keine allgemeine Antwort. Es kommt nur darauf an, ob Sie mehr als alles andere nach einem absoluten Maß im Vergleich zu einem relativen (Quantil-) Maß suchen. Betrachten Sie zum Beispiel die Größe: Sie könnten an der relativen Größe (über 6 Fuß hoch) und der Verwendung interessiert sein, cutoder Sie interessieren sich mehr für die höchsten 5% und die Verwendungqcut
JohnE
15
  • Der Befehl cut erstellt gleich große Bins, aber die Häufigkeit der Abtastungen ist in jedem Bin ungleich
  • Der Befehl qcut erstellt Bins mit ungleicher Größe, aber die Häufigkeit der Stichproben ist in jedem Bin gleich.

Geben Sie hier die Bildbeschreibung ein

    >>> 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
quelle
1
x, bins = pd.cut (Liste der Werte, Bins = 10, Labels = Liste (Bereich (10,0, -1)), Retbins = True) Dies ist hilfreich, um Bins zu erhalten
Dev_Man
9

Qcut sorgt also für eine gleichmäßigere Verteilung der Werte in jedem Bin, selbst wenn sie sich im Probenraum gruppieren. Dies bedeutet, dass Sie weniger wahrscheinlich einen Behälter voller Daten mit sehr engen Werten und einen anderen Behälter mit 0 Werten haben. Im Allgemeinen ist es besser zu probieren.

Mir H.
quelle
-1

Pd.qcut verteilt Elemente eines Arrays beim Teilen auf der Basis von ((Anzahl der Elemente im Array) / (Anzahl der Bins - 1)) und teilt dann so viel Nr. von Elementen seriell in jedem Behälter.

Pd.cut verteilt Elemente eines Arrays bei der Division auf der Basis von ((erstes + letztes Element) / (Nr. Von Bins-1)) und verteilt dann das Element gemäß dem Wertebereich, in den sie fallen.

Aditya Anand
quelle