Détecter les anomalies de séries temporelles à l'aide du package Anomalize dans R

Contenu

Cet article a été publié dans le cadre du Blogathon sur la science des données.

introduction

Détection d'anomalies de séries temporelles

Todo el proceso de detección de anomalías para una Séries chronologiques se lleva a cabo en 3 Pas:

  1. Décomposer la série chronologique en variables sous-jacentes; Tendance, saisonnalité, résidu.
  2. Créer des seuils supérieur et inférieur avec une valeur de seuil
  3. Identifier les points de données qui sont en dehors des seuils en tant qu'anomalies.

Cas d'étude

Téléchargeons l'ensemble de données sur le site Web du gouvernement de Singapour qui est facilement accessible. Consommation totale d'électricité des ménages par type de logement. Le site Web de données du gouvernement de Singapour plante assez facilement. Cet ensemble de données montre la consommation totale d'électricité des ménages par type de logement (et GWh).

Géré par l'Autorité du marché de l'énergie

Fréquence annuelle

La source (s) Autorité du marché de l'énergie

Licence de licence de données ouvertes de Singapour

Installer et charger les packages R

Dans cet exercice, nous travaillerons avec 2 Packages clés pour la détection d'anomalies de séries temporelles dans R: anormal Oui heuretk. Celles-ci nécessitent que l'objet soit créé comme un peu de temps, donc nous allons aussi charger les paquets tibble. Commençons par installer et charger ces bibliothèques.

paquet <- c('tridyverse',« heure des petits pains »,'anormaliser','timetk')
install.paquets(paquet)
une bibliothèque(bien rangé)
une bibliothèque(l'heure du chat)
une bibliothèque(anomalie)
une bibliothèque(heuretk)

Charger les données

A l'étape précédente, nous avons téléchargé le fichier des consommations totales d'électricité par type de logement (et GWh) du site Web du gouvernement de Singapour. Chargeons le fichier CSV dans une trame de données R.

df <- lire.csv("C:Détection d'anomalies dans Rtotal-household-electricity-consumption.csv")
diriger(df,5)
19390tête5-2325059

Traitement de l'information

Avant de pouvoir appliquer un algorithme d'anomalie sur les données, nous devons le changer en un format de date.

La columna ‘mes’ est à l'origine au format factoriel avec plusieurs niveaux. Convertissons-le en un type de date et sélectionnons uniquement les colonnes pertinentes dans le bloc de données.

str(df)
28293str1-1705281
# Changer le facteur au format de date
df$mois <- pâte(df$mois, "01", sep="-")
# Sélectionnez uniquement les colonnes pertinentes dans un nouveau dataframe
df$mois <- comme.Date(df$mois,format="%A-%m-%d")
df <- df %>% sélectionner(mois,globalement)
# Convertir df en tibble
df <- as_tibble(df)
classer(df)
72981tb-2708356

Usando el paquete ‘anomalie’

El paquete R ‘anomalie’ permet à un workflow de détecter les anomalies de données. Les fonctions principales sont time_decompose (), anomalie (), Oui time_recompose ().

df_anormalisé <- df %>%
    time_decompose(globalement, fusionner = VRAI) %>%
    anomalie(reste) %>%
    time_recompose()
df_anormalisé %>% aperçu()
60673anomalie2-5250021

Afficher les anomalies

On peut alors visualiser les anomalies à l'aide du plot_anomalies () une fonction.

df_anormalisé %>% plot_anomalies(ncol = 3, alpha_dots = 0.75)
56872visuel1-5145610

Tendance et ajustement de saisonnalité

Avec anomalie, il est facile de faire des ajustements car tout est fait avec une information de date ou d'horodatage, afin que vous puissiez sélectionner intuitivement des incréments pour des périodes de temps qui ont du sens (par exemple, "5 minutes" ou "1 mois").
Premier, notez qu'une fréquence et une tendance ont été automatiquement sélectionnées pour nous. C'est par conception. La fréquence des arguments = « auto » et tendance = « auto » sont les valeurs par défaut. On peut visualiser cette décomposition en utilisant plot_anomaly_decomposition ().

p1 <- df_anormalisé %>%
    plot_anomaly_decomposition() +
    titre("Fréq/Tendance = 'auto'")
p1
21584visuel2-3468737

Quand il est utilisé « auto », get_time_scale_template () utilisé pour déterminer la fréquence logique et les intervalles de tendance en fonction de l'échelle des données. Vous pouvez découvrir la logique:

get_time_scale_template()
91841échelle-8982421

Cela implique que si l'échelle est 1 jour (ce qui signifie que la différence entre chaque point de données est 1 jour), alors la fréquence sera 7 jours (O 1 la semaine) et la tendance sera autour 90 jours (O 3 mois). Cette logique peut être facilement ajustée de deux manières: paramétrage local et paramétrage global.

Réglage des paramètres locaux

El ajuste de los paramètres locales se realiza ajustando los parámetros en función. Ensuite, on ajuste la tendance = « 2 semaines », ce qui en fait une tendance assez suréquipée.

p2 <- df %>%
    time_decompose(globalement,
                   fréquence = "auto",
                   tendance = "2 semaines") %>%
    anomalie(reste) %>%
    plot_anomaly_decomposition() +
    titre("Tendance = 2 Semaines (Local)")
# Afficher les tracés
p1
p2
11669p1-8266744
77435p2-2213890

Paramétrage global

Nous pouvons également ajuster globalement en utilisant set_time_scale_template () pour mettre à jour le modèle par défaut vers celui que nous préférons. Nous allons changer la tendance de « 3 mois » une « 2 semaines » pour l'échelle de temps = « jour ». Utilisation time_scale_template () pour récupérer le modèle de chronologie avec lequel l'anomalie commence, muet () le champ de tendance à l'emplacement souhaité et utilisez set_time_scale_template () pour mettre à jour le modèle dans les options globales. Nous pouvons récupérer le modèle mis à jour en utilisant get_time_scale_template () pour vérifier que le changement a été exécuté correctement.

time_scale_template() %>%
    subir une mutation(tendance = sinon(échelle_de_temps == "journée", "2 semaines", tendance)) %>%
    set_time_scale_template()
get_time_scale_template()
28118échelle1-9995578

Finalement, nous pouvons réexécuter le time_decompose () avec les valeurs par défaut, et nous pouvons voir que la tendance est "2 semaines".

p3 <- df %>%
    time_decompose(globalement) %>%
    anomalie(reste) %>%
    plot_anomaly_decomposition() +
    titre("Tendance = 2 Semaines (Global)")
p3
64670p3-5409161

Réinitialisons les valeurs par défaut du modèle de chronologie aux valeurs par défaut d'origine.

time_scale_template() %>%
    set_time_scale_template()
# Vérifier le changement
get_time_scale_template()
60668échelle3-1542898

Extraire les points de données anormaux

À présent, nous pouvons extraire les points de données réels qui sont des anomalies. Pour ça, vous pouvez exécuter le code suivant.

df %>% 
  time_decompose(globalement) %>%
  anomalie(reste) %>%
  time_recompose() %>%
  filtre(anomalie == 'Oui')
75590extrait-2851353

Ajustement des Anoms Alpha et Max

Les alfa Oui max_anoms sont les deux paramètres qui contrôlent la anomalie () une fonction. H

Alfa

Nous pouvons ajuster l'alpha, qui est configuré dans 0.05 par défaut. Par défaut, les bandes ne couvrent que l'extérieur de la gamme.

p4 <- df %>%
    time_decompose(globalement) %>%
    anomalie(reste, alpha = 0.05, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalies(time_recomposed = VRAI) +
    titre("alpha = 0.05")
#> fréquence = 7 jours
#> tendance = 91 jours
p4
27149alpha-6207278

Si on diminue l'alpha, augmenter les bandes, ce qui rend plus difficile d'être une valeur aberrante. Ici, vous pouvez voir que les groupes sont devenus deux fois plus gros.

p5 <- df %>%
    time_decompose(globalement) %>%
    anomalie(reste, alpha = 0.025, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalies(time_recomposed = VRAI) +
    titre("alpha = 0.05")
#> fréquence = 7 jours
#> tendance = 91 jours
p5
56330alpha1-1407642

Max d'Anoms

Les max_anoms Le paramètre est utilisé pour contrôler le pourcentage maximum de données pouvant être une anomalie. Posons alpha = 0.3 de sorte qu'à peu près tout est une valeur aberrante. Essayons maintenant une comparaison entre max_anoms = 0.2 (20% anomalies autorisées) y max_anoms = 0.05 (5% anomalies autorisées).

p6 <- df %>%
    time_decompose(globalement) %>%
    anomalie(reste, alpha = 0.3, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalies(time_recomposed = VRAI) +
    titre("20% Anomalies")
#> fréquence = 7 jours
#> tendance = 91 jours
p7 <- df %>%
    time_decompose(globalement) %>%
    anomalie(reste, alpha = 0.3, max_anoms = 0.05) %>%
    time_recompose() %>%
    plot_anomalies(time_recomposed = VRAI) +
    titre("5% Anomalies")
#> fréquence = 7 jours
#> tendance = 91 jours
p6
p7
71948p6-8379584
12358p7-2416558

Usando el paquete ‘heuretk’

Il s'agit d'une boîte à outils pour travailler avec des séries chronologiques dans R, tracer, discuter et présenter des données de séries temporelles d'ingénieur pour effectuer des prédictions et des prédictions d'apprentissage automatique.

Visualisation interactive des anomalies

Ici, heuretk’s La fonction plot_anomaly_diagnostics () permet de modifier certains paramètres à la volée.

df %>% heuretk::plot_anomaly_diagnostics(mois,globalement, .facet_ncol = 2)
78486newplot-2216213

Détection interactive d'anomalies

Pour trouver les points de données exacts qui sont des anomalies, nous utilisons tk_anomalie_diagnostic () une fonction.

df %>% heuretk::tk_anomalie_diagnostic(mois, globalement) %>% filtre(anomalie=='Oui')
90009détecter-8672121

conclusion

Dans cet article, nous avons vu certains des packages populaires dans R qui peuvent être utilisés pour identifier et visualiser des anomalies dans une série temporelle. Pour clarifier les techniques de détection d'anomalies dans R, nous avons réalisé une étude de cas sur un ensemble de données accessibles au public. Il existe d'autres méthodes pour détecter les valeurs aberrantes et peuvent également être explorées.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.