시계열 데이터에서 결측치를 처리하는 것은 중요한 과제입니다. 이 글에서는 pandas의 fillna 함수를 사용하여 앞뒤 값으로 결측치를 대체하는 방법을 설명합니다. 특히 ffill과 bfill을 적절히 활용하여 결측치를 효과적으로 채우는 방법을 배울 수 있습니다.
주요내용
- 🕒 시계열 데이터의 결측치를 처리하는 다양한 방법 중, 가장 가까운 앞뒤 값으로 대체하는 방법에 대해 알아봅니다.
- 🛠️ pandas의
DataFrame.fillna()
함수를 사용하여ffill
과bfill
방법을 적용하는 방법을 배웁니다. - 🚫 특정 상황에서 시계열 결측치 대체가 어려울 수 있음을 이해하고, 이를 보완하는 전략을 학습합니다.
근처값으로 대체
-
시계열 변수 한정으로만 사용할 수 있는 방법
-
시계열 변수의 경우 결측이 바로 이전 값 혹은 이후 값과 유사할 가능성이 높다는 특성 때문
관련 문법 : DataFrame.fillna()
- 결측치를 특정 값이나 방법으로 채우는 함수
파라미터
-
value : 결측치를 대체할 값
-
method : 결측치를 대체할 방법
-
method=’ffill’ :
결측치 이전
의 유효한 값 가운데가장 가까운 값
으로 채움 -
method=’bfill’ :
결측치 이후
의 유효한 값 가운데가장 가까운 값
으로 채움
-
-
method=’ffill’만을 쓸 때의 맹점 : 결측치 이전에 값이 없을 때(결측치가 맨 앞의 값)
-
method=’bfill’만을 쓸 때의 맹점 : 결측치 이후에 값이 없을 때(결측치가 맨 뒤의 값)
-
이를 보완하기 위해 두 개의 method를 동시에 써서 ffill로 값을 채워준 후 bffill로 나머지 NaN인 경우도 채워주는 함수를 쓴다.
이 코드는 os
와 pandas
라이브러리를 임포트하고, Python 경고 메시지를 필터링하여 불필요한 경고 표시를 생략합니다. 또한, 현재 작업 경로를 변수 a
에 할당하고, os.chdir
함수를 사용하여 파일 로드 경로를 현재 작업 경로로 설정합니다.
1
2
3
4
5
6
7
8
9
import os
import pandas as pd
# 불필요한 경고 표시를 생략합니다.
import warnings
warnings.filterwarnings(action = 'ignore')
a=%pwd # 현재 작업 경로를 변수 a에 할당합니다.
os.chdir(a) # 현재 작업 경로로 파일 로드 경로를 설정합니다.
이 함수는 pd.read_excel()
을 사용하여 “AirQuality.xlsx” 파일을 읽고, 이를 DataFrame
객체로 변환합니다. 이 과정을 통해, Excel 파일에 저장된 공기 질 데이터를 분석하거나 처리하기 위한 초기 단계로 활용할 수 있습니다.
1
2
# AirQuality.xlsx 파일을 읽어서 DataFrame으로 로드합니다.
df = pd.read_excel("AirQuality.xlsx")
이 함수는 데이터프레임 df
에서 각 열의 결측치 개수를 계산합니다. isnull()
메서드는 데이터프레임의 각 셀이 결측치인지 여부를 나타내는 불리언 데이터프레임을 반환합니다. 이후 sum()
메서드를 사용하여 각 열에 있는 True
값(결측치를 나타냄)의 개수를 합산하여 결측치의 총 개수를 계산합니다.
1
2
# 각 변수의 결측치 개수 확인
df.isnull().sum()
앞의 값 or 뒤의 값으로 결측치 채우기
-
데이터를 train_test_split을 이용하여 임의로 분할한 경우에는 적용이 불가능
-
분할하기 전에 결측치 대체가 가능한 유일한 케이스
결측치를 처리하는 방법으로, fillna
함수를 두 번 연속 사용하여 먼저 앞의 값('ffill'
)으로 결측치를 채우고, 그 후에도 결측치가 남아있다면 뒤의 값('bfill'
)으로 채우는 방식을 적용합니다. 이 접근법은 데이터의 연속성을 유지하면서 결측치를 효과적으로 처리할 수 있는 방법을 제공합니다.
1
df = df.fillna(method = 'ffill').fillna(method = 'bfill') # 결측치를 앞의 값으로 채운 후, 여전히 결측치인 경우 뒤의 값으로 채웁니다.
이 함수는 데이터프레임 df
내의 모든 결측값을 찾아 그 합을 반환합니다. isnull()
메소드는 각 셀이 결측값인지 아닌지를 불리언 값으로 반환하며, sum()
메소드는 이 불리언 값을 합하여 결측값의 총 개수를 계산합니다.
1
df.isnull().sum() # 데이터프레임에서 결측값의 합을 계산합니다.
bfill을 먼저 쓰고 ffill을 나중에 쓰면 안되는걸까?
단계별로 생각해 봅시다.
-
ffill을 먼저 사용하는 것이 더 바람직하다.
-
새로 들어온 데이터의 경우 바로 뒤의 값을 참조하는 것이 어렵다.(새로 들어온 데이터 뒤에 데이터가 없기 때문)
시계열 결측치 대체(근처값 대체)를 쓰기 어려운 경우
- 하나의 변수에만 결측치가 유독 몰려 있는 경우(특히 연속해서 결측치가 발생한 경우), 근처의 값을 가져온다고 해도 그 값이 매우 멀리 떨어진 시계열상의 값일 수 있기 때문에 이 경우에는 부적절하다.
댓글남기기