[PYTHON] Ein Anfänger, der seit 2 Monaten programmiert, versuchte, das reale BIP Japans in Zeitreihen mit dem SARIMA-Modell zu analysieren.

[zunaechst]

Vielen Dank, dass Sie sich die Zeit genommen haben, den Artikel zu lesen! !!

Lassen Sie mich zunächst vorstellen! Ich bin ein Mitglied der Gesellschaft, das in meiner Freizeit gerne Python lernt

ist.

Weit davon entfernt, zu programmieren, war ich verrückt nach PC, also habe ich ab dem 1. September letzten Monats angefangen, Python zu lernen.

Es ist ungefähr zwei Monate her, seit ich angefangen habe, mit Progate, PyQ und Aidemy zu programmieren.

Nachdem ich alles über den Datenanalysekurs von Aidemy erfahren hatte, wollte ich ihn ausgeben und beschloss, diesen Artikel zu schreiben.

Soll der Artikel von wem gelesen werden?

Obwohl ich nicht viel Zeit für das Programmieren lernen kann, z. B. während der Arbeit oder während des Schulbesuchs,

Ich bin ein Programmieranfänger, der Ming lernen möchte. Wie ich oben über mich selbst geschrieben habe, bin ich auch ein Programm

Ich bin ein Anfänger. Verwenden Sie es daher als Beispiel dafür, wie viel Sie in etwa 2 Monaten tun können.

Ich bin glücklich.

Umgebung

Python3 MacBookAir Jupyter Notebook

[Text]

Ziel

Erstellen Sie ein SARIMA-Modell (eine Art Zeitreihenmodell), das das japanische BIP vorhersagt, und zeigen Sie die tatsächlichen und vorhergesagten Werte in einem Diagramm an.

Bibliothek verwendet dieses Mal

import csv
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from datetime import datetime
from statsmodels.tsa.statespace.sarimax import SARIMAX
import itertools

Datensatz verwendet

Reales BIP von E-Stat (Regierungsstatistik)

Verfahren

__1. Daten vorverarbeiten __ Da das Ziel geklärt ist, werden wir die Rohdaten zurückrechnen und verarbeiten.

#①
df = pd.read_csv('gaku-jg2022 (1).csv',encoding="shift-jis")
df = df.drop(range(0,6)) #Löschen Sie unnötige Zeilen
df = df.drop([110,111,112]) 
df = df.drop(df.columns[range(2, 30)], axis=1) #Löschen Sie nicht benötigte Spalten
df = df.reset_index(drop=True) #Zeilen neu nummerieren
df = df.rename(columns={'Wesentliche Originalserie': 'Date'}) #Geben Sie der Spalte einen neuen Titel
df = df.rename(columns={'Unnamed: 1': 'RealGDP'})

#②
#Verarbeiten Sie die Daten in der Spalte Zeit
j = 1994
k = 0
for i in range(len(df["Date"])):
    df.loc[i,"Date"] = j
    k += 1
    if k%4 == 0:
        j += 1
    
df["Date"] #Nur Datum extrahieren
index = pd.date_range("1994","2020",freq = "Q")#Daten vierteljährlich trennen
df.index = index
del df["Date"]

#③
#Prozess Reales BIP
i = 0
for x in df["RealGDP"]:
    x = x.replace(',', '')
    df.iloc[i,0] = float(x)
    i += 1

In (1) sind die Spalten, für die die erfassten Rohdaten nicht erforderlich sind (z. B. die Spalte mit den privaten Endverbrauchsausgaben), die Zeilen mit nicht numerischen Werten wie Variablennamen und Leerzeichen sowie die Daten für das Geschäftsjahr 2020 ungerade und werden daher abgeschnitten. In (2) wird der vorhandene Wert für die Indizierung der Zeitinformationen geändert (was aus der Zeile des Variablenindex erfolgt). (3) Da der Datentyp des BIP-Spaltenwerts eine Zeichenfolge ist und "," enthält, konvertieren Sie ihn zur Diagrammanzeige in einen Gleitkommatyp.

__2. Grafikanzeige __ Wenn Sie die in 1 verarbeiteten Daten als Diagramm mit dem folgenden Code anzeigen,

#Stellen Sie die Daten als Liniendiagramm dar
#Legen Sie den Titel des Diagramms fest
plt.title("quarterly-RealGDP_in_Japan")
#Benennung der x-Achse und der y-Achse des Diagramms
plt.xlabel("date")
plt.ylabel("GDP")
#Datenplot
plt.plot(df)
plt.show()

GDP.png Die horizontale Achse ist die Zeit und die vertikale Achse ist der Graph des BIP-Wertes. Es schwingt kurzfristig auf und ab und steigt langfristig tendenziell an.

Ich werde. Ausnahmsweise ist zu erkennen, dass der BIP-Wert um 2008 aufgrund des Lehman-Schocks deutlich gesunken ist. Ich bin Minuten

Wenn es analysiert wird, kann es nur insoweit interpretiert werden, aber welches Muster liest die Maschine aus diesen Daten und was ist es?

Wirst du eine solche Vorhersage machen? Ich freue mich darauf!

__3. Parameter bestimmen __ Das SARIMA-Modell erfordert 7 Variablen, eine wird visuell in der Grafik bestimmt und die anderen 6 werden von einer Funktion ausgegeben.

Ich werde.

Einer ist ein Parameter namens Periode s. Wie viele Einheiten von Mustern auf den Daten können in der Periode s wiederholt gesehen werden

Es wird eingegeben, wenn es einige Zeit gedauert hat. Unter Berücksichtigung der Perioden s in der oben gezeigten Grafik wird die vertikale Bewegung wiederholt.

Hat sich in vier Jahren viermal auf und ab bewegt, so dass einmal im Jahr ein periodisches Muster auftritt (eine Einheit). Daher beträgt der Zyklus s ein Jahr

In der Zwischenzeit, da es sich bei den Daten, mit denen wir uns zu diesem Zeitpunkt befassen, um vierteljährliche Daten handelt, entsprechen 4 Daten 1 Jahr, sodass wir sehen können, dass s = 4 ist.   Als nächstes werden die restlichen 6 von der folgenden Funktion ausgegeben.

#Bestimmen Sie die Parameter des SARIMA-Modells
def selectparameter(DATA,s):
    p = d = q = range(0, 2)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                            order=param,
                seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(BICs,results.bic)
            except:
                continue
    return print(parameters[np.argmin(BICs)])

#Verarbeiten Sie den Wert von RealGDP
i = 0
for x in df["RealGDP"]:
    x = x.replace(',', '')
    df.iloc[i,0] = x
    i += 1

selectparameter(df["RealGDP"].values.astype(float), 4)

[(0, 1, 0), (1, 1, 0, 12), 1641.6840970980422] CPU times: user 19.1 s, sys: 8.17 s, total: 27.3 s Wall time: 14.2 s

Setzen Sie die Parameter aus dem Ausgabeergebnis auf (0, 1, 0), (1, 1, 0, 12).

__4 Modellanpassung und Vorhersage __

#Modell fit
SARIMA_df = sm.tsa.statespace.SARIMAX(df.astype("float64"),order=(0, 1, 0),seasonal_order=(1, 1, 0, 12)).fit()#Bitte schreibe deine Antwort hier

#Pred durch Vorhersagedaten ersetzen
pred = SARIMA_df.predict("2015-03-31", "2022-12-31")

#Visualisierung von Prädaten und ursprünglichen Zeitreihendaten
plt.plot(df)
plt.plot(pred, color="r")
plt.show()

Prognostizieren Sie das BIP vom 31. März 2015 bis zum 31. Dezember 2022 und stellen Sie den tatsächlichen Wert in Blau und den prognostizierten Wert in Rot dar

Machen. Die Grafik sieht folgendermaßen aus:

GDPpred.png

Da sich Blau und Rot ziemlich stark überlappen, kann gesagt werden, dass es gut vorhergesagt werden kann.

Da jedoch die Auswirkungen des neuen Koronavirus auf die Wirtschaft nicht berücksichtigt werden, unterscheiden sich die vorhergesagten Werte danach erheblich von den tatsächlichen Werten.

Sie können es erwarten. Ich möchte auf zukünftige tatsächliche Messwerte warten.

[schließlich]

Obwohl ich kein striktes Verständnis hatte, konnte ich vor zwei Monaten nicht einmal blind anfassen, also ließ ich die Maschine lernen

Ich bin ein wenig beeindruckt, Vorhersagen treffen zu können.

Ich habe noch Aidemys Kurs in meinen zukünftigen Plänen, also werde ich in einem anderen Kurs studieren und andere Ergebnisse als Datenanalyse ausgeben.

Ich werde hierher zurückkommen, um es zu tun.

Vielen Dank für das Lesen bis zum Ende! !!

Verweise

e-stat Kurs zur Analyse von Aidemiedaten Prognose des Bevölkerungswandels in Japan durch maschinelles Lernen [Big-Data-Analysemethode und "SARIMA-Modell" zur Vorhersage der Zukunft](https://deepage.net/bigdata/2016/10/22/bigdata-analytics.html#sarima%E3%83%A2%E3%83] % 87% E3% 83% AB)

Recommended Posts

Ein Anfänger, der seit 2 Monaten programmiert, versuchte, das reale BIP Japans in Zeitreihen mit dem SARIMA-Modell zu analysieren.
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Eine Person, die das D-Problem mit ABC von AtCoder lösen möchte, hat versucht, zu kratzen
Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Wenn Sie neu in der Programmierung sind, warum machen Sie nicht vorerst ein "Spiel"? Die Geschichte
Zum ersten Mal versuchte ein Programmieranfänger eine einfache Datenanalyse mit Programmierung
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Der Tag, an dem ein Anfänger, der zweieinhalb Monate mit dem Programmieren begann, eine Webanwendung mit Flask erstellte
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Menschen in Japan nach der Methode des neuesten Papiers in China vorherzusagen
Mit LSTM + Embedding habe ich die Bedeutung der Vorverarbeitung in NLP erneut bekräftigt und gleichzeitig ein Modell zur Unterscheidung der Emotionen von Tweets erstellt.
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
(Python: OpenCV) Ich habe versucht, einen Wert auszugeben, der den Abstand zwischen Regionen angibt, während das Video in Echtzeit binärisiert wurde.