본문 바로가기
Python/Python DataAnalysis

[Python Data Analysis] 13. pandas 데이터 전처리 - One-Hot-Encoding

by Rosmary 2021. 12. 23.
728x90
반응형

 

 

 

 

 

 

특성치가 연속적인 값을 가지는 경우, 이 특성치를 최대최소척도(MinMaxScaler)나 표준정규화(StandardScaler) 클래스를 바로 사용하더라도 큰 문제가 되지 않는다. 하지만, 연속성을 가진 특성치가 아닌 범주형, 그것도 숫자가 아닌 문자값을 가지는 특성치라면, 분석을 위해 이들 값을 정규화하는 것도 매우 어려워진다.

 

 

그런다고 이들 값들을 함부로 숫자로 변경할 수도 없는 것이, 숫자로 변환되는 순간 sklearn의 정규화모듈들은 이들 값을 연속적인 값으로 인식하여 정확한 분석이 불가능해지기 때문이다. 만약, 남성을 10, 여성을 20으로 변환한 값으로 정규화를 시도한다면, 이 변환된 값을 분류 척도가 아닌 이산형 변수로 인식한다는 말이다.

 

따라서, 분류 척도의 경우 다음과 같은 방식으로 분류를 해야 한다.

 

* 성별 분류 시,

1. DataFrame의 Column "Gender"를 "Gender_M", "Gender_F"로 분류한다.

2. 각 Index에서 성별이 남성인 경우, Gender_M Column 값을 1(True)로, Gender_F Column 값을 0(False)로 지정한다. 반대의 경우 Gender_M = 0, Gender_F = 1로 지정한다.

 

위의 전처리 프로세스를 One Hot Encoding이라고 하는데 One Hot Encoding으로 나타난 변경된 범주형 변수를 전통적인 통계학에서 더미변수(Dummy Variables)라고 한다. One Hot Encoding을 Python 코드로 직접 작성하기가 크게 어려운 내용은 아니지만 범주형 척도의 컬럼이 둘 이상 존재하는 경우 코딩이 상당히 귀찮아진다. 다행히 pandas는 범주형 척도들을 더미변수로 변환해주는 매서드가 존재한다. 바로 get_dummies() 매서드다.

 

get_dummies() 매서드는 특정 DataFrame(보통 범주형 변수가 들어간 Column)을 인자로 지정하며, 결과값으로 범주값 수 만큼의 Column을 가지는 DataFrame 값이 만들어진다. 필자는 Gender Column을 One Hot Encoding으로 변환하여 다음과 같은 결과를 얻었다.

 

좌측은 One Hot Encoding으로 변환된 DataFrame, 우측은 원본 DataFrame 값이다.

 

get_dummies() 매서드에서 특정 컬럼을 인자로 지정하면, 위와 같이 Column 명이 "Column이름_값" 형태로 자동 변환된다. 그리고 각각의 Index에 지정된 성별에 따라, Gender_M, Gender_F 값을 0과 1로 자동 구분하여 새로운 DataFrame을 생성한다. 

 

만약 범주형 값을 가지는 다수 컬럼을 One Hot Encoding으로 변환하고자 한다면, 인자로 들어가는 X의 값에 변환하기를 원하는 Column들로만 새 DataFrame을 생성해주면 된다.

 

 

간혹, 문자열로 구성된 범주값이 아닌 숫자 형태의 범주값이 존재하는 경우도 있는데(남자를 10, 여자를 20으로 지정), 이 경우, get_dummies() 매서드를 사용하면, Column 명이 단순히 범주값으로만 나타나게 된다.

 

 

따라서, 여러 컬럼에서 숫자형 범주를 One Hot Encoding으로 변경하는 경우, Column값을 구분지어 표시해 줄 필요가 있는데, get_dummies() 매서드의 특정 인자를 사용하여 "해당 범주값이 포함되었던 Column명_값" 형태로 Column 이름을 지정할 수 있다.

 

 

이 때 사용하는 매서드 인자로 prefix와 prefix_sep이 있는데, prefix는 말 그대로 범주값 앞에 붙을 접두사를 지정하는 기능을 하며, prefix_sep은 접두사와 값 사이 구분자를 지정하는 기능을 한다고 보면 된다. 

 

 

 

마지막으로, One Hot Encoding 시 주의사항이 하나 있는데, 여러 범주형 컬럼 중, 숫자형 범주값으로 구성된 Column이 존재하는 경우, 해당 Column은 One Hot Encoding에 의해 자동 변환되지 않는다.

 

Gender의 경우 Name Prefix와 달리 One Hot Encoding이 진행되지 않았음을 확인할 수 있다.

 

 

따라서, 숫자형 범주를 One Hot Encoding 값으로 변환하기 위해 수작업이 불가피하며, 수작업은 위에서 예시로 든 방식대로 별도의 컬럼을 만들어 자동변환된 값과 합치거나, 또는 One Hot Encoding 변환 전에 숫자형 범주값을 문자형 범주값으로 변환하고 한 번에 One Hot Encoding 하는 방법을 사용해야 한다. 

 

 

 

2. One Hot Encoding 처리된 데이터에 대한 정규화 결과

 

필자는 Gender와 Name Prefix의 One Hot Encoding 결과 값을 특성치 X로 지정하고, 이를 최소최대척도법으로 정규화해보려 한다. 

 

먼저 Name Prefix와 Gender를 One Hot Encoding한다. One Hot Encoding 전에, Gender의 숫자형 범주값은 문자형 범주값으로 변환한다.

 

 

 

 

이제 변환된 특성치(Gender, Name Prefix) 값을 X_OHE라는 변수명에 지정하고 정규화해보자.

* 특성치의 정규화 방법은 여기를 참고하자.

 

 

One Hot Encoding을 진행하기 전의 특성치는 정규화 시 에러가 발생했었으나, One Hot Encoding을 거친 특성치 데이터는 정규화 시도 시 에러가 발생하지 않음을 알 수 있다. 결과로 나타난 Array 형태의 반환값을 DataFrame으로 변환하면 아래와 같이 조금 더 보기 쉬운 형태로 출력할 수 있다.

 

 

 

 


 

Fin.

 

반응형

댓글