데이터 전처리 - 결측치 처리

shyoon·2023년 6월 27일
1

머신러닝

목록 보기
1/11

✍Data Cleansing 이란?

데이터 정제(Data Cleansing)은 데이터 분석 목적에 부합하는 데이터 품질을 확보하기 위한 일체의 데이터 작업으로 데이터 분석 작업의 약 80% 수준이 데이터 수집 및 전처리 작업이라고 보아도 무방하다.

check list

  • 데이터 전처리 과정

    • 주어진 데이터에 어떠한 문제가 있는지 확인
    • 데이터 분석 결과에 직접적인 성능 차이를 야기하므로 반드시 수행 필요
    • 잘못 측정되고 불필요한 데이터를 제거할 수 있어야 함.
  • data cleansing의 주요 5단계
    1. 데이터 베이스 정의
    2. 불량 데이터의 원인 찾기
    3. 우선순위 매기기
    4. 데이터 베이스에 들어오는 불량 데이터 막기
    5. 불량 데이터 제거

  • 데이터 오류 확인

    • 결측치(Missing Value)
      • 다양한 대체법을 이용할 수 있으나 결측값이 너무 많지 않은 이상 삭제하고 진행하기도 한다.
    • 노이즈(Noise)
    • 이상값(Outlier)
      • 반면, 노이즈와 이상값은 무작정 지우고 진행할 것이 아닌, 적합시켜야 하는 귀중한 데이터이다.

결측치 문제 처리

✍결측치란?

  • 수집된 데이터 셋 중 관측되지 않은 특정 확률변수의 값을 의미한다.
  • 값의 특성은 0, NaN(Not Available) 이며 발생 시 잘못된 분석 결과를 낳거나 분석 시 코드 대입 경우 에러가 발생할 수 있다.
  • 결측치 발생 사유
    • 설문 조사 시 사람들이 특정 질문에 응답하지 않았을 때
    • 실수로 값을 입력하지 않은 경우
    • 특정 개체 종이 희귀해서 발견되지 않았을 때
    • EHR 등에서 사망한 사람의 데이터가 빠졌을 때
    • 다른 값들에 비해 측정하기 쉬운 값이 있을 때
    • 데이터 접근 오류 등등 다양한 사유가 존재한다.

결측치 종류

  • MCAR (완전 무작위 결측)
    • 결측치가 완전히 random으로 발생
    • 특정 변수와 연관성이 없음
    • 변수의 관측치와 결측치에 모두 독립
    • 결측치 대체 전후의 분포 변화 없음
    • 관측치가 많다면 지우는 것도 방법이다.
    • ex) 센서 오류, TCP통신 중 데이터 누락
  • MAR (무작위 결측)

    • 결측치는 random으로 발생
    • 특정 변수값에 따른 조건부 발생 가능
    • 다양한 결측치 대체 기법으로 추정 가능
    • ex) 해시계 (밤 되면 측정 불가) -> 원인이 분명히 존재!
  • MNAR (비 무작위 결측)

    • 결측치는 임의로 발생하지 않음
    • 관측값과 결측값 모두에 영향을 받음
    • 결측치 원인을 특정 짓기 어렵고, 단순 결측치 대체법 만으로는 해결하기 어려움
    • 분명한 결측 사유가 존재하지만, 비정상적이며 그 원인을 찾기가 쉽지 않은 경우
    • ex) 응답자들이 고의로 자신을 감추고 사실과 다른 응답을 하는 경우
  • 구분 방법

처음에는 이게 무슨 차이인가 싶지만, MCAR에서 발생한 결측치는 완전 무작위로 발생한 것이 자명하기 때문에 제거해도 무방한 이상적인 경우이다. 반면, MAR와 MNAR는 분명한 인과관계 때문에 생긴 결측치 이지만, MAR는 그 원인이 뚜렷한 상태이고, MNAR는 그 원인도 알 수 없다는 차이점이 있다.

결측치 대체 방법

단순 대치법

  • 완전 분석법(Complete Analysis)
    • 결측치가 포함된 특정 자료를 모두 무시하고 완전하게 관측된 자료만으로 데이터 분석에 필요한 데이터 셋을 구성하는 방법
    • 분석이 간편하지만, 관측치 부족 시에는 분석 기법에 대한 근거 미약
# 완전 분석법 예시 코드
import pandas as pd

# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
                   'B': [5, None, 7, 8]})

# 결측치가 있는 행 제거
df.dropna(inplace=True)

# 결측치가 있는 열 제거
df.dropna(axis=1, inplace=True)
  • 평균 대치법(Average Imputation)
    • 관측 변수의 평균값으로 결측값을 대체하는 방법
    • 평균, 중앙값, 최빈값 모두 사용 가능
    • 분석이 간편하고 결측치 포함 관측치를 지우지 않아 좋으나 통계량의 변량을 과소 추정하는 문제 발생 -> 데이터가 왜곡 될 수 있음
# 평균 대치법 예시 코드
import pandas as pd

# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
                   'B': [5, None, 7, 8]})

# 열의 평균값 계산
mean_A = df['A'].mean()
mean_B = df['B'].mean()

# 결측치를 평균값으로 대체
df['A'].fillna(mean_A, inplace=True)
df['B'].fillna(mean_B, inplace=True)
  • 단순 확률 대치법(Single Stochastic Imputation)
    • 평균 대치법에서 추정량 표준오차의 과소 추정문제를 보완하고자 고완된 방법
    • 알고 있는 정보나 주어진 데이터를 기반으로 사건에 대한 확률 추정, 값을 부여한 후 대치하는 방법
    • 단순 삭제나 평균 대치법보다 정확도가 높으나, 모든 상황에 적합하다고 볼 순 없음
# 단순 확률 대치법 예시 코드
import pandas as pd
import numpy as np

# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [5, np.nan, 7, 8],
                   'C': [np.nan, 2, 6, 8]})

# 각 열의 결측치 개수 확인
missing_counts = df.isnull().sum()

# 각 열의 결측치를 해당 열의 랜덤 데이터로 대체
for col in df.columns:
    if missing_counts[col] > 0:
        col_data = df[col].dropna()  # 결측치가 아닌 데이터 추출
        fill_values = np.random.choice(col_data, size=missing_counts[col])  # 랜덤으로 대체값 선택
        df[col].fillna(pd.Series(fill_values, index=df.index), inplace=True)

다중 대치법

  • N번의 단순 대치법을 반복 수행 - N개의 독립 데이터 셋 만들어 활용
  • bias가 높고 정확도 성능 부족한 단순 대치법의 한계 극복
  • 대치 적용 > 분석 > 결과 병합 단계 수행
  • 반복적인 예측 과정을 통해 결측치를 추정하므로 결과는 매번 달라질 수 있음
# 다중 대치법 예시 코드
import pandas as pd
from sklearn.impute import IterativeImputer

# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
                   'B': [5, None, 7, 8],
                   'C': [2, 4, 6, None]})

# 다중 대치법 모델 생성
imputer = IterativeImputer()

# 결측치 대체
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)

References

profile
큰 사람이 되겠어요

0개의 댓글