본문 바로가기
AI Research/Artificial Intelligence

[인공지능 기초] 결측치(Missing Value) 처리

by ga.0_0.ga 2023. 2. 28.
728x90
반응형

▶ 결측치(Missing Value)란?

결측치는 데이터상에서 표기되지 않은 값을 말합니다. 주로 NA(Not Available)로 표기됩니다.

▶ 결측치의 종류

결측 데이터를 올바르게 처리하기 위해서는 누락된 이유를 이해하는 것이 중요합니다. 어떻게 발생된 결측치인지에 따라 다른 접근방법이 필요하기 때문입니다. 결측치는 크게 3종류로 분류할 수 있습니다. 결측치의 종류를 설명하기 위해 성별로 체중을 모델링하는 경우를 예시로 들어 설명하겠습니다.

- 완전 무작위 결측(MCAR, Missing Completely At Random)

한 변수에서 발생한 결측치가 다른 변수들과 아무런 상관이 없는 경우에 해당하는 결측치입니다. 깜빡 잊고 입력이 안 된 데이터, 전산 오류로 인한 누락 데이터등이 여기에 해당합니다. 일부 응답자가 체중을 말하고, 또 다른 일부 응답자는 체중을 말하지 않았다면 체중이 누락될 확률은 성별이나 체중과 관련이 없기 때문에 이에 해당합니다. 이 결측치는 제거하거나 대규모 데이터 셋을 통한 단순 무작위 표본 추출을 통해 처리할 수 있습니다.

- 무작위 결측(MAR, Missing At Random)

누락된 데이터가 특정 변수와 관련이 있지만, 그 변수의 결과는 관계가 없는 경우에 해당하는 결측치입니다. 여성은 체중을 공개할 가능성이 적습니다. 즉, 체중이 누락될 확률은 성별에만 의존하기 때문에 이에 해당합니다.

- 비 무작위 결측(MNAR, Missing At Not Random)

1,2 번 이외의 경우에 해당하며 결츠치의 값이 다른 변수와 연관이 있는 경우를 말합니다. 무거운 사람들은 체중을 공개할 가능성이 적습니다. 즉 체중이 누락 될 확률은 체중 자체의 관찰되지 않는 값에 달려있기 때문에 이에 해당합니다.

▶ 결측치 처리 가이드라인

비율
처리 방법
10% 미만
제거 또는 imputation(대치)
10~20%
Hot deck, regression, model based imputation
20~50%
regression, model based imputation
50% 이상
해당 변수 제거

▶ Data Imputation

크게 sigle imputation과 multiple imputation으로 분류할 수 있습니다.

● Single Imputation

- 평균값 대체(Mean Imputation)

결측치가 존재하는 변수에서 결측되지 않은 나머지 값들의 평균을 내어 결측치를 대체하는 방법입니다. 이 방법을 사용하면 평균 값이 변하지 않는다는 장점이 존재합니다.

- 새로운 값으로 대체(Substitution)

해당 데이터 대신에 샘플링되지 않은 다른 데이터에서 값을 가져옵니다.

- Hot deck imputation

다른 변수에서 비슷한 값을 갖는 데이터 중에서 하나를 랜덤 샘플링하여 그 값을 가져오는 방법입니다. 결측 값이 존재하는 변수가 가질 수 있는 값의 범위가 정해져 있을 때 장점을 갖습니다. 또한 값을 랜덤하게 가져오기 때문에 어느 정도 변동성을 더해줘 표준 오차의 정확도에 어느정도 기여합니다.

- Cold deck imputation

Hot deck imputation과 비슷하지만 랜덤 샘플링을 하는 것이 아니라 어떠한 규칙에 의해 하나를 선정하는 것입니다.

- Regression imputation

결측치가 없는 변수를 feature로 사용하여 결측치가 있는 변수를 regression task를 진행하는 것입니다. 즉, 데이터 내의 다른 변수들을 기반으로 결측치를 예측하는 것입니다.

- Stochastic regression imputation

앞서 설명한 regression 방식에 random residual 값을 더해서 결측치를 예측한ㄴ 방식입니다.

- 보간법, 보외법(Interpolation, extrapolation)

같은 대상으로부터 얻은 다른 관측치로부터 결측치 부분을 추정하는 것입니다.

● Multiple Imputation

single imputation을 거친 여거 개의 데이터 셋을 만들어 평가합니다. 3가지 접근법이 존재합니다.

- 합리적 접근법

결측 값을 채우거나 재생하고자 하는 변수들 간의 관계를 이용합니다.

- 완전 제거법

결측치가 있는 행 자체를 지워버리는 방법입니다.

- 다중 대체법

가장 어려운 방법 중 하나로 하나의 관측치에 2개 이상의 결측치가 존재할 때 사용하는 방법입니다. 결측값에 대한 반복 시뮬레이션 기반 접근법입니다.

▶ 코드를 통해 결측치 활용하기

- 결측치 확인

'col'에서 결측치가 있는 부분을 반환해 줍니다. 두번 째 줄은 결측치 갯수를 반환합니다.

data['col'].isnull()
data['col'].isnull().value_counts()

 

- Deletion(제거)

목록 삭제(Listwise)와 단일값 삭제(Pairwise)방식으로 나눌 수 있습니다.

# 목록 삭제
data=data.dropna()  # 결측치가 있는 행 전부 삭제
data=data.dropna(axis=1)  # 결측치가 있는 열 전부 삭제

# 단일값 삭제
data=data.dropna(how='all')  # 행 전체가 결측치인 행만 삭제
data=data.dropna(thresh=2)   # 행의 결측치가 2개 초과인 경우 그 행만 삭제
data=data.dropna(subset=['col1', 'col2', 'col3'])  # 특정 열에 결측치가 있으면 삭제
data=data.dropna(subset=['col1', 'col2', 'col3'], how='all')  # 특정 열 모두가 결측치이면 삭제
data=data.dropna(subset=['col1', 'col2', 'col3'], thresh=2) # 특정 열에 2개초과의 결측치가 있으면 삭제

# 결측치 삭제 상태 바로 적용하기
# 결측치를 제거한 상태를 함수 사용시 바로 적용하려면 아래와 같은 방법을 사용하면 됩니다. 
# 따로 데이터 프레임 변수를 지정해서 저장하지 않고도 바로 적용됩니다.
data.dropna(inplace=True)

 

- Imputation

data.fillna(0)  # 전체 열에 있는 결측치를 0으로 대체

data['col'].fillna(0)  # 'col'열의 결측치를 0으로 대체

data['col'].fillna(data['col'].mean())  # 'col'열의 결측치를 평균값으로 대체
data['col'].fillna(data['col'].median())  # 'col'열의 결측치를 중앙값으로 대체
data['col'].fillna(data['col'].mode())  # 'col'열의 결측치를 최빈값으로 대체

data.fillna(method='pad')  # 결측치 이전 값으로 채우기
data.fillna(method='bfill) # 결측치 이후 값으로 채우기

data.replace(to_replace=np.nan, value=100) # replace함수를 이용해 nan값을 100으로 채움

# 인덱스를 무시하고 값들을 선형적으로 같은 간격으로 처리(시계열 데이터)
data.interpolate(method='linear, limit_direction='forward')
 

- 예측 모델

예측 기법을 사용하는 방법을 결측치들이 특정한 패턴을 가진다는 전제하에 진행됩니다. 결측 값이 없는 칼럼들로 구성된 데이터로 결측값 칼럼을 예측합니다. regression이나 SVM 과 같은 방법들이 사용됩니다.

- 참고 1 : https://daebaq27.tistory.com/43

- 참고 2 : https://wooono.tistory.com/103

 

728x90
반응형

댓글