移動平均


移動平均とはたとえば月次データが何年分か溜まった後に大きな傾向を見るために6か月平均とか12か月平均とかを1月から12月、2月から翌年1月、というように対象期間を移動させながら計算していくものです。年度合計の比較でいいじゃないか、と思いがちですが、昨年度は売上無理したしなぁ、とかいろいろ事情があったりするので、客観的な数字として威力があります。
例えば3年分36か月のデータがあるとして、年度平均だけだと3つの計算で済みますが、12か月移動平均のグラフをつくりたいとすると、12か月目から始まって、最後の月まで計算できますので、36-11=25回年度平均と同じ計算をしなければなりません。12個数字を足して12で割るだけですが、計算が面倒なだけでなく、手順も面倒だと思います。

本物のデータがあるといいのですが、まずデータを作ります。1年目は1〜100のランダム数字、2年目は10〜110のランダム数字、3年目は20〜120のランダムとする。これならば見かけはわからないけど移動平均をとれば増加傾向が見えるだろうという予想。安易? というかこの考え方が正しいかどうかが検証されるかもしれない。

   ]data1=:12?100
90 10 54 3 6 22 77 78 75 16 7 36
   ]data2=:10+12?100
50 104 77 101 84 65 74 68 79 10 105 14
   ]data3=:20+12?100
44 41 63 42 117 89 47 92 51 69 49 48

ためしに年度合計を取ってみると、年度では増加傾向はわかりません。

   (+/data1),(+/data2),(+/data3)
474 831 752

ほらね? よしよし。まず3年分をひとつのデータにします。

   ]data=:data1,data2,data3
90 10 54 3 6 22 77 78 75 16 7 36 50 104 77 101 84 65 74 68 79 10 105 14 44 41 63 42 117 89 47 92 51 69 49 48
   3 12$data
90  10 54   3   6 22 77 78 75 16   7 36
50 104 77 101  84 65 74 68 79 10 105 14
44  41 63  42 117 89 47 92 51 69  49 48
   load 'plot'
   plot data

数字の見た目もグラフも変動が大きすぎて傾向がつかめません。
さて、この月次データを対象に12か月移動平均を計算してみよう。最終的には36-11=25個の移動平均計算結果のデータになりますが、まずは36個のデータから25x12の月次データを取り出す必要があります。36個のデータを0〜34の数列とすると、対象月(target_months)は次のようになります。

   ]target_months=:(i.36-11)+/i.12
 0  1  2  3  4  5  6  7  8  9 10 11
 1  2  3  4  5  6  7  8  9 10 11 12
 2  3  4  5  6  7  8  9 10 11 12 13
 3  4  5  6  7  8  9 10 11 12 13 14
 4  5  6  7  8  9 10 11 12 13 14 15
 5  6  7  8  9 10 11 12 13 14 15 16
 6  7  8  9 10 11 12 13 14 15 16 17
 7  8  9 10 11 12 13 14 15 16 17 18
 8  9 10 11 12 13 14 15 16 17 18 19
 9 10 11 12 13 14 15 16 17 18 19 20
10 11 12 13 14 15 16 17 18 19 20 21
11 12 13 14 15 16 17 18 19 20 21 22
12 13 14 15 16 17 18 19 20 21 22 23
13 14 15 16 17 18 19 20 21 22 23 24
14 15 16 17 18 19 20 21 22 23 24 25
15 16 17 18 19 20 21 22 23 24 25 26
16 17 18 19 20 21 22 23 24 25 26 27
17 18 19 20 21 22 23 24 25 26 27 28
18 19 20 21 22 23 24 25 26 27 28 29
19 20 21 22 23 24 25 26 27 28 29 30
20 21 22 23 24 25 26 27 28 29 30 31
21 22 23 24 25 26 27 28 29 30 31 32
22 23 24 25 26 27 28 29 30 31 32 33
23 24 25 26 27 28 29 30 31 32 33 34
24 25 26 27 28 29 30 31 32 33 34 35

なかなか美しい。と自画自賛。
この一行一行について、もとの月次データを取り出して合計する。若干試行錯誤をしましたがまとめると次のようになると思う。

   ]result=:+/"1 target_months{data
474 434 528 551 649 727 770 767 757 761 755 853 831 825 762 748 689 722 746 719 743 715 774 718 752
   plot result

むむぅ。元がランダムなので、期待ほどはっきりした傾向にはなりませんでしたが、一応傾向が見られる形になったので成功としよう。