Deteksi Anomali pada Time Series/Deret Waktu

By | November 28, 2021
Print Friendly, PDF & Email
1,438 Views

— Deteksi Anomali Data – adalah hal yang sangat penting sebagai early warning system, salah satu yang kejadian yang tak enak dialami oleh saya pribadi yaitu tagihan PDAM dan listrik yang tiba-tiba melonjak beberapa kali lipat padahal tidak ada beban kerja/tambahan alat listrik dirumah. Lebih menjengkelkan lagi ketika tagihan itu bersifat payroll alias bayar otomatis maka tagihan yang sudah dibayar tidak akan bisa dikembalikan tapi dikompensasi pada bulan-bulan selanjutnya yaitu hanya membayar beban saja. Kalian bisa lihat grafik penggunaan di PLN mobile dibawah ini yang naik 5 kali lipat!

usut punya usut ternyata petugas CS nya salah masukan ID sehingga tertukar! tapi ini keterlaluan sekali! naik hampir 5 kali lipat! anomali data tersebut karena human error dan itu tidak diketahui sampai saya melapor bahwa aneh sekali naik drastis!

Seharusnya aplikasi tersebut akan melakukan warning ketika terjadi penggunaan diluar kebiasan misalkan diberikan pertanyaan, apakah yakin bahwa data yang telah dimasukan telah benar? sehingga tidak blong macam bus nyelonong ke jurang

Apa itu deteksi anomali data

Deteksi anomali (alias analisis outlier/pencilan) adalah langkah dalam penambangan data yang mengidentifikasi titik data, peristiwa, dan/atau pengamatan yang menyimpang dari perilaku normal kumpulan data. Data anomali dapat menunjukkan insiden kritis, seperti kesalahan teknis, atau peluang potensial, misalnya perubahan perilaku konsumen, alat mesin rusak sehingga sensor bacanya salah. Contoh kegunaan deteksi anomali

  1. Anomali data pada data sales / marketing sangat bermanfaat untuk deteksi perubahan perilaku konsumen
  2. perubahan tiba2 permukaan tinggi air laut merupakan early warning system terjadinya tsunami
  3. perubahan suhu pada PHE plate heat exchanger yang menandakan terjadinya kebocoran plate

Sehingga kita dapat menyimpulkan bahwa anomali adalah data yang menyimpang / berperilaku secara ekstrims

Tiga jenis anomali deret waktu / time series

Memahami jenis outlier yang dapat diidentifikasi oleh sistem deteksi anomali sangat penting untuk mendapatkan nilai maksimal dari insight yang dihasilkan. Secara umum, anomali dalam data terbagi dalam tiga kategori utama — outlier global, outlier kontekstual, dan outlier kolektif.

1. Global outliers

Juga dikenal sebagai anomali titik, outlier ini ada jauh di luar keseluruhan kumpulan data.

2. Contextual outliers

Juga disebut outlier bersyarat, anomali ini memiliki nilai yang menyimpang secara signifikan dari titik data lain yang ada dalam konteks yang sama. Anomali dalam konteks satu set data mungkin tidak menjadi anomali di yang lain. Pencilan ini umum dalam data deret waktu karena kumpulan data tersebut adalah catatan jumlah tertentu dalam periode tertentu. Nilai ada dalam ekspektasi global tetapi mungkin tampak tidak wajar dalam pola data musiman tertentu.

3. Collective outliers

Ketika subset dari titik data dalam satu set adalah anomali untuk seluruh dataset, nilai-nilai tersebut disebut outlier kolektif. Dalam kategori ini, nilai individu tidak anomali secara global atau kontekstual. Kalian mulai melihat jenis outlier ini ketika memeriksa deret waktu yang berbeda bersama-sama. Perilaku individu tidak boleh menyimpang dari rentang normal dalam kumpulan data deret waktu tertentu. Tetapi ketika digabungkan dengan kumpulan data deret waktu lain, anomali yang lebih signifikan menjadi jelas.

ref: https://www.anodot.com/blog/what-is-anomaly-detection/

Studi Kasus deteksi anomali pada time series/deret waktu

Deteksi anomali pada data mining / time series secara umum terdiri dari 3 langkah.

  1. Dekomposisi deret waktu menjadi variabel yang mendasarinya; Tren, Musiman, Residu.
  2. Buat ambang batas atas dan bawah dengan beberapa nilai ambang batas
  3. Identifikasi titik data yang berada di luar ambang batas sebagai anomali.

Contoh deteksi anomali secara gampang mengimplementasikan algoritma diatas, kita gunakan saja RStudio yang merupakan tools daily driver setiap kali saya mengolah data di kantor. Oiya bagi kalian ingin mengenal time series di RStudio bisa baca disini.

Dataset penggunaan konsumsi listrik konsumsi listrik rumah tangga menurut tipe tempat tinggal (dalam GWh)

konsumsi listrik

Konsumsi Listrik

Generated by wpDataTables

Package yang dibutuhkan di RStudio yaitu

pkg <- c('tidyverse','tibbletime','anomalize','timetk','Rcpp')
install.packages(pkg)
library(tidyverse)
library(tibbletime)
library(anomalize)
library(timetk)

Kalian bisa lihat column month yang kurang betul, maka kita harus melakukan beberapa penyesuaian

df <- read.csv("konsumsi listrik.csv")
head(df,5)

# Change Factor to Date format
df$month <- paste(df$month, "01", sep="-")
# Select only relevant columns in a new dataframe
df$month <- as.Date(df$month,format="%Y-%m-%d")

Sebenarnya kita hanya butuh 2 kolom saja koq, yaitu overall dan month

df <- df %>% select(month,overall)

overall yaitu konsumsi total langkah selanjutnya yaitu convert ke tibble

# Convert df to a tibble
df <- as_tibble(df)

Analisis anomali data menggunakan kode berikut

df_anomalized <- df %>%
    time_decompose(overall, merge = TRUE) %>%
    anomalize(remainder) %>%
    time_recompose()
df_anomalized %>% glimpse()

hasil

Rows: 187
Columns: 11
$ month         <date> 2005-01-01, 2005-02-01, 2005-03-01, 2005-~
$ overall       <dbl> 447.8, 437.1, 479.7, 533.6, 535.0, 560.2, ~
$ observed      <dbl> 594.1, 613.6, 598.2, 653.1, 670.5, 692.3, ~
$ season        <dbl> -49.042054, -57.804668, -68.694194, -8.182~
$ trend         <dbl> 653.2240, 649.2442, 645.2645, 641.2847, 63~
$ remainder     <dbl> -10.08193526, 22.16043161, 21.62971004, 19~
$ remainder_l1  <dbl> -92.75975, -92.75975, -92.75975, -92.75975~
$ remainder_l2  <dbl> 87.52123, 87.52123, 87.52123, 87.52123, 87~
$ anomaly       <chr> "No", "No", "No", "No", "No", "No", "No", ~
$ recomposed_l1 <dbl> 511.4222, 498.6798, 483.8105, 540.3427, 57~
$ recomposed_l2 <dbl> 691.7032, 678.9608, 664.0915, 720.6237, 75~

Plot Data anomali

Pusing dah bacanya, dari 1 kolom kok jadi 11 kolom, yuk kita plotkan saja menggunakan kode berikut

df_anomalized %>% plot_anomalies(ncol = 3, alpha_dots = 0.75)

nah nongol deh pencilan/outiler datanya

Penyesuaian Trend and Seasonality

Kita perjelas lagi, Dengan anomalize, mudah bagi kita untuk melakukan penyesuaian karena semuanya dilakukan dengan informasi tanggal atau DateTime sehingga kalian dapat secara intuitif memilih peningkatan menurut rentang waktu yang masuk akal (misalnya “5 menit” atau “1 bulan”).

Pertama, perhatikan bahwa frekuensi dan tren dipilih secara otomatis untuk kita. Frekuensi argumen = “otomatis” dan tren = “otomatis” adalah default. Kita dapat memvisualisasikan dekomposisi ini menggunakan plot_anomaly_decomposition().

p1 <- df_anomalized %>%
    plot_anomaly_decomposition() +
    ggtitle("Freq/Trend = 'auto'")
p1

Package timetk untuk Deteksi Anomali

Biar lebih mudah, kita pakai package yang lain yaitu timetk saja

df %>% timetk::plot_anomaly_diagnostics(month,overall, .facet_ncol = 2)

Deteksi Anomali pada Time Series/Deret Waktu jadi lebih jelas

Ada 4 makhluk bernama outlier/pencilan data, penasaran bukan? kita tampilkan saja data tersebut

pencilan = df %>% timetk::tk_anomaly_diagnostics(month, overall) %>% filter(anomaly=='Yes')

hasil Deteksi Anomali pada Time Series/Deret Waktu pada konsumsi listrik yaitu

# A tibble: 4 x 11
  month      observed season trend remainder seasadj remainder_l1 remainder_l2
  <date>        <dbl>  <dbl> <dbl>     <dbl>   <dbl>        <dbl>        <dbl>
1 2005-01-01     448.  -49.0  606.     -109.    497.        -92.8         87.5
2 2005-02-01     437.  -57.8  602.     -108.    495.        -92.8         87.5
3 2020-06-01     870.   59.0  602.      208.    811.        -92.8         87.5
4 2020-07-01     887.   40.0  602.      245.    847.        -92.8         87.5
# ... with 3 more variables: anomaly <chr>, recomposed_l1 <dbl>,
#   recomposed_l2 <dbl>

Gimana menurut kalian? seharusnya setiap aplikasi yang berupa tagihan punya deteksi data anomali atau emang disengaja ya!

ref:

analyticsvidhya

r-blogger

See also  Cara Hitung Manual Uji Normalitas Populasi dengan Uji Jarque-Bera

Leave a Reply

Your email address will not be published.




Enter Captcha Here :