시계열 데이터에서 결측치를 처리하는 것은 중요한 과제입니다. 이 글에서는 pandas의 fillna 함수를 사용하여 앞뒤 값으로 결측치를 대체하는 방법을 설명합니다. 특히 ffill과 bfill을 적절히 활용하여 결측치를 효과적으로 채우는 방법을 배울 수 있습니다.

주요내용

  • 🕒 시계열 데이터의 결측치를 처리하는 다양한 방법 중, 가장 가까운 앞뒤 값으로 대체하는 방법에 대해 알아봅니다.
  • 🛠️ pandas의 DataFrame.fillna() 함수를 사용하여 ffillbfill 방법을 적용하는 방법을 배웁니다.
  • 🚫 특정 상황에서 시계열 결측치 대체가 어려울 수 있음을 이해하고, 이를 보완하는 전략을 학습합니다.

근처값으로 대체


  • 시계열 변수 한정으로만 사용할 수 있는 방법

  • 시계열 변수의 경우 결측이 바로 이전 값 혹은 이후 값과 유사할 가능성이 높다는 특성 때문


image


관련 문법 : DataFrame.fillna()


  • 결측치를 특정 값이나 방법으로 채우는 함수

파라미터


  • value : 결측치를 대체할 값

  • method : 결측치를 대체할 방법

    • method=’ffill’ : 결측치 이전의 유효한 값 가운데 가장 가까운 값으로 채움

    • method=’bfill’ : 결측치 이후의 유효한 값 가운데 가장 가까운 값으로 채움


image


  • method=’ffill’만을 쓸 때의 맹점 : 결측치 이전에 값이 없을 때(결측치가 맨 앞의 값)

  • method=’bfill’만을 쓸 때의 맹점 : 결측치 이후에 값이 없을 때(결측치가 맨 뒤의 값)

  • 이를 보완하기 위해 두 개의 method를 동시에 써서 ffill로 값을 채워준 후 bffill로 나머지 NaN인 경우도 채워주는 함수를 쓴다.

이 코드는 ospandas 라이브러리를 임포트하고, 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을 먼저 사용하는 것이 더 바람직하다.

  • 새로 들어온 데이터의 경우 바로 뒤의 값을 참조하는 것이 어렵다.(새로 들어온 데이터 뒤에 데이터가 없기 때문)

시계열 결측치 대체(근처값 대체)를 쓰기 어려운 경우

  • 하나의 변수에만 결측치가 유독 몰려 있는 경우(특히 연속해서 결측치가 발생한 경우), 근처의 값을 가져온다고 해도 그 값이 매우 멀리 떨어진 시계열상의 값일 수 있기 때문에 이 경우에는 부적절하다.

댓글남기기