Udemyのデータサイエンス講習は一通りやってしまったので、復習するのもいいけど何か新しいことをやりたいと思い…
これを買ってしまいました。
大学数学から離れて10年以上立つので正直きついですが、かなり掘り下げて解説してくれるので理解が深まります。
その中でも、やってみて面白かったことを備忘録と練習を兼ねて、本書とは別のデータセット、irisデータを使い、特徴量同士の相関をヒートマップ化してみようと思います。
まずは特徴量同士のpairplot出力を見てみます。
この図を出すには、以下のようにします。
import numpy as np
import seaborn as sns
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(iris["data"], columns=iris["feature_names"])
iris_df = pd.concat([iris_df, pd.DataFrame(iris["target"], columns=["target",])], axis=1)
sns.pairplot(iris_df, hue="target")
sns.plt.show()
このpairplot、相関の有無やクラスタを見た目で判断できて便利なんですが、相関の強さを数値化できたら… どのデータを重点的に見れば良いか分かるので、更に便利。なはず。
ということで、各特徴量同士のピアソンの相関係数を計算して、ヒートマップとしてプロットしてみます。値が大きいほど相関が強いということですね。
この図を出すには、さっきのpairplot出力コードに続けて、以下のようにします。
hm = np.corrcoef(iris_df[iris_df.columns[:-1]].T)
sns.heatmap(hm, annot=True, xticklabels=iris_df.columns[:-1], yticklabels=iris_df.columns[:-1])
sns.plt.show()
petal lengthとpetal widthが最も強い相関を示すのが、数値で示せましたね。pairplotでも見た目そうであることが分かりますが、こちらの方がより明確になりました。
ちょっと解説
sklearn.datasetsがload_iris()関数を提供してくれているので、こちらを使いました。load_iris()["data"]
はnumpy.ndarray型のデータを返すので、columnsを設定したpandas.DataFrame型に変換してやると、後でデータを俯瞰する際に便利です。
iris = load_iris()
iris.keys()
dict_keys(['target_names', 'data', 'feature_names', 'target', 'DESCR'])
iris.feature_names
['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']
上記のデータを以下のコードでDataFrame形式に変換し、
iris_df = pd.DataFrame(iris["data"], columns=iris["feature_names"])
以下のコードで目的変数も上記DataFrame形式データに連結しちゃったわけですね。
iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
iris.target_names
array(['setosa', 'versicolor', 'virginica'],
dtype='<U10')
iris_df = pd.concat([iris_df, pd.DataFrame(iris["target"], columns=["target",])], axis=1)
こうしておくと、pairplotする際にhue指定してクラスタが見分けやすくなったりと、後々嬉しいことがたくさんあります。
ということで、またPython機械学習プログラミング 達人データサイエンティストによる理論と実践を進めたら、何か練習用の課題を設定して公開しようと思います。
それではまた。