TIL/Python

인공지능의 성능을 좌우하는 데이터 전처리 - 결측치 탐지 및 처리 방법

beady 2024. 11. 29. 20:34

데이터 전처리는 인공지능과 데이터 분석 프로젝트의 핵심 단계로, 데이터를 정제하고 구조화하여 모델링에 적합한 고품질 데이터로 만드는 과정이다.

 

잘못된 데이터 처리나 전처리의 부재는 데이터의 불안정성과 부정확성을 초래해 모델 성능을 저하시킬 수 있다.

 

대부분의 실제 데이터는 결측값, 이상치, 중복 등의 문제를 포함하고 있어 이를 해결하지 않으면 인공지능의 학습에 부정적 영향을 미쳐 예측 성능을 크게 떨어뜨리게 된다.

 

데이터 전처리는 결국 모델의 성능을 좌우하며, 인공지능의 성공적인 활용을 위해 반드시 필요한 작업이다.

 

이러한 데이터 전처리에는 여러 가지 방법이 있으며, 오늘은 그 중에서 결측치를 처리하는 방법에 대해 알아보고자 한다.

 

 

1. 결측치 탐지

결측치 : 데이터가 누락되거나 기록되지 못한 상황으로 인해 데이터에 값이 없는 것(ex. NA / Null / NaN)

 

- isna() 또는 isnull() 함수로 결측치 여부 확인하기

import pandas as pd

data = {
    '이름': ['철수', '영희', '민수', '지수'],
    '나이': [25, 30, None, 35],
    '직업': ['학생', '회사원', '학생', None]
}
df = pd.DataFrame(data)
df
'''
   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0   회사원
2  민수   NaN    학생
3  지수  35.0  None
'''

df.isna() # df.isnull()도 동일한 기능을 함
'''
   이름     나이     직업
0  False  False  False
1  False  False  False
2  False   True  False
3  False  False   True
'''

 

 

- sum()을 사용해 결측치 개수 확인하기

df.isna().sum() # 컬럼별로 결측치(True) 개수의 합 반환
'''
이름    0
나이    1
직업    1
dtype: int64
'''

※ 파이썬에서는 True = 1, False = 0으로 간주됨

 

 

- dropna() 함수를 사용해 결측치 제거하기

df.dropna() # df에서 결측치가 있는 행 제거
'''
   이름    나이   직업
0  철수  25.0   학생
1  영희  30.0  회사원
'''

df.dropna(axis=1) # 결측치가 있는 열을 제거하려면, axis=1 을 지정
'''
   이름
0  철수
1  영희
2  민수
3  지수
'''

 

 

- fillna() 함수를 사용해 결측치 대체하기

df.fillna('없음') # 결측치를 '없음'으로 대체
'''
   이름    나이   직업
0  철수  25.0   학생
1  영희  30.0  회사원
2  민수    없음   학생
3  지수  35.0   없음
'''

df['나이'] = df['나이'].fillna(df['나이'].mean()) # '나이'열의 결측치를 평균값으로 대체
df
'''
   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0   회사원
2  민수  30.0    학생
3  지수  35.0  None
'''

 

 

- interpolate() 함수를 사용해 주변 값들을 기반으로 결측치 보간하기

data = {
    '날짜': pd.date_range('2023-01-01', periods=5),
    '온도': [20, 22, None, 24, 25]
}
df2 = pd.DataFrame(data)
print(df2)
'''
          날짜    온도
0 2023-01-01  20.0
1 2023-01-02  22.0
2 2023-01-03   NaN
3 2023-01-04  24.0
4 2023-01-05  25.0
'''

# 결측치 채우기(선형 보간법)
df2['온도'] = df2['온도'].interpolate()
print(df2)
'''
          날짜    온도
0 2023-01-01  20.0
1 2023-01-02  22.0
2 2023-01-03  23.0
3 2023-01-04  24.0
4 2023-01-05  25.0
'''

 

 

- 특정 조건을 기반으로 결측치 처리하기

print(df)
'''
   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0   회사원
2  민수   NaN    학생
3  지수  35.0  None
'''

# '직업'이 '학생'인 경우에 '나이'가 결측치가 아닌 데이터
df.loc[(df['직업'] == '학생') & (~df['나이'].isna()), '나이']
'''
0    25.0
2    30.0
Name: 나이, dtype: float64
'''

# '직업'이 '학생'인 경우 '나이'의 결측치를 20으로 채우기
'''
   이름    나이    직업
0  철수  25.0    학생
1  영희  30.0   회사원
2  민수  20.0    학생
3  지수  35.0  None
'''

 

 

 

결측치를 채우는 코드는 비교적 간단하지만, 적절한 결측치를 찾는것은 어려운 문제이다.

즉, 어떻게 결측치를 채울지가 훨씬 중요한 문제이며 데이터의 특성과 논리적 흐름을 판단해서 가장 적당한 결측치를 찾는 것이 중요하다.

잘 처리된 결측치를 기반으로 만들어진 모델은 정말 좋은 성능을 낸다고 한다.

그러므로 결측치에 대한 고려를 상세하게 가져가야 한다.