[PYTHON] [Visualisation avec folium] J'ai l'impression que Famima a trop augmenté ces dernières années.

Ceci est l'article du 21e jour du Calendrier de l'Avent MYJLab 2019. Thatchy sera en charge. (Désolé d'être en retard)

Cette fois

Faire

Récemment, il y a un phénomène dans ma ville natale où il y a des marches familiales de l'autre côté de la route. Afin de visualiser ce phénomène, je voudrais montrer l'augmentation du nombre de magasins Family Mart sur une carte thermique chronologique pour chaque préfecture.

Quoi utiliser

Il existe une bibliothèque appelée Leaflet qui vous permet de dessiner de jolies cartes avec JavaScript. Cette fois, je vais créer une carte thermique de séries chronologiques à l'aide d'une bibliothèque appelée folium qui permet d'utiliser Leaflet en Python.

Dessiner immédiatement

Environnement d'exécution

Les fonctions et l'utilisation de folium varient en fonction de la version, assurez-vous donc de définir la version sur 0.10.1 cette fois.

#Charge de la bibliothèque
import pandas as pd
import folium
from folium import plugins

Préparation des données

Nous avons préparé les données en réécrivant le nombre de magasins du Family Mart pour chaque préfecture de 1999 à 2019 sur le site de ici dans un fichier csv. .. Il est conçu pour être supprimé par les requêtes Python. De plus, la latitude et la longitude de chaque préfecture sont requises lors du dessin sur la carte. Cette fois, le lieu où se trouve l'office préfectoral est la latitude et la longitude de chaque préfecture. Les données peuvent être téléchargées depuis ici.

#Données sur le nombre de magasins
import requests
import io

URL = "https://drive.google.com/uc?id=1-8tppvHwwVJWufYVskTfGz7cCrBIE0SM"
r = requests.get(URL)
famima_data = pd.read_csv(io.BytesIO(r.content))
famima_data.head()
スクリーンショット 2019-12-21 15.22.03.png

En raison de l'augmentation des dernières années, le nombre de valeurs manquantes a considérablement augmenté de 1999 à 2006.

#Latitude et longitude du bureau préfectoral
geo_data = pd.read_csv("./data/prefecturalCapital.csv")
geo_data.head()
スクリーンショット 2019-12-21 15.29.01.png

Combinez ensuite les deux blocs de données. Je veux combiner en utilisant l'id comme clé, alors changez l'id de geo_data en 0 et combinez. La valeur manquante est mise à 0 une fois.

import numpy as np

geo_data.id = geo_data.id - 1
merged_data = pd.merge(famima_data, geo_data[["id", "lat", "lon"]], on=["id"])
merged_data = merged_data.replace(np.nan, 0)
merged_data.head()
スクリーンショット 2019-12-21 18.02.45.png

Les données de base sont prêtes.

Convertir en données croissantes

Cette fois, je veux visualiser l'évolution du nombre de magasins, je vais donc prendre la différence dans la colonne.

#Obtenir un tableau de noms de colonnes de séries chronologiques
time_columns = merged_data.columns[2:23].values

#Différer en prenant la différence uniquement dans la partie données du nombre de magasins_Que ce soit des données
merged_data.loc[:, time_columns] = merged_data.loc[:, time_columns].astype(float)
diff_data = merged_data.copy()
diff_data.loc[:, time_columns]  = merged_data.loc[:, time_columns].diff(axis=1)

#Puisque les données de 1999 seront perdues, supprimez-les.
diff_data = diff_data.dropna(axis=1)
time_columns = time_columns[1:]

diff_data.head()
スクリーンショット 2019-12-21 19.06.26.png

Lorsque la différence est obtenue, effectuez une mise à l'échelle min-max. Dans la carte thermique du folium, 0 n'est pas pratique, alors ajoutez 1e-4 à l'ensemble.

# diff_Mettre les données à l'échelle et les mettre à l'échelle_Que ce soit des données
scaled_data = diff_data.copy()

scaled_data.loc[:, time_columns] = (diff_data.loc[:, time_columns] - diff_data.loc[:, time_columns] .min().min()) / (diff_data.loc[:, time_columns] .max().max() - diff_data.loc[:, time_columns] .min().min())
scaled_data.loc[:, time_columns] = scaled_data.loc[:, time_columns] + 1e-4
scaled_data.head()
スクリーンショット 2019-12-21 19.11.27.png

Enfin, pour dessiner une carte thermique de séries chronologiques Créez des données 3D qui seront [[[latitude, longitude, données] * 47 préfectures] * 1999 ~ 2019].

heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]

#La forme des données étant difficile à comprendre, seule la première sortie
heat_map_data[0]
#production
[[43.064359, 141.347449, 0.051760516605166056],
 [40.824294, 140.74005400000001, 0.051760516605166056],
 [39.70353, 141.15266699999998, 0.05545055350553506],
 [38.268737, 140.872183, 0.060985608856088565],
 [39.718175, 140.10335600000002, 0.051760516605166056],
 [38.240127, 140.362533, 0.07390073800738008],
 [37.750146, 140.466754, 0.0923509225092251],
 [36.341817, 140.446796, 0.04807047970479705],
 [36.56575, 139.883526, 0.05545055350553506],
 [36.391205, 139.060917, 0.060985608856088565],
 [35.857771, 139.647804, 0.060985608856088565],
 [35.604563, 140.123179, 0.04807047970479705],
 [35.689184999999995, 139.691648, 0.0997309963099631],
 [35.447505, 139.642347, 0.06467564575645757],
 [37.901699, 139.022728, 0.051760516605166056],
 [36.695274, 137.211302, 0.06467564575645757],
 [36.594729, 136.62555, 0.06467564575645757],
 [36.065220000000004, 136.221641, 0.06283062730627306],
 [35.665102000000005, 138.568985, 0.05545055350553506],
 [36.651282, 138.180972, 0.051760516605166056],
 [35.39116, 136.722204, 0.05729557195571956],
 [34.976987, 138.383057, 0.05729557195571956],
 [35.180246999999994, 136.906698, 0.07574575645756458],
 [34.730546999999994, 136.50861, 0.06836568265682658],
 [35.004532, 135.868588, 0.05360553505535055],
 [35.020996200000006, 135.7531135, 0.05360553505535055],
 [34.686492, 135.518992, 0.0978859778597786],
 [34.69128, 135.183087, 0.08128081180811808],
 [34.685296, 135.832745, 0.04622546125461255],
 [34.224806, 135.16795, 0.08866088560885609],
 [35.503463, 134.238258, 0.051760516605166056],
 [35.472248, 133.05083, 0.051760516605166056],
 [34.66132, 133.934414, 0.060985608856088565],
 [34.396033, 132.459595, 0.06836568265682658],
 [34.185648, 131.470755, 0.051760516605166056],
 [34.065732000000004, 134.559293, 0.051760516605166056],
 [34.340140000000005, 134.04297, 0.051760516605166056],
 [33.841649, 132.76585, 0.051760516605166056],
 [33.55969, 133.530887, 0.051760516605166056],
 [33.606767, 130.418228, 0.060985608856088565],
 [33.249367, 130.298822, 0.05360553505535055],
 [32.744541999999996, 129.873037, 0.10526605166051661],
 [32.790385, 130.742345, 0.06652066420664207],
 [33.2382, 131.612674, 0.05914059040590406],
 [31.91109, 131.423855, 0.05729557195571956],
 [31.560219, 130.557906, 0.0868158671586716],
 [26.211538, 127.68111499999999, 0.07759077490774909]]

Dessiner

japan_map = folium.Map(location=[35, 135], zoom_start=6)
hm = plugins.HeatMapWithTime(heat_map_data, index=list(time_columns),auto_play=False,radius=30,max_opacity=1,gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow',0.75: 'orange', 0.9:'red'})
hm.add_to(japan_map)

japan_map

画面収録-2019-12-21-19.37.12.gif

Seuls les incréments sont visibles car moins d'environ 0,052 doit être négatif.

Je suis content de la carte en mouvement ...! !! !!

Considération

la fin

J'ai trouvé très pratique de pouvoir visualiser la transition des données pour chaque série temporelle sans écrire autant de code. Je veux l'utiliser pour quelque chose de plus significatif. Jusqu'à la fin Merci d'avoir lu. Je vous serais reconnaissant de bien vouloir commenter les corrections.

Source de référence

Recommended Posts

[Visualisation avec folium] J'ai l'impression que Famima a trop augmenté ces dernières années.
Notez que j'ai traité du HTML dans Beautiful Soup
Mémo de travail que j'ai essayé i18n avec l'application Flask