[PYTHON] Ich habe versucht, die Abstimmungsergebnisse der Metropolregion Osaka für jede Gemeinde zu analysieren

Einführung

Ich lebe zurzeit in Osaka und habe gestern beim Beißen im Fernsehen gesehen, wie der Stadtplan abgestimmt hat.

Als ich den Fortschritt betrachtete, fand ich, dass der Unterschied in den Ergebnissen für jede Station bemerkenswert war **, und ich hatte das Gefühl, dass es möglich sein würde, für die Analyse geeignete Daten zu erhalten, also analysierte ich sie im Detail.

Hochladen verwendeter Skripte und bereinigter Daten auf GitHub

Vermeiden Sie, wie in den Qiita-Richtlinien angegeben, tiefe politische Überlegungen, um das Gebiet als technischen Artikel nicht zu überschreiten. Ich werde nur die erhaltenen Fakten auflisten.

Außerdem habe ich keine fortgeschrittenen analytischen Fähigkeiten wie kausales Denken. "Ich würde dies gerne tun, um tiefere Einsichten zu gewinnen." Wenn Sie Ratschläge zu solchen ** Methoden haben, wäre ich Ihnen sehr dankbar, wenn Sie einen Kommentar abgeben könnten! ** **.

Fazit

Das Verfahren, um zu der Schlussfolgerung zu gelangen, wird in den folgenden Kapiteln beschrieben, aber die folgenden Schlussfolgerungen wurden erhalten.

** "Je höher der Prozentsatz der Menschen in den Dreißigern und Fünfzigern ist, desto höher ist die Zustimmungsrate." ** ** "Je kleiner die durchschnittliche Anzahl der Haushalte (je kleiner die Anzahl der Familien) ist, desto höher ist die Zustimmungsrate" ** ** "Je höher der Breitengrad (Nordseite), desto höher die Genehmigungsquote" ** ** "Je höher das Männerverhältnis, desto höher die Zustimmungsrate" **

Analytisches Verfahren

Wie in TJOs Blog beschrieben, das auf dem Gebiet der Datenanalyse bekannt ist,

  1. Klärung des Zwecks (Festlegung der Zielvariablen)
  2. Merkmalsauswahl (Auswahl erklärender Variablen)
  3. Datenerfassung und -bereinigung
  4. Analyse und Visualisierung der Ergebnisse
  5. Überlegung und Zusammenfassung (ich werde diesmal nicht tief gehen)

Ich werde mit dem Verfahren fortfahren

1. Klärung des Zwecks

Dieses Mal interessierte mich die folgenden zwei Punkte (1) Vorspannung zwischen Stationen mit vielen und wenigen Stationen ② Unterschied zur vorherigen Abstimmung

In Bezug auf (1) besteht, wie in der folgenden Abbildung gezeigt (zitiert auf der Mainichi Shimbun-Website), eine deutliche geografische Abweichung in der Genehmigungsrate (ist die Genehmigungsrate im Norden des zentralen Teils der Stadt hoch?) image.png Ich wollte die Faktoren (Merkmale) hinter dieser Tendenz auf numerischer Basis aufzeigen.

Damit ** Zweck: Extrahieren Sie gültige Faktorkandidaten für hohe und niedrige Zulassungsraten ** ** Zielvariable: Rate vereinbaren ** ** Erklärende Variable: Merkmalsmenge als Faktorkandidat ** Ich werde mit der Analyse fortfahren als

In Bezug auf (2) möchte ich die Faktoren der Station extrahieren, in denen sich die Genehmigungsquote im Vergleich zum vorherigen Zeitpunkt erheblich geändert hat. ** Zielvariable: Diesmal die Genehmigungsrate ** ** Erklärende Variable: Letzte Genehmigungsrate ** Da möchte ich Ausreißer gruppieren.

2. Merkmalsauswahl (Auswahl erklärender Variablen)

Wie oben erwähnt, werden wir die Indikatoren, die sich wahrscheinlich auf die Genehmigungsrate auswirken, die die Zielvariable ist, als Merkmalsmengen extrahieren.

Alterszusammensetzung

Wie in der folgenden NHK-Tabelle gezeigt, zeigt die Exit-Umfrage, dass die Zustimmungsrate für Erwerbstätige in den Dreißigern und Fünfzigern hoch ist. Die Zustimmungsrate für ältere Menschen in den 60ern und darüber und junge Menschen in den 20ern ist relativ niedrig. image.png Dieses Mal fand ich es etwas eigenartig, dass sich die Tendenz erst in den 20er Jahren umkehrte, so dass angesichts des Vorhandenseins oder Nichtvorhandenseins dieses Effekts ** Merkmal 1 "Verhältnis über 60 Jahre alt" ** (Berücksichtigt das Umkehrphänomen in den 20er Jahren nicht) ** Merkmal 2 "Verhältnis der Menschen in den Dreißigern und Fünfzigern" ** (unter Berücksichtigung des Umkehrphänomens in den Zwanzigern) Auf die Merkmalsmenge

Verhältnis von Mann zu Frau

Es gibt keinen Unterschied zum Alter, aber das Geschlechterverhältnis scheint einen Effekt zu haben image.png ** Merkmal 3 "Männerverhältnis" ** Auf die Merkmalsmenge

Entfernung vom neuen Stationsbüro (Hauptregierungsgebäude)

Wie in der folgenden Abbildung gezeigt, sollte das neue Gemeindebüro (Hauptregierungsgebäude) im Zentrum der Stadt konzentriert werden. image.png

Ich lebe in einer Gemeinde, die sich von der Gemeinde unterscheidet, in der sich das Hauptregierungsgebäude befindet, aber ich war ein wenig besorgt, dass das Gebiet, in dem ich wohne, aufgrund der Entwicklung zurückbleiben würde, also dieses Gefühl (Domänenwissen) Glauben ** Merkmal 4 "Zeitaufwand von der Station, an der sich das Hauptregierungsgebäude befindet, bis zur alten Hauptstation der Station" ** Wurde als Feature-Menge hinzugefügt

Durchschnittliche Anzahl der Haushalte, durchschnittliches Jahreseinkommen

Es gibt keine klare Grundlage für diese, aber ich habe sie zu den Funktionen hinzugefügt, da sie wahrscheinlich das Abstimmungsverhalten beeinflussen und Daten leicht verfügbar sind. ** Merkmal 5 "Durchschnittliche Anzahl der Haushalte" ** ** Merkmal 6 "Durchschnittliches Jahreseinkommen pro Person" **

3. Datenerfassung und -bereinigung

Ich werde die Genehmigungsrate, die die objektive Variable ist, weglassen, da es viele Quellen gibt. An den folgenden Stellen wurden verschiedene Merkmale und Reinigungsmethoden gesammelt.

Spezifische Funktionsmenge

Verwenden Sie die folgenden 6 Funktionsgrößen

Verhältnis von 1,60 Jahren oder älter 2.30-50s Verhältnis 3. Männliches Verhältnis

Datenerfassungsmethode: Laden Sie die geschätzte Bevölkerung nach Alter und Geschlecht im Jahr 2020 von der folgenden Website in Osaka City herunter https://www.city.osaka.lg.jp/toshikeikaku/page/0000015211.html Reinigungsmethode: Berechnen Sie das Verhältnis der Zielaltersgruppe zum Ganzen und das Verhältnis der Männer für jede Station und machen Sie es zu einem Feld

"4. Zeit zum Hauptregierungsgebäude"

Datenerfassungs- / Bereinigungsmethode: Verwenden Sie die unten stehende Übergabestelle, um die erforderliche Zeit von der alten Station zur nächstgelegenen Station zum neuen Stationsbüro an Samstagen um 8, 12, 15 und 18:00 Uhr zu ermitteln. https://ekitan.com/

"5. Durchschnittliche Anzahl der Haushalte"

So erhalten Sie Daten: Laden Sie die Anzahl der Personen pro Haushalt im Jahr 2020 von der folgenden Website in Osaka City herunter https://www.city.osaka.lg.jp/toshikeikaku/page/0000068035.html Reinigungsmethode: Feldbildung für jede Station

"6. Durchschnittliches Pro-Kopf-Einkommen"

Datenerfassungsmethode: Laden Sie die Daten zur Einkommenshierarchie nach Haushalt von der folgenden Website in Osaka City herunter https://www.city.osaka.lg.jp/shimin/cmsfiles/contents/0000180/180789/20.pdf Reinigungsmethode: Berechnen Sie das durchschnittliche Jahreseinkommen, indem Sie das durchschnittliche Jahreseinkommen und -verhältnis für jede Ebene addieren und durch die in 5 berechnete durchschnittliche Anzahl der Haushaltsmitglieder dividieren.

Erhaltene Daten

Wie in der folgenden Abbildung gezeigt, wurden die Felddaten erhalten. Damit ist die Reinigung abgeschlossen image.png

Wenn es Japanisch ist, werden verschiedene Dinge auftreten, die im Umgang mit Python nicht gut sind, also werde ich es ins Englische übersetzen image.png

4. Datenanalyse und Visualisierung

Dieses Mal möchte ich als "objektive Variable: Genehmigungsrate" und "erklärende Variable: 6 Arten von Funktionen im vorherigen Kapitel" zurückkehren. Folgen Sie den unteren Schritten 4-1) Visualisierung der gesamten Daten 4-2) Merkmalsauswahl (Ausschluss stark korrelierter Merkmale) 4-3) Erstellen eines Regressionsmodells 4-4) Leistungsbewertung 4-5) Modellverbesserung

4-1. Visualisierung der gesamten Daten

Verwenden Sie Dieses in der Vergangenheit erstellte Tool, um das Streudiagramm und den Korrelationskoeffizienten zu ermitteln.

#%%Lesen
import pandas as pd
from custom_pair_plot import CustomPairPlot

#Zu verwendendes Feld
KEY_VALUE = 'ward_before'#Schlüsselreihe
OBJECTIVE_VARIALBLE = 'approval_rate'#Objektive Variable
EXPLANATORY_VALIABLES = ['1_over60','2_between_30to60','3_male_ratio','4_required_time','5_household_member','6_income']#Erklärende Variable

#pair_Visualisieren Sie die Korrelation mit dem Analysator
df = pd.read_csv(f'./osaka_metropolis_english.csv')
use_cols = [OBJECTIVE_VARIALBLE] + EXPLANATORY_VALIABLES
gp = CustomPairPlot()
gp.pairanalyzer(df[use_cols])

Ergebnisse durch Visualisierung erhalten

Die folgenden Ergebnisse werden wahrscheinlich erhalten (1) Charakteristischer Betrag, der die Umkehrung der 20er Jahre nicht berücksichtigt. Der Korrelationskoeffizient mit der Genehmigungsrate ist im betrachteten Verhältnis "2. 30-50s" höher als im Verhältnis "1. 60 Jahre oder älter" (wie geplant). (2) Das Männerverhältnis hat einen niedrigen Korrelationskoeffizienten mit der Zulassungsrate (obwohl es vom Ausreißer (Nishisei Ward) beeinflusst zu werden scheint ...) (3) Der Korrelationskoeffizient zwischen den erklärenden Variablen "2. 30-50s-Verhältnis" und "6. Durchschnittliches Jahreseinkommen" beträgt 0,89.

4-2. Funktionsauswahl

Dieses Mal werde ich Gradient Boosting (XGBoost) verwenden, eine Standardmethode der jüngsten Regressionsanalyse. Diese Methode soll relativ stark gegen multiple Co-Linearität sein (ein Problem bei Verwendung beider stark korrelierter erklärender Variablen), aber Wenn Sie dennoch stark korrelierte Variablen verwenden, wie sie dieser Site ähneln, können Sie sie nicht ignorieren. Es scheint Auswirkungen zu geben

Daher wurden diesmal die erklärenden Variablen mit hohem Korrelationskoeffizienten mit anderen erklärenden Variablen vom Analyseziel ausgeschlossen. Es scheint, dass VIF = 10 (entsprechend R = 0,95) oder 5 (entsprechend R = 0,9) häufig als Standard für die multiple Co-Linearität verwendet wird. Dieses Mal werden wir genauer hinschauen und erklärende Variablen mit einem Korrelationskoeffizienten von 0,9 oder höher ausschließen. Speziell ** ・ "1. 60 Jahre oder älteres Verhältnis" ist ausgeschlossen ** ‥ "2. 30-50s Verhältnis" hat einen Korrelationskoeffizienten von -0,96 und die Korrelation mit der Genehmigungsrate ist niedriger als 2. ** ・ "6. Durchschnittliches Jahreseinkommen pro Person ist ausgeschlossen" ** Der Korrelationskoeffizient mit "2. 30-50s Verhältnis" beträgt 0,89, was etwas niedriger als der Standard ist, aber "Das Jahreseinkommen ist hoch, wenn es viele Arbeitsplätze gibt". Da ein eindeutiger Kausalzusammenhang identifiziert werden kann, wird dieser ausgeschlossen

Daher werden wir die folgenden 4 Merkmalsgrößen für zukünftige Analysen verwenden. ** Merkmal 2 "Verhältnis der Menschen in den Dreißigern und Fünfzigern" ** (unter Berücksichtigung des Umkehrphänomens in den Zwanzigern) ** Merkmal 3 "Männerverhältnis" ** ** Merkmal 4 "Zeitaufwand von der Station, an der sich das Hauptregierungsgebäude befindet, bis zur alten Hauptstation der Station" ** ** Merkmal 5 "Durchschnittliche Anzahl der Haushalte" **

Das Streudiagramm nach Ausschluss des Merkmalsbetrags ist in der folgenden Abbildung dargestellt. image.png Wir werden diese erklärende Variable verwenden, um mit der Regressionsanalyse fortzufahren. Um zu betonen, dass es sich bei dem Folgenden um eine Regressionsanalyse handelt, werden wir den Begriff "Merkmalsbetrag" mit "erklärende Variable" vereinheitlichen.

4-3. Erstellen eines Regressionsmodells

Wie bereits erwähnt, verwenden wir die Gradientenverstärkung (XGBoost), die der Hauptstrom der jüngsten Regressionsanalyse ist. Es gibt eine praktische Python-Bibliothek, die Sie einfach verwenden können. Es gibt einige Hyperparameter, also optimieren Sie durch Rastersuche

Parameteroptimierung durch Rastersuche

Kombinieren Sie Rastersuche und Kreuzvalidierung, um die besten Hyperparameter zu finden.

Einfach ausgedrückt: Kreuzvalidierung "Teilen Sie die Daten in N gleiche Teile und finden Sie eine Parametereinstellung, die Leistung und Verhinderung von Überlernen in Einklang bringt." (Informationen zur gleichmäßigen Aufteilung der Daten finden Sie im Wikipedia-Bild unten). image.png

Die Rastersuche ist eine Methode zur Round-Robin-Suche nach einer Kombination vorgegebener Parameter. Der Nachteil ist, dass es Zeit braucht, und der Vorteil ist, dass es einfach zu implementieren ist. Ich suchte im Internet und verwendete eine Reihe von Parametern, die in XGBoost häufig als Kandidaten verwendet werden.

import xgboost as xgb
from sklearn import metrics as met
import sklearn as skl
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import numpy as np
import matplotlib.pyplot as plt
import os
from datetime import datetime
import seaborn as sns

#Zu verwendendes Feld
KEY_VALUE = 'ward_before'#Schlüsselreihe
OBJECTIVE_VARIALBLE = 'approval_rate'#Objektive Variable
USE_EXPLANATORY = ['2_between_30to60','3_male_ratio','4_required_time','5_household_member']#Zu verwendende erklärende Variablen
#Daten lesen
df = pd.read_csv(f'./osaka_metropolis_english.csv')

#Erhalten Sie objektive und erklärende Variablen (konvertieren Sie zu ndarray anstelle von Pandas)
y = df[[OBJECTIVE_VARIALBLE]].values
X = df[USE_EXPLANATORY].values
#Allgemeine Parameter für die Rastersuche und Leistungsbewertung
num_round=10000#Maximale Anzahl des Lernens
early_stopping_rounds=50#Hören Sie auf zu lernen, wenn sich der Bewertungsindex nicht so oft hintereinander verbessert
seed = 42#Zufälliger Samen

#Rastersuchparameter(Für Details https://qiita.com/R1ck29/items/50ba7fa5afa49e334a8f)
cv_params = {'eval_metric':['rmse'],#Datenauswertungsindex
             'objective':['reg:squarederror'],#Verlustfunktion muss minimiert werden
             'random_state':[seed],#Zufälliger Samen
             'booster': ['gbtree'],
             'learning_rate':[0.1,0.3,0.5],
             'min_child_weight':[1,5,15],
             'max_depth':[3,5,7],
             'colsample_bytree':[0.5,0.8,1.0],
             'subsample':[0.5,0.8,1.0]
            }

#XGBoost-Instanziierung
cv_model = xgb.XGBRegressor()
#Instanziierung der Rastersuche
# n_jobs=-Bei Einstellung auf 1 CPU100%Alle Kerne werden parallel berechnet. Sehr schnell.
cv = GridSearchCV(cv_model, cv_params, cv = 5, scoring= 'r2', n_jobs =-1)

#Ausführung der Rastersuche
evallist = [(X, y)]
cv.fit(X,
        y,
        eval_set=evallist,
        early_stopping_rounds=early_stopping_rounds
        )

#Anzeige der optimalen Parameter
print('Optimale Parameter' + str(cv.best_params_))
print('Variable Bedeutung' + str(cv.best_estimator_.feature_importances_))

Es mag seltsam erscheinen, dass die für die Rastersuche verwendeten Daten und die Testdaten hier nicht getrennt sind. Dieser Abschnitt dient jedoch der Optimierung der Parameter, und die Leistungsbewertung wird im nächsten Abschnitt separat durchgeführt. Deshalb vergib mir bitte. (Wenn Sie die Rastersuche für jede Station mit Leave_One_Out aktivieren, wird die erforderliche Zeit benötigt ...)

4-4. Leistungsbewertung

Die Leistungsbewertung wird für Testdaten und Trainingsdaten getrennt durchgeführt.

Verwenden Sie Folgendes als Indikatoren ** RMSE-Durchschnitt: ** Größerer Vorhersagefehler insgesamt (kleiner ist besser) ** Voraussichtlicher und tatsächlicher Korrelationskoeffizient: ** Die Größe der vorhergesagten und tatsächlichen Korrelation (je größer desto besser) ** Maximaler Vorhersagefehler: ** Bewerten Sie, ob es einen Abschnitt mit extrem großem Vorhersagefehler gibt (kleiner ist besser)

So teilen Sie Testdaten

Es gibt verschiedene Möglichkeiten, sich zu teilen

・ Da die Anzahl der Daten gering ist, muss die Anzahl der Trainingsdaten gesichert werden. ・ Ich möchte den Leistungsindex für jede Station berechnen und die Stationen identifizieren, die nicht zum Modell passen.

Aus der Sicht Nehmen Sie die Testdaten einzeln heraus und verwenden Sie den Rest als Trainingsdaten ** "Leave_One_Out" **, um die Leistung zu bewerten (In der folgenden Abbildung auf Wikipedia können Sie die Leistung mit einem Modell bewerten, das aus allen Daten auf anderen Stationen trainiert wurde.) 450px-LOOCV.gif

Code zur Auswertung

Fügen Sie dem obigen Code zur Parameteroptimierung den folgenden Code hinzu, um die Leistung zu bewerten.

#%%3.Leistungsbeurteilung(Leave-One-Out)
#Verwenden Sie den optimalen Parameter bei der Rastersuche für den Parameter
params = cv.best_params_
#DataFrame zum Speichern von Ergebnissen
df_result = pd.DataFrame(columns=['test_index','eval_rmse_min','train_rmse_min','num_train'])

#Leave-One-Leistungsbewertung durch Teilen von Daten mit Out
loo = LeaveOneOut()
for train_index, test_index in loo.split(X):#Geteilte Schleife für alle Daten
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    dtrain = xgb.DMatrix(X_train, label=y_train)#Trainingsdaten
    dtest = xgb.DMatrix(X_test, label=y_test)#Testdaten
    evals = [(dtest, 'eval'),(dtrain, 'train')]#Geben Sie Trainingsdaten und Testdaten für die Anzeige der Ergebnisse an
    evals_result = {}#Zum Halten von Ergebnissen

    #Ausführung lernen
    model = xgb.train(params,
                    dtrain,#Trainingsdaten
                    num_boost_round=num_round,
                    early_stopping_rounds=early_stopping_rounds,
                    evals=evals,
                    evals_result=evals_result
                    )
    
    #Bewertung der Modellleistung
    test_pred = model.predict(dtest, ntree_limit=model.best_ntree_limit)
    num_train = len(evals_result['eval']['rmse'])
    df_result = df_result.append({'test_index': test_index[0],
                    'key_value': df[[KEY_VALUE]].iloc[test_index[0],0],
                    'pred_value': test_pred[0],
                    'real_value': df[[OBJECTIVE_VARIALBLE]].iloc[test_index[0],0],
                    'eval_rmse_min': evals_result['eval']['rmse'][num_train - 1],
                    'train_rmse_min': evals_result['train']['rmse'][num_train - 1],
                    'num_train': num_train},
                    ignore_index=True)

#Anzeige der Ergebnisse der Leistungsbewertung
print('RMSE-Durchschnitt' + str(df_result['eval_rmse_min'].mean()))
print('Korrelationskoeffizient' + str(df_result[['pred_value','real_value']].corr().iloc[1,0]))
print('Maximaler Vorhersagefehler' + str(max((df_result['pred_value'] - df_result['real_value']).abs())))

#Ausgabeergebnis
dt_now = datetime.now().strftime('%Y%m%d%H%M%S')
feat_use = 'feat' + '-'.join([ex.split('_')[0] for ex in USE_EXPLANATORY])
#Resultate der Auswertung
df_result.to_csv(f"{os.getenv('HOMEDRIVE')}{os.getenv('HOMEPATH')}\Desktop\{feat_use}_{dt_now}_result.csv")

path = f"{os.getenv('HOMEDRIVE')}{os.getenv('HOMEPATH')}\Desktop\{feat_use}_{dt_now}_result.txt"
with open(path, mode='w') as f:
        f.write('Funktionswert' + str(USE_EXPLANATORY))
        f.write('\n Optimale Parameter' + str(cv.best_params_))
        f.write('\n Rastersuchziel' + str(cv_params))
        f.write('\n variable Bedeutung' + str(cv.best_estimator_.feature_importances_))
        f.write('\nRMSE-Durchschnitt' + str(df_result['eval_rmse_min'].mean()))
        f.write('\n Korrelationskoeffizient' + str(df_result[['pred_value','real_value']].corr().iloc[1,0]))
        f.write('\n Maximaler Vorhersagefehler' + str(max((df_result['pred_value'] - df_result['real_value']).abs())))

#Streukartenanzeige
sns.regplot(x="pred_value", y="real_value", data=df_result, ci=0)

Resultate der Auswertung

Der diesmal erhaltene Leistungsbewertungsindex ist wie folgt.

RMSE-Durchschnitt (kleiner ist besser): 0,0226 Prognostizierter und tatsächlicher Korrelationskoeffizient (je größer desto besser): 0,619 Maximaler Vorhersagefehler (kleiner ist besser): 0,0709

Ob dieser Index gut oder schlecht ist, wird im nächsten Abschnitt bewertet ** Schauen wir uns zunächst ein Streudiagramm an, in dem der vorhergesagte Wert (horizontale Achse) und der tatsächliche Wert (vertikale Achse) verglichen werden. ** image.png

Als ich mir das obige Streudiagramm ansah, fühlte ich mich mit dem Ergebnis von Fukushima Ward etwas unwohl, wo der Unterschied zwischen dem vorhergesagten Wert und dem gemessenen Wert groß ist. Zum Beispiel im Vergleich zu Miyakojima Ward, die nach derselben Fusion zu Kita Ward gehört, image.png

Trotz der Tatsache, dass die Werte aller Merkmalsgrößen nahe beieinander liegen, sind die vorhergesagten Werte von Fukushima Ward unnatürlich niedrig (vielmehr sind die vorhergesagten Werte aufgrund des großen Anteils von Menschen in den Dreißigern und Fünfzigern wahrscheinlich größer als die von Miyakojima Ward. ), Es scheint, dass die während des Leave-One-Out geteilten Trainingsdaten übertrainiert wurden. In den folgenden Abschnitten werden Methoden zur Verhinderung von Überlernen behandelt.

4-5 Modellverbesserung

Da das Phänomen, das zu viel zu lernen scheint, im vorherigen Abschnitt aufgetreten ist, werden wir Verbesserungsmaßnahmen anwenden, um die Leistung des Modells zu verbessern.

Verbesserungsmaßnahme 1 Grenzen Sie den Funktionsumfang ein

Ich konnte mir keine andere Methode als die Rastersuche vorstellen, um Überlernen zu verhindern, und habe daher die zu verwendenden erklärenden Variablen eingegrenzt.

Erklärende Variablen RMSE-Durchschnitt
(Je kleiner desto besser)
Prognostizierter und tatsächlicher Korrelationskoeffizient
(Je größer desto besser)
Maximaler Vorhersagefehler
(Je kleiner desto besser)
2,3,4,5 Verwenden Sie alle 0.0226 0.619 0.0709
2,3,4 0.0213 0.648 0.0531
2,3,5 0.0191 0.744 0.0474
2,4,5 0.0222 0.614 0.0739
3,4,5 0.0221 0.642 0.0593
2,3 0.0197 0.707 0.0519
2,4 0.0181 0.733 0.0604
2,5 0.0248 0.572 0.0590
3,4 0.0229 0.568 0.0610
3,5 0.0232 0.596 0.0503
4,5 0.0304 0.460 0.0750
2 0.0209 0.646 0.0559
3 0.0303 -0.996 0.0726
4 0.0246 0.541 0.0532
5 0.0292 0.407 0.0686

Die Kombination mit besonders hoher Leistung wurde gewagt. Das Streudiagramm ist wie unten ebenfalls dargestellt.

Vorhersagediagramm zwischen Messwert und gemessenem Wert, wenn erklärende Variablen 2, 3 und 5 verwendet werden

pred_real_2-3-5.png

Vorhersagediagramm zwischen Messwert und gemessenem Wert, wenn die erklärenden Variablen 2 und 4 verwendet werden

pred_real_2-4.png

Warum hat sich der Index verbessert?

Korrelation / Kausalzusammenhang zwischen 3 oder mehr Parteien unter den 4 verwendeten erklärenden Variablen (Beispiel: "Je näher am Hauptregierungsgebäude, desto mehr arbeitende Generationen in den Dreißigern und Fünfzigern und desto geringer die Anzahl der Familien, so dass die durchschnittliche Anzahl der Haushaltsmitglieder ist Da es "weniger" usw. enthält, wird angenommen, dass die Verwendung aller von ihnen eine nachteilige Wirkung haben kann.

Ehrlich gesagt kann ich auch nicht das Gefühl leugnen, dass ich mit 4 Variablen nicht die beste Leistung erzielen konnte, weil meine Fähigkeit, die Gradientenverstärkung zu nutzen, nicht ausreichte. ** Wenn Sie Kenntnisse wie "Dies verhindert Überlernen!" ** haben, würde ich es begrüßen, wenn Sie einen Kommentar abgeben könnten.

Verbesserungsmaßnahme 2 Berücksichtigung der regionalen Positionsbeziehung

Betrachtet man das Streudiagramm der vorhergesagten und gemessenen Werte des Modells unter Verwendung der erklärenden Variablen 2, 3 und 5 mit guter Leistung, so sind die Stationen mit niedrigeren Messwerten als die vorhergesagten die Stationen auf der Südseite (insbesondere Shintennoji in rot dargestellt). Sie können sehen, dass die Station, die der Station entspricht, auffällt. image.png Im Gegenteil, in den grün dargestellten nördlichen Stationen wie der Kita-Station und der Yodogawa-Station gibt es viele Stationen, deren tatsächliche Messwerte höher als erwartet sind.

Es wird gesagt, dass das regionale System von Osaka City zwischen der Nord- und der Südseite sehr unterschiedlich ist, und es wird vermutet, dass dieser regionale Unterschied das Wahlverhalten beeinflusst hat.

Daher haben wir dieses Mal "Breitengrad" als erklärende Variable hinzugefügt, die Nord und Süd darstellt ** (Da alle 〇 Teile von "nördlicher Breite 〇 Grad △ Minuten □ Sekunden" "34 Grad" sind, verwenden Sie diesmal Werte unter Minuten.)

Erklärende Variablen RMSE-Durchschnitt
(Je kleiner desto besser)
Prognostizierter und tatsächlicher Korrelationskoeffizient
(Je größer desto besser)
Maximaler Vorhersagefehler
(Je kleiner desto besser)
2,3,5 0.0191 0.744 0.0474
2,3,5+Breite 0.0174 0.767 0.0444
2,4 0.0181 0.733 0.0604
2,4+Breite 0.0182 0.755 0.0586

Sowohl bei Verwendung der erklärenden Variablen "2,3,5" als auch bei Verwendung von "2,4" wird der Index auf breiter Front verbessert. Immerhin scheint der Unterschied zwischen Nord und Süd ein Faktor für die Genehmigungsquote zu sein.

Erwartungswert gegen Messwert-Streudiagramm, wenn erklärende Variablen 2,3,5, Breitengrad verwendet werden

pred_real_2-3-5-latitude.png

Vorhersagediagramm zwischen Messwert und gemessenem Wert, wenn erklärende Variablen 2, 4 und Breitengrad verwendet werden

pred_real_2-4-latitude.png

Funktionsbedeutung, wenn die erklärenden Variablen 2, 3, 5 und der Breitengrad verwendet werden.

importance_2-3-5-latitude.png

5. Überlegung und Zusammenfassung

Das Modell mit der besten Leistung (unter Verwendung der erklärenden Variablen 2,3,5, Breitengrad) verwendet die folgenden Merkmale in absteigender Reihenfolge der Wichtigkeit. Feature 2 ** "Verhältnis der Menschen in den 30ern und 50ern" ** Merkmal 5 ** "Durchschnittliche Anzahl der Haushalte" ** Zusätzliche Funktionen ** "Breitengrad" ** Merkmal 3 ** "Männerverhältnis" **

Die hier verwendete Merkmalsmenge kann als ein Faktor angesehen werden, der die Genehmigungsrate beeinflusst, die die Zielvariable ist.

Ich werde es vermeiden, tief über die Ursache nachzudenken. ** "Der Anteil der Männer in der Hauptarbeitsgeneration ist groß, die durchschnittliche Anzahl der Haushalte ist gering und die Gemeinde auf der Nordseite" hat viel Unterstützung ** ** Es gibt viel Widerstand in "das Verhältnis der Männer in der Hauptarbeitsgeneration ist gering, es gibt viele Familien und die Gemeinde auf der Südseite" ** Das scheint der Fall zu sein. (In Bezug auf die Bedeutung der Merkmalsmenge im vorherigen Abschnitt scheint der Einfluss der Alterszusammensetzung am größten und der Einfluss des Männerverhältnisses am geringsten zu sein.)

Wie Sie der Korrelationsanalyse in 4-1 entnehmen können ** Die Tatsache, dass es in den 20er Jahren einen relativ großen Widerstand gibt (Umkehrphänomen bei den 30er Jahren), wirkt sich auch auf den Unterschied in der Genehmigungsrate zwischen den Stationen aus ** Ich denke es kann gesagt werden.

6. Was ich fühlte

Durch diese Analyse konnte ich die folgenden Gefühle bekommen.

Bedeutung des Domänenwissens

Einer der Gründe für das Zweifeln an Überlernen in 4.4 ist "Ich kann mir nicht vorstellen, warum Fukushima Ward keinen Wert mehr hat". Fukushima Ward ist eine einzigartige Gegend, die für Gourmet-Essen bekannt ist. Es gab ein durchschnittliches Image (Domänenwissen) in der Stadt als einen Faktor, der die Abstimmung beeinflusst, daher die Idee, dass "Wenn dies ein Ausreißer ist, muss die Leistung des von mir erstellten Modells schlecht sein". Ich konnte erreichen.

Übertreiben Sie das Domänenwissen nicht

Kapitel 2 basiert auf der Idee, dass die Bürger das Gefühl haben, je weiter sie vom Hauptregierungsgebäude entfernt sind, desto unbequemer fühlen sie sich und desto niedriger ist die Zustimmungsrate. Der Funktionsbetrag "4. Zeit, die benötigt wird, um das Hauptregierungsgebäude zu erreichen" wurde hinzugefügt.

Wenn Sie Daten sammeln, während Sie auf die Übertragungsinformationen klicken, ** "Es muss eine Funktionsmenge sein, die zu einer verbesserten Leistung führt! Das stärkste Domänenwissen!" ** Ich war in hoher Spannung, als ich nachdachte, Als ich mit der Analyse fortfuhr, gab es nur einen gewissen Einfluss, der in anderen Merkmalsgrößen begraben war.

Und da die Daten, an deren Erfassung ich hart gearbeitet habe, mir ein Gefühl dafür geben werden, ** "Ich möchte diesen Funktionsbetrag sowieso nicht wegwerfen! Ich möchte ihn mit Gewalt verwenden" ** Als Analytiker entsteht ein Gefühl, dem es an Objektivität mangelt.

Ich konnte die Schwierigkeit spüren, nur nach den Tatsachen zu urteilen, die durch das Versiegeln der Vorurteile und Gefühle, die aus einem solchen Domänenwissen entstanden waren, erhalten wurden.

Der Spaß beim Analysieren von Live-Daten

Beim Umgang mit aktuellen und hochaktuellen Daten hatte ich das Gefühl, dass meine Motivation zunehmen würde. Ich werde weiterhin aktuelle Angelegenheiten analysieren, um die Ergebnisse meiner Studien auszugeben!

Bonus: Analyse der Differenz zur vorherigen Abstimmung

Es wird eine zusätzliche Analyse sein, aber ich werde auch die Stationen analysieren, auf denen der Unterschied zur vorherigen Abstimmung groß ist.

Vergleich der Zustimmungsraten zwischen der vorherigen Abstimmung und dieser Abstimmung

Ich habe die Zustimmungsrate der vorherigen Abstimmung 2015 mit der Zustimmungsrate dieser Zeit verglichen (horizontale Achse: letztes Mal, vertikale Achse: diesmal) image.png Die Tendenz ist fast dieselbe wie beim vorherigen Mal (R2 = 0,88), aber es gibt einige Schutzzauber, die sich gegenüber dem vorherigen Zeitpunkt geändert haben (besonders bemerkenswerte Schutzzauber sind rot).

Vergleich der Abteilungen

Ich denke, dass einer der Gründe für die Änderung gegenüber dem oben genannten Zeitpunkt die Änderung der Klassifizierung nach dem Zusammenschluss sein kann. Ich habe die Klassifizierung zwischen dem letzten und diesem Mal verglichen.

Letzte Division

Die folgende Abbildung stammt von der Sankei Shimbun-Website image.png

Diese Aufteilung

image.png

Es gibt keine Änderung in der Aufteilung des zentralen Teils von Chuo Ward und Kita Ward, Es scheint, dass sich die Aufteilung der umliegenden Bezirke (entsprechend der vorherigen Ost-, Süd- und Buchtstation) erheblich geändert hat (das Hauptregierungsgebäude wurde in die Station in der Nähe des Stadtzentrums integriert).

Analyserichtlinie

Ich habe versucht, die Schutzzauber zu extrahieren, bei denen eine Zunahme oder Abnahme von 2% oder mehr gegenüber dem vorherigen Zeitpunkt zu verzeichnen war. Basierend auf der Klassifizierung im vorherigen Abschnitt (Chuo-ku, Kita-ku oder andere) werden auch die Änderungen in der Klassifizierung nach dem Zusammenschluss angezeigt.

Stationsname Änderungen in der Klassifizierung nach der Fusion Erhöhen verringern
Taisho Ward Ja +2.54%
Nishinari Ward Keiner +2.49%
Kita Ward Keiner -2.73%
Chuo-ku Ja -3.12%
Abeno Ward Ja -3.32%
Nishi-Ward Keiner -3.89%
Minato-ku Ja -4.82%

Ich möchte die Stationen analysieren, die sich nach dem Zusammenschluss geändert haben, und diejenigen, die dies nicht getan haben.

1. Station, in der sich die Klassifizierung geändert hat

Minato Ward, Abeno Ward und Taisho Ward sind gleichwertig. Es geht runter, aber ich glaube, dass es in Minato Ward und anderen Bereichen wahrscheinlich unterschiedliche Faktoren gibt.

Minato-ku

Obwohl die Abnahmerate bei Minato Ward bei weitem die größte ist wie in verschiedenen Berichten erwähnt, liegt sie geografisch vor der Abstimmung. Es scheint, dass eine Stimme auf die Entfernung hinwies. Mit Blick auf die Karte nach dem Zusammenschluss ist Minato Ward sehr weit von den 13 Stationen entfernt, an denen sich das Hauptregierungsgebäude befindet. image.png Sie befinden sich nicht nur weit entfernt, sondern haben auch eine kleine regionale Verbindung mit einem großen Fluss namens Yodogawa dazwischen. Selbst wenn Sie versuchen, mit dem Zug zu fahren, ist die Transferzeit am Umeda-Bahnhof unterwegs sehr lang, was sehr unpraktisch ist. (Wenn Sie es mit Tokio vergleichen, das Bild der Positionsbeziehung zwischen Odaiba (Koto Ward) und Shinkoiwa (Katsushika Ward))

Im vorherigen Konzept war geplant, dass sich das Hauptregierungsgebäude in Minato Ward befindet. Selbst in diesem Blumenviertel, das ein ähnliches Positionsverhältnis aufweist, ist die Zustimmungsrate um 1,5% gesunken. Es wird spekuliert, dass sich die ** geografische Entfernung zum Hauptregierungsgebäude ** auswirkt.

Abeno Ward, Taisho Ward

(Bitte verzeihen Sie etwas Subjektivität) In Bezug auf die Gemeinde Abeno war im vorherigen Konzept geplant, das Hauptregierungsgebäude der neuen "Minami-Gemeinde" in der Gemeinde Abeno zu errichten. In diesem Konzept wird das Hauptregierungsgebäude in der alten Gemeinde Tennoji untergebracht, und der Name der neuen Gemeinde lautet auch "Tennoji-Gemeinde". ". [Die Geschichte mit dem Namen "Abeno Harukas" möchte den Namen Abeno zu einer nationalen Gemeinde machen.](Https://ja.wikipedia.org/wiki/%E3%81%82%E3%81%B9% E3% 81% AE% E3% 83% 8F% E3% 83% AB% E3% 82% AB% E3% 82% B9 #% E6% A6% 82% E8% AA% AC) In Anbetracht dessen bin ich der Meinung, dass die Verlagerung des Stationsbüros und des Stationsnamens in die benachbarte Gemeinde Tennoji, die eine gewisse Rivalität aufweist, für die Bewohner der Gemeinde ein Nachteil zu sein scheint.

Im Gegenteil, die Gemeinde Taisho war eine Hafenstation, die sich beim letzten Mal in der Nähe des Hauptregierungsgebäudes befand, diesmal jedoch in die größere Gemeinde Chuo. Es wird spekuliert, dass sich die Genehmigungsquote erhöht hat, indem die Situation, in der das Hauptregierungsgebäude in eine angrenzende Gemeinde mit einem ähnlichen Umfang verlegt wurde, verlassen wurde **.

2. Stationen, in denen sich die Aufteilung nicht geändert hat

Nishinari Ward (erhöhte Genehmigungsrate), Kita Ward (verringerte Genehmigungsrate), Chuo Ward (verringert), Nishi Ward (verringert) korrespondieren.

Es ist nicht sehr klar, aber es scheint, dass in den letzten fünf Jahren einige politische Veränderungen stattgefunden haben, unabhängig von der Änderung der Klassifizierung. (Während Kita-ku, Chuo-ku und Nishi-ku, deren Genehmigungsquoten gesunken sind, zu den vier besten Stationen mit einem durchschnittlichen Jahreseinkommen pro Kopf gehören. Seit Nishinari Ward, das die Zustimmungsrate erhöht hat, das niedrigste jährliche Pro-Kopf-Einkommen hat, Ist es eine Änderung in Bezug auf das Einkommen? Kann angenommen werden)

Zusammenfassung der Stationen, auf denen sich die Genehmigungsrate zwischen dem letzten und diesem Zeitpunkt geändert hat

Es scheint in die folgenden 3 Kategorien unterteilt zu sein ** Geografische Isolation vom Stationsbüro ** Minato Ward, (Konohana Ward)

** Hauptregierungsgebäude in einer nahe gelegenen Gemeinde ** Abeno Ward, Taisho Ward (Asahi Ward)

** Einige Änderungen treten unabhängig von der Änderung der Klassifizierung auf (hat dies möglicherweise etwas mit dem Einkommen zu tun?) ** Nishinari Ward, Chuo Ward, Nishi Ward, Kita Ward

Recommended Posts

Ich habe versucht, die Abstimmungsergebnisse der Metropolregion Osaka für jede Gemeinde zu analysieren
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Weisen Sie dem Namen der zerlegten PDF-Datei für jede Seite ein Datum zu
Ich habe nach dem Inhalt von CloudWatch Logs Agent gesucht
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Deshalb analysiere ich die Homepages jeder Partei
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Ich habe versucht, das Bild des Bogenschießen-Bewertungsbuchs (eine Broschüre, in der die Ergebnisse von Treffern aufgezeichnet werden) zu analysieren. (Google Colaboratory)
Verwenden Sie die Clustering-Ergebnisse erneut
Überprüfen Sie die Zunahme / Abnahme der Bitmünzen für jede Adresse aus der Blockchain
Python Hinweis: Map - Machen Sie dasselbe für jedes Element der Liste
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.