프로그래밍/Pandas

[Pandas] 데이터 전처리 | 범주형 데이터 | 구간 분할 | 더미 변수

LeeSeunghyuk 2021. 2. 11. 08:47
반응형

 

※ 범주형 자료

 

수치형 자료 : 양적 데이터 , 양적 자료

범주형 자료 : 질적 데이터 , 질적 자료

 

범주형 자료는 순위형 자료, 명목형 자료로 구분할 수 있습니다.

 

순위형 : 범주 간 순서가 있는 자료입니다.

           평점(1~5점) , 선호도(매우 나쁨~매우 좋음) 등이 있습니다.

 

명목형 : 범주 간에 순서가 의미 없는 자료입니다.

           혈액형(A,B,O,AB) , 성별(남/여) 등이 있습니다.

 

 

★ 범주형 자료도 수치형 자료도 표현할 수 있다 ★

 

순위형 자료의 평점 , 명목형 자료의 반(1반,2반,3반 등) 혹은 남자는 1, 여자는 0과 같이 나타냅니다.

 

이때 수치는 서열을 나타낼 수도, 나타내지 않을 수도 있습니다.

 

### 범주형 데이터 처리

 

## 구간 분할

 

데이터 분석 알고리즘에 따라 연속한 데이터를 그대로 사용하는 것 보다

일정 구간으로 나누어 분석하는 것이 효율적일 수도 있습니다.

 

연속 데이터인 가격을 매우쌈, 쌈, 중간, 비쌈, 매우비쌈 으로 구간 분할합니다.

 

연속 변수를 일정 구간으로 나누고,

각 구간을  ' 범주형 이산 변수 ' 로 변환하는 과정을 구간 분할이라고 합니다.

 

판다스의 cut 함수를 사용해 연속 데이터를 여러 구간으로 나눌 수 있고,

범주형 데이터로 변환할 수 있습니다.

 

이전 포스팅에서 사용한 UCI 자동차 연비 데이터셋을 이어서 사용합니다.

 

마력을 나타내는 'horsepower' 변수를 저출력, 보통, 고출력 3가지로 구간 분할해 표시합니다.

 

 

# Numpy - histogram

 

 

 

Numpy 모듈의 histogram 메소드를 사용합니다.

시리즈 데이터, bin 개수를 사용하면 구간을 분할해 리턴합니다.

 

 

 

 

46 ~ 107 : 257개 데이터

107 ~ 168 : 103개 데이터

168 ~ 203 : 32개 데이터

 

 

 

# Pandas - cut

 

 

 

include_lowest : 각 구간 낮은 경계의 값 포함 여부

labels : 구간 이름

bins : 경계 값 리스트

 

 

df['hp_bins']=pd.cut(x=df.horsepower,bins=bins,
                     labels=['저출력','보통','고출력'],
                     include_lowest=True)
df.hp_bins

 

 

해당 데이터가 각 구간에 맞게 새로운 데이터로 변경되었습니다.

범주형(category) 데이터로 잘 변환이 된 모습입니다.

 

## 더미 변수

 

 

연속형 데이터 -> 구간 분할 작업을 완료 했습니다.

범주형 데이터를 회귀 분석과 같은 머신러닝 알고리즘에는 바로 적용할 수 없습니다.

따라서 이를 수치형 데이터로 변경해 주겠습니다.

 

0과 1을 사용해 더미변수(dummy variable)로 변경합니다.

 

여자 / 남자 와 같은 범주 데이터는 여자는 1, 남자는 0과 같이 나타낼 수 있습니다.

저 / 보통 / 고 범주 데이터도 같은 방법으로 나타낼 수 있습니다.

 

더미 변수로 나타내기 위해 0 , 1의 벡터로만 나타내는 과정을 원 핫 인코딩이라고 합니다.

 

 

# Pandas - get_dummies

 

 

 

pandas의 get_dummies 함수를 사용합니다.

범주형 데이터를 인자로 사용해 원핫 인코딩된 데이터 프레임을 반환합니다.

 

 

 

 

# Pandas - concat

 

 

두 데이터 프레임, 시리즈를 연결합니다.

 

axis = 0 : 위 아래로 연결

axis = 1 : 옆으로 연결

ignore_index = True : 행 번호 새로 부여

join = 'inner' : 컬럼들 교집합 출력

join = 'outer' : 모든 칼럼 다 출력

 

 

new_df=pd.concat([df,dummy],axis=1)
new_df

 

기존 데이터 프레임(df)에 새로운 데이터 프레임(dummy)를 concat을 사용해 연결합니다.

 

이제 기존의 데이터 열을 삭제합니다.

 

horsepower : 연속형 데이터

hp_bins : 구간 분할한 범주형 데이터

 

 

new_df.drop(['horsepower','hp_bins'],axis=1,inplace=True)
new_df

 

 

 

 

이번 시간에는 연속형 데이터를 구간 분할하고, 구간 분할한 데이터를 원핫 인코딩해 보았습니다.

 

데이터 전처리는 복잡하지만 재밌는 과정이라고 생각합니다!!!!!!

 

반응형