[PYTHON] Vorhersage der Zukunft der Bevölkerungsentwicklung in Numazu City durch Zeitreihen-Regressionsanalyse mit Prophet

Was du machen willst

・ Prognostizieren Sie die zukünftige Bevölkerung von Numazu City basierend auf der Demografie der letzten Jahre mit Pythons Zeitreihen-Vorhersagebibliothek "Facebook Prophet". ・ Analysieren Sie die Analyseergebnisse. ⇒ Abstimmung ⇒ Erneut analysieren

Umgebung

** Windows10 64bit** ** Anaconda3** Virtuelle Umgebung: Python (3.7.3) Bibliotheken: fbprophet (0.6), pandas (1.1.2), matplotlib (3.0.3)

Nutzungsdaten

Liste "Bevölkerung und Haushalt" der Stadt Numazu

dataset.csv

Jahr Monat Haushaltspersonal (insgesamt)
2013-04 205,790
2013-05 205,739
2013-06 205,572
・ ・ ・ ・ ・ ・
2020-07 193,896
2020-08 193,756

Vorausschauende Analyse

Bibliothek importieren

import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet

Datenerfassung

Jinkoudata = pd.read_csv("dataset.csv")
Jinkoudata.columns = ['ds','y']

-Importieren Sie Bevölkerungsdaten in den Datenrahmen [Jinkou-Daten].

Modellgenerierung

model = Prophet(weekly_seasonality=False,daily_seasonality=False)

・ Da die Analyse dieses Mal monatlich durchgeführt wird, werden Parameter angegeben, die den Wochenzyklus und den Tageszyklus nicht berücksichtigen.

●growth='linear' [logistic/linear] Geben Sie das Analysemodell als linear oder logistisch an.

●changepoints=None [DATE(YYYY-MM-DD)] Beliebige Bezeichnung von Änderungspunkten von Trends (langfristige Trendschwankungen). Im Propheten werden Änderungspunkte automatisch extrahiert und in der Vorhersage wiedergegeben, aber anstatt die automatische Erkennung von Änderungspunkten nach Bedarf zu verwenden, Es wird mit der Absicht verwendet, die Position potenzieller Änderungspunkte mithilfe dieses Parameters manuell anzugeben.

** ● n_changepoints ** = 25 [beliebige Konstante] Geben Sie die Anzahl der zu erkennenden Änderungspunktkandidaten an. Je größer der Wert, desto einfacher ist es, viele Änderungspunkte zu erkennen. Wenn dies zu groß gemacht wird, werden Änderungspunkte möglicherweise übermäßig erkannt und die Vorhersagegenauigkeit kann abnehmen.

** ● jährliche_Saisonalität ** = 'auto' [true / false / auto / beliebige Konstante] Geben Sie die Periodizität (Jahr) an. Der Grad der Berücksichtigung kann durch Angabe einer beliebigen Zahl angepasst werden (10 ist der angegebene Wert, wenn nicht angegeben).

** ● wöchentliche Saisonalität ** = 'auto' [true / false / auto / beliebige Konstante] Geben Sie die Periodizität (Woche) an. Der Grad der Berücksichtigung kann durch Angabe einer beliebigen Zahl angepasst werden (10 ist der angegebene Wert, wenn nicht angegeben).

** ● daily_seasonality ** = 'auto' [true / false / auto / beliebige Konstante] Geben Sie die Periodizität (Tag) an. Der Grad der Berücksichtigung kann durch Angabe einer beliebigen Zahl angepasst werden (10 ist der angegebene Wert, wenn nicht angegeben).

●holidays=None [DataFrame] Geben Sie den Datenrahmen für das Ereignisdatum an. Integrieren Sie Feiertage und Daten mit Ereignissen in die Analyse und spiegeln Sie diese in der Prognose wider.

** ● changepoint_prior_scale ** = 0,05 [beliebige Konstante] Geben Sie die Streuung der Laplace-Verteilung an. Je größer dieser Wert ist, desto einfacher ist es, den Änderungspunkt zu erkennen. Es kann jedoch zu flexibel sein. Gleich wie n_changepoints.

** ● changepoint_range ** = 0,8 [beliebige Konstante] Geben Sie das Datenverhältnis zum Erkennen von Änderungspunkten an. Da der angegebene Wert 0,8 ist, werden die Änderungspunkte zu 80% aus dem Anfang der Trainingsdaten extrahiert. Wenn sich der Trend am Ende der Daten beispielsweise stark bewegt, setzen Sie ihn auf "1.0". Der Änderungspunkt wird anhand des gesamten Datenbereichs einschließlich der Schwankung in der Endstufe erfasst.

Es scheint verschiedene andere Dinge zu geben, aber ich werde es weglassen, weil das Obige das einzige ist, was mit der Menge an Wissen bisher berücksichtigt werden kann.

Lernen

model.fit(Jinkoudata)

fit() ・ Lernen Sie, indem Sie die Trainingsdaten mit Fit angeben.

Datenrahmengenerierung

future = model.make_future_dataframe(periods=16,freq='M')

make_future_dataframe()

future

ds
0 2013-04-01
1 2013-05-01
2 2013-06-01
・ ・ ・ ・ ・ ・
103 2021-10-31
104 2021-11-30

Prognose

predict = model.predict(future)

** Vorhersageergebnis [vorhersagen] **

ds yhat yhat_lower yhat_upper
0 2013-04-01 205798.225901 205762.014035 205838.079234
1 2013-05-01 205717.024368 205679.523657 205759.642408
2 2013-06-01 205600.30351 205560.587079 205640.792342
3 2013-07-01 205530.899822 205488.087052 205570.056443
4 2013-08-01 205335.468464 205296.411528 205378.093757

Es gibt andere Informationen, die vorhergesagt und im Datenrahmen gespeichert werden. Da es schwierig ist, den numerischen Wert zu erfassen, werden wir hier die Elemente überprüfen, die sich auf den vorhergesagten Wert beziehen. ・ Yhat: Voraussichtlicher Wert ・ Yhat_lower: Voraussichtliche Untergrenze ・ Yhat_upper: Voraussichtliche Obergrenze "Prognostizierter Wert", "Prognostizierter unterer Grenzwert" und "Prognostizierter oberer Grenzwert" werden in den obigen Spalten gespeichert. "Vorhersagewert" ist ein sehr wahrscheinliches Vorhersageergebnis, und "vorhergesagte untere Grenze" und "vorhergesagte obere Grenze" sind die unteren und oberen Grenzen des Schwankungsbereichs des vorhergesagten Werts.

Analyse

model.plot(predict)

model.plot(predict).png ** [Was können Sie hier lesen] ** ■ Aufgrund der Prognose ist der Trend des Rückgangs im Jahr 2021 im gleichen Tempo wie zuvor (etwa 1000 Personen oder weniger / Jahr). ■ Bis Ende 2021 das Niveau von 193.000 durchbrechen ■ Die Genauigkeit der Vorhersage ist hoch, da der vorhergesagte Wert und das tatsächliche Ergebnis nicht getrennt sind (vielmehr sind die Daten einfach). ■ Es ist möglich, Vorhersagen mit einem relativ kleinen Schwankungsbereich der vorhergesagten Werte bis etwa ein halbes Jahr im Voraus zu treffen. (Die Lerndaten haben von 2021/03 bis 2020/08 rapide zugenommen.)

model.plot_components(predict)

-Das Zeichnen für jeden Faktor wie Trendschwankungen und saisonale Schwankungen erfolgt mit [plot_components]. ・ Der [Trend] -Term ist der Trend (langfristige Trendschwankung). Ich zeichne, welche Art von Fluktuation es als jährlicher Übergang ist. ・ Die [jährliche] Laufzeit ändert sich saisonal. Es zeigt die Schwankungen während des Jahres. ・ Trends zeigen in kurzer Zeit keine starke Zunahme oder Abnahme und beobachten eine jährliche Zunahme oder Abnahme der Skala, die saisonale Schwankungen wiederholt.

model.plot_components(predict).png ** [Was können Sie hier lesen] ** ■ In den letzten 8 Jahren hat es eine schöne Linienform angenommen. Nach dem Jahr des Lernens (2013) gibt es keine Anzeichen für eine jährliche Erholung ■ Als Schwankung innerhalb des Jahres nimmt sie im Wesentlichen weiter ab, wird jedoch im Oktober und November leicht zunehmen. (Da saisonale Schwankungen analysiert und durch Wellenformen ausgedrückt werden, werden monatliche Daten wie diese Zeit verwendet Beachten Sie, dass erwartet wird, dass die Wellenform größer wird, wenn das Datendatumsintervall größer ist.) (Obwohl die tatsächlichen Daten kaum zunehmen, ist die Abnahmerate im Oktober und November im Vergleich zu anderen Daten erheblich zurückgegangen. Da es in den letzten Jahren einen leichten Anstieg gezeigt hat, scheint es einen Ort zu geben, an dem es sich als Vorhersage zu einem Anstieg entwickelt hat.) ■ Der Abwärtstrend ist leicht allmählich (Obwohl der Rückgang jedes Jahr im März stark ist, ist auch die Abnahmerate selbst rückläufig. Zum Beispiel ist der Rückgang im März selbst auf Beschäftigungs- / Aufstiegsereignisse zurückzuführen. Es kann spekuliert werden, dass die Verringerung der Abnahmerate auf die sinkende Geburtenrate zurückzuführen ist. Um die Details zu erfahren, soziale Dynamik wie Ein- und Ausziehen, wie die Anzahl der Geburten und Todesfälle Offene Daten wie natürliche Dynamik sind erforderlich.

Auswertung

Es muss bewertet werden, wie viel Vorhersagegenauigkeit das erstellte Modell aufweist. Dieses Mal werden wir mithilfe der Kreuzungsüberprüfung bewerten.

Gegenüberstellung

from fbprophet.diagnostics import cross_validation
df_cv = cross_validation(model, initial='1095 days', period='182 days', horizon = '365 days')

cross_validation() ・ Anfänglich: Wann soll mit der Prognose begonnen werden? ・ Zeitraum: Zeitraum zum Verschieben von Daten ・ Horizontal: Erwarteter Zeitraum Im Fall des obigen Deklarationsbeispiels ab dem 1095. Tag (Initiale) 1 bis 1094 Tage Daten für den Trainingsdatenzeitraum (3-facher Horizont, sofern nicht anders angegeben), Prognostizieren Sie den Bewertungszeitraum vom 1095. Tag bis zu 365 Tagen (Horizont). Verschieben Sie nach der Analyse der Prognose den Startpunkt des Prognosezeitraums um 182 Tage (Zeitraum) zurück. Wir prognostizieren 365 Tage ab dem 1277. Tag als nächsten Bewertungszeitraum. Dies wird bis zum Ende der Daten wiederholt und das Vorhersageergebnis gespeichert. Dieses Vorhersageergebnis wird als Bewertungsergebnis verwendet, indem es durch eine Skala ersetzt wird, die durch das später beschriebene Verfahren leicht bestätigt werden kann.

** Kreuzverifizierungsergebnis [df_cv] **

ds yhat yhat_lower yhat_upper y cutoff
0 2016-09-01 199454.428910 199389.987532 199514.165966 199386 2016-08-05
1 2016-10-01 199437.182903 199145.883231 199744.554272 199236 2016-08-05
2 2016-11-01 199274.971653 198645.490967 199906.989114 199110 2016-08-05
3 2016-12-01 199073.586270 198066.379455 200065.689963 199006 2016-08-05
4 2017-01-01 198809.990576 197391.138491 200210.975003 198837 2016-08-05

Bewertung der Bewertungsskala

from fbprophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)

performance_metrics() Berechnet die Bewertungsskala für das Ergebnis der Kreuzungsüberprüfung [df_cv] und speichert das Ergebnis.

** Berechnungsergebnis der Bewertungsskala [df_p] **

horizon mse rmse mae mape mdape coverage
0 57 days 16078.849437 126.802403 109.436237 0.000554 0.000432 0.1250
1 58 days 20194.085707 142.105896 129.175240 0.000655 0.000627 0.1250
2 59 days 18026.561842 134.263032 113.963954 0.000578 0.000545 0.2500
3 60 days 20932.092431 144.679274 129.291089 0.000657 0.000687 0.2500
4 87 days 33783.385041 183.802571 161.495031 0.000819 0.000824 0.3750

Die Bewertungsskala ist eine Berechnung der Ergebnisse für jeden Bewertungsindex, und die Typen sind wie folgt.

** ● MSE [mittlerer quadratischer Fehler] ** Der Durchschnittswert des Quadrats des Absolutwerts, der die Differenz zwischen dem tatsächlichen Wert und dem vorhergesagten Wert darstellt.

** ● RMSE [quadratischer Mittelwertfehler] ** Die Quadratwurzel des Quadrats der Differenz zwischen dem tatsächlichen Wert und dem vorhergesagten Wert.

** ● MAE [mittlerer absoluter Fehler] ** Der Durchschnitt der absoluten Werte der Differenz zwischen dem tatsächlichen Wert und dem vorhergesagten Wert.

** ● MAPE [mittlerer absoluter prozentualer Fehler] ** Durchschnitt des Verhältnisses der Differenz zwischen dem tatsächlichen Wert und dem vorhergesagten Wert zum tatsächlichen Wert.

MSE, RMSE und MAE werden unterschiedlich berechnet, aber die Abweichungen in der Vorhersage werden im Durchschnitt basierend auf tatsächlichen Messungen (diesmal Population) ausgedrückt. MAPE drückt die Abweichung der Vorhersage in Prozent (%) aus. Da die diesmal behandelten Zahlen groß sind, möchte ich die Bewertungsergebnisse mit MAPE (Average Absolute Percentage Error) bestätigen, das intuitiv leicht zu verstehen ist.

Visualisierung der Bewertungsskala durch MAPE (durchschnittlicher absoluter prozentualer Fehler)

from fbprophet.plot import plot_cross_validation_metric
fig = plot_cross_validation_metric(df_cv, metric='mape')

plot_cross_validation_metric() Sie können die im vorherigen Abschnitt berechnete Bewertungsskala visualisieren. Mit dem in der Kreuzungsüberprüfung als X-Achse angegebenen Horizont (Auswertungszeitraum) Der MAPE-Wert für die Anzahl der ausgeführten Auswertungen wird als Punkt gezeichnet. Der Durchschnitt wird als blaue Linie angezeigt.

plot_cross_validation_metric.png ** [Was können Sie hier lesen] ** ■ Die Genauigkeit der Gesamtvorhersage ist nicht gering ⇒ Selbst wenn Sie den maximalen Abweichungswert betrachten, beträgt der Mape-Wert etwa 0,4%.

Wenn Sie dem Durchschnitt folgen, ändert sich der Fehler zwischen 0,05 und 0,15%, was ungefähr 100 bis 300 Personen entspricht. Da es sich um eine Vorhersage bis zum letzten handelt, gibt es keinen Index, der korrekt sein könnte. Da es jedoch viele Zeiträume gibt, in denen sich die tatsächlichen Messdaten monatlich um 100 Personen bewegen, besteht der Unterschied darin, dass sie in einem Aggregationszeitraum ausgefüllt werden können, sodass es sich nicht um einen großen Fehler handelt. Das können Sie beurteilen. ■ Die Genauigkeit nimmt mit Ablauf der Periode ab dem Beginn der Vorhersage ab ⇒ Natürlich nimmt die Genauigkeit im Laufe der Monate tendenziell ab (die Verteilung der Mape nimmt zu).

Tuning

Raum zur Verbesserung der Modellgenauigkeit

Da das erstellte Modell nicht immer das beste ist, kann die Genauigkeit möglicherweise verbessert werden, indem Vorhersagen unter Verwendung des abgestimmten Modells getroffen werden. Hier werde ich auch den Prozess der Beurteilung schreiben: "Gibt es Raum zum Stimmen?"

Abstimmungsperspektive

Bei der Entscheidung, ob eine Abstimmung durchgeführt werden soll oder nicht, muss die Art der für das Training verwendeten Daten berücksichtigt werden. Dieses Mal werden wir aus den folgenden Perspektiven betrachten.

** ● Gesetzliche Saisonalität / Reitsaisonalität ** Schwankungen der tatsächlichen Daten sind entweder additiv (der Bereich und die Größe der Schwankungen sind unabhängig von der Größe der Zielvariablen konstant) oder multipliziert (je größer die Zielvariable, desto größer der Schwankungsbereich). Oder

** ● Anzahl der extrahierten Änderungspunkte ** Ist die Anzahl der Änderungspunkte in den tatsächlichen Daten angemessen?

** ● Extraktionsbereich der Änderungspunkte ** Ist der Extraktionsbereich des Änderungspunktes der tatsächlichen Daten angemessen?

Beurteilung der Abstimmung auf dieses Modell

** ● Gesetzliche Saisonalität / Reitsaisonalität ** Die Zielvariable sind diesmal Bevölkerungsdaten. "Tod" und "Geburt", die als einer der Faktoren für die Zunahme und Abnahme der Bevölkerung angesehen werden, sollen alt und jung sein Weil angenommen wird, dass sich das Ausmaß der Fluktuation je nach Bevölkerungszahl ändern wird. ** Wir beurteilen, dass diese Daten einen leichten Multiplikationsaspekt haben **. (Obwohl die Gesamtzahl von Jahr zu Jahr von der Darstellung des Vorhersageergebnisses abnimmt, wird sie von dieser begleitet. Sie sehen, dass der jährliche Rückgang gering ist, wenn auch nur geringfügig. (Abgesehen davon werden "Einzug" und "Auszug" auch von der Bevölkerungsbevölkerung beeinflusst. In diesen Fällen sind auch die Anzahl und der Umfang der Unternehmen / Schulen, die Empfänger des Ein- und Auszugs sind, stark betroffen. Es war schwierig, nur mit Bevölkerungsdaten abzuschließen. Die Modellierung von Propheten kann mit dem Parameter [Seasonality_Mode] oder "Additive Seasonality" erfolgen. Sie können "legale Saisonalität" angeben. Wenn dies jedoch weggelassen wird, wird das Modell standardmäßig mit "additive Saisonalität" erstellt. Es gibt Raum, um zu versuchen, ein Modell mit "legaler Saisonalität" als Abstimmung zu erstellen. ⇒ Ziel </ font> optimieren

** ● Anzahl der extrahierten Änderungspunkte ** Der Prophet extrahiert automatisch Änderungspunkte aus Trainingsdaten und verwendet sie zur Vorhersage. Die Anzahl der zu extrahierenden Änderungspunkte beträgt standardmäßig ebenfalls 25. Die Anzahl der extrahierten Änderungspunkte kann zum Zeitpunkt der Modellerstellung mit dem Parameter [n_changepoints] angegeben werden. Wenn diese Zahl zu klein ist, wird "zu diesem Zeitpunkt eine Änderung vorgenommen". Die Genauigkeit der Vorhersage wird aufgrund mangelnder Erkennung von Änderungspunkten in der Zeitreihe verringert. Auch wenn diese Zahl zu groß ist, werden leichte Schwankungen als Änderungspunkte erkannt, und Es wird angenommen, dass die Flexibilität der Vorhersage beeinträchtigt und die Genauigkeit verringert wird. Mit anderen Worten, wenn Sie eine Nummer angeben, soll das Modell trainiert werden Es ist notwendig, die wichtigen Änderungspunkte zu kontrollieren, Ereignisse wie monatliche sind in der Regel unklar. ** Es ist schwierig zu beurteilen, "wie viele angemessen sind" **, daher denke ich, dass es wenig Raum für Abstimmungen gibt. ⇒ Kann nicht optimiert werden </ font>

** ● Extraktionsbereich der Änderungspunkte ** Im Propheten als Extraktionsbereich von Änderungspunkten Extrahieren Sie 80% vom Startpunkt der Trainingsdaten als Zielzeitraum. Wenn beispielsweise der Trend am Ende der Trainingsdaten stark ansteigt, Das Standardmodell kann keine Vorhersagen treffen, die diese Änderung berücksichtigen. Im Parameter [changepoint_range] beim Erstellen eines Modells Passen Sie den Extraktionsbereich an, indem Sie '1.0' angeben. In diesem Fall sind solche ** jüngsten großen Schwankungen Da dies nicht besonders zu sehen ist **, scheint es keinen Raum für eine Abstimmung hinsichtlich des Extraktionsbereichs von Änderungspunkten zu geben. ⇒ Kann nicht optimiert werden </ font>

Tuning: Modellieren mit Saisonalität

Wie im obigen Abschnitt beurteilt, werden wir ein Modell mit "legaler Saisonalität" als Abstimmung erstellen.

#Modellgenerierung (legale Saisonalität)
#Generierungszeitparameter hinzugefügt[seasonality_mode = "multiplicative"]
model_multi = Prophet(weekly_seasonality=False,daily_seasonality=False,seasonality_mode = "multiplicative")
#Lernen
model_multi.fit(Jinkoudata)
#Prognose
predict_multi = model_multi.predict(future)
#Vorhersageergebniszeichnung
fig = model_multi.plot(predict_multi)

Die Zeichnung des Vorhersageergebnisses des Fahrmodells ist wie folgt. model.plot(predict_multi).png model.plot_components(predict_multi).png Die Tendenz ähnelt dem Rechtsmodell. Wir werden diesbezüglich auch eine Gegenprüfung durchführen.

#Gegenüberstellung
df_cv_multi = cross_validation(model_multi, initial='1095 days', period='182 days', horizon = '365 days')
#Bewertung der Bewertungsskala
df_p_multi = performance_metrics(df_cv_multi)
#Visualisierung der Bewertungsskala durch MAPE (durchschnittlicher absoluter prozentualer Fehler)
fig_multi = plot_cross_validation_metric(df_cv_multi, metric='mape')

Die Bewertungsskala MAPE war wie folgt. plot_cross_validation_metric(df_cv_multi.png Etwas, wirklich sehr wenig, aber weniger abwechslungsreich als das additive Modell, Es wurde ein Modell mit geringer Abweichung von der Vorhersage.

Zeichnen Sie die tatsächlichen Messdaten und die beiden Arten von Vorhersageergebnissen in dieselbe Tabelle und vergleichen Sie sie.

#Einstellung der Tabellengröße
plt.figure(figsize=(12,6))
#Einstellung der Achsenrichtung
plt.xlabel('Year month')
plt.ylabel('Jinkou')
#Zeichnungsbereich angeben
plt.xlim(82, 105)
plt.ylim(190000, 196000)
#Ändern Sie die Skalenanzeige
plt.xticks([82,88,94,100,105], ["2020-01","2020-07","2021-01","2021-07","2021-12"])
#Zeichnung jedes numerischen Wertes
plt.plot(Jinkoudata.y,label = 'Jinkoudata')
plt.plot(predict.yhat,label = 'Predict_add')
plt.plot(predict_multi.yhat,label = 'Predict_multi')
plt.legend()

Das Zeichnungsergebnis war wie folgt. plt.legend_data_add_multi.png Tatsächliche Messdaten, die von [Jinkoudata] zum Lernen verwendet werden, [Predict_add] ist das Vorhersageergebnis im additiven Saisonalitätsmodell. [Predict_multi] ist das Vorhersageergebnis im Fahrsaisonalitätsmodell. Es gibt eine Frage, ob dies in Ordnung ist, aber die Zeilen von [Predict_add] und [Predict_multi] überlappen sich und die Ergebnisse sind fast gleich. Ursprünglich war die Multiplikation der gemessenen Daten selbst gering, sodass sie möglicherweise nicht als signifikanter Unterschied in den Vorhersageergebnissen erscheint.

Zusammenfassung

Das Modellieren und Vorhersagen selbst war einfacher als ich erwartet hatte. Die Nutzung erfordert jedoch immer noch das Verständnis und die Kenntnis der Art und Korrelation von Daten. Der Prognosezeitraum, dem als Modell für zukünftige Prognosen vertraut werden kann, war nicht länger als erwartet. Es handelt sich also um eine Operation zum Lesen von Trends aus Daten für jeden Einheitszeitraum und zum Optimieren jedes Mal (obwohl dies anscheinend nicht auf dieses Beispiel beschränkt ist). Ich dachte, das wäre eine Voraussetzung.

Ich habe versucht, die Zukunft der Bevölkerung als Praxis vorherzusagen, aber da der Rückgang aus den ursprünglichen Daten hervorgeht, denke ich, dass es die Vorhersage bisher nicht wert war. Die Auswahl eines Themas ist immer noch wichtig. Wenn Sie tiefer graben möchten, können Sie externe Variablen verwenden, um die Genauigkeit zu verbessern. Möglicherweise möchten Sie die Korrelationsanalyse jedoch separat ausprobieren. Die Stadt Numazu ist meine Lieblingsstadt, daher dachte ich, es wäre gut, Vorhersagen zu treffen, nachdem ich andere Bereiche studiert habe.