[PYTHON] J'ai essayé l'analyse par grappes de la carte météo

introduction

Avez-vous déjà entendu parler de mots tels que la dépression ouest haute-est et la répartition de la pression de type hivernal? Il existe plusieurs modèles de distribution de pression près du Japon, et la distribution de pression de type hivernal appelée West High East Low est probablement la plus connue (voir la figure ci-dessous). Il existe plusieurs autres types, comme une distribution de pression de type été couverte par la haute pression du Pacifique. Dans cet article, je vais essayer de classer ce modèle par apprentissage non supervisé. img.png (D'après les actualités météorologiques)

J'ai fait les trois choses suivantes cette fois.

Acquisition d'images satellites

L'image satellite a été acquise sur le site Web du musée météorologique d'Enamiyama. C'est parce que c'était ce site qui était lourd à télécharger des données de ligne et qui semblait bon à gratter avec des données bien traitées. À l'origine, il semble approprié d'acheter auprès de HP of Meteorological Business Support Center. Je vous remercie. Le code source n'est pas répertorié ici, mais est répertorié dans github.

L'image que j'ai utilisée est une image de 12:00 (JST) près du Japon, et l'image suivante (854 x 480px). 20190721.jpg

Prétraitement


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image
import glob
from tqdm import tqdm
from os import makedirs

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, silhouette_samples

x=np.empty((0,240*427))

paths=glob.glob("pictures/*.jpg ")
for path in tqdm(paths):
    img=Image.open(path)
    img = img.convert('L')
    img=img.resize((int(img.width/2), int(img.height/2)))
    x=np.append(x,np.array(img).reshape(1,-1),axis=0)

Lisez l'image, remodelez-la en une seule ligne, puis insérez-la dans le tableau numpy. Il a fallu beaucoup de temps pour que la qualité de l'image soit bonne, alors je l'ai rendue grésque et l'ai divisée par deux.

Méthode du coude


distortions = [] #Méthode du coude (trouver le nombre optimal de grappes)
for k in tqdm(range(1, 20)):
    kmeans = KMeans(n_clusters=k, n_init=10, max_iter=100)
    kmeans.fit(x)
    distortions.append(kmeans.inertia_)
fig = plt.figure(figsize=(12, 8))
plt.xticks(range(1, 20))
plt.plot(range(1, 20), distortions)
plt.savefig("elbow.jpg ")
plt.close()

Le nombre optimal de grappes a été calculé par la méthode du coude. Il a fallu environ 10 minutes pour le faire à 20, donc je pense qu'environ 10 sont suffisantes. Le résultat est illustré dans la figure ci-dessous. elbow.jpg Je ne savais pas exactement combien seraient bons, mais cette fois j'ai décidé de le faire avec 4.

L'analyse par grappes


k_means = KMeans(n_clusters=4).fit(x)
y_pred = k_means.predict(x)
print(k_means.labels_)
print(pd.Series(k_means.labels_, name='cluster_number').value_counts(sort=False))

out=pd.DataFrame()
out["picture"]=paths
out["classnumber"]=y_pred
out["date"]=pd.to_datetime(out["picture"].str.split("\\",expand=True).iloc[:,1].str.split(".",expand=True).iloc[:,0])
out.to_csv("out.csv")

Le nombre d'éléments par cluster était de 139,61,68,98. C'était divisé en bons sentiments, donc je peux m'y attendre.


#Enregistrer par classe
for i in range(4):
    makedirs(str(i)+"_pictures", exist_ok=True)
for i in out.itertuples():
    img=Image.open(i.picture)
    img.save(str(i.classnumber)+"_"+i.picture)

for i in range(4):
    out["month"]=out["date"].dt.month
    sns.countplot("month",data=out[out["classnumber"]==i])
    plt.title(i)
    plt.savefig("Distribution mensuelle"+str(i))
    plt.close()

Sauvegardons chaque classe séparément et voyons la distribution mensuelle et les images concrètes de chaque classe.

Groupe n ° 0

月分布0.png On a l'impression qu'il y en a beaucoup en hiver et peu en été. S'agit-il d'une distribution de pression de type hivernal? Il semble étrange que cela puisse être vu même en été, même si le nombre est petit.

Les images qui appartiennent à ce cluster sont les suivantes, par exemple.

2020/1/13 2020/1/19
20200113.jpg 20200119.jpg

Il s'agissait d'une carte météorologique avec une distribution de basse pression typique ouest haute-est et un vent froid soufflant du nord-ouest, provoquant des nuages au-dessus de l'archipel japonais.

En outre, les chiffres appartenant à cette grappe pendant la saison non hivernale étaient indiqués dans la figure ci-dessous.

2020/6/26 2019/10/26
20200626.jpg 20191026.jpg

L'atmosphère est qu'il y a des nuages sur le continent et sur le Japon, et il n'y a pas de nuages au-dessus de l'océan Pacifique. Bien que les types de nuages soient différents, je pense que l'atmosphère de l'emplacement du nuage est certainement similaire.

Groupe n ° 1

月分布1.png Il augmente en avril et en novembre. Je ne savais pas ce qu'ils avaient en commun avec ce graphique seul.

Les images qui appartiennent à ce cluster sont les suivantes, par exemple.

2019/11/2 2020/4/29
20191102.jpg 20200429.jpg

Il ne semble pas avoir de fonction de distribution de pression claire. Comme caractéristique de l'image, la région autour du Japon était ensoleillée et il y avait de nombreuses images avec des nuages diagonaux dans la direction sud-est du Japon. Certains de ces nuages se sont formés autour du bord de la haute pression du Pacifique selon la saison, mais j'estime que des nuages similaires se forment par hasard. Au contraire, ce cluster avait une forte impression comme le reste des autres clusters.

Groupe n ° 2

月分布2.png C'est souvent le cas pendant la saison des pluies. Est-ce la répartition de la pression quand il y a un front de saison des pluies? De plus, il semble que personne n'ait été vu en février, août et septembre.

2020/6/28 2020/7/4
20200628.jpg 20200704.jpg

Comme prévu, bon nombre de ces groupes ont montré le front de la saison des pluies. C'est une saison des pluies qui n'apparaît pas dans les quatre catégories printemps, été, automne et hiver, mais je pense qu'il a été démontré que ses caractéristiques météorologiques sont claires.

Les images des autres saisons appartenant à ce groupe étaient les suivantes.

2019/10/20 2020/3/19
20191020.jpg 20200319.jpg

Des nuages de forme similaire à celle de la ligne de front se répandent sur l'archipel japonais, et il est compréhensible qu'ils aient été classés dans ce cluster.

Groupe n ° 3

月分布3.png Cela montre un été bouleversant. Il semble représenter la répartition de la pression de type estival surplombant la haute pression du Pacifique.

En regardant les images réellement classées dans ce groupe, c'était une image pleine de sentiment de type estival comme suit.

2019/7/29 2019/8/21
20190729.jpg 20190821.jpg

De plus, de nombreuses images d'autres saisons avaient des jours ensoleillés plus larges.

2019/10/14 2019/11/1
20191014.jpg 20191101.jpg

Résumé

À partir des résultats d'analyse ci-dessus, il a été possible de classer la tendance générale de la distribution de la pression par analyse en grappes et d'interpréter celles qui s'en écartent. Cependant, comme l'image satellite ne représente pas directement la pression, il n'est pas possible de classer directement la distribution de pression, et les amas sont divisés en fonction de la distribution des nuages, donc si les formes des nuages sont similaires, ce sera incorrect. Il sera classé. Afin de classer la distribution de la pression, il est possible de réfléchir à la manière de capturer non seulement les nuages, mais aussi la pression. Code exécuté cette fois (github)

Les références

Recommended Posts

J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse du SRAS avant le virus corona
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé l'analyse morphologique et la vectorisation de mots
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé de prédire le match de la J League (analyse des données)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé la bibliothèque changefinder!
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de lancer le cluster ipython au minimum sur AWS
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé le roman Naro API 2
J'ai étudié le mécanisme de connexion flask!
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé le tutoriel TensorFlow 2ème
J'ai essayé l'API du roman Naruro
J'ai essayé de déplacer le ballon
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'estimer la section.
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock