情報地球科学演習 (2024年前学期) 第06回

今日のテーマ: 相関

今回の目標は、松山市の過去134年間における各月の気温の相関係数を求め、またそれらの間の関係を「あてはめ」た回帰直線の方程式を求めること。

最初の目標として、「過去134年間の5月と12月の月平均気温の相関係数を求める」ことを考えよう。 今日の演習でも、第4回 で作成した、平均・分散・標準偏差を計算するプログラム (enshu03c.f90 という名前だったか) の 適切な場所に、以下に示す「部品」をうまく追加する ことで目的のプログラムが完成するようになっている。 ただし、どこに追加するのが適切かは 各自で考える こと。

また、講義でも指摘したように、相関・相関係数を求めるための手順は、線形最小二乗法で直線に「あてはめ」る手順と非常によく似ている。 その反面、変数の意味の違いによる混乱が起こりやすいので、「最小二乗法」のときに使ったプログラムからのコピペはしないのが無難 だと思う。

xy の積の平均を求める

必要な手順 (の要点だけ) を以下に示す。

まずここまで作ったところで、gfortran にかけ、エラーが出ないことを確かめよ。

相関係数を求める

ここまでくれば後は簡単、のはず。 必要な手順 (の要点だけ) を以下に示す。

これらを参考にして、過去134年間の5月と12月の月平均気温の相関係数を求める手順がどう書けるかを考えよ。 そして 第4回 で作成した、平均・分散・標準偏差を計算するプログラム (enshu03c.f90 だったか) にその機能を追加したプログラムを作成せよ [みほん]。

gfortran に怒られないプログラムができたら、例の如く

$ cat matsuyama-kion.txt | ./a.out
と実行して計算結果を確認せよ。 正しくプログラミングできていたら、プログラムの出力 (の最後の1行) は以下のようになっているはずである。
  0.479

また、実際に両者の相関の程度をグラフにして眺めてみよう。 端末から Gnuplot を起動し、以下のように入力してみよう (gnuplot>Gnuplot のプロンプト)。

gnuplot> plot "matsuyama-kion.txt" using 6:13
とすると、5月の平均気温を横軸に、12月の平均気温を縦軸にとったグラフが表示されているはずだ。 相関係数の値 (符号、および絶対値の大きさ) と、実際にグラフに表示されているデータの相関の程度を確認してみよ。

余力のある人向けのおまけ: 回帰直線を求める

今度は、上で表示したグラフの回帰直線の方程式や、「あてはめ」の決定係数を求める機能を追加してみよう。 必要な手順 (の要点だけ) を以下に示す。 ただし、すでに相関係数や各月の気温の平均・分散・標準偏差が全て求まっている ので、新たに計算しなければいけないものは何もない

これらを参考にして、過去134年間の5月と12月の月平均気温の相関係数と回帰直線の方程式を求める手順がどう書けるかを考えよ。 そして、今回の演習で先に作ったプログラムにその機能を追加したプログラムを作成せよ [みほん]。

gfortran に怒られないプログラムができたら、例の如く

$ cat matsuyama-kion.txt | ./a.out
と実行して計算結果を確認せよ。 正しくプログラミングできていたら、プログラムの出力 (の最後の4行) は以下のようになっているはずである。
 134  5.26  5.59  8.64 13.72 17.97 21.91 26.24 27.05 23.48 17.69 12.51  7.68 <- 平均
 134  1.51  2.10  2.00  1.52  1.33  0.98  1.37  1.09  1.74  1.53  1.60  1.53 <- 分散
 134  1.23  1.45  1.42  1.23  1.15  0.99  1.17  1.04  1.32  1.24  1.27  1.24 <- 標準偏差
  0.479  0.230 0.513  -1.5 <- 相関係数、決定係数、回帰直線の傾きと y 切片

さらに、直線への「あてはまり」具合をグラフで確認してみよう。 再び Gnuplot を起動し、以下のように入力してみよ。

gnuplot> plot "matsuyama-kion.txt" using 6:13, 0.513*x-1.5
このグラフで、回帰直線と実際のデータの位置関係がもっともらしいものになっているか どうか、また 回帰直線への「あてはめ」の程度が、相関係数 (あるいは決定係数) の大きさから予想されるものと合っているか どうかを改めて確認せよ。

相関係数を求める (その2)

さらに今度は、5月の平均気温と、全ての月の平均気温との相関係数や回帰直線の傾き・y切片・決定係数をいっぺんに求めるプログラムを作ってみよう [みほん]。

必要な手順 (の要点の一部) を以下に示す。

gfortran に怒られないプログラムができたら、例の如く

$ cat matsuyama-kion.txt | ./a.out
と実行して計算結果を確認せよ。 正しくプログラミングできていたら、プログラムの出力 (の最後の7行) は以下のようになっているはずである。
 134  5.26  5.59  8.64 13.72 17.97 21.91 26.24 27.05 23.48 17.69 12.51  7.68 <- 平均
 134  1.51  2.10  2.00  1.52  1.33  0.98  1.37  1.09  1.74  1.53  1.60  1.53 <- 分散
 134  1.23  1.45  1.42  1.23  1.15  0.99  1.17  1.04  1.32  1.24  1.27  1.24 <- 標準偏差
     0.410 0.585 0.651 0.646 1.000 0.640 0.475 0.662 0.561 0.710 0.636 0.479 <- 相関係数
     0.168 0.343 0.424 0.417 1.000 0.410 0.225 0.438 0.315 0.504 0.405 0.230 <- 決定係数
     0.437 0.735 0.799 0.690 1.000 0.549 0.482 0.599 0.642 0.761 0.698 0.513 <- 回帰直線の傾き a
      -2.6  -7.6  -5.7   1.3   0.0  12.1  17.6  16.3  11.9   4.0  -0.0  -1.5 <- 回帰直線の y 切片 b
正しく動いていることが確認できたら、本日の演習の出席確認のため、このプログラムを 末尾のフォーム 経由で提出せよ。

また、Gnuplot を使って先と同様に、横軸に5月の平均気温、縦軸にある月の平均気温をとったグラフを描いてみよ。 データの相関の度合が、相関係数の値から予想されるものと合っているかどうかを確認せよ。

余力のある人向けのおまけ: 2次元配列・2重ループ

ここまでの課題では、5月の気温と各12ヶ月の気温との相関をとってきた。 その際、5月の気温とi月の気温との相関 を入れておくための変数を、12個の実数を入れる配列 soukan として宣言し、i月の気温との相関係数を 配列 soukani 番目の「番地」に入れる ようにしていたのであった。 では、もし全ての月の間の相関、具体的には i月の気温とj月の気温の相関係数を全部 求めてみたくなった場合には、どのような方法を用いればよいだろうか。

Fortran 90 に限らずコンピューター言語のほとんどは複数の「添え字」を使った配列を用いることができる。 具体的には、2つの「添え字」を使った配列を2次元配列 といい、kion(12) のように1つの「添え字」を使った配列を1次元配列という。 以下の例は、変数 seki_souwaseki_heikinsoukan を2次元配列として宣言するためのものである。 この場合、これら3つの配列は、1つめの「番地」は1から12まで、2つめの「番地」も1から12までの値をとり、合計で 12×12=144 個の実数 を入れることができる。

  real,dimension(12,12) :: seki_souwa,seki_heikin,soukan 

余力のある人は、このプログラム (コピペ可) を参考に、全ての月の間で平均気温の相関係数を求めてみるプログラムを作成してみよ。 ある月とそれ以外の月の組み合わせをとった \({}_{12}\mathrm{C}_{2}=\frac{12\times11}{2}=66\) 通りのうち、何月と何月の平均気温の間が最も相関がよいか。

ちなみに、このプログラムの出力 (の最後の13行) は以下のようになるはず。 この「表」形式に書かれている \(12\times12=144\) 個の相関係数の結果からも、

になっている (そりゃ当然) ことも確認できる。
        1      2      3      4      5      6      7      8      9     10     11     12
 1  1.000  0.468  0.402  0.370  0.410  0.244  0.120  0.280  0.292  0.361  0.371  0.221
 2  0.468  1.000  0.580  0.430  0.585  0.425  0.256  0.463  0.386  0.462  0.380  0.357
 3  0.402  0.580  1.000  0.518  0.651  0.518  0.392  0.535  0.465  0.553  0.444  0.412
 4  0.370  0.430  0.518  1.000  0.646  0.488  0.428  0.513  0.467  0.568  0.371  0.333
 5  0.410  0.585  0.651  0.646  1.000  0.640  0.475  0.662  0.561  0.710  0.636  0.479
 6  0.244  0.425  0.518  0.488  0.640  1.000  0.496  0.480  0.472  0.561  0.530  0.369
 7  0.120  0.256  0.392  0.428  0.475  0.496  1.000  0.575  0.456  0.459  0.287  0.233
 8  0.280  0.463  0.535  0.513  0.662  0.480  0.575  1.000  0.616  0.611  0.396  0.235
 9  0.292  0.386  0.465  0.467  0.561  0.472  0.456  0.616  1.000  0.656  0.473  0.249
10  0.361  0.462  0.553  0.568  0.710  0.561  0.459  0.611  0.656  1.000  0.551  0.397
11  0.371  0.380  0.444  0.371  0.636  0.530  0.287  0.396  0.473  0.551  1.000  0.492
12  0.221  0.357  0.412  0.333  0.479  0.369  0.233  0.235  0.249  0.397  0.492  1.000

さらに、上で挙げたプログラムでは、2次元配列を操作している部分は、doend do のループの中にもう1つの doend do のループを含んでいる、という2重構造になっていることにも注意してほしい。 この例のように、複数のループを「入れ子」にして用いる ことも可能であり、2つのループが「入れ子」になったものは2重ループと呼ばれる。 また、このプログラムの出力を注意して眺めることにより、2重ループの中の2つのカウンタ変数 (ij) がどのような順番で変化しているかを確認せよ。

出席確認用プログラム提出フォーム

Moodle のコースページ 以下の 課題ファイル提出 により、各自で作成した (enshu05c.f90 に相当する) 過去134年間における各月の平均気温と5月の平均気温の相関係数を求める Fortran 90 プログラムの最終版を提出せよ。