파이썬 버전 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 |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
멀티인덱스 레이블의 추출과 비사용 level의 제거-pandas(42) (0) | 2020.11.05 |
---|---|
멀티인덱스(Multiindex)의 생성-pandas(41) (0) | 2020.11.04 |
중복 요소 수 세기(히스토그래밍) value_counts 메서드-pandas(39) (0) | 2020.10.16 |
최대/최소값 인덱스(레이블) idxmin, idxmax 메서드-pandas(38) (0) | 2020.10.15 |
데이터 요약을 위한 describe() 메서드-pandas(37) (2) | 2020.10.12 |
댓글