본문 바로가기
Python/Pandas

이산화를 위한(구간별 나누기) qcut, cut 함수-pandas(40)

by 콩돌 2020. 10. 17.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준

 

 이산화를 위한 qcut, cut 함수

 

본 포스팅에서는 이산화 작업 수행하기 위해 존재하는 qcut(), cut() 함수에 대해 다룬다.

본 메서드에서 사용 하는 구간인덱스에 대한 설명은 여기(링크)를 참고한다.

 

 

 이산화(Discretization)와 분위수(Quantiling)

 

연속적인 값들에 대해서는 cut() 및 qcut() 함수를 통해 이산화될 수 있다.

  ○ cut은 값들을 기반으로 이산화를 수행한다.

    ▷ 즉, 사용자가 이산화를 할 수치를 직접 입력한다

  ○ qcut은 샘플의 변위치를 기반으로 이산화를 수행한다.

    ▷ 특정 분위수를 계산하여 이를 기반으로 이산화를 수행한다. 

 

아래는 함수의 사용 형식을 보여준다.

앞선 예제들과는 다르게 qcut()과 cut()은 함수형태로 사용된다.

 

함수 사용 형식)

result=pandas.cut(x, bins)

result=pandas.qcut(x, q)

 

각 입력 객체별 설명은 다음과 같다.

  ○ x: 이산화를 수행할 배열을 입력받는다.

    ▷ 1차원 배열만을 입력받는다.

  ○ bins: int, scalar의 시퀀스(배열), IntervalIndex를 입력받는다.

    ▷ int: x의 범위에서 동일한 두께로 나눌 숫자를 입력받는다.

    ▷ scalar의 시퀀스(배열): 동일하지 않은 두께를 입력하기 위해 각 두꼐의 배열로 입력받는다. x범위 확장은 되지 않는다.

    ▷ IntervalIndex: 사용되는 범위를 정확히 정의할 때 사용된다. 각 구간은 겹치지 않아야 한다.

  ○ q: int 혹은 float의 list-like자료형을 입력받는다.

    ▷ 분위수의 숫자를 입력받는다.

    ▷ int가 입력될 경우, 10분위수라면 10이, 4분위수라면 4를 입력받는다.

    ▷ float 배열을 입력받아 사용자 설정의 분위수를 입력할 수도 있다. (예: [0, 0.25, 0.5, 0.75, 1.0])

 

 

 함수 사용 예

본 포스팅에서 예제를 수행하기 위해 다음과 같이 세팅을 수행한다.

 

모듈의 임폴트 및 예제 배열 정의)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

 

# 예제용 array의 정의

In[4]: sample_array = np.random.randint(0,10, size=25)

In[5]: sample_array

Out[5]: 

array([0, 4, 4, 2, 9, 8, 7, 8, 9, 2, 6, 4, 0, 0, 8, 2, 4, 0, 1, 2, 7, 2, 4, 8, 2])

 

 

아래 예제는 cut() 함수의 사용 예제를 보여준다.

  ○ value_counts 함수를 사용하면 각 범위에 존재하는 요소의 수를 파악할 수 있다.

 

cut() 함수의 사용 예제)

# ex1: cut() 함수의 사용 예제

In[6]: cut_data= pd.cut(sample_array, 5)


In[7]: cut_data

Out[7]: 

[(-0.009, 1.8], (3.6, 5.4], (3.6, 5.4], (1.8, 3.6], (7.2, 9.0], ..., (5.4, 7.2], (1.8, 3.6], (3.6, 5.4], (7.2, 9.0], (1.8, 3.6]]

Length: 25

Categories (5, interval[float64]): [(-0.009, 1.8] < (1.8, 3.6] < (3.6, 5.4] < (5.4, 7.2] < (7.2, 9.0]]


In[8]: cut_data.value_counts()

Out[8]: 

(-0.009, 1.8]    5

(1.8, 3.6]       6

(3.6, 5.4]       5

(5.4, 7.2]       3

(7.2, 9.0]       6

dtype: int64

 

 

위에 설명한 바와 같이 qcut은 표본의 변위치를 계산한다. 

  ○ 예를들어, 사용자는 동일한 사이즈의 변위치로 정규적으로 분산된 데이터를 자를 수 있다.

  ○ value_counts 함수를 사용하면 각 범위에 존재하는 요소의 수를 파악할 수 있다.

 

qcut() 함수의 사용 예제)

# ex2: qcut() 함수의 사용 예제

In[9]: qcut_data= pd.qcut(sample_array,[0, 0.20, 0.4, 0.6, 0.8, 1])


In[10]: qcut_data

Out[10]: 

[(-0.001, 1.8], (2.0, 4.0], (2.0, 4.0], (1.8, 2.0], (8.0, 9.0], ..., (4.0, 8.0], (1.8, 2.0], (2.0, 4.0], (4.0, 8.0], (1.8, 2.0]]

Length: 25

Categories (5, interval[float64]): [(-0.001, 1.8] < (1.8, 2.0] < (2.0, 4.0] < (4.0, 8.0] < (8.0, 9.0]]


In[11]: qcut_data.value_counts()

Out[11]: 

(-0.001, 1.8]    5

(1.8, 2.0]       6

(2.0, 4.0]       5

(4.0, 8.0]       7

(8.0, 9.0]       2

dtype: int64

 

 

사용자는 bin을 정의하기 위해 무한값을 입력할 수 있다.

 

무한대 범위의 사용 예제)

# ex3: 무한대 범위의 사용 예제

In[12]: cut_data= pd.cut(sample_array,[0, 2, np.inf])


In[13]: cut_data

Out[13]: 

[NaN, (2.0, inf], (2.0, inf], (0.0, 2.0], (2.0, inf], ..., (2.0, inf], (0.0, 2.0], (2.0, inf], (2.0, inf], (0.0, 2.0]]

Length: 25

Categories (2, interval[float64]): [(0.0, 2.0] < (2.0, inf]]

 

 

 함수 세부사항

 

 

 pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)

이산화된 구간을 나누고 값들을 이산화된 구간에 넣는다.

이 함수는 데이터를 분할하고 구간으로 정리하는데 사용된다.

또한 연속적인 값들을 카테고리 변수로 바꿀때도 유용하다.

  ○ 예를들어 연령별 그룹을 만들때 사용되면 유용하다.

입력되는 값들을 동일한 숫자의 구간 혹은 미리 배열로 작성된 구간으로 넣는것도 가능하다.

 

x: array-like

함수를 적용할 배열을 입력받는다.

반드시 1차원 이어야 한다.

 

bins: int, sequence of scalars, or IntervalIndex

구간을 나눌 기준을 입력받는다.

  ○ int: 구간을 나눌 숫자를 입력받는다. 

    ▷ 이 경우 x의 범위에서 동일한 두께의 구간을 형성한다. 

    ▷ x의 범위 양끝에서 0.1%정도 더 연장시킨후 구간을 나눈다.

  ○ sequence of scalars: 나눌 구간의 좌표값에 대해 시퀀스(리스트 등)로 입력받는다.

    ▷ 균일하지 않은 두께를 가지는 구간을 정의할때 사용한다.

    ▷ int와는 다르게 x범위 양끝에서 연장을 수행하지 않는다.

  ○ IntervalIndex: IntervalIndex형태의 자료형을 입력받는다.

    ▷ 정확한 구간을 정의할때 사용한다.

    ▷ 반드시 각 구간은 겹치지 않아야 한다.

 

right: bool 

기본값은 True이다.

각 구간의 오른쪽끝을 포함시킬지 안시킬지 여부를 결정한다.

만약 True(기본값)라면 bins=[1,2,3,4]로 설정되있다면 구간은 (1,2], (2,3], (3,4]으로 나뉜다.

이 변수는 bins에 IntervalIndex형 자료형이 입력되어 있다면 무시된다.

 

labels: array or False

기본값은 None이다.

반환된 구간들에 대해 레이블을 명시한다.

결과로 반환된 구간들과 레이블은 길이가 동일해야한다.

False인 경우, 정수 레이블이 반환된다.

이것은 출력 컨테이너의 타입에 영향을 미친다.

이 변수는 bins에 IntervalIndex형 자료형이 입력되어 있다면 무시된다.

  ○ True라면 에러를 발생시킨다.

ordered=False라면 반드시 레이블이 입력되어야 한다.

 

retbins: bool

기본값은 False이다.

구간들을 반환할것인지 아니면 말것인지 결정하는 변수이다.

이 변수는 구간이 scalar로 정의되어 있을때 유용하다.


precision: int

기본값은 3이다.

정밀도를 설정한다. 

만약 3이 입력되면 3자리수까지 계산한다.

 

include_lowest: bool, default False

기본값은 False이다.

첫번째 구간에 대해 왼쪽을 포함할지 말지 결정한다.


duplicates: {‘raise’, ‘drop’}

기본값은 'raise이다.

만약에 구간의 고유하지 않다면, 

  ○ 'raise': ValueError를 발생킨다.

  ○ 'drop': 고유하지 않은 값을 삭제한다. 

 

ordered: bool

기본값은 True이다.

레이블을 정렬할지 혹은 아닐지 를 결정한다.

카테고리 타입일 경우 적용해보도록하자.

  ○ True: 결과 카테고리가 정렬된다.

  ○ False: 결과 카테고리가 정렬되지 않는다.

    ▷ 이 경우 반드시 레이블이 입력되어야 한다.

 

 

 pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

분위수를 기반으로 이산화를 수행하는 함수이다.

 

이 함수는 변수 값들을 입력된 랭크 혹은 분위수를 기반으로 이산화시키는 함수이다. 

예를들어 1000개의 값에 10분위로 나눈다면 각각의 데이터 포인트에 대해 분위수를 나타내는 카테고리 객체를 생성한다.


x: 1d ndarray or Series

이산화를 수행하려는 데이터를 입력받는다.

반드시 1차원 배열만 입력하여야한다.

 

q: int or list-like of float

분위수의 숫자를 입력받는다.

10 이면 10분위수를, 4면 4분위수를 출력한다.

사용자가 원하는 분위수를 넣고싶다면 float형태로 구성된 시퀀스형 자료형을 입력받는다.

  ○ 예를들어 [0, 0.25, 0.5, 0.75, 1.]와 같이 입력할 수 있다.

 

labels: array or False

기본값은 None이다.

반환된 구간들에 대해 레이블을 명시한다.

결과로 반환된 구간들과 레이블은 길이가 동일해야한다.

False인 경우, 정수 레이블이 반환된다.

True라면 에러를 발생시킨다.

 

retbins: bool

기본값은 False이다.

(bins, labels)을 반환할것인지 아니면 말것인지 결정하는 변수이다.

이 변수는 구간이 scalar로 정의되어 있을때 유용하다.

 

precision: int

기본값은 3이다.

정밀도를 설정한다. 

만약 3이 입력되면 3자리수까지 계산한다.


duplicates: {‘raise’, ‘drop’}

기본값은 'raise'이다.

만약에 구간의 고유하지 않다면, 

  ○ 'raise': ValueError를 발생킨다.

  ○ 'drop': 고유하지 않은 값을 삭제한다. 

  

 

 

 

 

 참고자료

  https://pandas.pydata.org/docs/user_guide/basics.html

  https://pandas.pydata.org/docs/reference/api/pandas.cut.html

  https://pandas.pydata.org/docs/reference/api/pandas.qcut.html

 

 

 

 

 

 

반응형

댓글