본문 바로가기
Language/파이썬

파이썬 '판다스 데이터 분석' - 범주형(카테고리) 데이터 처리 -> 구간 분할 cut(), 더미 변수 get_dummies(Series):원핫인코딩, factorize(Series):라벨인코딩

by javapp 자바앱 2021. 7. 21.
728x90

 

연속 데이터를 일정한 구간 (bin) 으로 나눠서 분석하는 것이 효율적인경우가 있다.
가격, 비용, 효용 등 연속적인 값을 일정한 수준이나 정도를 나타내는 이산적인 값으로 나타내어 구간별 차이를 드러내는 것

 

 

구간 분할

- 각 구간을 범주형 이산 변수로 변환하는 과정을 구간 분할(binning)이라고 한다.

np.histogram

bins = 구간 갯수, 반환값 -> count = 각 구간에 속하는 값의 개수
bin_dividers = 경계값 리스트

import numpy as np

# np.histogram 함수로 3개의 bin으로 구분할 경계값의 리스트 구하기
count, bin_dividers= np.histogram(df.horsepower, bins =3)
print(count, bin_dividers)
<결과>
[257 103  32] [ 46.         107.33333333 168.66666667 230.        ]

 

 

데이터 구간 분할
pd.cut(x , bins, labels, include_lowest)

# 데이터 구간 분할
# pd.cut(x , bins, labels, include_lowest)

bin_names = ['저출력','보통출력','고출력']
df['hp_name'] = pd.cut(x = df['horsepower'], # 데이터
                    bins = bin_dividers,   # 경계값 리스트
                    labels = bin_names,    # 경계 내 이름
                    include_lowest = True)# 첫 경계값 포함
df[['horsepower', 'hp_name']].head(15)
<결과>

	horsepower  hp_name
0	130.0	보통출력
1	165.0	보통출력
2	150.0	보통출력
3	150.0	보통출력
4	140.0	보통출력
5	198.0	고출력
6	220.0	고출력
7	215.0	고출력
8	225.0	고출력
9	190.0	고출력
10	170.0	고출력
11	160.0	보통출력
12	150.0	보통출력
13	225.0	고출력
14	95.0	저출력

 

 

더미변수

카테고리를 나타내는 범주형 데이터를 회귀분석 등 머신러닝 알고리즘에 바로 사용할 수 없는 경우가 있다.

컴퓨터가 인식 가능한 입력값으로 변환해야한다.

 

더미변수로 숫자 0 또는 1로 표현되는 더미 변수를 사용한다. -> 어떤 특성이 있는지 없는지 여부만 표시

이처럼 범주형 데이터를 컴퓨터가 인식할 수 있도록 숫자 0과 1로만 구성되는 원핫벡터로 변환한다고 해서 원핫인코딩이라고도 부른다.

option : prefix='컬럼명' -> 컬럼명_저출력

drop_first=True : 만약 남성, 여성을 더미 변수로 만들 때 여성 컬럼이 1이면 여성을 의미 0이면 남성을 의미하기 때문에 일부러 남성 열을 만들 필요가 없다. 그렇기 때문에 각 더미 변수에서 하나씩 지워야 하는 것이 좋다.

# 카테고리를 나타내는 범주형 데이터를 회귀분석 등 머신러닝 알고리즘에 사용할 수 없는 경우가 있다.
# 더미 변수를 이용하여 원핫인코딩 진행
horsepower_dummies = pd.get_dummies(df['hp_name'])
horsepower_dummies
<결과>
	저출력	보통출력	고출력
0	0	1	0
1	0	1	0
2	0	1	0
3	0	1	0
4	0	1	0

 

 

factorize

개체를 열거형 또는 범주형 변수로 인코딩

 

[파이썬] 판다스(pandas)와 함께 사용하는 강력한 통계 요약 기능 : 사이드테이블(sidetable) 사용법 1

파이썬의 Sidetable이란 패키지를 아는가?! 오늘 소개할 sidetable은 기술통계할 때 흔히 사용하는 pandas...

blog.naver.com

 

예제코드)

학교명	지역	설립구분	1학년	2학년	3학년	4학년	5학년	6학년	특수학급	순회학급	학급당학생수	년도	계(남)	계(여)	총계	남-여	남녀성비(A÷B×100)
가락초등학교	부산광역시	공립	1	1	1	1	1	1	1	0	8.14	2021	22	35	57	-13	63.0

 

codes , uniques = pd.factorize(df['설립구분'])
print(codes,uniques)
<결과>
[0 0 1 ... 1 1 1] Index(['국립', '공립', '사립'], dtype='object')
# 설립구분 맵핑
df['설립구분_매핑']=df['설립구분'].factorize()[0]
<결과>
	설립구분	설립구분_매핑
978	공립	1
979	공립	1
980	사립	2
981	공립	1

 


 

데이터 병합

.concat

ndf = pd.concat([df, horsepower_dummies],axis= 1)
ndf.head()

 

 

concat , merge 잘 설명한 블로그

https://velog.io/@moksu/Merge로-데이터-합치기join

 

Merge로 데이터 합치기(+join)

좀 더 디테일하게 데이터를 합치려면 merge를 이용하면 된다.

velog.io

 

댓글