[python] pandas.qcut과 pandas.cut의 차이점은 무엇입니까?

문서는 다음과 같이 말합니다.

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

“컷 (값 기반 빈) 및 qcut (샘플 분위수 기반 빈) 함수를 사용하여 연속 값을 이산화 할 수 있습니다.”

나에게 매우 추상적으로 들린다 … 아래 예제에서 차이점을 볼 수 있지만 qcut (샘플 Quantile)은 실제로 무엇을 / 의미합니까? qcut과 cut을 언제 사용합니까?

감사.

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



답변

시작하려면 분위수는 백분위 수, 사 분위수 및 중앙값과 같은 항목에 대한 가장 일반적인 용어입니다. 예제에서 5 개의 빈을 지정 했으므로 qcut5 분위수를 요청 합니다.

따라서를 사용하여 5 분위수를 요청할 때 qcut각 빈에 동일한 수의 레코드를 가지도록 빈이 선택됩니다. 30 개의 레코드가 있으므로 각 빈에 6 개가 있어야합니다 (무작위 그리기로 인해 중단 점이 다르더라도 출력은 다음과 같이 표시되어야합니다).

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

반대로, cut더 고르지 않은 것을 보게 될 것입니다.

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

이는 cut값의 빈도 가 아닌 값 자체에 따라 균등 한 간격으로 배치 될 빈을 선택 하기 때문 입니다 . 따라서 무작위 법선에서 추출했기 때문에 내부 빈에서는 더 높은 주파수를, 외부에서는 더 적은 주파수를 볼 수 있습니다. 이것은 본질적으로 히스토그램의 표 형식이 될 것입니다 (30 개의 레코드로 상당히 종 모양이 될 것으로 예상됩니다).


답변

  • cut 명령은 등 간격 빈을 생성 하지만 샘플 빈도는 각 빈에서 동일하지 않습니다.
  • qcut 명령은 크기다른 빈을 생성 하지만 샘플의 빈도는 각 빈에서 동일합니다.

여기에 이미지 설명 입력

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


답변

따라서 qcut은 샘플 공간에 클러스터링 되더라도 각 빈의 값을보다 고르게 분포시킵니다. 이는 매우 가까운 값을 가진 데이터로 가득 찬 빈과 0 값을 가진 다른 빈을 가질 가능성이 적다는 것을 의미합니다. 일반적으로 더 나은 샘플링입니다.


답변

Pd.qcut은 ((배열의 요소 수) / (빈 수-1))을 기준으로 나눗셈을 할 때 배열의 요소를 배포 한 다음 이만큼 번호를 나눕니다. 각 빈에 직렬로 요소의.

Pd.cut은 ((first + last element) / (no. of bins-1))을 기준으로 나눗셈을 할 때 배열의 요소를 배포 한 다음 해당 값의 범위에 따라 요소를 배포합니다.


답변