Jaka jest różnica między pandas.qcut i pandas.cut?

96

Dokumentacja mówi:

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

„Wartości ciągłe można dyskretyzować za pomocą funkcji cut (pojemniki oparte na wartościach) i qcut (pojemniki oparte na kwantylach próbek)”

Brzmi dla mnie bardzo abstrakcyjnie ... Widzę różnice w poniższym przykładzie, ale co właściwie robi / oznacza qcut (kwantyl próbki)? Kiedy użyłbyś qcut zamiast cut?

Dzięki.

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
źródło

Odpowiedzi:

222

Na początek zwróć uwagę, że kwantyle to najbardziej ogólne określenie na takie elementy, jak percentyle, kwartyle i mediany. W swoim przykładzie określiłeś pięć pojemników, więc prosisz qcuto kwintyle.

Tak więc, gdy poprosisz o kwintyle z qcut, pojemniki zostaną wybrane tak, aby mieć taką samą liczbę rekordów w każdym pojemniku. Masz 30 rekordów, więc powinieneś mieć 6 w każdym koszu (twoje wyjście powinno wyglądać tak, chociaż punkty przerwania będą się różnić ze względu na losowanie):

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

I odwrotnie, bo cutzobaczysz coś bardziej nierównego:

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

Dzieje się tak, ponieważ cutwybierze pojemniki, które mają być równomiernie rozmieszczone zgodnie z samymi wartościami, a nie częstotliwością tych wartości. W związku z tym, ponieważ narysowałeś z losowej normy normalnej, zobaczysz wyższe częstotliwości w pojemnikach wewnętrznych, a mniej w zewnętrznych. Zasadniczo będzie to tabelaryczna forma histogramu (który, jak można się spodziewać, będzie miał kształt dzwonu z 30 rekordami).

JohnE
źródło
Świetna odpowiedź na to , co to jest. Czy mógłbyś porozmawiać, dlaczego wybrałbyś jedną z nich?
James Hulse
5
@JamesHulse to uczciwe pytanie, ale nie mam ogólnej odpowiedzi. zależy to tylko od tego, czy szukasz miary bezwzględnej czy względnej (kwantylowej) bardziej niż czegokolwiek innego. Weź pod uwagę wzrost, na przykład: możesz być zainteresowany wzrostem względnym (ponad 6 stóp wzrostu) i użyć cutlub możesz bardziej przejmować się najwyższym 5% i użyćqcut
JohnE
17
  • Polecenie cut tworzy równo rozmieszczone pojemniki, ale częstotliwość próbek jest nierówna w każdym pojemniku
  • Polecenie qcut tworzy kosze o różnej wielkości, ale częstotliwość próbek jest równa w każdym koszu.

wprowadź opis obrazu tutaj

    >>> 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
źródło
1
x, bins = pd.cut (list_of_values, bins = 10, labels = list (range (10,0, -1)), retbins = True) Jest to pomocne przy uzyskiwaniu pojemników
Dev_Man
9

Zatem qcut zapewnia bardziej równomierny rozkład wartości w każdym przedziale, nawet jeśli skupiają się w przestrzeni próbki. Oznacza to, że mniej prawdopodobne jest, że będziesz mieć pojemnik pełen danych z bardzo bliskimi wartościami i inny pojemnik z zerowymi wartościami. Ogólnie rzecz biorąc, jest to lepsze samplowanie.

Mir H.
źródło
-1

Pd.qcut rozdziela elementy tablicy wykonując dzielenie na podstawie ((ilość elementów w tablicy) / (ilość koszy - 1)), a następnie dzieli tyle nie. elementów seryjnie w każdym koszu.

Pd.cut rozdziela elementy tablicy po dokonaniu podziału na podstawie ((pierwszy + ostatni element) / (liczba bins-1)), a następnie rozdziela elementy według zakresu wartości, w jakim się one mieszczą.

Aditya Anand
źródło