
プログラミングの基礎知識③ -MATLABによるデータ解析-
本日は前回の続きを説明していきたいと思います。
前回は下記の①と②について説明しました。
今回は③と④について説明していきます。
前回
①エクセルデータ(xlsx)を読み込む
②1名分の1日分のデータの平均値と標準偏差を算出する
今回
③for文を用いて9日分のデータの平均値と標準偏差を算出する
④ ③のグラフと作成する(標準偏差は省く)
前回と本日、用いるデータは図1になります。
前回と同様ですが、本日は1名分です。
9日間のデータがあり、1日50個のデータ(反応時間)があります。

では、③について説明していきます。
③はfor文を用いて9日分のデータの平均値と標準偏差を算出です。
前々回の記事でfor文を使わないと9個の同じコードを書く必要があると説明しました。
その意味は下記のコードになります。
result_mean = mean(data(:,1));
result_SD = std(data(:,1));
result_mean2 = mean(data(:,2));
result_SD2 = std(data(:,2));
result_mean3 = mean(data(:,3));
result_SD3 = std(data(:,3));
result_mean4 = mean(data(:,4));
result_SD4= std(data(:,4));
result_mean5 = mean(data(:,5));
result_SD5 = std(data(:,5));
result_mean6 = mean(data(:,6));
result_SD6 = std(data(:,6));
result_mean7 = mean(data(:,7));
result_SD7= std(data(:,7));
result_mean8 = mean(data(:,8));
result_SD8 = std(data(:,8));
result_mean9 = mean(data(:,9));
result_SD9 = std(data(:,9));
これでも9日分の平均値と標準偏差の算出は可能です(図2)。

ただ、時間もかかる上にスマートではありません。
(最初はこれでもいいと思いますし、私もfor文を理解していない最初の頃は面倒でもこう書いていました。)
そこで、for文を用いると楽にスマートにコードを書くことができます。
前々回の記事でfor文はfor文内のコードを指定した数だけ繰り返すと説明しました。
つまり、for文を用いて、9回(9日分)同じコードを繰り返してもらったらいいということになります。
上記で9回同じコードを書く必要がありましたが、for文を使えば以下のコードで済むことになります。
for i = 1 : 9
result_mean = mean(data(:,i));
result_SD = std(data(:,i));
result(1,i) = result_mean;
result(2,i) = result_SD;
end
では、ここから1つ1つ説明していきます。
まず、for文の基本構造は下記になります。
for index(iなど自由に決めます) = values(何回繰り返すか)
statements(繰り返す文)
end
for i = 1 : 9は9回繰り返すという意味になります。
result_mean = mean(data(:,i))とresult_SD = std(data(:,i))はiに上記の数値が入ります。
例えば、iが1のときはresult_mean = mean(data(:,1))となり1日目のデータ、iが2のときはresult_mean = mean(data(:,2))となり2日目のデータというように9日目まで自動で計算してくれます。
ただ、これだけでは9日間のデータをどこに抽出するのかコンピューターにはわかりません。
また、for文はデータを上書きして最後のiの数値のデータのみ保存しています。
つまり、9回繰り返した場合、9回目のデータは保存されますが(ワークスペースに記載されますが)、1-8回目のデータは上書きされるということになります(図3)。

そのため、for文の中で算出されたデータを入れる箱を作っておく必要があります。
その箱が今回でいう反応時間の算出データを入れるresult(1,i) = result_meanと標準偏差の算出データを入れるresult(2,i) = result_SDになります。
ここでもiには繰り返している数値が入ります。
例えば、iが1の場合は、result(1,1) = result_meanとなり、1行目の1列目に上記で計算したresult_mean = mean(data(:,1))の結果(反応時間)を入れてくださいという意味になります。
result(2,1) = result_SDは2行目の1列目に上記で計算したresult_SD = std(data(:,1))の結果(標準偏差)の結果を入れてくださいという意味になります。
このように9回分の結果をresultの箱の中に入れてくれます(図4)。
(本来ならfor文の前にzerosという関数を用いて箱を用意しておく方が良いですが、用意しておかなくてもできるので今回はしていません)

これで③のfor文を用いて9日分のデータの平均値と標準偏差を算出ができたことになります。
次に③で算出した反応時間をグラフにしたいと思います。
下記のコードでグラフが作成できます。
figure()
plot(result(1,:), '-o');
hold on
xlim([0.5 9.5]);
ylim([400 600]);
title('Reaction time');
単純にグラフを作成するだけであれば以下のみで作成できます。
figure()
plot(result(1,:), '-o');
result(1,:)のはresultの中の1行目のデータ全てという意味で、それをplotするという意味になります。
「’-o’」はグラフにマーカーを付けるという意味です。「’-o’」がなくても図の作成は可能ですが、ただの折れ線グラフになります。
hold on以下はX軸(xlim)やY軸(ylim)、タイトルを付けたりと見やすくするために用います(図5)。

これで、前回の①エクセルデータ(xlsx)を読み込むと②1名分の1日分のデータの平均値と標準偏差を算出する、今回の③for文を用いて9日分のデータの平均値と標準偏差を算出すると④ ③のグラフと作成する(標準偏差は省く)ができたことになります。
このように簡単なことを何度も繰り返していき、わからない部分はネットで調べれば出てくる時代なのでその都度調べながら新しい関数を覚えていけばいいと思います。
私もまだまだ調べないとスラスラとは書けないレベルですが、なんとか自分の研究範囲内の解析であればできているというレベルです。
もし、MATLAB解析やプログラミングでわからないことがあれば下記(twitterとインスタ)にご連絡いただければ、私のわかる範囲でお答えします。
また、今であれば無料説明会もあるので参加してモチベーションを高めるもの1つです。
Twitter : @kengo_brain
インスタ:graine_kr
関連書籍
はじめてのMATLAB新品価格 ¥2,673から (2020/10/22 13:45時点) |