[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 [↵]