본문 바로가기
데이터 사이언스

데이터 클리닝 및 전처리 작업

by 빛나는존재 2022. 4. 23.
반응형

 

C언어를 이용한 데이터 클리닝

토양에서 이산화탄소 호흡이 발생하는 현상을 자동으로 측정해 주는 장비로부터 발생한 raw 데이터를 파싱 하여 원하는 통계 값이 계산된 새로운 데이터를 text 파일로 출력하는 프로그램을 C언어로 개발했었다. 처음에는 Python으로 하려고 했었는데, 내가 맨 처음에 가장 많은 시간을 들여서 배운 언어가 C언어이다 보니 파이썬으로 작업하는 것이 불편하게 느껴져서 결국은 C언어로 개발하게 되었다. 그런데 이 작업을 하면서 참 많은 시행착오를 겪었다. 자동으로 측정된 데이터에는 일정한 규칙에 위배되는 이상한 값이 들어가 있는 경우, 데이터가 측정되다가 멈춘 경우 등 여러 가지 예외 사항들이 있었다. 특히 숫자만 있어야 하는 부분에 문자가 섞여 들어간 부분, 특정 행에서의 데이터가 부족하여 행간의 데이터를 계산할 수 없는 경우를 핸들링하기 위해여 이러한 부분을 정제하는 프로그램을 따로 만들어 정제된 데이터가 출력되도록 했다. 그리고 정제된 데이터를 입력하여 기초 통계량(평균, 표준오차 등)이 column 으로 구성된 데이터 파일 출력하는 프로그램 작성했다. 이 과정에서 엑셀 형식으로 있는 데이터를 C 언어에서 읽어 들이기 위해 약 200000행, 20개의 열로 구성된 2차원 배열을 만들고 fscanf를 이용했으나, stack overflow 에러가 나서 그 이후에 malloc으로 동적 메모리 할당 기능을 이용했다.

 

결측치가 아님에도 결측치로 판단 하는 경우

캐글에서 bike sharing demand 데이터를 분석할 때에도 전처리하는 데 많은 노력이 들었다. 분석의 목적은 자전거를 대여한 건수를 예측하는 것이고 이를 위해 계절, 공휴일 여부, 날씨, 날씨, 온도, 체감온도, 습도, 풍속, 각 비회원 및 회원이 자전거를 대여한 건수들의 데이터를 이용하는 것이다. 여기서 계절, 년도 및 월과 같은 범주형 데이터들은 one-hot-encoding을 통해 전처리를 했다. 이를 위해 우선 년도 및 월을 파이썬에서 인식하도록 pd.to_datetime()을 이용했다. 여기서 한 가지 재미있던 점은, 보통 결측치는 NaN이나 비어있는 값으로 나타나는데, 풍속의 경우 0으로 입력되어 있는 경우 또한 결측치로 간주할 수 있다는 점이다. 풍속이 0인 경우는 매우 드물 것인데, 그에 비해 0이 상식에 벗어나게 많이 들어가 있어서 혹시나 이것이 데이터가 없어서 0이라는 값이 들어가지 않았을까 하는 의심을 하게 되었다. 내가 다른 데이터를 분석할 때에도 임상 데이터에서 나이가 0인 경우가 있었는데, 그건 데이터를 수집한 사람에게 물어보니 데이터가 없는 경우 0이라는 숫자가 들어간다고 한다. 따라서 명시적으로 결측치가 아니더라도 0이라는 값이 특정 변수에 많이 들어가 있으면 의심을 해 보는 것이 좋을 것 같다. 이 데이터 분석의 경우 풍속이 0인 경우를 결측치로 간주했을 때, random forest를 이용하여 결측치를 예측하여 채워 넣을 수도 있고, 가장 일반적으로는 결측치를 제외한 median값으로 대체할 수 있다. 하지만 바람은 시간대, 온도 등에 따라 변하기 때문에 단순히 median값으로 대신할 수 없다는 판단이 들어 random forest를 이용하여 결측치를 예측하였다. 물론 이 경우에 예측된 결측치가 어느 정도로 정답에 가까운지는 알 수가 없다. 애초에 정답이 없기 때문이다.

 

중복 데이터 클리닝

데이터를 전처리 하면서 가장 머리 아픈 일은 중복된 데이터를 처리하는 것이다. 그것도 다른 테이블과 join 할 때 사용되는 key값이 중복되면 그것은 key값으로의 가치를 잃기 때문에 더욱 심각한 문제라고 할 수 있다. 이럴 때, 다른 테이블과 연결하려고 하면 일단 중복된 데이터를 지운 후, 그 값을 다른 값과 combine 하여 그 값을 key로 삼을 수 있는지 여부를 체크해야 한다. 중복된 데이터를 지우고 맨 첫 행만 남기는 작업은 파이썬에서 drop_duplicates()를 이용하면 된다. R에서는 duplicated() 함수를 이용하여 그것이 아닌 것만 따로 필터링을 할 수 있다. 또한, column 하나가 아닌 행 전체의 값이 중복인 경우도 있는데 이럴 경우에는 거의 잘못 중복되었을 확률이 높으므로 확인을 꼼꼼히 해야 한다.

반응형