[MATLAB] 3.3 解析

3.3 解析

 ここでは,水温と溶存酸素濃度 (DO) との間に相関関係があるかどうかを確認してみる。

(1) 水温とDOとの関係をグラフで確認する

1) 全てのデータでグラフを作成する

plot(WT(:),DO(:),'o'); xlabel('WT'); ylabel('DO'); [↵]

図 3.3 水温とDOとの関連性

 データはばらついているものの,水温とDOとの間にはなんらかの関係がありそうな雰囲気がある。ただ,この図では全ての水深のデータを一度にプロットしているので,傾向がはっきりしない。

2) 水深ごとに色を変えて表示してみる

plot(WT,DO,'o'); xlabel('WT'); ylabel('DO'); [↵]
legend(['01'; '02'; '03'; '04'; '05'; '06'; '07'; '08'; '09'; '10']) ; [↵]

図 3.4 水温とDOとの関連性

(水深別に色分け)

 水温とDOとの関係は,水深によってはっきりと異なること,水深によっては水温とDOとの間に相関関係がありそうなことがわかる。

3) 水深ごとに別々のグラフを作成する

for k=1:10, subplot(4,3,k); plot(WT(:,k),DO(:,k),'o'); title(num2str(k)); end [↵]

図 3.5 水深ごとの水温とDOとの関連性

 水深の浅い地点で,水温とDOとの間に負の相関関係がはっきりと表れている。

(2) 相関係数を確認する

1) 相関関係を求める

 最も浅い水深での水温とDOとの相関係数を求めてみる:

corrcoef(WT(:,1), DO(:,1)) [↵]

→ 以下の通り出力される。ansの1行目1列目,2行目2列目はそれぞれWT(:,1),DO(:,1)同士の相関係数で,通常は1になる。1行目2列目,2行目1列目がWT(:,1)とDO(:,1)との相関係数を表すが,“NaN”と表示され,計算できなかったことを示している。

>> corrcoef(WT(:,1), DO(:,1))
ans =
     1   NaN
   NaN   NaN

図 3.6 水深1(表層0.5 m)での水温とDOとの相関係数

2) NaN を取り除く

 相関係数の計算結果がNaNとなった原因は,もとのデータにNaNが含まれるためである。そこで,NaNを除いた残りのデータで相関係数を求めるために,もとの変数からNaNを取り除くための関数を作成する。

 ツールバーの [New] > [Function] をクリックし,エディターを開いたのち,以下の内容を記述する。全て書き終えたらファイル名を “remnan.m” として保存する 。

function val = remnan(val0)
  % 行列から,NaNが入っている行または列を削除する。
  % 171212 nagare
  val = val0 ;  % 入力値を出力値にコピー

  [i,j] = find(isnan(val));  % NaNが入っている場所を検索

  sz = size(val) ;  % 変数の大きさを確認
  if sz(2) > sz(1)  % もし列数>行数なら
    val(:,j) = [] ;  % NaNが入っているj列目を削除
  else            % 列数<=行数なら
    val(i,:) = [] ;  % NaNが入っているi行目を削除
  end
   
  end

図 3.7 データからNaNを取り除くための関数 “remnan()”

3) 2)で作成した関数を使いNaNを取り除き,相関係数を求める:

val=[WT(:,1),DO(:,1)]; val=remnan(val); r=corrcoef(val) [↵]

※または,

val=[WT(:,1),DO(:,1)]; r=corrcoef(remnan(val)) [↵]

4) 全ての水深で水温とDOとの相関係数を求める。

r=zeros(10,1); [↵]
for k=1:10, val=[WT(:,k),DO(:,k)]; rr=corrcoef(remnan(val)); r(k)=rr(1,2); end [↵]

このブログの人気の投稿

[MATLAB] 2.3 行列の要素を抽出する

[MATLAB] A1 PAD (Problem Analysis Diagram)