[PYTHON] Bewegungsstatistik zur Vorhersage von Zeitreihen

Einführung

CyberAgent20 New Graduate Adventskalender 2019 Artikel zum 16. Tag. Eine übliche statistische Methode zur Analyse von Zeitreihendaten ist die gleitende Mittelwertbildung. Dies ist besonders häufig bei der Messung von Trends bei Aktienkursen der Fall, aber dieses Mal möchte ich es zu einem Formular machen, das als Merkmalsgröße für maschinelles Lernen verwendet werden kann. Wenn überhaupt, handelt es sich um einen Artikel, der der Implementierung näher kommt.

Normalerweise konzentriere ich mich auf die Text- und Tonanalyse, daher würde ich mich freuen, wenn Sie auf Fehler hinweisen könnten.

Was ist eine mobile Statistik?

Obwohl es sich um eine gleitende Statistik handelt, handelt es sich um einen gleitenden Durchschnitt oder eine gleitende Varianz. Die meisten der tatsächlich verwendeten Methoden sind gleitende Durchschnitte, und selbst wenn Sie nach etwas suchen, das als gleitende Streuung bezeichnet wird, gibt es fast keine Treffer. Wenn Sie es jedoch im tatsächlichen Feld verwenden, korreliert es mit y und führt zu einer verbesserten Genauigkeit. Ich habe beschlossen, es zu posten, weil es gab. Die Erklärung des gleitenden Durchschnitts selbst wird so weit wie möglich weggelassen, da bei der Suche viele Artikel angezeigt werden. Wenn es jedoch schwierig ist, den Übergang der Daten aufgrund der Streuung in den Zeitreihendaten zu erkennen, zeigt die Glättung mit dem gleitenden Durchschnitt den Übergang der Gesamtdaten. Sie können es sichtbar machen. Mathematisch kann der gleitende Durchschnitt für 3 Zeitschritte * t * in den Zeitreihendaten * x * wie folgt ausgedrückt werden.


\frac{x_{t-2}+x_{t-1}+x_t}{3}

Ich habe 3 Schritte gemacht, aber wenn es sich um tägliche Daten handelt, werden diese gemäß der Zeitreihenskala wie 3 Tage berechnet. Die Glättung erfolgt durch Berechnung des gleitenden Durchschnitts unter Verwendung der obigen Formel unter Verschiebung der Zeit * t *.

Wenn es Zeitreihendaten gibt, wie in der linken Abbildung unten als tatsächliches Bild gezeigt, kann der Trend erfasst werden, indem der gleitende Durchschnitt wie in der rechten Abbildung gezeigt genommen wird. image.png

Das Obige wird als einfacher gleitender Durchschnitt bezeichnet, und es gibt verschiedene Arten von gleitenden Durchschnitten. Wenn Sie es in [Wiki] nachschlagen (https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87), sieht es folgendermaßen aus: Es scheint, dass es viele Typen gibt, aber wie geschrieben, scheinen die oben erwähnten SMA, WMA und EMA im Allgemeinen verwendet zu werden. Ich möchte tatsächlich jede Hand bewegen und beim nächsten Mal einen Anwendungsfall finden.

Ich habe bei der Vorhersage von Bitmünzen den einfachen gleitenden Durchschnitt (SMA), den gewichteten gleitenden Durchschnitt (WMA) und den exponentiellen gleitenden Durchschnitt (EMA) ausprobiert. Zu diesem Zeitpunkt gab es keine Daten, die stark abfallen würden. Welche sind also derzeit verfügbar? Ich weiß nicht, ob der Index gut ist, aber ich erinnere mich, dass SMA im Sommer 2017 am besten funktioniert hat. Der einfache gleitende Durchschnitt wird auch im tatsächlichen Feld verwendet.

Teppichfunktion

Wenn Sie eine Bewegungsstatistik als Feature verwenden, muss sie als Lag-Feature verwendet werden. Die Verzögerungsfunktion wird als Zeitindex verwendet, indem die Daten von mehreren Stunden und Tagen vor dieser Zeit als Merkmal einer bestimmten Zeit verwendet werden. Bei Bewegungsstatistiken werden Statistiken von einem bestimmten Zeitpunkt bis vor einem bestimmten Schritt erstellt. Wenn die vorhergesagte Zeit jedoch 7 Tage später liegt, können die Daten nach 6 Tagen nicht für die Feature-Menge nach 7 Tagen verwendet werden, sodass eine Verzögerung von der Zeit auftritt. Die Bewegungsstatistik bis zum heutigen Zeitpunkt wird 7 Tage nach der Geburt als Merkmalsgröße verwendet. Auf diese Weise wird die Merkmalsmenge zwischen den Trainingsdaten und den Vorhersagedaten gleich behandelt.

Der Betrag der Verzögerungsmerkmale wurde kürzlich in diesem Buch beschrieben, daher als Referenz.

Implementierung

Über Daten

Da es als Daten leicht zu verstehen war, habe ich die tägliche Durchschnittstemperatur der Meteorologischen Agentur verwendet. https://www.jma.go.jp/jma/index.html

In Anbetracht des Falls, in dem Sie die Durchschnittstemperatur im November 2019 vorhersagen möchten, werden wir diesmal die Daten von 2000 bis September / Oktober / November 2018 und September / Oktober 2019 verwenden.

Visualisierung

Lassen Sie uns den tatsächlichen Wert in einem Diagramm visualisieren. Die obere Zahl ist der rohe Durchschnitt der Temperaturdaten und die untere Zahl ist der gleitende 30-Tage-Durchschnitt. Auf diese Weise können Sie sehen, wann die Temperatur geringfügig variiert und wann nicht. Bei Verwendung der Bewegungsstatistik wird der Betrag der Verzögerungsfunktion gegenüber der folgenden Abbildung um einen Monat weiter verschoben, sodass die Trainingsdaten reduziert werden. Daher müssen Sie vorsichtig sein, wenn Sie die Verzögerung erhöhen müssen. image.png

Über die Umwelt

Vorerst werde ich über das Ziel nachdenken und es spezifizieren.

Pipfile


[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
pandas = "~=0.25"
matplotlib = "~=3.1"

[requires]
python_version = "3.7"

pandas Pandas hat eine Fensterfunktion namens Rollen. Zusätzlich werden Statistiken mit Mittelwert und Var ausgegeben, und die Zeitreihen werden unter Berücksichtigung der Verzögerungseigenschaften mit Verschiebung verschoben.

impoart pandas as pd

df = pd.read_csv('')
#Da davon ausgegangen wird, dass es sortiert ist, sortieren Sie es bitte entsprechend
df['Durchschnittstemperatur(℃)'].rolling(30).mean().shift(30)
#Die Breite der Fensterfunktion wird gemäß der Domäne bestimmt, indem der Trend und die Korrelation mit y betrachtet werden.

Da Pandas eine Aggregatfunktion haben, können Sie problemlos einen Index hinzufügen, auch wenn Sie einen anderen Index als den gleitenden Durchschnitt hinzufügen möchten.

df['Durchschnittstemperatur(℃)'].rolling(30).agg(['mean', 'var']).shift(30)
#Kurtosis(kurt)Und Verzerrung(skew)Sie können auch sehen.

BigQuery BigQuery verfügt auch über eine praktische Fensterfunktion, sodass Sie den gleitenden Durchschnitt unter Berücksichtigung der Verzögerung leicht berechnen können.

SELECT
	AVG(Durchschnittstemperatur(℃)) OVER(ROWS BETWEEN 30 PRECEDING 60 PRECEDING)
FROM
	`project.dataset.table`

Der Unterschied zu Pandas ist offensichtlich, aber BigQuery ist viel schneller. Die Berechnung der Schärfeverzerrung ist nicht so einfach wie bei Pandas, aber kein Problem, da sie selten als Merkmalsgröße verwendet wird. Die Fensterfunktion ist praktisch und einfach und leicht zu verstehen, da Sie beim Anwenden der Funktion jede Gruppe und Sortierung angeben können.

Am Ende

Es ist interessant, die Anzahl der Features zu ermitteln, während Sie sich mit den tatsächlichen Daten befassen. Da ich jedoch noch ein Anfänger in der Statistik bin, wünschte ich mir, ich könnte noch weiter gehen.

Recommended Posts

Bewegungsstatistik zur Vorhersage von Zeitreihen
LSTM (1) zur Zeitreihenvorhersage (für Anfänger)
Vorhersage von Zeitreihendaten durch Simplex-Projektion
Erkennung von Zeitreihendatenanomalien für Anfänger
Zeitreihenzerlegung
Python: Zeitreihenanalyse
Python 3.4 Windows7-64bit-Umgebung erstellen (für die Analyse finanzieller Zeitreihen)
Programm zum Studium der Statistik
Python-Zeitreihenfrage
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
TOPIX-Zeitreihen anzeigen
Zeitreihendiagramm / Matplotlib
Eine Lernmethode für Anfänger zum Erlernen der Zeitreihenanalyse
Herausforderung für die zukünftige Umsatzprognose: ① Was ist Zeitreihenanalyse?
Erster Kaggle (Kaggle ①)
[Statistik für Programmierer] Bayes-Theorem
[Statistik für Programmierer] Box Whisker
Installation der Python 3-Serie für Mac
Zeitreihenanalyse Teil 4 VAR
Kaguru zum ersten Mal
Zeitreihenanalyse Teil 3 Prognose
[Python] Zeichnen Sie Zeitreihendaten
Zeitreihenanalyse Teil 1 Autokorrelation
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.