Quelle est la différence entre pandas.qcut et pandas.cut?

94

La documentation dit:

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

"Les valeurs continues peuvent être discrétisées à l'aide des fonctions cut (bacs basés sur des valeurs) et qcut (bacs basés sur des quantiles d'échantillons)"

Cela me semble très abstrait ... Je peux voir les différences dans l'exemple ci-dessous, mais que signifie / signifie réellement qcut (quantile d'échantillons)? Quand utiliseriez-vous qcut plutôt que couper?

Merci.

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
la source

Réponses:

213

Pour commencer, notez que les quantiles n'est que le terme le plus général pour des éléments tels que les percentiles, les quartiles et les médianes. Vous avez spécifié cinq catégories dans votre exemple, vous demandez donc qcutdes quintiles.

Ainsi, lorsque vous demandez des quintiles avec qcut, les bacs seront choisis de sorte que vous ayez le même nombre d'enregistrements dans chaque bac. Vous avez 30 enregistrements, donc vous devriez en avoir 6 dans chaque bac (votre sortie devrait ressembler à ceci, bien que les points d'arrêt différeront en raison du tirage au sort):

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

À l'inverse, cutvous verrez quelque chose de plus inégal:

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

C'est parce que cutva choisir les bacs à espacer uniformément en fonction des valeurs elles-mêmes et non de la fréquence de ces valeurs. Par conséquent, parce que vous vous êtes inspiré d'une normale aléatoire, vous verrez des fréquences plus élevées dans les bacs intérieurs et moins dans l'extérieur. Il s'agira essentiellement d'une forme tabulaire d'histogramme (que vous vous attendriez à être assez en forme de cloche avec 30 enregistrements).

JohnE
la source
Excellente réponse pour ce que c'est. Pourriez-vous expliquer pourquoi vous choisiriez l'un plutôt que l'autre?
James Hulse
4
@JamesHulse c'est une bonne question mais je n'ai pas de réponse générale. cela dépend simplement de savoir si vous recherchez une mesure absolue par rapport à une mesure relative (quantile) plus que toute autre chose. Considérez la hauteur, par exemple: vous pourriez être intéressé par la hauteur relative (plus de 6 pieds de haut) et utiliser cutou vous pourriez vous soucier davantage des 5% les plus hauts et utiliserqcut
JohnE
15
  • La commande cut crée des bacs équidistants mais la fréquence des échantillons est inégale dans chaque bac
  • La commande qcut crée des bacs de taille inégale mais la fréquence des échantillons est égale dans chaque bac.

entrez la description de l'image ici

    >>> 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
la source
1
x, bins = pd.cut (list_of_values, bins = 10, labels = list (range (10,0, -1)), retbins = True) Ceci est utile pour obtenir des bins
Dev_Man
9

Ainsi, qcut garantit une distribution plus uniforme des valeurs dans chaque bac, même si elles se regroupent dans l'espace échantillon. Cela signifie que vous êtes moins susceptible d'avoir un bac plein de données avec des valeurs très proches et un autre bac avec des valeurs 0. En général, c'est un meilleur échantillonnage.

Mir H.
la source
-1

Pd.qcut distribue les éléments d'un tableau lors de la division sur la base de ((nombre d'éléments dans le tableau) / (nombre de bins - 1)), puis divise ce nombre. d'éléments en série dans chaque bac.

Pd.cut distribue les éléments d'un tableau lors de la division sur la base de ((premier + dernier élément) / (nombre de bins-1)) puis distribue l'élément en fonction de la plage de valeurs dans laquelle ils se situent.

Aditya Anand
la source