5. データ可視化

5.1. はじめに

5.1.1. 開始前に行うこと(重要)

まず,Chrome 等のブラウザを利用して,本教材の URL にアクセスし,画面の指示に従い Google アカウントにログインしてください.その後,ブラウザ表示画面左上の「ファイル」をクリックし,さらにポップアップで出てくる項目から「ドライブにコピーを保存」をクリックしてください.これにより,本教材のコピーが自分のGoogleドライブに保存され,自分で書いたプログラムを実行できるようになります.

また,多くのセルが非表示になっていると思われるため,同じくブラウザ表示画面上の「表示」をクリックし,さらにその項目から「セクションを展開」をクリックし,非表示のセルを表示させてください.

Hint

各ページの上部にロケットのアイコン があるのでこれをクリックして各ページのファイルを Google Colaboratory 上で開いて利用してください.

5.1.2. 到達目標

matplotlib を用いてデータの可視化ができるようになることを目標とします.

5.1.3. matplotlib とは

データの特徴を把握するために,その可視化は必要不可欠です.matplotlib は Python を使って描画ができるようになるライブラリです.しかし,書き方がやや複雑でわかりにくいため,matplotlibを簡単に使えるようにするライブラリがいくつか提供されています.例えば,pandas や seaborn です.この講義では基本的に matplotlib を使いますが,必要に応じてpandasの描画機能やseabornを用います.日本語を使えるようにするのはやや面倒なので,今回は日本語は使用しません.

5.1.4. matplotlib のインポート

matplotlib は以下のようにインポートします.matplotlib は matplotlib.pyplot の形式で呼び出し,それには plt という略称を与えて利用するのが普通です.また,%matplotlib inline は Jupyter Notebook のようなグラフィカルな環境で描画をするために必要な記述です.

import matplotlib.pyplot as plt
%matplotlib inline

一緒に利用するその他のライブラリもインポートしておきましょう.

import numpy as np
import pandas as pd

5.1.5. 学習の進め方

上から順に読み進み,【実習】と書いてある箇所でコードを書いて実行してください.基本的に入力するコードの前に見本のコードが書かれており,見本と同じコードを書けば正しく動作するようになっています(見本コードの上下に入っている区切り線は入力する必要ありません).理解を深めるには,見本とは異なるコードを書いて試してみることも役立つと思います. なお, Colab では,コードが書かれている領域をコードセル,説明文等が書かれている領域をテキストセルといいます.

5.2. matplotlib の基本操作

5.2.1. データの準備

八戸の気象データを使用します.

【実習】データフレームを生成する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
sunshine = [141.3, 152.5, 180.4, 164.1, 179.2, 151.9, 166.9, 146.6, 147, 184.4, 141.1, 124]
rainfall = [14, 56.5, 86.5, 102.5, 135, 79, 152.5, 239.5, 152, 86.5, 24, 49]
under0 = [28, 27, 17, 1, 0, 0, 0, 0, 0, 0, 5, 23]
over30 = [0, 0, 0, 0, 1, 4, 8, 6, 2, 0, 0, 0]
max_temp = [9.3, 9.8, 22.1, 27.4, 30.2, 31.6, 33.6, 34, 30.7, 25.6, 19.6, 18.9]
min_temp = [-9.6, -9, -6.5, -0.4, 4.2, 9.1, 12.6, 13, 10.6, 5.5, -1.3, -6.1]
hachinohe = pd.DataFrame(
    {"month" : month, "sunshine" : sunshine, "rainfall" : rainfall,
     "under0" : under0, "over30" : over30, "max_temp" : max_temp, "min_temp" : min_temp})
hachinohe
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.2. 折れ線グラフ

【実習】八戸の各月の最高気温をプロットする.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.plot(hachinohe["max_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】x軸の値をmonth列の値にする.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.plot(hachinohe["month"], hachinohe["max_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】色々情報を付け加えてみる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.plot(hachinohe["month"], hachinohe["max_temp"])
plt.xlabel("Month")
plt.ylabel("Degree")
plt.title("Highest temperature at Hachinohe in 2018")
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】最高気温と最低気温を同時にプロットする.

Hint

2つのデータを区別するためにラベルをつけます.また,legend()関数を呼ぶことで凡例を表示できます.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.plot(hachinohe["month"], hachinohe["max_temp"], label="max temp")
plt.plot(hachinohe["month"], hachinohe["min_temp"], label="min temp")
plt.legend()
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】pandasではもう少し簡単に描画できる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
hachinohe.plot.line(x="month", y=["max_temp", "min_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.3. 棒グラフ

【実習】最高気温と最低気温について棒グラフを書く.

Hint

plot()をbar()に変えるだけです.bar()関数のドキュメント.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.bar(hachinohe["month"], hachinohe["max_temp"], label="max temp")
plt.bar(hachinohe["month"], hachinohe["min_temp"], label="min temp")
plt.legend()
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】pandasではもう少し簡単に描画できる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
hachinohe.plot.bar(x="month", y=["max_temp", "min_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.4. ヒストグラム

【実習】最高気温に関するヒストグラムを描画する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.hist(hachinohe["max_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】最高気温と最低気温のヒストグラムを同時に描画する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.hist(hachinohe["max_temp"], label="max temp")
plt.hist(hachinohe["min_temp"], label="min temp")
plt.legend()
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Note

最高気温のデータの一部が最低気温のデータで見えなくなっているが一応描画できています.

【実習】もう少し見やすくする.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.hist(hachinohe["max_temp"], label="max temp", alpha=0.5, range=(-10, 40), bins=10)
plt.hist(hachinohe["min_temp"], label="min temp", alpha=0.5, range=(-10, 40), bins=10)
plt.xlabel("Degree")
plt.ylabel("Frequency")
plt.legend()
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Hint

以下の操作をしました.

  • 棒の色を半透明にする(alphaは透過率)

  • 最小値を-10, 最大値を40にし,5度刻みで集計する(ビンの数(集計する区分の数)を10個にする)

  • x軸とy軸の説明を追加する

【実習】pandasの関数を使用してヒストグラムを作成する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
hachinohe[["max_temp", "min_temp"]].plot.hist(alpha=0.5)
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.5. 箱ひげ図

箱ひげ図はデータの中央値と四分位点(25%, 75%)と最大値,最小値を表す図です.

【実習】最高気温と最低気温に関して箱ひげ図を作成する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.boxplot([hachinohe["max_temp"], hachinohe["min_temp"]], labels=["max temp", "min temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】pandasではもう少し簡単に描画できる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
hachinohe[["max_temp", "min_temp"]].plot.box()
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.6. 散布図

【実習】最高気温と最低気温に関して散布図を作成する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.scatter(hachinohe["max_temp"], hachinohe["min_temp"])
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】グラフに情報を付加する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
plt.scatter(hachinohe["max_temp"], hachinohe["min_temp"])
plt.xlabel("max temp (degree)")
plt.ylabel("min temp (degree)")
plt.title("max temp vs min temp")
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】pandasではもう少し簡単に描画できる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
hachinohe.plot.scatter(x="max_temp", y="min_temp")
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.7. seabornの活用

seabornをセットするだけで,自動で見た目を美しくしてくれます.

【実習】searbornをセットする.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
import seaborn as sns
sns.set()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Note

seabornにはsnsという名前をつけるのが慣習です.

Hint

set() は引数でcontext="talk"やcontext="poster"を指定すると,フォントが大きくなります.

【実習】これまでに実行したグラフ描画プログラムを再実行する.

Note

見た目が変わるはずです.

5.2.8. ペアプロット

ペアプロットとは複数の変数間の相関関係を可視化する際に使用される図です.ここでは,seabornを利用してペアプロットを作成します.seabornのペアプロット描画関数は概ね以下の形式となります.varsを指定しないとすべての列が使用されます.

sns.pairplot(
    "データフレーム名",
    vars = "列名のリスト",
    その他オプション
)

【実習】八戸の気象データのペアプロットを作成する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
sns.pairplot(hachinohe)
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】ペアプロットに回帰直線(データの傾向を表す直線)を入れる.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
sns.pairplot(hachinohe, kind="reg")
plt.show()
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

5.2.9. 描画した図のダウンロード

描画した図は以下の手順を行うことでダウンロードできます.

  1. 描画した図をmatplotlibのsavefig()関数を使って画像ファイルとして保存 * plt.show()を呼ばずにplt.savefig("ファイル名")を呼ぶ

  2. google.colabのライブラリを使用して画像ファイルをダウンロードする

Hint

手動ダウンロードでよければ,グラフ表示後,画像を右クリックして画像を保存するだけで良いです.

【実習】八戸の気象データに対するペアプロット図をダウンロードする.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
from google.colab import files

sns.pairplot(hachinohe)
plt.savefig("pairplot.png")
files.download("pairplot.png")
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Hint

エラーが出た場合,もう一回試すとうまくいくことがあります.

Note

終わりです.