티스토리 뷰
목차
결측값 제외는 통계와 코딩에서 데이터를 정제하는 핵심 과정입니다. 이 글에서는 결측값 지정 방식, Python·R·SPSS 코드 예시, 실무에서의 오류 경험과 처리 팁까지 자세히 설명합니다.
1. 데이터 분석의 첫 관문, 결측값
우리가 데이터를 다룰 때 가장 먼저 마주하는 벽은 ‘결측값’입니다. 설문지에 누락된 항목, 센서가 기록하지 못한 값, 혹은 데이터 입력자가 실수로 비워둔 칸. 이런 값들은 통계 분석이나 머신러닝 모델링에서 큰 오류를 일으킬 수 있기 때문에 반드시 사전에 정리되어야 합니다. 이 작업을 우리는 흔히 결측값 제외라고 부릅니다.
2. 결측값 제외는 왜 중요한가?
통계 분석에서는 한 항목이라도 결측값이 포함되면, 평균 계산이 불가능하거나 표본 수가 줄어드는 등의 문제가 발생합니다. 특히 회귀분석, 판별분석, 로지스틱 분석 등에서는 결측값이 한 개만 있어도 분석 전체가 중단될 수 있습니다. 그래서 실무에서는 결측값을 처리하기 위한 관행적인 코드 지정 방식이 존재합니다.
예를 들어, 값의 범위가 1~8인 경우 9를, 1~98까지 가능한 경우에는 99를, 3자리 숫자 범위에서는 999를 결측값으로 지정하는 것이 일반적입니다. 이렇게 하면 SPSS나 SAS 같은 프로그램에서도 해당 숫자를 인식해 자동으로 처리를 할 수 있도록 세팅할 수 있습니다.
3. 코딩에서의 결측값 처리 예시
파이썬(Python)을 예로 들면, Pandas 라이브러리에서 결측값을 탐지하고 제외하는 방식은 다음과 같습니다.
import pandas as pd
# 데이터프레임 생성
data = pd.DataFrame({
'나이': [25, 30, None, 28, 29],
'점수': [80, 90, 85, None, 95]
})
# 결측값 확인
data.isnull()
# 결측값 제외
data_cleaned = data.dropna()
print(data_cleaned)
이처럼 dropna()
함수 하나로 결측값이 포함된 행(row)을 제거할 수 있습니다. 만약 특정 열에서만 결측값 제외를 하고 싶다면 subset
옵션을 활용할 수도 있죠.
R에서는 na.omit()
함수를 쓰면 전체 데이터에서 결측값을 제외한 데이터프레임을 얻을 수 있습니다.
df <- data.frame(나이=c(25, 30, NA, 28), 점수=c(80, 90, 85, NA))
clean_df <- na.omit(df)
4. [체험] 결측값으로 밤새 작업을 되돌렸던 날
한 번은 고객의 CRM 데이터를 기반으로 마케팅 전략 리포트를 만들던 프로젝트에 참여한 적이 있습니다. 당시 저는 엑셀로 정리된 대규모 데이터를 CSV 파일로 저장한 뒤, Python의 Pandas 라이브러리를 통해 데이터를 불러와 머신러닝 모델을 학습시키고 있었습니다. 표면적으로는 문제없이 코딩이 돌아갔고, 결과도 출력되었습니다. 하지만 결과는 이상하리만큼 왜곡되어 있었고, 고객의 실제 구매 패턴과 전혀 다른 분석이 나오기 시작했습니다.
처음엔 모델의 성능 문제라고 생각해서 알고리즘을 바꾸고 하이퍼파라미터를 조정하는 데 시간을 쏟았지만, 아무리 해도 이상한 결과가 반복됐습니다. 그러다 데이터 프레임을 하나하나 확인하던 중, '소득'이라는 변수에서 999
라는 값이 다수 발견되었습니다. 저는 처음엔 단순한 높은 소득으로 해석했지만, 문서를 다시 확인해 보니 해당 숫자는 결측값을 나타내는 코드였습니다. 즉, 모델은 결측값을 고소득으로 오인하고 있었던 것입니다.
이 오류 하나로 전체 모델이 왜곡된 셈이었고, 예측 정확도는 엉망이 되어버렸습니다. 고객에게 제출했던 분석 보고서 역시 신뢰를 잃을 수 있는 상황이라, 전면 수정에 들어갔고 밤을 새워 모든 과정을 다시 진행해야 했습니다. 보고서를 회수하고, 새롭게 정제한 데이터를 기반으로 다시 모델을 구축하느라 프로젝트 일정은 이틀 넘게 지연됐고, 팀 전체의 일정도 영향을 받았습니다.
이 경험 이후, 저는 어떤 데이터를 다룰 때든 가장 먼저 하는 일이 '결측값이 어떤 형태로 존재하는가'를 확인하는 것이 되었습니다. 특히 숫자로 대체된 결측값(예: 9, 99, 999 등)은 겉으로 보기엔 정상값처럼 보여 쉽게 간과하기 때문에 더욱 조심해야 한다는 교훈을 얻었습니다. 지금도 데이터를 불러오는 순간, 저는 자동으로 dropna()
나 replace
함수로 결측값 처리를 먼저 합니다. 그리고 항상 문서나 데이터 딕셔너리를 꼼꼼히 검토해 어떤 값이 의미 없는 데이터인지 명확히 구분하는 습관을 들이게 되었죠.
이 사건은 단지 코드 하나의 실수가 아니라, 데이터 해석 전 과정에서 신중함이 얼마나 중요한지를 보여주는 강렬한 경험이었습니다. 결국 데이터는 숫자 그 자체보다, 그 안에 숨은 의미를 어떻게 다루느냐에 따라 분석의 방향이 완전히 달라질 수 있다는 것을 이때 처음 절실하게 느꼈습니다.
5. 결측값 처리 방법 정리
처리 방법 | 설명 | 주의사항 |
---|---|---|
제외(drop) | 결측값이 있는 행 또는 열 삭제 | 샘플 수가 줄어들 수 있음 |
대체(imputation) | 평균, 중앙값 등으로 채움 | 데이터 왜곡 위험 |
코드 지정 | 9, 99, 999 등 특정 값으로 처리 | 통계 툴 설정 필요 |
6. 결론: 결측값은 조용히 분석을 무너뜨린다
결측값은 아무리 작은 숫자 하나라도, 분석 결과를 크게 왜곡시킬 수 있습니다. 결측값 제외는 단순한 데이터 정리 차원이 아니라, 전체 분석의 기반을 튼튼하게 만드는 과정입니다. 특히 머신러닝, 회귀분석 등 민감한 모델에서는 이 과정을 소홀히 하면 비용과 시간이 수십 배로 돌아올 수 있습니다.
데이터를 다룬다면, 결측값을 마주했을 때 주저하지 말고 제거하거나 적절히 대체하는 연습이 필요합니다. 그것이 진짜 데이터 분석가로 성장하는 첫걸음이니까요.
출처: 나무위키 ≪ Pandas (판다스)는 Python의 정형 데이터 (테이블 데이터)≫
'코딩' 카테고리의 다른 글
최빈값 삽입: 가장 흔한 값으로 빈칸을 채우는 기술 (0) | 2025.05.16 |
---|---|
평균 삽입: 결측값 처리의 시작부터 끝까지 (0) | 2025.05.16 |
의미 코드란? 코딩에 감성을 담는 기술 (0) | 2025.05.15 |
집단 분류 코드란? 행정과 통계의 숨은 기초 체계 (0) | 2025.05.14 |
블록 코드의 원리와 확장성 (0) | 2025.05.14 |