L'élection du gouverneur de Tokyo a eu lieu. Quel que soit le résultat, quand je regardais le résultat de l'ouverture du vote, le sang des amateurs de données me faisait mal et j'ai fait une simple analyse de données avec élan!
Je pense que c'est aussi un résumé du flux de l'acquisition de données sur le net au traitement avec des pandas et à une simple analyse des données.
** * Ce qui suit est simplement dans le cadre de l'intérêt personnel et a été fait comme une pratique d'analyse de données, il n'y a donc aucune intention ou acte politique. De plus, nous ne garantissons pas l'exactitude ou la signification des données utilisées et des résultats d'analyse. ** **
** => "Le résultat de l'élection est-il en corrélation avec la formation universitaire?" ** Je suis désolé, je suis assez ouvert d'esprit ... (Je me souviens que l'enquête sur la corrélation entre le revenu annuel des parents et la capacité scolaire des enfants a déjà été évoquée.)
Il a été traité selon le flux suivant.
Jetons un œil à eux dans l'ordre ~ Le traitement suivant est effectué sur Google Colab Notebook.
election.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#Données sur le nombre de votes (auto-fabriquées)
path = "~~~/xxxx.xlsx" #Nom du chemin dans Drive
df = pd.read_excel(path)
Quelque chose comme ça. Je l'ai vérifié, mais comme il a été fait par moi-même, soyez patient même s'il y a une erreur dans le nombre de votes ... (* À propos, si les données de vote pour l'élection précédente étaient les précédentes, elles ont été converties en données ouvertes, donc je pense que les résultats de cette période seront facilement disponibles après un certain temps.)
election.py
path = "~~~/xxxx.csv" #Nom du chemin dans Drive
edu = pd.read_csv(path,encoding='cp932') #l'encodage est pour l'entrée japonaise
#Extraire sous la ligne du nom de la colonne
edu.columns=edu.iloc[7]
edu = edu[8:]
#Ne retirez que la partie totale de la commune
edu = edu[edu["Code de la ville"].isnull()]
#Réinitialisation de l'index
edu.reset_index(inplace=True)
election.py
#Combinez le nombre de diplômés (population non inscrite) et le nombre de diplômés universitaires (y compris les études supérieures)
df2 = pd.concat([df,edu["Diplômés"],edu["Université / École supérieure 2)"]],axis=1)
#Les noms de colonne pour les hommes et les femmes étaient les mêmes, les colonnes en double ont donc été supprimées.
#=>Ne laissez que le nombre total d'hommes et de femmes en df2
df2 = df2.loc[:,~df2.columns.duplicated()]
À propos, la disposition des villes, quartiers, villes et villages de Tokyo est unifiée dans tous les matériaux, vous pouvez donc définir axis = 1 sans vous soucier de la combinaison.
election.py
path = "https://www.toukei.metro.tokyo.lg.jp/kurasi/2020/csv/ku20rv0440.csv"
population = pd.read_csv(path,encoding='cp932')
#Extraire la population par ville, quartier, ville et village
population = population[8:]["Unnamed: 4"].reset_index()
#Joindre
df3 = pd.concat([df2,population],axis=1)
election.py
#Changer le nom de la colonne
df3.rename(columns={"Unnamed: 0":"Municipalité",
'Diplômés': 'graduates',
'Université / École supérieure 2)': 'university graduation',
"Unnamed: 4":"population"},
inplace=True)
#Effacer les colonnes d'index inutiles
df3.drop("index",axis=1,inplace=True)
#Pour une raison quelconque, il était de type str, donc converti en type int
df3["population"] = df3["population"].astype(int)
df3["graduates"] = df3["graduates"].astype(int)
df3["university graduation"] = df3["university graduation"].astype(int)
En conséquence, df3 ressemble à ceci:
election.py
data = df3.copy()
#Remplacer en divisant le nombre de votes obtenus par la population
data.iloc[:,1:6] = df3.iloc[:,1:6].values / df3["population"].values.reshape(62,1)
#Ajout d'une colonne pour le taux de diplomation universitaire (taux de diplomation universitaire = nombre de diplômés universitaires)/Nombre de graduations)
data["university graduation rate"] = data["university graduation"] / data["graduates"]
J'ai toutes les données nécessaires.
Il est enfin temps pour l'apprentissage automatique.
Utilisez sklearn.
election.py
from sklearn.cluster import KMeans
kmeans = KMeans(init='random', n_clusters=3,random_state=1)
X = data.iloc[:,1:6].values #Forme du ratio de vote=(62,5)
kmeans.fit(X)
y = kmeans.predict(X) #Numéro de cluster
#Combinez les résultats du clustering en données
data = pd.concat([data,pd.DataFrame(y,columns=["cluster"])],axis=1)
Maintenant qu'il est divisé en 3 clusters, jetons un coup d'œil à ses fonctionnalités. (Au fait, j'ai essayé de changer le nombre de clusters (n_clusters), mais je pensais qu'environ 3 serait bien, alors je l'ai mis à 3.)
Regardons la moyenne de chaque donnée lorsque chaque cluster est l'axe.
election.py
data.groupby("cluster").mean()
C'est juste une moyenne, mais vous pouvez voir qu'elle a été divisée en groupes avec des caractéristiques différentes. J'ai essayé de peindre les villes, les quartiers, les villes et les villages qui appartiennent au groupe sur la carte,
** 0. Zone de Yamate Line et ses environs
C'était une panne. J'ai été surpris que nous ayons pu faire une telle classification (ce qui semble possible dans le bon sens) sur la seule base du taux de vote.
L'analyse de régression linéaire est effectuée avec la variable explicative X comme pourcentage de diplômés collégiaux et la variable objective Y comme pourcentage de votes pour chaque candidat. Ce qui suit définit un ensemble de fonctions jusqu'à la visualisation.
election.py
from sklearn.linear_model import LinearRegression
colors=["blue","green","red"] #Pour le codage couleur des clusters
def graph_show(Jpname,name,sp=False,cluster=True,line=True):
#Jpname:Notation kanji du candidat
#name:Notation romaine du candidat (pour le graphique)
X = data["university graduation rate"].values.reshape(-1,1)
Y = data[Jpname].values.reshape(-1,1)
model = LinearRegression()
model.fit(X,Y)
print("Coefficient de décision(Coefficient de corrélation):{}".format(model.score(X,Y)))
plt.scatter(X,Y)
#Mettre en évidence des municipalités spécifiques dans le graphique (la valeur par défaut est False)
if sp:
markup = data[data["Municipalité"]==sp]
plt.scatter(markup["university graduation rate"],markup[Jpname],color="red")
#k-Code couleur pour chaque cluster obtenu au moyen
if cluster:
for i in range(3):
data_ = data[data["cluster"]==i]
X_ = data_["university graduation rate"].values.reshape(-1,1)
Y_ = data_[Jpname].values.reshape(-1,1)
plt.scatter(X_,Y_,color=colors[i])
#Afficher la ligne de régression
if line:
plt.plot(X, model.predict(X), color = 'orange')
plt.title(name)
plt.xlabel('university graduation rate')
plt.ylabel('vote')
plt.show()
Affichez le graphique de chaque candidat en utilisant le show_graph défini précédemment. (Excusez-moi pour l'abréviation du titre ci-dessous)
L'analyse des données a commencé par la question ouverte «Le résultat de l'élection est-il lié à la formation universitaire?», Mais je voudrais conclure par une conclusion finale.
Avant cela, vérifions la partie inappropriée (potentielle) de cette analyse de données.
Pour cette raison, comme je l'ai écrit au début, je ne peux pas garantir que cette analyse des données sera significative. Dans cet esprit, je voudrais résumer les conclusions qui ne seraient pas démenties du moins de cette analyse des données.
(* La corrélation et la relation causale ne correspondent pas toujours) Quel endroit, comme. Eh bien, je pense personnellement que la conclusion n'est pas difficile à imaginer.
Il y a beaucoup de choses que nous pouvons comprendre sur les candidats individuels, mais je les omettrai ici.
Comme mentionné ci-dessus, puisque j'étudie l'analyse de données, j'ai essayé une analyse de données simple en utilisant des données fraîches, mais si vous combinez diverses données autres que les données utilisées cette fois, il y a d'autres choses Il semble y avoir quelque chose à comprendre.
Comme impression personnelle, il était difficile de saisir les données de vote, donc je n'avais pas besoin d'être une administration, alors j'ai pensé que ce serait bien si au moins les données compilées par la presse pouvaient être publiées en csv. (Je comprends qu'il existe diverses restrictions)
Recommended Posts