MATLAB Examples

Contents

レンタルバイクの需要予測

データは以下ページから取得したオープンデータを使用

UCI Bike Sharing Dataset

データの読み込み

読み込みたいファイルを右クリックして「データのインポート」を選択します。 インポートツール を 起動して以下の手順で読み込み、読み込みのための関数を作成します。

インポートデータを列ベクトルからテーブルに変更 B列 (DateTime) をテキストから日付/時刻フォーマットに変更して 自動的に yyyy-MM-dd 形式を指定

filename = 'data/bs2011.csv';
bikesharing = importfile(filename);

月情報、曜日情報と平日/休日情報をテーブルデータ bikesharing に追加します。

month は月番号を出力します。 weekday は曜日を出力します。 isweekend は R2014bで新しく導入された datetime コンポネント形式の関数で、平日か休日かを出力します。

bikesharing.Month = month(bikesharing.Date);
[bikesharing.DayOfWeek, bikesharing.DOWname] = weekday(bikesharing.Date);
bikesharing.Holiday = isweekend(bikesharing.Date);

DateTime のズーム(R2014b新機能)

ズームをすると時系列データが自動的に更新される機能を紹介します。

全体のバイクレンタルデータを可視化します。

figure(1)
plot(bikesharing.Date, bikesharing.Count, '.')
grid on
grid minor

% このグラフから、冬場は少なく、夏場は多いことがわかります。
%
% フォントサイズを大きくすると、tickLabelが重なって見えにくくなります。
h = gca;
h.FontSize = 16;

% ラベルを回転させることで見えやすくします。
h.XTickLabelRotation = 45;

% ズームインをすると、自動的にx軸のラベルが更新されていきます。

可視化

24時間ごと、曜日ごと、月ごとのバイクレンタル数の平均を可視化してデータの傾向を確認します。

  • 24時間の平均レンタル数を描画します。 データをそのまま使用して24時間の平均を描画することはできません。 たとえば scatter を使うと以下のようなグラフが描けます。
figure(1)
scatter(bikesharing.Hour,bikesharing.Count)

% これは各時間帯のレンタル数分布のグラフで、回数平均のグラフではありません。
% 平均回数のグラフに変更するため、平均回数をカウントします。
bikestats = varfun(@mean, bikesharing, 'GroupingVariables', 'Hour');
% Figureタブから plotを選択して描画します。

figure(2)
h = plot(bikestats.mean_Count);
grid on; grid minor;

% プロットツールを使えば、マーカーをつけたり範囲を設定することが可能です。
xlim([1 24])
h.Marker = '*';
% 0時から8時頃までは使用数が少ないことがわかります。
  • 1週間の平均レンタル数 同様に、一週間の各曜日の平均回数をカウントします。
bikestats = varfun(@mean, bikesharing, 'GroupingVariables', 'DayOfWeek');
% Figureタブから plotを選択して描画します。
figure(3)
h = plot(bikestats.mean_Count);
xlim([1 7])
h.Marker = '*';
grid on; grid minor;

figure(4)
h = plot(bikestats.GroupCount);
xlim([1 7])
h.Marker = '*';
grid on; grid minor;
% 水曜日のレンタル平均回数が非常に少ないことや、
% 土曜日のレンタルユーザ数が突出して多いことがわかります。
  • 1ヶ月の平均レンタル数を描画します。 同様に、一ヶ月ごとの平均バイクレンタル数をカウントします。
bikestats = varfun(@mean, bikesharing, 'GroupingVariables', 'Month');
% Figureタブから |bar| を選択して描画します。
figure(5)
h = bar(bikestats.mean_Count);

% プロットツールを使えば、範囲を設定することが可能です。
xlim([1 12])
% 1, 2, 3月は使用数が少ないことがわかります。

曲面近似

バイクのレンタル数は時刻と気候 (気温) の関数であると仮定します。 また、これらの描画より、季節ごとのモデリングや曜日ごとのモデリングによって モデルの精度を上げることができると考えられます。 今回は9月の平日のデータでモデリングを行います。

データの抜き出しをおこないます。 論理インデクスを使用して9月の平日のバイクレンタルデータのみを抜き出してみましょう。

idxMonth = (bikesharing.Month == 9 );
idxDay = ismember(bikesharing.DayOfWeek, 2:6);
idx = idxDay & idxMonth;
Hour = bikesharing(idx,:).Hour;
Temp = bikesharing(idx,:).Temp;
Count = bikesharing(idx,:).Count;

% 例えば、論理インデクスで抜き出した変数 |Hour| と |bikesharing.Hour| のサイズをワークスペースで確認すると、
% |Hour| の方が小さいことがわかります。
% この抜き出したデータを使用してフィッティングを行います。

% |cftool| を使用して作成した関数を使用してフィッティングを行います。
[fitresult, gof] = createFit(Hour, Temp, Count);
disp(fitresult)
% 15時、20度のときのバイクレンタル台数の予測
fitresult(15,20)
     一般モデル:
     fitresult(x,y) = a1 * exp( - ( ( x - b1) / c1 )^2 ) + a2 * exp( - ( ( x 
                    - b2) / c2 )^2 )  + d0 + d1 * cos(y*w) + e1 * sin(y*w)
                     + d2 * cos(2*y*w) + e2*sin(2*y*w)
     係数 (95% の信頼限界):
       a1 =       264.4  (237.3, 291.4)
       a2 =       323.3  (287.5, 359)
       b1 =       17.21  (16.88, 17.53)
       b2 =       7.872  (7.738, 8.007)
       c1 =         4.9  (4.352, 5.448)
       c2 =       1.502  (1.3, 1.704)
       d0 =       96.06  (42.79, 149.3)
       d1 =      -21.41  (-379.5, 336.7)
       d2 =       10.94  (-156.5, 178.4)
       e1 =      -92.51  (-159.8, -25.23)
       e2 =       18.25  (-63.43, 99.93)
       w =      0.3256  (0.171, 0.4802)
ans =
  288.0281
close all