matplotlibでデータを可視化する

AI開発やデータサイエンスにおいてデータの可視化は欠かすことができません。数値で表現された無数のデータも散布図などにプロットすることにより、データ全体が持つ特徴を人間の目でも確認することができるようになります。

gnuplotなど有名なプロットツールもありますが、pythonとmatplotlibを使えば簡単にグラフやプロット図を描画することができます。今回は、matplotlibを使って3次元散布図を作成していきます。

matplotlibでデータを可視化する

アヤメのデータを使用して3次元散布図を作成してみます。アヤメのデータの作成については、下のダウンロードボタンから取得できます。

散布図を作成するpythonコードは以下の通りです。

import pandas as pd
from sklearn.model_selection import train_test_split
import pydotplus as pdp
from sklearn.externals.six import StringIO
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

csv = pd.read_csv('iris.csv')

csv_data = csv[["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
csv_label = csv["Name"]

train_data, test_data, train_label, test_label = \
train_test_split(csv_data, csv_label, test_size=0.3, random_state=1)

labels = train_label.map({'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})
aaa = train_data[["PetalWidth","PetalLength","SepalLength"]]

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(aaa[["PetalWidth"]],aaa[["PetalLength"]],aaa[["SepalLength"]],c=[['orange', 'green', 'blue'][x] for x in labels])

ax.set_title("Iris dataset 3D scatter plot")
ax.set_xlabel("PetalWidth")
ax.set_ylabel("PetalLength")
ax.set_zlabel("SepalLength")

plt.show()

スクリプトの前半でアヤメのデータを読み込んでいます。また、「がくの長さ」、「がくの幅」、「花びらの長さ」と「花びらの幅」の中から、特徴量の重み順にデータを取り出しています。以下がその部分です。

aaa = train_data[["PetalWidth","PetalLength","SepalLength"]]

matplotlibのグラフ図設定は、以下の通りです。

import pydotplus as pdp
from sklearn.externals.six import StringIO
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

・・・

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(aaa[["PetalWidth"]],aaa[["PetalLength"]],aaa[["SepalLength"]],c=[['orange', 'green', 'blue'][x] for x in labels])

ax.set_title("Iris dataset 3D scatter plot")
ax.set_xlabel("PetalWidth")
ax.set_ylabel("PetalLength")
ax.set_zlabel("SepalLength")

plt.show()

scatter()は散布図作成のメソッドで、特徴量の重み順に抽出した要素をx、y、zの軸に割り当て、アヤメの種類ごとにオレンジ色、緑色及び青色でプロットします。また、set_titleはグラフタイトル、set_xlabel、set_ylabelやset_zlabelで各軸のタイトルを設定します。

では、実際にどのような図が表示されるのか見てみましょう。

グラフを画面上に表示させる

matplotlibのグラフを画面に表示させるためにはX window systemが必要です。サーバなどのCUI環境(teratermなど)で実行している場合は、GUI環境(VNC Serverなど)で実行してください。

上記のpythonコードを実行すると、以下のような3次元散布図が画面に表示されます。

アヤメの種類ごとに3次元散布図上にプロットされています。では、少しグラフを回転させてみましょう。

グラフをドラグして回転させることができるので、見やすい位置で見ることができます。「家」アイコンを押すと初期状態のグラフ表示に戻ります。また、「フロッピー」アイコンを押すと、表示しているグラフを画像ファイルとして保存することができます。

エクセルを使ってしまえばプロット図を作ることは簡単なことなのですが、マウスでグリグリ回転させて様々な角度から確認することができるため、データサイエンスに欠かすことができません。

アヤメのデータに含まれる4種類(4次元)のデータを2次元に圧縮(次元削減)してプロットした図がこちらです。(※注:プロットの色は一致していません。)

3次元や2次元でもアヤメの特長がはっきりしていることが確認できました。このようにデータの可視化は、AI開発時のデータ分析などで必須のテクニックということができるでしょう。

あらためて、データ分析の重要性が理解できました。