時系列データ分析の書籍のサンプルデータをMATLABで試してみた

# 時系列データ解析の書籍
[技術評論社の書籍「現場ですぐ使える時系列データ分析～データサイエンティストのための基礎知識〜」](http://gihyo.jp/book/2014/978-4-7741-6301-7)には、ファイナンス分野における時系列データ解析の実践として、Rによるコードが掲載され、サンプルデータが[技術評論社のサポートページ](http://gihyo.jp/book/2014/978-4-7741-6301-7/support)に置いてあります。著者のサンプルコード通りRで試すのも良いのですが、MATLABでも試してみたい、そんな時の備忘録メモがこちらです。

## データのダウンロード
[技術評論社のサポートページ](http://gihyo.jp/book/2014/978-4-7741-6301-7/support)の「演習用データ」のリンクからデータをダウンロードできます。認証が不要なので、書籍の購読者じゃなくてもダウンロードできますね。ダウンロードされたexercise_data.zipを解凍すると、「演習用データ」フォルダーにサンプルデータ「.RData」が格納されています。.RDataはRでワークスペースを保存した際に使われるフォーマット。MATLABで言う.matと同じようなものですね。

## .RDataをMATLABで読めるフォーマットに変換
ここが一番の肝でした。ネットを調べても.RDataをMATLABに直接読み込むことはできなさそうなので、R側でファイルを加工してからMATLABに取り込むことにしました。

まず試したのは、RでRDataファイルをmatファイルに変換すること。Rのワークスペースを保存したものをそのままmatファイルにしてMATLABで取り込んでしまえば最短ルートかと思い、Rのパッケージ「[R.matlab](https://cran.r-project.org/web/packages/R.matlab/R.matlab.pdf)」を使用しました。`install.packages("R.matlab")`→`library("R.matlab")`→`writeMat("data.mat")`のような流れで試しましたが、
結論から言うと、下記の理由からこのパッケージで当該RDataファイルmatファイルへうまく変換できませんでした。
- 当該RDataファイルに無名列があるため、R.matlabのwriteMatでエラーが出る。
- writeMatで作成されたmatファイルをMATLABでloadしても、変数のフィールド名が空だったりしてアクセスできない。
- writeMatでmatファイルのバージョンを指定できるが、5までしか指定できない。現在(R2018a)のMATLABでは7がデフォルト、7.3が最新なのだが。

結局、RでCSVファイルに出力してMATLABに渡すことにしました。
### R側スクリプト(R 3.5.0を使用)

```r:convertTimeSeriesRData.R
# サンプルデータ読み込み
load(".RData")

# 変数のリストを出力
variables = ls()

# 変数毎に「変数名.csv」というファイル名で出力
for (i in 1:length(variables)){
  fname = sprintf("%s.csv", variables[i])
  write.csv(get(variables[i]), file = fname)
}
```
これでdata.cum.core30.csvのようにCSVファイルが21個作成されます。これをMATLABのワークフォルダーに持っていきます。

### MATLAB側
```matlab:matlabReadTimeSeries.m
% ファイル名をリスト出力
listing = dir('*.csv');

% CSVから変数名を取得し、同じ変数名に格納
for ii=1:length(listing)
    inputFileName = listing(ii).name;
        
    fieldName = extractBefore(inputFileName, '.csv');
    % data.cum.core30.2やdata.cum.train.2のように、変数名のプロパティが数字始まりのものは変数名をリネーム
    if ( strcmp(inputFileName, 'data.cum.core30.2.csv') )
        fieldName =  'data.cum.core30_2';
    elseif ( strcmp(inputFileName, 'data.cum.train.2.csv') )
        fieldName = 'data.cum.train_2';  
    end
    
    % 変数名=readtable(ファイル名)となるようevalで実行
    expression  = sprintf('%s = readtable(inputFileName);', fieldName);
    eval(expression)
end
% 後に使い回せるようにワークスペースに格納した変数をmatファイルに出力
save('sampleData.mat')
```

これでサンプルデータがsampleData.matというmatファイルに入りましたので、引き続きMATLABで中身を見てみようと思います。

## 変換したデータをMATLABでプロット
本格的な時系列データ解析を行う前のステップとして、書籍のChapter2-1「時系列データを観察する」で行っているプロットをMATLABでも試してみましょう。RDataに含まれていたQUICKの株価データから板硝子(x5202)、ヤマハ(x7272)、ポーラHD(x4927)、武田薬品(x4502)の4社の株価データを2012/9/28から2013/3/29までの121日分のデータを同じスケールでプロットし、価格変動の大きさを見てみます。

```matlab:plotFourData.m
load('sampleData.mat');
ylimVal = [min(diff( log( price4.x5202))* 100) max(diff( log( price4.x5202))* 100)];

subplot(2,2,1)
plot(diff( log( price4.x5202))* 100)
title('板硝子')
xlabel('Time')
ylabel('x5202')
ylim(ylimVal)

subplot(2,2,2)
plot(diff( log( price4.x7272))* 100)
title('ヤマハ')
xlabel('Time')
ylabel('x7272')
ylim(ylimVal)

subplot(2,2,3)
plot(diff( log( price4.x4927))* 100)
title('ポーラHD')
xlabel('Time')
ylabel('x4927')
ylim(ylimVal)

subplot(2,2,4)
plot(diff( log( price4.x4502))* 100)
title('武田薬品')
xlabel('Time')
ylabel('x4502')
ylim(ylimVal)
```

MATLABでのプロット結果
![MATLAB_Plot.png](https://qiita-image-store.s3.amazonaws.com/0/254990/3b5550a8-278b-7c25-45c5-9e35319c8774.png)
書籍での説明と同様、この期間の株価データの変動は板硝子→ヤマハ→ポーラHD→武田薬品の順に変動が大きいことが分かりました。

参考として書籍に従ってRでプロットしたものが下記の図ですが、同様の結果を得られています。まずはMATLABへのデータ読み込みはうまくいっていますね。
![R_Plot.png](https://qiita-image-store.s3.amazonaws.com/0/254990/f0a56643-3152-07e6-bbca-b5cbb22275ad.png)

また、書籍に掲載されていたこの後の本格的な時系列データ解析もMATLABで試していければと思います。

# まとめ
- Rのワークスペース保存ファイル「.RData」をMATLABで読み込めるようにするには一手間が必要 
- ここではCSVに出力してからMATLABで変数名=readtable(ファイル名)で取り込む方法を紹介