生のPythonがわかってきたところで、さっそくデータ解析をやってみましょう。 データ解析にもいろいろありますが、基本的には次のような流れになります。
より複雑になると、1.の前にデータをプログラムが読める状態に変換する工程が入ったり、2.の計算が膨大な量になっていったりするのですが、ここでは第一歩として「データを読み込む」→「グラフを描く」という流れを学びます。
Python自体には図を描画する機能がありませんので、ライブラリであるmatplotlibの力を借ります。
下の1文は、「matplotlib内のpyplotという機能をpltという変数名で読み込む」という命令です。
import matplotlib.pyplot as plt
このように、外部の機能を用いるプログラムを書くときにははじめにその機能を読み込んでくる必要があります。 データ解析を行う際にはmatplotlib.pyplotやNumPyなどといったライブラリを毎回のように使いますので、プログラムの最初でまとめて読み込んでおくのが良いでしょう。 NumPyはさまざまな計算に関わる機能を詰め込んだ非常に強力なライブラリで、詳細は次回以降に解説します。ここでは、大きなデータを読み込むためにその機能の一部を使います。
import numpy as np # numpyをnpという名前で読み込む
データ数が少ない場合は、手入力でデータを記入することもできます。以下は、2001年以降の年ごとの台風上陸数をリストとして作成する場合です。
num_typhoon = [2, 3, 2, 2, 4, 4, 6, 4, 5, 5, 0, 3]
year = list(range(2010, 2022))
print(num_typhoon)
print(year)
一方、データが多いときに手打ちで入力しようとすると、手間がかかるばかりか誤入力の危険性もあります。 せっかくプログラムを使うのですから、コンピュータに自動的にさせられるところはそのようにしてしまうのがスマートです。 Python自体やNumPy、Pandasなどのライブラリには多彩な読み込み機能が実装されており、それを用いてファイルからデータを読み込みましょう。
まず以下からデータをダウンロードし、適当なフォルダに保存します。
今回のデータはCSV(Comma-Separated Value)形式のファイルです。CSVはその名の通り、コンマ,で区切られた数字が羅列されている形式です。ただし今回は各行に数字は1つだけなので、次のような内容になっています。
(KEOairt_2019daily.csvの内容)
15.1
15.8
13.0
13.8
17.3
...
各行に日ごとの気温が記されており、これが365行続いています。ほかのファイルも同様です。 さて、このファイルを読み込んでみましょう。
airt = np.loadtxt(r"C:\Users\yfuji\Desktop\lesson\data\data_KEO\KEOairt_2019daily.csv")
CSVを読み込む関数であるNumPy(今はnpという名前で読み込まれています)のloadtxt関数を使ってファイルを読み込み、読み込んだ配列にairtという名前を付けました。
ライブラリはフォルダのような階層構造になっており、np.loadtxtは「npの中のloadtxt関数」を意味します。
np.loadtxt関数に与えた文字列r"C:\Users\yfuji\lesson\data\data_KEO\KEOairt_2019daily.csv"は、読み込みたいファイルの場所を示したパスです。私のWindows PCの場合はこのような位置でしたが、自分のパソコンのOS・ユーザー名・ファイル位置に合わせて適宜書き換えましょう。
ヒントとして、「現在地(このJupyterノートブックが置かれている場所)のパス」は次のようなコマンドで得られます。
%pwd
Windowsではフォルダの階層関係をバックスラッシュ\で表しますが、バックスラッシュは特別な意味(エスケープ)にも使われるのでそれを避けるために二重の\\で表されています。「この文字列内で\は別の意味ではなく、単純に\を意味しますよ」というのを教えるために、上の例では文字列の前にrをつけています。
一方、MacやLinuxではフォルダの階層関係はスラッシュ/で表されているので気にする必要はありません。
さて、読み込んだairtはどのような内容でしょうか。
print(airt)
この通り、ファイルの内容が配列として読み込まれました。 なお、見た目ではわかりませんがこの配列はリストではなくNumPyのもつndarrayという型に入っています。ndarrayはたくさんの数を扱うのに極めて便利な機能をもっていますが、その内容は次回以降に詳しく見ていくことにします。今回は、リストだと思ってもらって構いません。
同様に、海面水温をsst (SST=sea surface temperature)、風速をwindとして読み込みましょう。
sst = np.loadtxt(r"C:\Users\yfuji\Desktop\lesson\data\data_KEO\KEOsst_2019daily.csv")
wind = np.loadtxt(r"C:\Users\yfuji\Desktop\lesson\data\data_KEO\KEOwind_2019daily.csv")
print(sst)
print(wind)
date = list(range(1, 366))
print(date) # 1年の何日目か
plt.plot(date, airt)
続けて別の配列のplotを行うことで、複数のグラフを描くことができます。ここでは、気温airtと海面水温sstを描くことにしましょう。
さらに、複数の量を同時にプロットしているので凡例を表示することにします。plt.plotの呼び出しの際にオプション引数labelに凡例の文字列を与え、すべてのプロットが終わったのちにplt.legend関数を呼び出すことで凡例が表示できます。
また、グラフを描くときは縦軸・横軸が何を表しているのか記載するのが基本中の基本です。横軸のラベルはplt.xlabel, 縦軸のラベルはplt.ylabelで表示できます。ここでは横軸が1年の中の日数なので"Day of year", 縦軸が気温及び水温なので"Temperature [degree]"としましょう。
Jupyter labではセルごとに新しい図が描かれますので、もう一度airtから書き直します。
plt.plot(date, airt, label="air temperature")
plt.plot(date, sst, label="SST")
plt.legend()
plt.xlabel("Day of year")
plt.ylabel("Temperature [degree]")
さらに、plt.xlimやplt.ylimで描画の範囲を指定できます。短い変動に着目したいときは、図を拡大しましょう。
plt.plot(date, airt, label="air temperature")
plt.plot(date, sst, label="SST")
plt.legend()
plt.xlabel("Day of year")
plt.ylabel("Temperature [degree]")
plt.xlim(150, 210) # x座標が150~210までを表示する
plt.ylim(18, 28) # y座標が18~28までを表示する
また、plt.plotのオプション引数colorで線の色を指定できます。
colorとして指定できる文字としては"r"(赤), "g"(緑), "b"(青), "k"(黒), "gray", "orange"などのほか、"#a03261"のような16進数コード、"C0", "C1"...といったデフォルトで設定された色の列(結局これがおすすめ)などが使えます。
# C0, C1, ...の例
plt.plot([0, 1], [4, 4], color="C0", label="C0")
plt.plot([0, 1], [3, 3], color="C1", label="C1")
plt.plot([0, 1], [2, 2], color="C2", label="C2")
plt.plot([0, 1], [1, 1], color="C3", label="C3")
plt.plot([0, 1], [0, 0], color="C4", label="C4")
plt.legend()
年間の風速の変化を折れ線グラフで表示しましょう。横軸ラベル、縦軸ラベルを適切に指定しましょう。(windに入っている風速は[m/s]の単位です)
線の色を自分で好きに設定しましょう。
上の図を見たらわかる通り、気温と海面水温は高い正の相関を持っています。まあ、気温・水温共に夏は高く冬は低いので、当たり前と言えば当たり前ですね。
2つの量の相関関係を図示するには、散布図が便利です。
散布図も折れ線グラフと同じく、plt.plot関数にx座標とy座標を与えるだけで作れますが、線ではなく点を描く必要があります。3つ目の引数を与えてplt.plot(x座標, y座標, 線種)とすることで線や点の種類を指定できます。
線種として与えられる文字列には以下のようなものがあります。
"-" 実線(デフォルト)"--" 破線":" 点線"." 点(中サイズ)"o" 点(大サイズ)"," 点(小サイズ)".-" 点 + 実線ここでは"."を使って、横軸に気温・縦軸に海面水温をとった散布図を描いてみましょう。
plt.plot(airt, sst, ".")
plt.plot([18, 30], [18, 30], "--") # SST = airtを示す補助線、別になくてもいい
plt.xlabel("air temperature [degree]")
plt.ylabel("SST [degree]")
不思議な分布をしていますね。処理をせずにただ図示しただけの図を見ても、たくさんの疑問や発見が出てきます。
ぜひ考えてみてください。
気温と海面水温の散布図を、季節ごとに色分けしてプロットしてみましょう。 例:4月から9月を加熱期、10月から3月を冷却期とする(4月1日は年間の91日目、10月1日は年間の273日目)。
ここまで紹介した方法で、1次元データについておおよその図示はできるようになったと思います。 しかし、これらの図はプレゼンスライドや論文に使うのは不十分です。特に、図のサイズや線の太さ、軸・ラベルの文字サイズを調整する必要があります。 ここでは気温・海面水温の時系列グラフを例に、遠くからでも見やすい図に整形して保存するまでを実演します。
plt.figure(figsize=(10,5)) # 図全体のサイズ、今回は少し横長にする
plt.plot(date, airt, label="air temperature", lw=1.5) # lwはlinewidth、つまり線の太さのこと
plt.plot(date, sst, label="SST", lw=1.5) # 1.5は元と同じですが、より太くするのが良い場合もあります
plt.legend(fontsize=16, loc="upper left") # fontsizeで凡例の文字サイズを大きく、位置を左上に指定
plt.xlabel("Day of year", fontsize=18) # fontsizeでラベルの文字サイズを大きく
plt.ylabel("Temperature [degree]", fontsize=18) # 同上
plt.tick_params(labelsize=16) # x軸・y軸の数字のサイズを大きく
plt.savefig(r"\Users\yfuji\Desktop\lesson\data\airt_sst.png") # 保存したい画像のパス、拡張子から形式を判別してくれる
ここではplt.plotなど代表的な関数の使い方の基本を紹介しましたが、これらの関数にはたくさんのオプションがありそれを活かすことでより描画の自由度が広がります。
NumPyやmatplotlibの使い方で迷ったら、公式ドキュメントを参照するのが1番確実です。
また、Jupyter labやipython環境では関数名?と入力することで関数のヘルプ(docstringと呼ばれる、説明文)が表示されます。インターネットがなくてもすぐに使い方を調べられるので便利です。以下では、CSVの読み込みに使ったnp.loadtxtの説明文を表示しています。
これらの説明文や、プログラムがうまく走らなかったときのエラーメッセージはすべて英語です。 Pythonは比較的メジャーな言語で日本語の情報も多く出回っていますが、それでも公式の情報やエラーメッセージの解読で英語を避けて通ることはできません。覚悟を決めて、頑張って読みましょう。
np.loadtxt?