[PYTHON] J'ai essayé d'analyser les résultats du vote de la région métropolitaine d'Osaka pour chaque quartier

introduction

Je vis actuellement à Osaka et j'ai regardé le vote du plan de la ville hier en mordant à la télévision.

En regardant les progrès, j'ai pensé que la différence dans les résultats pour chaque service était remarquable **, et j'ai senti qu'il serait possible d'obtenir des données adaptées à l'analyse, je l'ai donc analysée en détail.

Téléchargement des scripts utilisés et des données nettoyées sur GitHub

Comme indiqué dans Qiita Guidelines, évitez toute considération politique profonde afin de ne pas dépasser le territoire en tant qu'article technique. Je n'énumérerai que les faits obtenus.

De plus, je n'ai pas de compétences analytiques avancées telles que le raisonnement causal, alors «j'aimerais faire cela pour avoir une meilleure compréhension». Si vous avez des conseils sur ces ** méthodes, je vous serais très reconnaissant de bien vouloir commenter! ** **

Conclusion

La procédure pour parvenir à la conclusion sera décrite dans les chapitres suivants, mais les conclusions suivantes ont été obtenues.

** "Plus le pourcentage de personnes dans la trentaine et la cinquantaine est élevé, plus le taux d'approbation est élevé." ** ** "Plus le nombre moyen de ménages est petit (plus le nombre de familles est petit), plus le taux d'approbation est élevé" ** ** "Plus la latitude (côté nord) est élevée, plus le taux d'approbation est élevé" ** ** "Plus le ratio d'hommes est élevé, plus le taux d'approbation est élevé" **

Procédure analytique

Comme décrit dans le blog de TJO, qui est familier dans le domaine de l'analyse de données,

  1. Clarification de l'objectif (définition de la variable objective)
  2. Sélection des fonctionnalités (sélection des variables explicatives)
  3. Collecte et nettoyage des données
  4. Analyse et visualisation des résultats
  5. Examen et résumé (je n'irai pas plus loin cette fois)

Je vais poursuivre la procédure

1. Clarification de l'objectif

Cette fois, je me suis intéressé aux deux points suivants (1) Biais entre les quartiers avec de nombreux et peu de quartiers ② Différence par rapport au vote précédent

En ce qui concerne (1), comme le montre la figure ci-dessous (citée sur le site Web de Mainichi Shimbun), il existe un biais géographique clair dans le taux d'approbation (le taux d'approbation est-il élevé vers le nord de la partie centrale de la ville?) image.png Je voulais révéler les facteurs (caractéristiques) derrière ce biais sur une base numérique.

Donc ** Objectif: Extraire les facteurs candidats valides pour les taux d'approbation élevés et faibles ** ** Variable objective: taux d'accord ** ** Variable explicative: quantité de caractéristiques comme facteur candidat ** Je vais procéder à l'analyse comme

En ce qui concerne (2), je voudrais extraire les facteurs du quartier où le taux d'approbation a changé de manière significative par rapport à la fois précédente. ** Variable objective: taux d'approbation de cette fois ** ** Variable explicative: Dernier taux d'approbation ** Comme, je voudrais regrouper les valeurs aberrantes.

2. Sélection des fonctionnalités (sélection des variables explicatives)

Comme mentionné ci-dessus, nous allons extraire les indicateurs susceptibles d'affecter le taux d'approbation, qui est la variable objective, en tant que quantités de caractéristiques.

Composition par âge

Comme le montre le tableau de la NHK ci-dessous, l'enquête de sortie montre que le taux d'approbation des travailleurs dans la trentaine et la cinquantaine est élevé. Le taux d'approbation des personnes âgées dans la soixantaine et plus et des jeunes dans la vingtaine est relativement faible. image.png Cette fois, j'ai senti que c'était un peu étrange que la tendance ne s'inverse que dans la vingtaine, alors j'ai considéré la présence ou l'absence de cet effet. ** Caractéristique 1 "Ratio de plus de 60 ans" ** (Ne prend pas en compte le phénomène de retournement dans les 20 s) ** Caractéristique 2 "Ratio de personnes dans la trentaine et la cinquantaine" ** (Compte tenu du phénomène d'inversion dans la vingtaine) Vers la quantité de fonction

Ratio hommes-femmes

Il n'y a pas de différence autant que l'âge, mais le rapport entre les sexes semble avoir un effet, donc image.png ** Caractéristique 3 "Ratio masculin" ** Vers la quantité de fonction

Distance du nouveau bureau de paroisse (bâtiment principal du gouvernement)

Comme le montre la figure ci-dessous, le nouveau bureau de quartier (bâtiment principal du gouvernement) devait être concentré dans le centre de la ville. image.png

Je vis dans un quartier différent de celui où se trouve le bâtiment principal du gouvernement, mais je me sentais un peu inquiet que la région où je vis soit laissée pour compte en raison du développement, donc ce sentiment (connaissance du domaine) Croyez ** Caractéristique 4 «Temps requis entre la gare où se trouve le bâtiment principal du gouvernement et l'ancienne gare centrale de quartier» ** A été ajouté en tant que quantité de fonctionnalités

Nombre moyen de ménages, revenu annuel moyen

Il n'y a pas de base claire pour cela, mais je les ai ajoutés aux fonctionnalités car ils sont susceptibles d'affecter le comportement de vote et les données sont facilement disponibles. ** Caractéristique 5 «Nombre moyen de ménages» ** ** Caractéristique 6 "Revenu annuel moyen par personne" **

3. Collecte et nettoyage des données

J'omettrai le taux d'approbation, qui est la variable objective, car il existe de nombreuses sources. Diverses caractéristiques ont été collectées aux endroits et méthodes de nettoyage suivants.

Montant de la caractéristique spécifique

Utilisez les 6 quantités de fonctionnalités suivantes

"Ratio de 1,60 ans ou plus" "Ratio de 2,30-50s" "3. Ratio d'hommes"

Méthode d'acquisition des données: Téléchargez la population estimée par âge et sexe en 2020 à partir du site Web suivant de la ville d'Osaka https://www.city.osaka.lg.jp/toshikeikaku/page/0000015211.html Méthode de nettoyage: calculez le rapport du groupe d'âge cible à l'ensemble et le rapport des hommes pour chaque salle et transformez-le en champ

"4. Heure du bâtiment principal du gouvernement"

Méthode d'acquisition / de nettoyage des données: Utilisez le site de transfert ci-dessous pour trouver le temps nécessaire entre l'ancien poste du centre de service et le poste le plus proche du nouveau bureau de service les samedis à 8, 12, 15 et 18 h en moyenne. https://ekitan.com/

"5. Nombre moyen de ménages"

Comment obtenir des données: Téléchargez le nombre de personnes par ménage en 2020 à partir du site Web suivant de la ville d'Osaka https://www.city.osaka.lg.jp/toshikeikaku/page/0000068035.html Méthode de nettoyage: Fieldisation pour chaque salle

"6. Revenu moyen par habitant"

Méthode d'acquisition des données: Téléchargez les données de la hiérarchie des revenus par ménage à partir du site Web suivant de la ville d'Osaka https://www.city.osaka.lg.jp/shimin/cmsfiles/contents/0000180/180789/20.pdf Méthode de nettoyage: calculez le revenu annuel moyen en additionnant le revenu annuel moyen et le ratio pour chaque niveau, et divisez par le nombre moyen de membres du ménage calculé en 5.

Données obtenues

Comme le montre la figure ci-dessous, les données sur le terrain ont été obtenues. Ceci termine le nettoyage image.png

S'il s'agit du japonais, diverses choses qui ne sont pas bonnes lorsqu'il s'agit de Python se produiront, je vais donc le traduire en anglais image.png

4. Analyse et visualisation des données

Cette fois, je voudrais revenir en tant que "variable objective: taux d'approbation" et "variable explicative: 6 types de fonctionnalités dans le chapitre précédent". Suivez les étapes ci-dessous 4-1) Visualisation de l'ensemble des données 4-2) Sélection des fonctionnalités (exclusion des fonctionnalités hautement corrélées) 4-3) Créer un modèle de régression 4-4) Évaluation des performances 4-5) Amélioration du modèle

4-1. Visualisation de l'ensemble des données

Utilisez Cet outil créé dans le passé pour trouver le diagramme de dispersion et le coefficient de corrélation.

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

#Champ à utiliser
KEY_VALUE = 'ward_before'#Ligne clé
OBJECTIVE_VARIALBLE = 'approval_rate'#Variable objective
EXPLANATORY_VALIABLES = ['1_over60','2_between_30to60','3_male_ratio','4_required_time','5_household_member','6_income']#Variable explicative

#pair_Visualisez la corrélation avec l'analyseur
df = pd.read_csv(f'./osaka_metropolis_english.csv')
use_cols = [OBJECTIVE_VARIALBLE] + EXPLANATORY_VALIABLES
gp = CustomPairPlot()
gp.pairanalyzer(df[use_cols])

Résultats obtenus par visualisation

Les résultats suivants sont susceptibles d'être obtenus (1) Montant caractéristique qui ne tient pas compte de l'inversion de 20s Le coefficient de corrélation avec le taux d'approbation est plus élevé dans le «rapport 2. 30-50s» considéré que dans le «1. (2) Le ratio masculin a un faible coefficient de corrélation avec le taux d'approbation (bien qu'il semble être affecté par la valeur aberrante (Nishisei Ward) ...) (3) Le coefficient de corrélation entre les variables explicatives «2. Ratio 30-50s» et «6. Revenu annuel moyen» atteint 0,89.

4-2. Sélection des fonctionnalités

Cette fois, j'utiliserai le boosting de gradient (XGBoost), qui est une méthode standard d'analyse de régression récente. Cette méthode est dite relativement forte contre la colinéarité multiple (un problème lors de l'utilisation des deux variables explicatives hautement corrélées), mais Pourtant, si vous utilisez des variables fortement corrélées car elles sont comme ce site, vous ne pouvez pas l'ignorer. Il semble y avoir un impact

Par conséquent, cette fois, les variables explicatives à coefficient de corrélation élevé avec d'autres variables explicatives ont été exclues de la cible d'analyse. Il semble que VIF = 10 (correspondant à R = 0,95) ou 5 (correspondant à R = 0,9) est souvent utilisé comme norme pour la colinéarité multiple. Cette fois, nous examinerons de plus près et exclurons les variables explicatives avec un coefficient de corrélation de 0,9 ou plus. En particulier ** ・ «1. 60 ans ou plus» est exclu ** ‥ «2. 30-50 ans» a un coefficient de corrélation de -0,96 et la corrélation avec le taux d'approbation est inférieure à 2. ** ・ "6. Le revenu annuel moyen par personne est exclu" ** Le coefficient de corrélation avec "2. Ratio 30-50s" est de 0,89, ce qui est légèrement inférieur à la norme, mais "Le revenu annuel est élevé lorsqu'il y a beaucoup d'emplois" Parce qu'une relation causale claire peut être identifiée, elle est exclue

Par conséquent, nous utiliserons les 4 quantités de caractéristiques suivantes pour une analyse future. ** Caractéristique 2 "Ratio de personnes dans la trentaine et la cinquantaine" ** (Compte tenu du phénomène d'inversion dans la vingtaine) ** Caractéristique 3 "Ratio masculin" ** ** Caractéristique 4 «Temps requis entre la gare où se trouve le bâtiment principal du gouvernement et l'ancienne gare centrale de quartier» ** ** Caractéristique 5 «Nombre moyen de ménages» **

Le diagramme de dispersion après avoir exclu la quantité de fonctionnalité est comme indiqué dans la figure ci-dessous. image.png Nous utiliserons cette variable explicative pour procéder à l'analyse de régression. En outre, afin de souligner que ce qui suit est une analyse de régression, nous unifierons le terme «montant caractéristique» en «variable explicative».

4-3. Création d'un modèle de régression

Comme mentionné précédemment, nous utilisons le boosting de gradient (XGBoost), qui est le courant dominant de l'analyse de régression récente. Il existe une bibliothèque Python pratique que vous pouvez facilement utiliser, Il y a quelques hyper paramètres, donc optimisez par la recherche de grille

Optimisation des paramètres par recherche de grille

Combinez la recherche de grille et la validation croisée pour trouver les meilleurs hyperparamètres.

Pour faire simple, validation croisée "Divisez les données en N parties égales et trouvez un paramètre qui équilibre les performances et la prévention du surapprentissage." (Reportez-vous à l'image Wikipédia ci-dessous pour la méthode de division égale des données). image.png

La recherche de grille est une méthode de recherche d'une combinaison de paramètres prédéterminés de manière circulaire. L'inconvénient est que cela prend du temps et l'avantage est qu'il est facile à mettre en œuvre. J'ai cherché sur le net et utilisé une gamme de paramètres qui sont couramment utilisés dans XGBoost comme candidats.

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

#Champ à utiliser
KEY_VALUE = 'ward_before'#Ligne clé
OBJECTIVE_VARIALBLE = 'approval_rate'#Variable objective
USE_EXPLANATORY = ['2_between_30to60','3_male_ratio','4_required_time','5_household_member']#Variables explicatives à utiliser
#Lecture des données
df = pd.read_csv(f'./osaka_metropolis_english.csv')

#Obtenir des variables objectives et explicatives (convertir en ndarray au lieu de pandas)
y = df[[OBJECTIVE_VARIALBLE]].values
X = df[USE_EXPLANATORY].values
#Paramètres communs pour la recherche de réseau et l'évaluation des performances
num_round=10000#Nombre maximum d'apprentissage
early_stopping_rounds=50#Arrêtez d'apprendre lorsque l'indice d'évaluation ne s'améliore pas ce nombre de fois de suite
seed = 42#Graine aléatoire

#Paramètres de recherche de grille(Pour plus de détails https://qiita.com/R1ck29/items/50ba7fa5afa49e334a8f)
cv_params = {'eval_metric':['rmse'],#Index d'évaluation des données
             'objective':['reg:squarederror'],#Fonction de perte à minimiser
             'random_state':[seed],#Graine aléatoire
             '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]
            }

#Instanciation XGBoost
cv_model = xgb.XGBRegressor()
#Instanciation de la recherche de grille
# n_jobs=-Lorsqu'il est réglé sur 1, CPU100%Tous les noyaux sont calculés en parallèle. Très vite.
cv = GridSearchCV(cv_model, cv_params, cv = 5, scoring= 'r2', n_jobs =-1)

#Exécution de la recherche de grille
evallist = [(X, y)]
cv.fit(X,
        y,
        eval_set=evallist,
        early_stopping_rounds=early_stopping_rounds
        )

#Affichage des paramètres optimaux
print('Paramètres optimaux' + str(cv.best_params_))
print('Importance variable' + str(cv.best_estimator_.feature_importances_))

Il peut sembler étrange que les données utilisées pour la recherche de grille et les données de test ne soient pas séparées ici, mais cette section a pour but d'optimiser les paramètres, et l'évaluation des performances sera effectuée séparément dans la section suivante. Par conséquent, veuillez me pardonner. (Si vous tournez la grille de recherche pour chaque quartier avec Leave_One_Out, le temps nécessaire ...)

4-4. Évaluation des performances

L'évaluation des performances est effectuée séparément pour les données de test et les données d'entraînement.

Utilisez les éléments suivants comme indicateurs ** Moyenne RMSE: ** Erreur de prédiction plus grande dans son ensemble (plus petite est meilleure) ** Coefficient de corrélation prévu et réel: ** L'ampleur de la corrélation prévue et réelle (la plus grande est la meilleure) ** Erreur de prédiction maximale: ** Évaluer s'il existe une section avec une erreur de prédiction extrêmement grande (plus petite est meilleure)

Comment diviser les données de test

Il existe plusieurs façons de diviser

・ Le nombre de données étant petit, il est nécessaire de sécuriser le nombre de données d'entraînement. ・ Je veux calculer l'indice de performance pour chaque salle et identifier les salles qui ne correspondent pas au modèle.

Du point de vue Retirez les données de test une par une et utilisez le reste comme données d'entraînement ** "Leave_One_Out" ** pour évaluer les performances (Voir la figure ci-dessous sur Wikipedia pour évaluer les performances avec un modèle formé à partir de toutes les autres données de service) 450px-LOOCV.gif

Code utilisé pour l'évaluation

Le code suivant est ajouté au code d'optimisation des paramètres ci-dessus pour évaluer les performances.

#%%3.Évaluation des performances(Leave-One-Out)
#Utilisez le paramètre optimal dans la recherche de grille pour le paramètre
params = cv.best_params_
#DataFrame pour conserver les résultats
df_result = pd.DataFrame(columns=['test_index','eval_rmse_min','train_rmse_min','num_train'])

#Leave-One-Évaluation des performances en divisant les données avec Out
loo = LeaveOneOut()
for train_index, test_index in loo.split(X):#Boucle divisée pour toutes les données
    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)#Données d'entraînement
    dtest = xgb.DMatrix(X_test, label=y_test)#données de test
    evals = [(dtest, 'eval'),(dtrain, 'train')]#Spécifiez les données d'entraînement et les données de test pour afficher les résultats
    evals_result = {}#Pour tenir les résultats

    #Exécution de l'apprentissage
    model = xgb.train(params,
                    dtrain,#Données d'entraînement
                    num_boost_round=num_round,
                    early_stopping_rounds=early_stopping_rounds,
                    evals=evals,
                    evals_result=evals_result
                    )
    
    #Évaluation des performances du modèle
    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)

#Affichage des résultats de l'évaluation des performances
print('Moyenne RMSE' + str(df_result['eval_rmse_min'].mean()))
print('Coefficient de corrélation' + str(df_result[['pred_value','real_value']].corr().iloc[1,0]))
print('Erreur de prédiction maximale' + str(max((df_result['pred_value'] - df_result['real_value']).abs())))

#Résultat de sortie
dt_now = datetime.now().strftime('%Y%m%d%H%M%S')
feat_use = 'feat' + '-'.join([ex.split('_')[0] for ex in USE_EXPLANATORY])
#Résultats de l'évaluation
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('Valeur de la fonctionnalité' + str(USE_EXPLANATORY))
        f.write('\n Paramètres optimaux' + str(cv.best_params_))
        f.write('\n Cible de recherche de grille' + str(cv_params))
        f.write('\n importance variable' + str(cv.best_estimator_.feature_importances_))
        f.write('\Moyenne nRMSE' + str(df_result['eval_rmse_min'].mean()))
        f.write('\n Coefficient de corrélation' + str(df_result[['pred_value','real_value']].corr().iloc[1,0]))
        f.write('\n Erreur de prédiction maximale' + str(max((df_result['pred_value'] - df_result['real_value']).abs())))

#Affichage de la carte de dispersion
sns.regplot(x="pred_value", y="real_value", data=df_result, ci=0)

Résultats de l'évaluation

L'indice d'évaluation des performances obtenu cette fois est le suivant.

Moyenne RMSE (plus petite est meilleure): 0,0226 Coefficient de corrélation prévu et réel (le plus grand est le mieux): 0,619 Erreur de prédiction maximale (plus petite est meilleure): 0,0709

Que cet indice soit bon ou mauvais sera évalué dans la section suivante, donc ** Tout d'abord, regardons un diagramme de dispersion comparant la valeur prédite (axe horizontal) et la valeur réelle (axe vertical) ** image.png

En regardant le diagramme de dispersion ci-dessus, je me suis senti un peu mal à l'aise avec le résultat de Fukushima Ward, où la différence entre la valeur prédite et la valeur mesurée est grande. Par exemple, par rapport à Miyakojima Ward, qui appartient à Kita Ward après la même fusion, image.png

Malgré le fait que les valeurs de toutes les quantités de caractéristiques soient proches, les valeurs prédites de Fukushima Ward sont anormalement basses (au contraire, les valeurs prédites sont susceptibles d'être plus grandes que celles de Miyakojima Ward en raison de la grande proportion de personnes dans la trentaine et la cinquantaine. ), Il semble que les données de formation divisées au cours de Leave-One-Out aient été surentraînées. Nous examinerons les méthodes de prévention du surapprentissage dans les sections suivantes.

4-5. Amélioration du modèle

Puisque le phénomène qui semble être le surapprentissage s'est produit dans la section précédente, nous appliquerons des mesures d'amélioration pour améliorer les performances du modèle.

Mesure d'amélioration 1 Réduire la quantité de fonctionnalités

Je ne pouvais pas penser à une autre méthode que la recherche par grille pour éviter le surapprentissage, j'ai donc réduit les variables explicatives à utiliser.

Variables explicatives Moyenne RMSE
(Le plus petit sera le mieux)
Coefficient de corrélation prévu et réel
(Le plus grand est le mieux)
Erreur de prédiction maximale
(Le plus petit sera le mieux)
2,3,4,5 Utiliser tout 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

La combinaison avec des performances particulièrement élevées a été audacieuse. Le diagramme de dispersion est également présenté ci-dessous comme précédemment.

Diagramme de dispersion des valeurs prédites et des valeurs mesurées lorsque les variables explicatives 2, 3 et 5 sont utilisées

pred_real_2-3-5.png

Diagramme de dispersion des valeurs prédites par rapport aux valeurs mesurées lorsque les variables explicatives 2 et 4 sont utilisées

pred_real_2-4.png

Pourquoi l'indice s'est-il amélioré?

Corrélation / relation de cause à effet entre 3 parties ou plus parmi les 4 variables explicatives utilisées (Exemple: "Plus le bâtiment principal du gouvernement est proche, plus il y a de générations actives dans la trentaine et la cinquantaine, et plus le nombre de familles est petit, donc le nombre moyen de membres du ménage est Puisqu'il inclut «moins», etc.), on émet l'hypothèse que l'utilisation de tous peut avoir un effet négatif.

De plus, honnêtement, je ne peux pas nier le sentiment que je ne pouvais pas obtenir les meilleures performances avec 4 variables parce que mes compétences pour utiliser le boosting de gradient n'étaient pas suffisantes. ** Si vous avez des connaissances telles que "Cela empêchera le sur-apprentissage!" **, je vous serais reconnaissant si vous pouviez commenter.

Mesure d'amélioration 2 Prise en compte de la relation de position régionale

En regardant le diagramme de dispersion des valeurs prédites et mesurées du modèle en utilisant les variables explicatives 2, 3 et 5 qui ont eu de bonnes performances, les quartiers avec des valeurs mesurées plus faibles que les prédictions sont les quartiers du côté sud (en particulier Shintennoji en rouge). Vous pouvez voir que la paroisse correspondant à la paroisse) se démarque. image.png Au contraire, dans les quartiers nord représentés en vert tels que les quartiers de Kita et de Yodogawa, il existe de nombreux quartiers dont les valeurs de mesure réelles sont plus élevées que prévu.

On dit que le système régional de la ville d'Osaka diffère considérablement entre le côté nord et le côté sud, et on émet l'hypothèse que cette différence régionale a influencé le comportement électoral.

Par conséquent, cette fois, nous avons ajouté la «latitude» comme variable explicative qui représente le nord et le sud ** (Puisque toutes les parties de «Latitude nord North degrés △ minutes □ secondes» sont «34 degrés», utilisez des valeurs inférieures à minutes cette fois)

Variables explicatives Moyenne RMSE
(Le plus petit sera le mieux)
Coefficient de corrélation prévu et réel
(Le plus grand est le mieux)
Erreur de prédiction maximale
(Le plus petit sera le mieux)
2,3,5 0.0191 0.744 0.0474
2,3,5+latitude 0.0174 0.767 0.0444
2,4 0.0181 0.733 0.0604
2,4+latitude 0.0182 0.755 0.0586

Tant lorsque la variable explicative «2,3,5» est utilisée que lorsque «2,4» est utilisé, l'indice est amélioré à tous les niveaux. Après tout, la différence entre le nord et le sud semble être un facteur du taux d'approbation.

Diagramme de dispersion de la valeur prédite et de la valeur mesurée lorsque les variables explicatives 2,3,5, la latitude sont utilisées

pred_real_2-3-5-latitude.png

Diagramme de dispersion de la valeur prédite par rapport à la valeur mesurée lorsque les variables explicatives 2, 4 et la latitude sont utilisées

pred_real_2-4-latitude.png

Fonctionnalité Importance lorsque les variables explicatives 2, 3, 5 et la latitude sont utilisées.

importance_2-3-5-latitude.png

5. Examen et résumé

Le modèle le plus performant (utilisant les variables explicatives 2,3,5, latitude) utilise les caractéristiques suivantes par ordre décroissant d'importance. Caractéristique 2 ** "Ratio de personnes dans la trentaine et la cinquantaine" ** Caractéristique 5 ** "Nombre moyen de ménages" ** Fonctionnalités supplémentaires ** "latitude" ** Caractéristique 3 ** «Ratio masculin» **

La quantité de caractéristiques utilisée ici peut être considérée comme un facteur qui influence le taux d'approbation, qui est la variable objective.

J'éviterai une réflexion approfondie sur la cause, ** Beaucoup de gens sont d'accord pour dire que "le ratio d'hommes dans la première génération active est élevé, le nombre moyen de ménages est petit et le quartier du côté nord" ** ** Il y a beaucoup d'opposition dans "le ratio d'hommes dans la première génération de travailleurs est faible, il y a beaucoup de familles et le quartier du côté sud" ** Cela semble être le cas. (En ce qui concerne l'importance de la quantité de caractéristiques dans la section précédente, il semble que l'influence de la composition par âge soit la plus grande et que l'influence du ratio masculin soit la plus faible.)

De plus, comme vous pouvez le voir à partir de l'analyse de corrélation en 4-1 ** Le fait qu'il y ait une opposition relativement importante dans les années 20 (phénomène de retournement avec les années 30) influe également sur la différence de taux d'approbation entre les quartiers ** Je pense que cela peut être dit.

6. Ce que j'ai ressenti

Grâce à cette analyse, j'ai pu ressentir les sentiments suivants.

Importance de la connaissance du domaine

Une des raisons de douter du surapprentissage en 4.4 est "Je ne peux pas penser à la raison pour laquelle Fukushima Ward est hors de valeur". Le quartier de Fukushima est une région unique réputée pour sa gastronomie, Il y avait une image moyenne (connaissance du domaine) dans la ville en tant que facteur qui influence le vote, donc l'idée que "s'il s'agit d'une valeur aberrante, les performances du modèle que j'ai créé doivent être mauvaises" J'ai pu atteindre.

Ne vous fiez pas à la connaissance du domaine

Dans le chapitre 2, basé sur l'idée que les citoyens estiment que "plus on est éloigné du bâtiment principal du gouvernement, plus il se sent gênant et plus le taux d'approbation est faible". Le montant de la fonction «4. Temps nécessaire pour atteindre le bâtiment principal du gouvernement» a été ajouté.

Lors de la collecte de données en cliquant sur les informations de transfert, ** "Ce doit être une quantité de fonctionnalités qui conduit à des performances améliorées! La meilleure connaissance du domaine!" ** J'étais en haute tension en pensant, Lorsque j'ai procédé à l'analyse, il n'y avait qu'un degré d'influence enfoui dans d'autres quantités de caractéristiques.

Et comme les données sur lesquelles j'ai travaillé dur pour collecter me donneront une idée, ** "Je ne veux pas jeter ce montant de fonctionnalité de toute façon! Je veux l'utiliser de force" ** En tant qu'analyste, un sentiment qui manque d'objectivité apparaît.

J'ai pu ressentir la difficulté de juger uniquement à partir des faits obtenus en scellant les idées préconçues et les sentiments nés d'une telle connaissance du domaine.

Le plaisir d'analyser des données en direct

Lorsque je traitais de données d'actualité et d'actualité, je sentais que ma motivation augmenterait. Je continuerai à analyser l'actualité comme lieu de sortie des résultats de mes études!

Bonus: analyse de la différence par rapport au vote précédent

Ce sera une analyse supplémentaire, mais j'analyserai également les quartiers où la différence par rapport au vote précédent est importante.

Comparaison des taux d'approbation entre le vote précédent et ce vote

J'ai comparé le taux d'approbation du vote précédent de 2015 avec le taux d'approbation de cette fois (axe horizontal: dernière fois, axe vertical: cette fois) image.png La tendance est presque la même que la fois précédente (R2 = 0,88), mais il y a quelques quartiers qui ont changé par rapport à la fois précédente (les quartiers particulièrement remarquables sont rouges).

Comparaison des divisions

Je pense que l'une des raisons du changement par rapport à la date précédente mentionnée ci-dessus peut être le changement de classification après la fusion. J'ai comparé le classement entre la dernière fois et cette fois.

Dernière division

La figure ci-dessous provient du site Web de Sankei Shimbun image.png

Cette division

image.png

Il n'y a pas de changement dans la division de la partie centrale de Chuo Ward et Kita Ward, Il semble que la division des quartiers environnants (correspondant à l'ancien quartier est, sud et baie) a considérablement changé (le bâtiment principal du gouvernement a été intégré dans le quartier situé près du centre-ville).

Politique d'analyse

J'ai essayé d'extraire les salles où il y avait une augmentation ou une diminution de 2% ou plus par rapport à la fois précédente. Sur la base du classement de la section précédente (Chuo-ku, Kita-ku ou autres), les changements de classement après la fusion sont également indiqués.

Nom du quartier Changements de classification après la fusion Augmentation Diminution
Quartier Taisho Oui +2.54%
Quartier Nishinari Aucun +2.49%
Kita Ward Aucun -2.73%
Chuo-ku Oui -3.12%
Quartier Abeno Oui -3.32%
Nishi-ward Aucun -3.89%
Minato-ku Oui -4.82%

Je voudrais analyser en divisant en quartiers où il y a eu un changement de classification après la fusion et en quartiers où il n'y a pas eu de changement.

1. Quartier où il y a eu un changement de classification

Minato Ward, Abeno Ward et Taisho Ward sont équivalents. Même si ce sera un ralentissement, j'estime qu'il y aura probablement des facteurs différents à Minato Ward et dans d'autres régions.

Minato-ku

Bien que le taux de diminution soit de loin le plus important à Minato Ward, comme mentionné dans divers rapports, il se situe géographiquement avant le vote. Il semble qu'il y ait eu une voix indiquant la distance. En regardant la carte après la fusion, Minato Ward est très loin des 13 stations où se trouve le bâtiment principal du gouvernement. image.png Non seulement ils sont situés loin, mais ils ont également une petite connexion régionale avec une grande rivière appelée Yodogawa entre les deux. Même si vous essayez d'y aller en train, le temps de transfert à la gare d'Umeda est très long, ce qui est très gênant. (Si vous le comparez à Tokyo, l'image de la relation positionnelle entre Odaiba (Koto Ward) et Shinkoiwa (Katsushika Ward))

Dans le concept précédent, le bâtiment principal du gouvernement devait être situé dans le quartier de Minato, Même dans ce quartier fleuri, qui a une relation de position similaire, le taux d'approbation a baissé de 1,5%. On suppose que la ** distance géographique du bâtiment principal du gouvernement ** a un effet.

Quartier Abeno, quartier Taisho

(Veuillez pardonner un peu de subjectivité) En ce qui concerne Abeno Ward, dans le concept précédent, le bâtiment principal du gouvernement du nouveau "Minami Ward" devait être placé dans Abeno Ward, mais dans ce concept, le bâtiment principal du gouvernement sera situé dans l'ancien quartier Tennoji, et le nom du nouveau quartier est également "Tennoji Ward". ". [L'histoire avec le nom "Abeno Harukas" est "Je veux faire du nom Abeno une paroisse nationale."](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) Compte tenu de cela, je pense que déplacer le bureau de la paroisse et le nom de la paroisse dans le quartier voisin de Tennoji, qui a une certaine rivalité, semble être un désavantage pour les habitants du quartier.

Au contraire, Taisho Ward était un quartier portuaire qui était proche du bâtiment principal du gouvernement à côté de lui la dernière fois, mais cette fois, il sera déplacé vers le plus grand quartier de Chuo. On suppose que le taux d'approbation a augmenté en sortant de la situation où le bâtiment principal du gouvernement est déplacé dans un quartier adjacent avec une échelle similaire **.

2. Quartiers où il n'y a pas eu de changement dans la division

Nishinari Ward (taux d'approbation augmenté), Kita Ward (taux d'approbation diminué), Chuo Ward (diminué), Nishi Ward (diminué) correspondent.

Ce n'est pas très clair, mais il semble qu'un changement politique s'est produit au cours des cinq dernières années, quel que soit le changement de classification. (Alors que Kita-ku, Chuo-ku et Nishi-ku, qui ont diminué les taux d'approbation, font partie des quatre premiers quartiers avec un revenu annuel moyen par habitant. Puisque Nishinari Ward, qui a augmenté le taux d'approbation, a le revenu annuel par habitant le plus bas, Est-ce un changement lié au revenu? Peut être émis une hypothèse)

Résumé des quartiers où le taux d'approbation a changé entre la dernière fois et cette fois

Il semble être divisé dans les 3 catégories suivantes ** Isolement géographique du bureau de division ** Quartier de Minato, (quartier de Konohana)

** Bâtiment gouvernemental principal dans un quartier voisin ** Quartier Abeno, quartier Taisho, (quartier Asahi)

** Certains changements se produisent indépendamment du changement de classification (peut-être que cela a quelque chose à voir avec le revenu?) ** Quartier Nishinari, quartier Chuo, quartier Nishi, quartier Kita

Recommended Posts

J'ai essayé d'analyser les résultats du vote de la région métropolitaine d'Osaka pour chaque quartier
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
Attribuer une date au nom du PDF décomposé pour chaque page
J'ai recherché le contenu de l'agent CloudWatch Logs
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
C'est pourquoi j'analyserai la page d'accueil de chaque partie
Obtenez le nombre d'occurrences pour chaque élément de la liste
J'ai essayé l'analyse d'image du livre de score de tir à l'arc (un livret qui enregistre les résultats des coups). (Google Colaboratory)
Réutiliser les résultats du clustering
Vérifiez l'augmentation / la diminution des pièces de monnaie pour chaque adresse de la blockchain
python Remarque: map -faire la même chose pour chaque élément de la liste
Je veux connaître la population de chaque pays du monde.