パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

【データサイエンス】【python】【k-means】過去の気温データからクラスタリングを行う

 k-means法について

今回扱うデータ

ソースコード

クラスタリングの出力

k-means法について

クラスタリングは与えられたデータを類似性のグラフに分けることです。クラスタとは集団という意味があります。

クラスタリング

  1. 入力データをプロットする。
  2. ランダムに指定したクラスタ数の点をプロットする。
  3. 各ランダムの点をクラスターの重心点としてラベリングする。
  4. 入力データの各点について、指定したクラスタ数の重心点の中で、最も近いものを選びその番号をそのデータのクラスタ番号とする。
  5. 全ての入力データについて、クラスタが決まった後、それぞれのクラスタの重心を計算する。
  6. 5で求めた3つの重心を新しいクラスタの重心点とする。
  7. 4~6までの流れを繰り返す。

これらの流れを機械学習ライブラリーのsklearnで行っていきたいと思います。

今回扱うデータについて

今回も気温データを扱っていきたいと思います。

今回の扱うデータを前の記事のデータを少し加工して使います。前回の気温データの取得方法で過去十年分の月ごとの気温データを取得しましょう。

 

pannakotta.hatenablog.jp

 この記事を参考にしてみてください。

f:id:panNakotta:20200304184343p:plain

各月の気温平均データ 十年分

このような感じにcsvファイルで作成します。各行が月の平均気温になっています。各列が各年度の気温データになっています。この表は

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy as sp
from matplotlib import pyplot 
from pandas import Series,DataFrame
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import seaborn as sns
import sklearn
data1=DataFrame(pd.read_csv("m_ave.csv"))
#気温データのcsvファイルを読み込み
data1

jupyter notebookで上記のようにすると表示できます。

ソースコード

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy as sp
from matplotlib import pyplot 
from pandas import Series,DataFrame
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import seaborn as sns
import sklearn
data1=DataFrame(pd.read_csv("m_ave.csv"))
data1
#data1の転置行列
t_data=data1.T
t_data
#kmeans.fitでクラスタ分けをする。
kmeans=KMeans(init='k-means++',n_clusters=4,n_init=10,max_iter=400)
kmeans.fit(data3)
y_pred=kmeans.predict(data3)
print(y_pred)
merge_data=pd.concat([data1,pd.DataFrame(y_pred)],axis=1)
#クラスタ分けをした結果をデータフレームに挿入する。
merge_data.columns=["feature1","feature2","2009","2010","2011","2012","2013","2014","2015","2016","2017","cluster"]
merge_data

ax=None
colors=['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf',"yellow","blue","black","green"]
for i,data in merge_data.groupby("cluster"):
    ax=data.plot.scatter(x="feature1",y="feature2",color=colors[i],label=f'cluster{i}',ax=ax)
plt.savefig("class.png")
#出力結果を画像に表示する。

f:id:panNakotta:20200304230951p:plain

class

f:id:panNakotta:20200304231228p:plain

今回のクラスタ分けで月の平均気温の類似性を分類できた。もっとデータ数が多いときれいな分類が出来ると思うので、やってみても良いと思います。