Cette fois, j'ai poursuivi la décomposition des séries chronologiques précédente.
Autrement dit, le modèle est le suivant
・ Décomposer en R ・ Décomposer en python
Presque comme la dernière fois, vous pouvez spécifier des données saisonnières avec la notation decompose_IIP $ season.
data <- read.csv("./industrial/sibou_p.csv",encoding = "utf-8")
IIP <- ts(data,start=c(2008),frequency=12)
w_list <- c("seasonal","random","trend","observed")
decompose_IIP <- decompose(IIP)
for (i in w_list){
if (i=="seasonal"){
plot(decompose_IIP$seasonal)
}else if(i=="random"){
plot(decompose_IIP$random)
}else if(i=="trend"){
plot(decompose_IIP$trend)
}else if(i=="observed"){
plot(IIP)
}
}
seasonal | random |
---|---|
trend | observed |
Un autre code Tout d'abord, dessinez les données d'origine. Ensuite, puisque ces données ont un cycle de 12 mois, nous prendrons une moyenne mobile de 12 comme courbe de tendance. Ensuite, superposez les données originales ci-dessus et tracez des lignes.
#install.packages("forecast")
library(forecast)
plot(as.ts(IIP))
trend_beer = ma(IIP, order = 12, centre = T) #4
lines(trend_beer)
plot ne dessine que cette courbe de tendance.
plot(as.ts(trend_beer))
Tracez en soustrayant les données de tendance des données d'origine.
detrend_beer = IIP - trend_beer
plot(as.ts(detrend_beer))
Ensuite, les données avec le bruit moins la tendance sont divisées en 12 éléments de données, et leur moyenne est calculée comme la variation saisonnière. 13 d'entre eux sont tirés d'affilée. 【référence】
m_beer = t(matrix(data = detrend_beer, nrow = 12))
seasonal_beer = colMeans(m_beer, na.rm = T)
plot(as.ts(rep(seasonal_beer,13)))
Enfin, trouvez la variation aléatoire. Le résultat était cohérent avec ce que nous avons trouvé avec la fonction decompose (). ** Je recherche ce calcul **.
random_beer = IIP - trend_beer - seasonal_beer
plot(as.ts(random_beer))
Enfin, pour diverses utilisations, effectuez une sortie dans un fichier csv comme suit.
write.csv(as.ts(rep(seasonal_beer,1300)), file = 'decompose_seasonal1300.csv')
Des fonctions similaires sont disponibles en python. Le code est ci-dessous.
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.seasonal import STL
import matplotlib.pyplot as plt
# Set figure width to 12 and height to 9
plt.rcParams['figure.figsize'] = [12, 9]
df = pd.read_csv('sibou_.csv')
series = df['Price']
print(series)
cycle, trend = sm.tsa.filters.hpfilter(series, 144)
fig, ax = plt.subplots(3,1)
ax[0].plot(series)
ax[0].set_title('Price')
ax[1].plot(trend)
ax[1].set_title('Trend')
ax[2].plot(cycle)
ax[2].set_title('Cycle')
plt.show()
Une autre façon avec python Personnellement, si le résultat de la décomposition est la méthode ci-dessus, un autre processus est nécessaire pour le cycle, et cela semble être plus raisonnable car il peut traiter même des parties aléatoires. De plus, comparé à R, saisonnier semble avoir une plus grande largeur de vibration d'année en année (bien qu'il soit naturel que R ait disparu parce que cette fluctuation a été moyennée). Dans certains cas, cette méthode est la plus polyvalente. 【référence】 ・ Décomposition saisonnière à l'aide de LOESS (STL)
stl=STL(series, period=12, robust=True)
result = stl.fit()
chart = result.plot()
chart1= result.plot(observed=False, resid=False)
chart2= result.plot(trend=False, resid=False)
plt.show()
Observed & Trend & Seasonal & Residual Trend & Seasonal Obeserved & Seasonal En outre, si vous procédez comme suit, vous pouvez générer un graphique sous forme de graphiques séparés.
pl1 = result.observed
pl2 = result.trend
pl3 = result.seasonal
pl4 = result.resid
plt.plot(pl1)
plt.plot(pl2)
plt.plot(pl3)
plt.plot(pl4)
plt.show()
plt.close()
Vous pouvez facilement générer une sortie en procédant comme suit.
pl5 = result.seasonal.plot()
plt.show()
plt.close()
...
seasonal | resid |
---|---|
trend | observed |
Et la sortie du fichier csv se fait comme suit.
import csv
with open('sample_pl2.csv', 'w') as f:
writer = csv.writer(f, delimiter='\n')
writer.writerow(pl2)
・ J'ai essayé d'arranger la méthode de decompose () avec R et python ・ Les résultats de chaque code sont légèrement différents, mais ils peuvent être presque les mêmes, et les fluctuations périodiques avec le bruit et les tendances peuvent être extraites comme de pures fluctuations périodiques. ・ Chaque élément décomposé composant peut être écrit dans des données csv et peut être utilisé secondairement. ・ En fait, cette fois-ci, en prenant comme exemple le changement séculaire du nombre de décès [chiffres préliminaires jusqu'en mars](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00450011&tstat=000001028897&cycle = 1 & tclass1 = 000001053058 & tclass2 = 000001053059 & result_back = 1) a été utilisé, mais aucune valeur anormale comme 2011 n'est vue dans cette plage (elle diminue plutôt).
・ Ensuite, convertissons l'élément de fluctuation périodique en son et écoutons-le. ・ Essayez les éléments de fluctuation apériodiques (en dehors du test)
Recommended Posts