데이터를 기반으로

pandas encoding에 관하여 본문

데이터 분석(Python)/탐색적 데이터 분석(EDA)

pandas encoding에 관하여

이노후 2023. 7. 15. 20:22
728x90
반응형

데이터 분석을 하다 보면 pandas 패키지를 자연스럽게 사용하게 될 것이다.

 

우리는 수 많은 데이터를 load 해야하는 경우가 많을 것이다.

 

우선, pandas documentation에 있는 read_csv 함수에 대한 옵션을 살펴보고 가자.

https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html?highlight=read_csv#pandas.read_csv

 

pandas.read_csv — pandas 2.0.3 documentation

Delimiter to use. If sep is None, the C engine cannot automatically detect the separator, but the Python parsing engine can, meaning the latter will be used and automatically detect the separator by Python’s builtin sniffer tool, csv.Sniffer. In addition

pandas.pydata.org

 

페이지를 들어가보면 알겠지만 너무나 많은 옵션값들이 존재한다.

 

우리가 가장 많이 사용하는 read_csv 함수에 옵션 중 encoding 옵션이 있다.

 

많은 분들이 encoing 옵션에 utf-8 을 넣고 대부분 작업을 했을 것이다. 하지만, 간혹 가다 utf-8로 인코딩이 안되고 오류를 뱉어서 euc-kr 이나, cp949 로 적용해서 encoding을 진행했을 것이다.

 

문득, 이 3개의 인코딩 값들의 차이점이 무엇인지 궁금해 해당 글을 작성하게 되었다.

 

먼저, 인코딩 기본 옵션인 utf-8에 대해서 알아보자.

 

[ UTF-8 ]

(위키피디아) UTF-8은 가장 많이 사용되는 가변 길이 유니코드 인코딩이다.

UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. UTF-16과 UTF-8 중 어느 인코딩이 더 적은 바이트를 사용하는지는 문자열에서 사용된 코드 포인트에 따라 달라지며, 실제로 DEFLATE와 같은 일반적인 압축 알고리즘을 사용할 경우 이 차이는 무시할 수 있을 정도이다. 이러한 압축 알고리즘을 사용하기 힘들고 크기가 중요할 경우 유니코드 표준 압축 방식(Standard Compression Scheme for Unicode)을 대신 사용할 수 있다.

 

가장 중요한 결론은 utf-8은 한글 1자를 3바이트로 표시한다는 것이다.

 

[ EUC-KR ]

(위키피디아) EUC-KR은 KS X 1001와 KS X 1003을 사용하는 8비트 문자 인코딩, EUC의 일종이며 대표적인 한글 완성형 인코딩이기 때문에 보통 완성형이라고 불린다.

 

EUC-KR 은 UTF-8에 비해 한글에 최적화된 인코딩이라 표현할 수 있다. 그리고 EUC-KR은 한글 지원을 위해 유닉스 계열에서 나온 완성형 코드 조합이며 여기서  완성형 코드란 완성 된 문자 하나하나마다 코드 번호를 부여한 것이다. 

 

그리고, 가장 큰 장점은 EUC-KR은 한글 1자를 2바이트로 표시한다는 것이다.

 

[ CP949 ]

(위키피디아) 한국어판 Microsoft Windows의 기본 코드 페이지로, 한글 인코딩의 한 종류이며 EUC-KR의 확장형이다. '통합 완성형'이나 '확장 완성형'이라고도 한다. 마이크로소프트가 개발했기 때문에 MS949, Windows-949 등으로도 불린다.

 

CP949는 EUC-KR에서 완성형 코드로만 표현하기 힘든 나머지 한글들이 추가된 것이다. 하지만, 문자의 사전 순서는 고려하지 않아 초기에 많은 비난을 받았다고 합니다.

 

해당 인코딩은 EUC-KR과 같이 한글 1자를 2바이트로 표시한다.

 

 

이렇게 각각 생성 배경과 특징을 확인해보았다.

 

결론적으로 데이터를 주고 받을 때는 euc-kr 및 cp949 가 용량측면에서 조금 장점을 가지고 있는 것으로 보인다.

기존에는 utf-8 -> euc-kr -> cp949 순으로 테스트를 하며 인코딩을 했었는데, 좀 더 데이터 적인 이점과 더 큰 범용성을 가진 cp949를 pandas 에서는 사용하는게 좋아보인다.

 

※ 파이썬 말고 다른 곳에서는 cp949와 euc-kr 과의 차이가 없이 나오는 곳이 있다고 하니 이 부분은 좀 더 조사가 필요해보인다.

 

728x90
반응형