ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 수집과 EDA 전략 시리즈 – 3화. 결측치와 이상치 탐지 전략: 데이터의 허점을 읽어내는 기술
    기술과 산업/AI 2025. 5. 7. 15:57
    728x90

    데이터 분석에서 ‘보이지 않는 것들’이 가장 위험하다.

    우리가 보지 못하거나, 애써 무시한 누락된 정보와 극단적인 값은

    모델을 망치고, 분석 결과를 왜곡하며, 나쁜 의사결정으로 이어질 수 있다.

     

    이번 글에서는 데이터 탐색 과정 중 반드시 짚고 넘어가야 할

    **결측치(Missing Values)**와 **이상치(Outliers)**에 대해

    실무 분석가의 시선으로 심층적으로 정리한다.

     


     

    1. 결측치와 이상치는 왜 중요한가?

     

    데이터는 언제나 완전하지 않다.

    현장에서 수집되는 로그, 설문 응답, 기기 센서 데이터 등은

    환경적·기술적·인적 요인에 따라 손상되거나 누락되기 쉽다.

     

     

    📌 결측치(Missing Values)

     

    결측치는 말 그대로 어떤 값이 ‘비어 있는 상태’를 의미한다.

    주로 다음과 같은 원인으로 발생한다:

     

    • 사용자 입력 누락 (예: 나이 미기입)
    • 수집 실패 (예: 서버 장애로 로그 미기록)
    • 의도적 생략 (예: 민감정보 제외)
    • 데이터 전처리 중 삭제 또는 병합 과정에서의 손실

     

     

    📌 이상치(Outliers)

     

    이상치는 데이터의 분포에서 일반적인 범위를 벗어난 극단적인 값이다.

    예를 들어, 대부분의 제품 가격이 1~10만원인데

    어떤 하나가 500만원이라면 이는 이상치일 가능성이 높다.

     

    이상치는 다음과 같은 상황에서 발생한다:

     

    • 입력 오류 (0을 하나 더 적음, 단위 혼동 등)
    • 실제 극단 상황 (VIP 고객, 사고 발생 등)
    • 비즈니스적 예외 (신제품 출시, 마케팅 이벤트 등)

     

    중요한 점: 모든 이상치가 제거 대상은 아니다.
    분석 목적에 따라, 때로는 ‘이상치야말로 중요한 인사이트’가 될 수 있다.

     


     

    2. 결측치 탐지 실전 전략

     

    결측치는 우선 전체 데이터셋의 어디에, 얼마나 존재하는지 파악하는 것이 중요하다.

     

     

    🔹 기본 확인

    import pandas as pd
    
    df = pd.read_csv('data.csv')
    df.isnull().sum().sort_values(ascending=False)

    → 결측치가 많은 열부터 정렬

     

     

    🔹 전체 비율 확인

    (df.isnull().sum() / len(df)).sort_values(ascending=False)

    → 30% 이상 결측치가 있는 열은 제거 대상 고려

     


     

    📊 시각화로 한눈에 보기

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
    plt.title('결측치 분포 Heatmap')
    plt.show()
    열 단위뿐 아니라 행 단위 패턴까지 시각적으로 파악 가능

     


     

    3. 결측치 처리 전략

    전략설명적용 예시

    삭제 결측이 많은 열/행 제거 전체 열의 70% 이상 결측
    대체(평균/중앙값) 수치형 평균 또는 중앙값으로 채움 나이, 소득 등
    범주 대체 범주형은 최빈값 또는 ‘Missing’으로 처리 지역, 성별
    모델 기반 예측 다른 변수로 결측값을 예측해 채움 KNN, 회귀 기반 보간
    다중 대체(MICE) 통계적으로 여러 번 예측 → 평균화 고급 통계기법, 비용 ↑
    ✅ 실무 팁: 테스트 데이터에는 절대 평균으로 결측치를 대체하지 않는다.
    학습 데이터에서 계산한 값을 기준으로 일관성 있게 처리해야 함.

     


     

    4. 이상치 탐지 실전 전략

     

    이상치는 분석 목적에 따라 제거 또는 강조해야 할 대상이다.

    탐지 방식은 수치형 데이터 기준으로 다음과 같다.

     

     

    (1) 사분위수(IQR) 기반 탐지

    Q1 = df['feature'].quantile(0.25)
    Q3 = df['feature'].quantile(0.75)
    IQR = Q3 - Q1
    
    outliers = df[(df['feature'] < Q1 - 1.5 * IQR) | (df['feature'] > Q3 + 1.5 * IQR)]

    → 박스플롯(boxplot) 기반 이상치 정의

     


     

    (2) Z-score 기반 탐지

    from scipy import stats
    
    z = stats.zscore(df['feature'])
    df[abs(z) > 3]

    → 정규분포를 전제한 경우, z > 3은 극단값으로 간주

     


     

    (3) 시각화 기반 탐지

    sns.boxplot(x=df['feature'])
    plt.title('Boxplot으로 보는 이상치')
    plt.show()

    또는 2D 이상치 탐색:

    sns.scatterplot(x='price', y='volume', data=df)
    plt.title('이상치 시각 탐색')

     

     


     

    5. 이상치 처리 전략

    전략설명주의사항

    제거 극단치 행 제거 이유가 확실할 때만
    로그 변환 왜도(Skew)를 줄이기 위한 처리 양수만 가능
    클리핑 상한/하한값 설정 극단 영향 완화
    비즈니스 룰 기반 라벨링 예: VIP 고객, 이상거래 플래그 마케팅·보안 분야 활용
    ⚠ 이상치는 때로 ‘문제’가 아니라 ‘인사이트’이다.
    예: 금융 사기 탐지에서 이상치는 곧 타겟(Target)이다.

     


     

    6. 실전 예제: EDA + 결측치 + 이상치 통합 적용

    # 결측치 대체
    df['Age'].fillna(df['Age'].median(), inplace=True)
    
    # 이상치 제거 (Fare 기준)
    Q1 = df['Fare'].quantile(0.25)
    Q3 = df['Fare'].quantile(0.75)
    IQR = Q3 - Q1
    df = df[(df['Fare'] >= Q1 - 1.5 * IQR) & (df['Fare'] <= Q3 + 1.5 * IQR)]

    이렇게 EDA → 결측 탐색 → 이상치 제거를 거친 후

    모델링 단계로 진입하면 데이터 신뢰도는 훨씬 높아진다.

     


     

    7. 결론: 데이터의 허점을 읽어내는 것이 진짜 실력이다

     

    많은 분석가가 복잡한 모델을 만들려고 하지만,

    실제로 모델의 성능을 결정짓는 건 데이터의 품질이다.

    이 품질은 결측과 이상치 처리에서 갈린다.

     

    결측과 이상치는 단순한 오류가 아니라, 분석의 잠재적 리스크다.

    이 허점을 먼저 찾아내고 조치할 수 있어야

    분석가로서의 신뢰를 얻을 수 있다.

     

    “결측과 이상치를 읽어내는 눈이 없다면,
    당신은 절대로 좋은 예측을 하지 못할 것이다.”

     


     

    다음 편 예고

     

    데이터 수집과 EDA 전략 시리즈 – 4화. 변수의 유형과 분석 전략: 수치형과 범주형, 처리 방식이 다르다

     

    변수는 모두 같지 않다. 숫자처럼 보이지만 범주인 경우도, 범주처럼 보여도 순위가 존재하는 경우도 있다.

    EDA에서 변수의 타입을 올바르게 분류하고 처리하는 전략을 정리한다.

    728x90
Designed by Tistory.