Sự khác biệt giữa pandas.qcut và pandas.cut là gì?


94

Tài liệu cho biết:

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

"Các giá trị liên tục có thể được tùy ý sử dụng các chức năng cut (thùng dựa trên giá trị) và qcut (thùng dựa trên lượng tử mẫu)"

Nghe có vẻ rất trừu tượng đối với tôi ... Tôi có thể thấy sự khác biệt trong ví dụ bên dưới nhưng qcut (lượng tử mẫu) thực sự làm / có nghĩa là gì? Khi nào bạn sử dụng qcut so với cắt?

Cảm ơn.

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

Câu trả lời:


213

Để bắt đầu, hãy lưu ý rằng lượng tử chỉ là thuật ngữ chung nhất cho những thứ như phần trăm, phần tư và trung bình. Bạn đã chỉ định năm thùng trong ví dụ của mình, vì vậy bạn đang yêu cầu qcutnhóm ngũ phân vị.

Vì vậy, khi bạn yêu cầu nhóm ngũ phân vị qcut, các thùng sẽ được chọn để bạn có cùng số bản ghi trong mỗi thùng. Bạn có 30 bản ghi, do đó, nên có 6 bản ghi trong mỗi thùng (đầu ra của bạn sẽ giống như thế này, mặc dù các điểm ngắt sẽ khác nhau do rút thăm ngẫu nhiên):

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

Ngược lại, cutbạn sẽ thấy một cái gì đó không đồng đều hơn:

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

Đó là bởi vì cutsẽ chọn các thùng cách đều nhau theo chính các giá trị chứ không phải tần số của các giá trị đó. Do đó, bởi vì bạn đã vẽ từ một bình thường ngẫu nhiên, bạn sẽ thấy tần số cao hơn ở các thùng bên trong và ít hơn ở bên ngoài. Về cơ bản, đây sẽ là một dạng bảng của biểu đồ (mà bạn mong đợi sẽ có hình dạng khá giống với 30 bản ghi).


Câu trả lời tuyệt vời cho những gì nó là. Bạn có thể nói lý do tại sao bạn chọn cái này hơn cái kia không?
James Hulse

4
@JamesHulse đó là một câu hỏi công bằng nhưng tôi không có câu trả lời chung. nó chỉ phụ thuộc vào việc bạn đang tìm kiếm một thước đo tuyệt đối so với một thước đo tương đối (lượng tử) hơn bất cứ thứ gì khác. Xem xét chiều cao, ví dụ: bạn có thể quan tâm chiều cao tương đối (hơn 6 ft cao) và sử dụng cuthoặc bạn có thể quan tâm nhiều hơn về người cao nhất 5% và sử dụngqcut
Johne

15
  • lệnh cắt tạo ra các thùng cách đều nhau nhưng tần số mẫu không bằng nhau trong mỗi thùng
  • Lệnh qcut tạo ra các thùng có kích thước không bằng nhau nhưng tần số mẫu trong mỗi thùngbằng nhau.

nhập mô tả hình ảnh ở đây

    >>> 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, label = list (range (10,0, -1)), retbins = True) Điều này rất hữu ích để có được thùng
Dev_Man

9

Vì vậy, qcut đảm bảo phân phối đều hơn các giá trị trong mỗi thùng ngay cả khi chúng tập hợp trong không gian mẫu. Điều này có nghĩa là bạn ít có khả năng có một thùng chứa đầy dữ liệu với các giá trị rất gần và một thùng khác có 0 giá trị. Nói chung, đó là lấy mẫu tốt hơn.


-1

Pd.qcut phân phối các phần tử của một mảng khi thực hiện phép chia trên cơ sở ((số phần tử trong mảng) / (số của thùng - 1)), sau đó chia số này nhiều không. của các phần tử nối tiếp nhau trong mỗi thùng.

Pd.cut phân phối các phần tử của một mảng khi thực hiện phép chia trên cơ sở ((phần tử đầu tiên + phần tử cuối cùng) / (số của thùng-1)) và sau đó phân phối phần tử theo phạm vi giá trị mà chúng rơi vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.