[PYTHON] Un débutant qui programme depuis 2 mois a tenté d'analyser le PIB réel du Japon en séries chronologiques avec le modèle SARIMA.

[en premier]

Merci d'avoir pris le temps de lire l'article! !!

Laissez-moi commencer par me présenter! Je suis un membre de la société qui aime apprendre Python pendant mon temps libre

est.

Loin de la programmation, j'étais fou de PC, j'ai donc commencé à étudier Python à partir du 1er septembre le mois dernier.

Cela fait environ deux mois que j'ai commencé à programmer avec Progate, PyQ et Aidemy.

Ayant tout appris sur le cours d'analyse de données d'Aidemy, je voulais le sortir, j'ai donc décidé d'écrire cet article.

L'article est-il censé être lu par qui?

Bien que je ne puisse pas gagner beaucoup de temps pour l'apprentissage de la programmation, par exemple en travaillant ou en allant à l'école,

Je suis un débutant en programmation qui souhaite apprendre le Ming. Comme je l'ai écrit plus haut sur moi-même, je suis aussi un programme

Je suis un débutant. Par conséquent, veuillez l'utiliser comme l'un des exemples de ce que vous pouvez faire dans environ 2 mois.

Je suis heureux.

environnement

Python3 MacBookAir Jupyter Notebook

[Texte]

Cible

Créez un modèle SARIMA (un type de modèle de série chronologique) qui prédit le PIB du Japon et affichez les valeurs réelles et prévues dans un graphique.

Bibliothèque utilisée cette fois

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

Ensemble de données utilisé

PIB réel de l'e-stat (statistiques gouvernementales)

procédure

__1. Pré-traiter les données __ Puisque la cible est clarifiée, nous calculerons et traiterons les données brutes.

#①
df = pd.read_csv('gaku-jg2022 (1).csv',encoding="shift-jis")
df = df.drop(range(0,6)) #Effacez les lignes inutiles
df = df.drop([110,111,112]) 
df = df.drop(df.columns[range(2, 30)], axis=1) #Effacer les colonnes inutiles
df = df.reset_index(drop=True) #Renuméroter les lignes
df = df.rename(columns={'Série originale substantielle': 'Date'}) #Renouveler le titre de la colonne
df = df.rename(columns={'Unnamed: 1': 'RealGDP'})

#②
#Traitez les données dans la colonne Heure
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"] #Extraire uniquement la date
index = pd.date_range("1994","2020",freq = "Q")#Données séparées trimestriellement
df.index = index
del df["Date"]

#③
#Processus du PIB réel
i = 0
for x in df["RealGDP"]:
    x = x.replace(',', '')
    df.iloc[i,0] = float(x)
    i += 1

Dans (1), les colonnes qui ne nécessitent pas les données brutes acquises (telles que la colonne de la dépense de consommation finale privée), les lignes qui incluent des valeurs non numériques telles que les noms de variables et les blancs, et les données pour FY2020 sont impaires, elles sont donc tronquées. Dans (2), la valeur existante est modifiée pour le travail d'indexation des informations temporelles (ce qui est fait à partir de la ligne de la variable index). (3) Puisque le type de données de la valeur de la colonne PIB est une chaîne de caractères et contient ",", convertissez-le en type flottant pour l'affichage du graphique.

__2. Affichage du graphique __ Si vous affichez les données traitées en 1 sous forme de graphique avec le code suivant,

#Représenter les données sous forme de graphique linéaire
#Définir le titre du graphique
plt.title("quarterly-RealGDP_in_Japan")
#Nommer l'axe des x et l'axe des y du graphique
plt.xlabel("date")
plt.ylabel("GDP")
#Graphique de données
plt.plot(df)
plt.show()

GDP.png L'axe horizontal représente le temps et l'axe vertical est le graphique de la valeur du PIB. Il oscille de haut en bas à court terme et a tendance à augmenter à long terme.

Je vais. Exceptionnellement, on peut constater que la valeur du PIB a considérablement baissé vers 2008 en raison du choc Lehman. Je minutes

Une fois analysé, il ne peut être interprété que dans cette mesure, mais quel type de modèle la machine lit-elle à partir de ces données et de quoi s'agit-il?

Ferez-vous une telle prédiction? J'ai hâte d'y être!

__3. Déterminer les paramètres __ Le modèle SARIMA nécessite 7 variables, l'une est déterminée visuellement sur le graphique et les 6 autres sont sorties par une fonction.

Je vais.

L'un est un paramètre appelé période s. Combien d'unités de motifs sur les données peuvent être vues à plusieurs reprises au cours de la période s

Il sera entré s'il a fallu du temps. Compte tenu de la période s dans le graphique affiché ci-dessus, le mouvement vertical est répété.

A monté et descendu quatre fois en quatre ans, un schéma périodique se produit donc une fois par an (une unité). Par conséquent, le cycle s est d'un an

En attendant, comme les données dont nous traitons cette fois-ci sont des données trimestrielles, 4 données équivalent à 1 an, nous pouvons donc voir que s = 4.   Ensuite, les 6 restants sont générés par la fonction suivante.

#Déterminer les paramètres du modèle SARIMA
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)])

#Traiter les valeurs du PIB réel
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

Définissez les paramètres sur (0, 1, 0), (1, 1, 0, 12) à partir du résultat de sortie.

__4. Ajustement et prédiction du modèle __

#Coupe du modèle
SARIMA_df = sm.tsa.statespace.SARIMAX(df.astype("float64"),order=(0, 1, 0),seasonal_order=(1, 1, 0, 12)).fit()#Veuillez écrire votre réponse ici

#Remplacer les données de prédiction par pred
pred = SARIMA_df.predict("2015-03-31", "2022-12-31")

#Visualisation des données prédéfinies et des données de séries chronologiques originales
plt.plot(df)
plt.plot(pred, color="r")
plt.show()

Prédire le PIB du 31 mars 2015 au 31 décembre 2022, représenter graphiquement la valeur réelle en bleu et la valeur prévue en rouge

Faire. Le graphique ressemble à ceci:

GDPpred.png

Puisque le bleu et le rouge se chevauchent un peu, on peut dire que la prédiction est bonne.

Cependant, étant donné que l'impact sur l'économie du nouveau virus corona n'est pas pris en compte, les valeurs prévues après cela sont considérablement différentes des valeurs réelles.

Vous pouvez vous attendre à ce que ce soit le cas. Je voudrais attendre les futures valeurs de mesure réelles.

[enfin]

Je ne pouvais même pas faire une touche aveugle il y a deux mois, même si je n'avais pas une compréhension stricte

Je suis un peu impressionné de pouvoir faire des prédictions.

Puisque j'ai toujours le cours d'Aidemy dans mes projets futurs, j'étudierai dans un autre cours et je sortirai autre que l'analyse des données.

Je reviendrai ici pour le faire.

Merci beaucoup d'avoir lu jusqu'au bout! !!

Références

e-stat Cours d'analyse des données Aidemy Prévision de l'évolution de la population au Japon par apprentissage automatique [Méthode d'analyse des mégadonnées et "modèle SARIMA" pour prédire l'avenir](https://deepage.net/bigdata/2016/10/22/bigdata-analytics.html#sarima%E3%83%A2%E3%83] % 87% E3% 83% AB)

Recommended Posts

Un débutant qui programme depuis 2 mois a tenté d'analyser le PIB réel du Japon en séries chronologiques avec le modèle SARIMA.
J'ai essayé de décrire le trafic en temps réel avec WebSocket
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Une personne qui veut résoudre le problème D avec ABC d'AtCoder a essayé de gratter
Analysez le modèle thématique pour devenir romancier avec GensimPy3
Mettre le processus en veille pendant un certain temps (secondes) ou plus en Python
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
Si vous êtes novice en programmation, pourquoi ne pas créer un "jeu" pour le moment? L'histoire
Le premier débutant en programmation à essayer une analyse de données simple avec programmation
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Le jour où un débutant qui a commencé à programmer pendant deux mois et demi a créé une application web avec Flask
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
Avec LSTM + Embedding, j'ai réaffirmé l'importance du prétraitement en PNL tout en créant un modèle pour discriminer les émotions des tweets.
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Analyse des séries chronologiques 4 Construction du modèle SARIMA
N'hésitez pas à rédiger un test avec nez (dans le cas de + gevent)
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Transformez plusieurs listes avec l'instruction for en même temps en Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
(Python: OpenCV) J'ai essayé de générer une valeur indiquant la distance entre les régions tout en binarisant la vidéo en temps réel.