성공적인 데이터 사이언스 프로젝트의 기반은 깔끔하고 일관된 데이터입니다. 그러나 분석의 빠른 진행 속도 속에서 경험 많은 파이썬 사용자조차도 종종 피할 수 있는 데이터 전처리 함정에 빠지곤 합니다. 기계 학습 모델용 데이터를 다듬거나 시각화를 위한 데이터를 준비하든, 어떤 실수를 주의해야 하는지 알면 수많은 좌절의 시간을 아끼고 훨씬 더 견고한 결과를 얻을 수 있습니다.
파이썬에서 가장 흔하고(종종 치명적인) 데이터 정리 실수를 실용적인 팁과 설명 가능한 예시를 곁들여 자세히 살펴보고, 워크플로를 확실하고 효율적으로 유지할 수 있도록 해드립니다.
현실 세계의 데이터 집합에서 가장 먼저 직면하는 문제 중 하나는 누락 데이터입니다. 파이썬에서 특히 판다스(pandas) 같은 도구를 사용할 때 NaN을 대체하거나 제거하는 일은 쉽습니다: df.dropna() 또는 df.fillna(0)가 한 줄로 이를 처리합니다. 그러나 쉽다고 해서 옳다는 뜻은 아닙니다.
자동으로 누락 값이 있는 행을 제거하면 데이터 세트가 급격히 축소되거나, 누락 여부가 상관관계가 있는 경우 편향을 도입할 수 있습니다. 평균이나 0으로 값을 채우면 특히 비수치 열이나 이상치가 있는 열에서 분포가 왜곡될 수 있습니다.
다음 코드를 고려해 보세요:
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna() # Danger: goodbye valuable data!
만약 30%의 행이 단 하나의 선택적 필드—예를 들어 나이(NaN)—에 대해 누락되어 있다면 데이터의 30%를 잃게 됩니다. 누락된 나이가 특정 인구통계에서 주로 발생한다면 결과는 모집단을 더 이상 정확하게 대변하지 못하는 데이터 세트가 됩니다.
df.isnull().sum() 또는 df.info()를 사용하세요.sklearn.impute.SimpleImputer를 고려하거나 도메인 특화 로직을 활용하세요.
여러 출처에서 수집한 데이터는 거의 하나의 형식으로 깔끔하게 들어맞지 않습니다. 날짜, 범주, 문자열 인코딩은 특히 미묘하고 추적하기 어려운 오류에 취약합니다.
dtype: object)이 숫자 연산을 불가능하게 만듦.전형적인 파이썬 문제:
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min() # Only finds the minimum string, not chronological min
df.dtypes가 숫자형이어야 하는 열을 빠르게 노출합니다.pd.to_datetime(), pd.to_numeric(), 그리고 카테고리 변환을 사용하세요..str.lower().str.strip()를 사용하고 동의어나 오타를 일관된 값으로 대체하세요.encoding 인자를 지정하세요(encoding='utf-8' 또는 encoding='cp1252').df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at']) # Remove rows where dates couldn't parse
여기에 조금 주의를 기울이면 나중에 이상한 분석을 디버깅하는 데 걸리는 시간을 크게 줄일 수 있습니다.
이상치는 데이터 정리의 와일드카드입니다—때로는 데이터 입력 오류를 나타내기도 하고, 때로는 연구 가치가 있는 중요한 사건일 수 있습니다!
맥락을 고려하지 않고 특정 범위를 벗어난 값을 자동으로 제거하는 스크립트는 오류와 중요한 신호를 모두 데이터에서 제거할 수 있습니다.
건강 데이터 세트에 혈압 열이 있습니다. 일부 값은 400으로 기록되어 있는데, 이는 데이터 입력 오류일 수 있습니다(단위나 입력 문제). 다른 값은 고혈압 응급 상황과 같은 극한 사례일 수 있습니다. 모든 값을 200을 넘는 값을 일괄적으로 제거하면 실제로 희귀한 환자 정보를 잃을 수 있습니다.
# Don't just drop anything >200 without context
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers) # Investigate: are these errors or medically relevant cases?
df.describe()와 상자 그림(box plots)이나 히스토그램과 같은 시각화를 사용해 분포를 파악하고 이상치를 발견하세요.이상치가 실제로 타당한 경우에는 데이터에 의해 주도되는 비즈니스 인사이트를 재구성할 수 있습니다.
중복 데이터는 만연합니다—데이터 입력 오류, 웹 스크래핑, 시스템 오류 등이 이를 야기합니다. 파이썬은 순식간에 df.drop_duplicates()를 실행할 수 있게 해주지만, 진짜 위험은 중복이 어디에서 왔는지 또는 이를 어떻게 가장 잘 해결해야 하는지 오해하는 데 있습니다.
소매 데이터베이스에서 반복된 시스템 제출로 인해 같은 고객 주문에 대해 여러 행이 있을 수 있습니다. 모든 열이 일치하는 경우에만 한 행만 남기는 것이 작동합니다. 그렇지 않으면 정보가 손실될 수 있습니다.
# Problematic: Dropping all duplicates based only on 'order_id'
df = df.drop_duplicates(subset=['order_id']) # Could lose different addresses or notes attached to split-row orders
열 간에 'delivery_notes'가 서로 다르면 중복 제거를 맹목적으로 수행하면 데이터가 손실되거나 충돌하는 정보를 해결하지 못할 수 있습니다.
df.duplicated(subset=key_cols, keep=False)를 사용해 실제 중복을 표시하세요.is_duplicate로 표시하는 것이 제거하는 것보다 바람직합니다.다음은 중복 제거 전에 유용한 필드를 집계하는 방법의 예시입니다:
def collapse_order_notes(notes):
return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
'customer_id': 'first',
'total_amount': 'sum',
'delivery_notes': collapse_order_notes
}).reset_index()
이것은 중요한 보조 데이터를 보호합니다.
많은 강력한 알고리즘은 직접적인 문자열 레이블이나 범주가 아닌 숫자 입력을 필요로 합니다. 범주형 열의 인코딩은 중요한 단계이지만, 서두르거나 잘못된 방법을 선택하면 모델 성능이 저하되고 버그가 생길 수 있습니다.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city']) # Problem: Model interprets numbers mathematically
0,1,2 등). 그렇지 않으면 원-핫 또는 다른 인코딩을 선택하세요.pd.get_dummies(df, drop_first=True, dummy_na=False)를 사용하거나 대용량 카디널리티 특성의 경우 해싱이나 타깃 인코딩을 고려하세요.fit/transform을 사용). 이렇게 하면 모델 배포 시 동일한 매핑이 적용되지만, 새롭고 보지 못한 범주가 실제 입력에 나타날 때Classic한 함정이 됩니다.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
이로써 특징 공간의 크기를 실용적으로 유지하고 모델의 견고성을 높입니다.
파이썬에서의 데이터 정리는 미묘한 세부 사항과 속도에 대한 존중이 함께 필요합니다. 기계적이거나 맥락 없이 이루어지는 정리를 피함으로써 데이터 사이언스와 분석 작업의 수준을 평균 이상으로 끌어올립니다. 의도적으로 누락 값을 검토하고, 형식을 일관되게 유지하며, 이상치를 단순한 소음이 아닌 신호로 다루고, 중복을 면밀히 검토하며, 범주 인코딩에 대해 전략적으로 생각하세요.
이 교훈과 데이터에 대한 비판적 시각을 갖추면 되돌아보는 데 들이는 시간을 줄이고, 운영 중 발생하는 창피한 실수를 최소화하며, 분석가가 신뢰하는 데이터 파이프라인을 설계하는 명성을 쌓게 됩니다. 그리고 점점 더 커져 가는 데이터 사이언스 분야에서, 인사이트를 얻을 수 있도록 데이터가 실제로 준비된 사람이 되는 것은 진정한 슈퍼파워가 됩니다.