본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
실전에서 바로 쓰는 시계열 데이터 처리와 분석 in R/못다한 이야기

시계열 데이터의 결측치(Missing value) 처리 in R - part 1

by 아참형인간 2022. 9. 8.
ts.knit

결측치란?

시계열 데이터는 일정한 시간적 간격으로 기록된 데이터를 말한다. 연도별 시계열 데이터나 분기별, 월별 시계열 데이터의 경우는 그 시간적 간격이 크기 때문에 측정치간의 결측치가 비교적 적지만 주별, 일별 데이터나 그보다 작은 시간간격의 시계열 데이터에는 중간 중간 측정값이 누락되어 있는 경우가 많다. 이렇게 일정한 간격으로 값이 있어야하는 시간 간격에 측정치가 누락된 것을 결측치(Missing Value)라고 한다.

사실 이러한 결측치는 시계열 데이터가 아닌 어떤 데이터 셋에서도 존재한다. 하지만 시계열 데이터에는 시간이라는 일정한 선형 변수를 지니기 때문에 다른 데이터 셋의 결측치와는 다소 다르게 처리된다.

이러한 결측치는 시계열 데이터의 시각화나 모델링에 영향을 미치기 때문에 적절히 처리해줄 필요가 있다.

이번 포스트에서는 시계열 데이터의 결측치 처리 방법 중 ts 클래스에 따라 살펴보도록 하겠다.

ts

ts 클래스의 결측치를 처리하는데에는 imputeTS 패키지를 사용하면 쉽게 처리된다. imputeTS에서 제공하는 주요 기능은 다음과 같다.

데이터 Import

결측치 처리를 위해 사용하는 데이터는 imputeTS 패키지에서 제공하는 tsAirgap 데이터 셋을 사용하도록 하겠다.

if (!require(imputeTS)) {
  install.packages('imputeTS')
  library(imputeTS)
}
tsAirgap 
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129  NA 135 148 148  NA 119 104 118
## 1950 115 126 141 135 125 149 170 170  NA 133  NA 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234  NA 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277  NA  NA  NA 374 413 405 355 306 271 306
## 1957 315 301 356 348 355  NA 465 467 404 347  NA 336
## 1958 340 318  NA 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362  NA
## 1960 417 391 419 461  NA 535 622 606 508 461 390 432

시각화 함수

imputeTS 패키지는 그 자체에서 ggplot2 기반의 시각화 함수를 제공한다. 다음은 imputeTS 패키지에서 제공하는 시각화 함수이다.

  • ggplot_na_distribution() : 시계열 데이터에서 결측치의 분포를 보여주는 시각화 함수
tsAirgap |> ggplot_na_distribution()

  • ggplot_na_imputations() : 결측치가 보정된 시계열 데이터에 대한 시각화 함수. 원 시계열 데이터와 보정된 시계열 데이터를 매개변수로 전달하면 보정값을 표시함.
imputation <- tsAirgap |> na_interpolation(option = 'linear')

tsAirgap |> ggplot_na_imputations(imputation)

결측치 대체 함수

ts 클래스로 만들어진 시계열 데이터의 결측 부분에 값을 대체하는 기능으로 imputeTS 패키지에서 제공하는 함수는 다음과 같다.

  • na_interpolation() : 선형(linear), 스플라인(spline), 스틴만(stine) 보간법을 사용하여 결측치를 만들어 이 값을 채워 넣는 함수
imputation <- tsAirgap |> na_interpolation(option = 'linear')

imputation
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
## 1949 112.00 118.00 132.00 129.00 132.00 135.00 148.00 148.00 133.50 119.00
## 1950 115.00 126.00 141.00 135.00 125.00 149.00 170.00 170.00 151.50 133.00
## 1951 145.00 150.00 178.00 163.00 172.00 178.00 199.00 199.00 184.00 162.00
## 1952 171.00 180.00 193.00 181.00 183.00 218.00 230.00 242.00 209.00 191.00
## 1953 196.00 196.00 236.00 235.00 229.00 243.00 264.00 272.00 237.00 211.00
## 1954 204.00 188.00 235.00 227.00 234.00 268.00 302.00 293.00 259.00 229.00
## 1955 242.00 233.00 267.00 269.00 270.00 315.00 364.00 347.00 312.00 274.00
## 1956 284.00 277.00 301.25 325.50 349.75 374.00 413.00 405.00 355.00 306.00
## 1957 315.00 301.00 356.00 348.00 355.00 410.00 465.00 467.00 404.00 347.00
## 1958 340.00 318.00 333.00 348.00 363.00 435.00 491.00 505.00 404.00 359.00
## 1959 360.00 342.00 406.00 396.00 420.00 472.00 548.00 559.00 463.00 407.00
## 1960 417.00 391.00 419.00 461.00 498.00 535.00 622.00 606.00 508.00 461.00
##         Nov    Dec
## 1949 104.00 118.00
## 1950 136.50 140.00
## 1951 146.00 166.00
## 1952 172.00 194.00
## 1953 180.00 201.00
## 1954 203.00 229.00
## 1955 237.00 278.00
## 1956 271.00 306.00
## 1957 341.50 336.00
## 1958 310.00 337.00
## 1959 362.00 389.50
## 1960 390.00 432.00
ggplot_na_imputations(tsAirgap, imputation)

imputation <- tsAirgap |> na_interpolation(option = 'spline')

imputation
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 127.4371 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 271.5019 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 282.3799 301.4650 332.5677 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 409.5555 465.0000 467.0000
## 1958 340.0000 318.0000 327.7336 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.0000 461.0000 485.0764 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 137.4742 119.0000 104.0000 118.0000
## 1950 151.3445 133.0000 131.6738 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 229.0000 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 328.9605 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 388.0346
## 1960 508.0000 461.0000 390.0000 432.0000
ggplot_na_imputations(tsAirgap, imputation)

  • na_kalman() : 칼만 필터 방법을 사용하여 결측치를 채우는 값을 산정하는 함수
imputation <- tsAirgap |> na_kalman()

imputation
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 123.5734 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 260.8078 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 312.6060 311.6160 311.0830 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 414.6160 465.0000 467.0000
## 1958 340.0000 318.0000 382.6912 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.0000 461.0000 452.5683 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 132.7833 119.0000 104.0000 118.0000
## 1950 157.1427 133.0000 130.8971 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 229.0000 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 298.6147 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 390.9089
## 1960 508.0000 461.0000 390.0000 432.0000
ggplot_na_imputations(tsAirgap, imputation)

  • na_locf() : 바로 이전 값을 결측치에 채워넣는 함수
imputation <- tsAirgap |> na_locf()

imputation
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 129 135 148 148 148 119 104 118
## 1950 115 126 141 135 125 149 170 170 170 133 133 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 234 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 277 277 277 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 355 465 467 404 347 347 336
## 1958 340 318 318 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 362
## 1960 417 391 419 461 461 535 622 606 508 461 390 432
ggplot_na_imputations(tsAirgap, imputation)

  • na_ma() : 이동 평균을 결측치에 채워넣는 함수, 매개변수 k의 값으로 이동평균 범위(Moving Average Window)를 설정함. k가 2라면 왼쪽으로 2개, 오른쪽으로 2개의 관측치에 대한 이동평균을 사용
imputation <- tsAirgap |> na_ma(k = 2)

imputation
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 134.6667 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 265.3333 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 279.3333 325.5000 387.0000 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 409.1667 465.0000 467.0000
## 1958 340.0000 318.0000 339.1667 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.0000 461.0000 505.5000 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 131.0000 119.0000 104.0000 118.0000
## 1950 155.2000 133.0000 138.2000 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 229.0000 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 351.6667 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 392.6667
## 1960 508.0000 461.0000 390.0000 432.0000
ggplot_na_imputations(tsAirgap, imputation)

  • na_mean() : 전체 값의 평균(중간값, 조화평균, 기하평균)을 사용하여 결측치를 채워 넣는 함수
imputation <- tsAirgap |> na_mean()

imputation
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 279.8168 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 279.8168 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 279.8168 279.8168 279.8168 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 279.8168 465.0000 467.0000
## 1958 340.0000 318.0000 279.8168 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.0000 461.0000 279.8168 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 279.8168 119.0000 104.0000 118.0000
## 1950 279.8168 133.0000 279.8168 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 229.0000 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 279.8168 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 279.8168
## 1960 508.0000 461.0000 390.0000 432.0000
ggplot_na_imputations(tsAirgap, imputation)

imputation <- tsAirgap |> na_mean(option = 'median')

imputation
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 259 135 148 148 259 119 104 118
## 1950 115 126 141 135 125 149 170 170 259 133 259 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 259 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 259 259 259 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 259 465 467 404 347 259 336
## 1958 340 318 259 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 259
## 1960 417 391 419 461 259 535 622 606 508 461 390 432
ggplot_na_imputations(tsAirgap, imputation)

  • na_remove() : 결측치를 모두 제거해주는 함수. 결과값은 ts 클래스가 아닌 vector로 반환
imputation <- tsAirgap |> na_remove()

imputation
##   [1] 112 118 132 129 135 148 148 119 104 118 115 126 141 135 125 149 170 170
##  [19] 133 140 145 150 178 163 172 178 199 199 184 162 146 166 171 180 193 181
##  [37] 183 218 230 242 209 191 172 194 196 196 236 235 229 243 264 272 237 211
##  [55] 180 201 204 188 235 227 234 302 293 259 229 203 229 242 233 267 269 270
##  [73] 315 364 347 312 274 237 278 284 277 374 413 405 355 306 271 306 315 301
##  [91] 356 348 355 465 467 404 347 336 340 318 348 363 435 491 505 404 359 310
## [109] 337 360 342 406 396 420 472 548 559 463 407 362 417 391 419 461 535 622
## [127] 606 508 461 390 432
  • na_seadec() : 시계열에서 계절성을 제거하여 결측치를 만들고 이후 계절성을 다시 추가하여 결측치를 보정.
imputation <- tsAirgap |> na_seadec()

imputation
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 121.3941 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 274.9995 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 321.8776 321.4178 329.4329 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 424.1798 465.0000 467.0000
## 1958 340.0000 318.0000 357.2362 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.0000 461.0000 477.2415 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 131.6204 119.0000 104.0000 118.0000
## 1950 149.7682 133.0000 113.0095 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 229.0000 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 305.0315 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 398.3917
## 1960 508.0000 461.0000 390.0000 432.0000
ggplot_na_imputations(tsAirgap, imputation)

  • na_seasplit() : 시계열을 계절성에 따라 분할한 후 분할된 시계열 데이터 세트 개별적으로 결측치를 채워 넣음.
imputation <- tsAirgap |> na_seasplit()

imputation
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 1949 112.0 118.0 132.0 129.0 125.0 135.0 148.0 148.0 184.0 119.0 104.0 118.0
## 1950 115.0 126.0 141.0 135.0 125.0 149.0 170.0 170.0 184.0 133.0 125.0 140.0
## 1951 145.0 150.0 178.0 163.0 172.0 178.0 199.0 199.0 184.0 162.0 146.0 166.0
## 1952 171.0 180.0 193.0 181.0 183.0 218.0 230.0 242.0 209.0 191.0 172.0 194.0
## 1953 196.0 196.0 236.0 235.0 229.0 243.0 264.0 272.0 237.0 211.0 180.0 201.0
## 1954 204.0 188.0 235.0 227.0 234.0 279.0 302.0 293.0 259.0 229.0 203.0 229.0
## 1955 242.0 233.0 267.0 269.0 270.0 315.0 364.0 347.0 312.0 274.0 237.0 278.0
## 1956 284.0 277.0 311.5 308.5 312.5 374.0 413.0 405.0 355.0 306.0 271.0 306.0
## 1957 315.0 301.0 356.0 348.0 355.0 404.5 465.0 467.0 404.0 347.0 290.5 336.0
## 1958 340.0 318.0 381.0 348.0 363.0 435.0 491.0 505.0 404.0 359.0 310.0 337.0
## 1959 360.0 342.0 406.0 396.0 420.0 472.0 548.0 559.0 463.0 407.0 362.0 384.5
## 1960 417.0 391.0 419.0 461.0 420.0 535.0 622.0 606.0 508.0 461.0 390.0 432.0
ggplot_na_imputations(tsAirgap, imputation)

댓글