2008-06-27

蚊の割合

蚊のピーク時の日生存率は83%
蚊がマラリア患者を刺してから、人に感染させられるようになるまでに要する日数は平均10日。
0.8310≒0.15

では、マラリア患者を刺した蚊の中で、人に感染させられる蚊の割合は?
話を簡単にするために、人に感染させられるようになるまでに要する日数を10日に固定すると…
日生存率をrとすると、刺して0日経過から9日経過の数は、刺した蚊の数で割って基準化すると
1+r+r2+…+r9
一方感染力を持つ蚊はr10+r11+…
よって比率は
r10+r11+…
-----------------=r10
1+r+r2+…+r9+r10+r11+…
なんか、凄く簡単なことを長々計算したような…

2008-06-26

多変量回帰

レポートの回答例

Sub report()
i = 2
Do While Cells(i, 5) <> ""
  i = i + 1
Loop
last = i - 1

For i = 2 To last - 1
  Cells(i, 7) = Log(Cells(i, 5)) - Log(Cells(i + 1, 5))
Next i

wa = 0
For i = 2 To last - 1
  wa = wa + Cells(i, 7)
Next i
heikin = wa / (i - 2)
Cells(1, 8) = heikin

wa = 0
For i = 2 To last - 1
  wa = wa + (Cells(i, 7) - heikin) ^ 2
Next i
bunsan = wa / (i - 2)
Cells(2, 8) = bunsan

wa = 0
For i = 2 To last - 2
  wa = wa + (Cells(i, 7) - heikin) * (Cells(i + 1, 7) - heikin)
Next i
kyoubunsan = wa / (i - 2)
Cells(3, 8) = kyoubunsan

a = kyoubunsan / bunsan
b = heikin - a * heikin
c = heikin
Cells(4, 8) = a
Cells(5, 8) = b

r1 = 0
For i = 2 To last - 2
  r1 = r1 + (Cells(i, 7) - heikin) ^ 2
Next i

r2 = 0
For i = 2 To last - 2
  r2 = r2 + (Cells(i, 7) - (a * Cells(i + 1, 7) + b)) ^ 2
Next i

Cells(6, 8) = (r1 - r2) / r1

End Sub

多変量回帰

高次の自己回帰モデルを考える前に、多変量回帰を考えて見ましょう。 次のようなデータがあります。
indexcityyx1x2x3
1稚内-8.0 45.42 141.68 2.8
2旭川-13.6 43.77 142.37 111.9
3札幌-9.5 43.05 141.33 17.2
4青森-5.4 40.82 140.78 3.0
5盛岡-6.7 39.70 141.17 155.2
6仙台-3.2 38.27 140.90 38.9
7金沢-0.1 36.55 136.65 26.1
8長野-5.5 36.67 138.20 418.2
9高山-7.6 36.15 137.25 560.2
10軽井沢-10.0 36.33 138.55 999.1
11名古屋-0.9 35.17 136.97 51.1
12飯田-4.7 35.52 137.83 481.8
13東京-0.4 35.68 139.77 5.3
14鳥取0.5 35.48 134.23 7.1
15京都-0.6 35.02 135.73 41.4
16広島0.2 34.37 132.43 29.3
17福岡1.5 33.58 130.38 2.5
18鹿児島2.0 31.57 130.55 4.3
19高知0.1 33.55 133.53 1.9
20那覇13.5 26.23 127.68 34.9
このデータは、20地点の1月の日最低気温の月平均値y, 緯度x1, 経度x2, 標高x3のデータです。この緯度、経度、標高と気温の関係を数式で表したいと思います。 また神戸の緯度は34.68、経度は135.18、標高は59.30です。神戸の気温を推定しましょう。

緯度、経度、標高と気温の関係は色々考えることが出来ますが、今回は緯度、経度、標高の3変量を使う最も簡単なものとして

y=β01x12x23x3+誤差

という形を考えます。
β0123はどうやって決めましょうか。
本当の気温yと、緯度、経度、標高から推定した気温β01x12x23x3 との差が小さくなるように決めましょう。

データの
1番目の都市の気温をy1、緯度をx11、経度をx12、標高をx13
2番目の都市の気温をy2、緯度をx21、経度をx22、標高をx23
・・・・・
20番目の都市の気温をy20、緯度をx20,1、経度をx20,2、標高をx20,3
と書きます。すると、本当の気温と推定した気温の差は

y1-(β01x112x123x13)
y2-(β01x212x223x23)
・・・・・
y20-(β01x20,12x20,23x20,3)
です。これらはプラスになったりマイナスになったりするので、そのまま足すと打ち消しますから、二乗して足して
i=120 {yi-(β01xi12xi23xi3)}2
が最小になるようなβ0123を求めることにします。
一見、求めるのは難しそうに見えます。でもこれはβ0123に関する二次式で、しかもは二乗して足していますから0以上です。だからグラフは下に凸になっていて、どこかで最小値を取ります。

公式の導出は書きにくいので講義のときに板書しますが、実は最小にするβ0123は次の連立一次方程式を解くことで求めることが出来ます。

まず未知数β0123を縦に並べたベクトル

β0
β1
β2
β3
をΒとおき、
ベクトル
y1
y2
y20
をYとおき、
最後に行列
1x11x12x13
1x21x22x23
1x20,1x20,2x20,3
をXとおきます。
1が縦に並んでいるのはβ0の係数だからです。この時、最小にするβ0123は 連立一次方程式
(Xt・X)Β=(Xt・Y)
を解くことで得られます。Xの右上のtは転置を表します。
この連立一次方程式を解いて、β0123を求めてみましょう。 連立一次方程式の解き方は、前回の最後の部分を見てください。

2008-06-23

ソウルの交通機関

韓国で研究会があるので交通を調べてみました。
仁川国際空港からはリムジンバスもありますし、地下鉄もあります。
地下鉄の路線は結構多いです。路線図のPDFファイルもあります。

Holiday Inn SEOULへ行くなら
  • Shuttle Charge (one way): ₩14,000
  • Airport Limousine Gate 3B or 10B Bound for Seongbuk, Dongdaemun, Seongdong
  • Subway Station Name: Gireum Subway Station
という手段があるそうです。
地下鉄で行くなら、まず仁川空港鉄道で金浦空港駅で5号線に乗り換えて、東大門運動場で4号線に乗り換えてで417が最寄駅です。 料金は韓国旅行「コネスト」によると2000ウォンくらいでしょう。SuicaのようなT-Moneyカードというのもあるそうです。

2008-06-21

ハフモデルによる商圏分析

本稿では、消費者の買い物出向率をハフモデルを用いて分析する。
ハフモデルとはHuff (1963)により提案された「消費者が、各商業集積へ買い物出向する確率は、商業集積の売場面積の規模に比例し、そこに到達する時間距離のべき乗に反比例する」というモデルであり、新規出店による集客及び他店舗への影響の推定に用いられる。 今回は数年おきに調査された「岡山県民の生活行動圏」データを用い、市町村を集計単位とした。分析の結果、ハフモデルにおける距離の指数、すなわち購買地選択において距離をどの程度重視するかというパラメータに関しては、食料品などの最寄品は距離を重視、レジャーなどは距離を軽視するという常識的な結果だけでなく、最近は距離を重視する傾向があることが分かった。また同一市町村間の移動に関しても最近は時間距離が増加していると見做しての購買地選択を行っていることが分かった。さらに、通産省修正ハフモデルにおいては距離の指数として2が指定されているが、仮説検定の結果この値を用いることは棄却された。

ハフモデルについて詳しくはRetail Trade Area Analysis Using the Huff Model - Articlesをご覧ください。

2008-06-20

第二章の実習

確率関数、分布関数の値の求め方

二項分布B(n,p)の確率関数P(X=x)はエクセルの関数BINOMDIST(x,n,p,0)で求めることが出来ます。
一方分布関数P(X≦x)はBINOMDIST(x,n,p,1)で求めることが出来ます。

まず正しいコインを10回投げたときに、5回表が出る確率を求めてみましょう。
表が出る回数が5回ですのでxは5, 10回投げるのでn=10, 正しいコインなのでp=0.5, 確率関数なので最後は0です。 前回、合計を求めるときに=SUM(A2:A31)と入力したように、どこかのセルに=BINOMDIST(5, 10, 0.5, 0)と入力します。
次に6回以上表が出る確率を求めてください。今回は講義中に正解を書けないので数字だけ書いておきます。0.376953…となれば正解、入力した式は正しいです。

しかし、BINOMDISTでは10,000回投げたときに5,000回以上表が出る確率を求めようとしてもnが大きすぎて出来ませんので、こんなときは正規分布で近似します。
正規分布N(μ,σ2)の密度関数f(x)はエクセルの関数NORMDIST(x,μ,σ,0)で求めることが出来ます。
一方分布関数P(X≦x)はNORMDIST(x,μ,σ,1)で求めることが出来ます。

練習:Xの確率分布が標準正規分布の時、P(X≦1)を求めなさい。0.841345…となれば正解です。

次に、二項分布B(n,p)でnが大きいときの正規分布による近似が正しいかどうか確かめるために、BINOMDISTでも計算できるn=100で確かめてみましょう。
正しいコインを100回投げたときに表が出た回数をXとします。
P(X≦50)とP(X≦55)をBINOMDISTを用いて求めてみましょう。それぞれ0.539795…と0.864373…となれば正解です。
Xの分布を正規分布で近似するために期待値μと分散σ2の値を求めてください。公式は教科書にまとめてあります。
P(X≦50)とP(X≦55)を正規分布による近似で求めてください。それぞれ0.5と0.841345…となれば正解です。
少し精度が低いですね。講義中に板書した、二項分布の棒グラフと正規分布の密度関数の曲線で囲まれた部分の面積を思い出してください。棒グラフには幅があるので、密度関数を積分するときにもその幅の分だけ広げた方が精度があがります。どのようにすれば精度が上がるか考えてください。0.539828…と0.864334…になります。

一様乱数

1.新しくブックを開いてください。
2.A1セルに[0,1]の一様乱数を作ります。A1セルに =RAND() と入力してください。
3.100個の一様乱数を作るため、A1セルをコピーしてA100セルまで貼り付けます。
4.B2セルに>0.5と入力してください。
5.先ほど発生させた100個の一様乱数の中で、0.5よりも大きいものの個数を調べます。B1セルにCOUNTIF関数を挿入します。「統計」の「COUNTIF」を選択してOKを押してください。
6.範囲にA1:A100、検索条件にB2とそれぞれ入力してください。検索条件は4.で入力した>0.5という条件を指定しています。


7.ファンクションキー「F9」を押すと、新しく乱数を発生させることができます。0.5より大きい個数も、F9を押す度に変化します。
8.これらの値がどの区間に入っているかを調べます。まずC1セルからC11セルに0から1までの数を0.1刻みで、次のように入力してください。


9.度数分布を調べます。ツールタブ→分析ツール→ヒストグラムを選択してください。
10.入力範囲にA1セルからA100セルのデータを選択してください。データ区間に先ほど入力したC1セルからC11セルを選択してください。出力先にはE3セルを指定してください。グラフ作成にチェックを入れてください。最終的には次のような形になっていると思います。


11.OKを押してください。適当にグラフを移動し、広げて見やすい形にしてください。

練習:乱数をA1000まで1,000個発生させて同じことをやってみましょう。どんな違いがありますか。

簡便な正規乱数

1.演習1のワークシートをそのまま利用します。
2.A1セルに12個の一様乱数の和を作ります。A1セルに=RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()+RAND()と入力してください。
このようにするとA1には平均6、分散1の乱数が入力されます。何故でしょう?[0,1]上の一様乱数の平均と分散を計算して、それと定理2.4を使うと求めることが出来ます。
3.先ほどと同じく、A1セルのコピーをA100セルまで貼り付けてください。
4.B2セルには>6と入力してください。するとB1セルに6より大きいものの個数が表示されます。
5.C1セルからC25セルに0から12までの数を0.5刻みで入力してください。
6.演習1と同じ要領でヒストグラムを作ってください。データ区間にはC1セルからC25セルを選択してください。
どんなヒストグラムになりましたか?
練習:乱数をA1000まで1,000個発生させて同じことをやってみましょう。どんな違いがありますか。

二項分布の表

確率関数、分布関数、期待値、分散を公式を使うのではなく定義どおりに求めてみましょう。また先ほどは特定の値にだけ分布関数を求めてみましたが、分布関数全体を求めてみましょう。 まず、分布のパラメータを入力します。

xの欄に0から10まで入力します。一つずつ入れていると大変なので、 まずA6に0を入れた後は自動で埋めましょう。0を入れたセルをクリックして 編集→フィル→連続データの作成を選びます。

列方向に1つずつ10まで増やします。

するとこのようになります。

次に確率関数を入力します。確率関数の式に従ってx=0に対しては
=COMBIN(B$2,A6)*B$3^A6*(1-B$3)^(B$2-A6)
と入力します。

それをB16セルまでコピーして、確率関数の完成です。

次に分布関数を入力します。 x=0に対しては=SUM(B$6:B6)と入力します。

それをC16セルまでコピーします。

次に期待値μ=Σxp(x)を求めます。まずx=0に対して=a6*b6と入力します。

それをD16セルまでコピーします。

それらを合計したものが期待値です。実は期待値はnpとして求めることが出来ます。

次に分散σ^2=Σ(x-μ)^2p(x)を求めます。まずx=0に対して=(a6-d$18)^2*b6と入力します。

それをE16セルまでコピーします。

それらを合計したものが分散です。実は分散はnp(1-p)として求めることが出来ます。

さて、n=10の場合はこのように確率関数、分布関数を計算することが出来ますし、正規近似では近似精度が悪いです。でもnが大きくなると確率関数を計算することが出来なくなる一方、正規近似の精度は良くなります。それで正規分布N(μ,σ^2)の分布関数で近似します。 とりあえずn=10の場合に対してどれくらい近似できるか見てみましょう。 まずx=0に対して
=NORMDIST(a6,d$18,sqrt(e$18),1)と入力します。3番目の引数には分散ではなく その平方根である標準偏差を代入します。以下の画像では=NORMDIST(a6,d$18,sqrt(e$18),true)と書いています。本当はtrue, falseなのですが、面倒なのでtrueの代わりに1、falseの代わりに0を書いても同じ計算結果が得られるようになっています。

それをF16セルまでコピーします。

さて近似してみましたが、C列とF列を見比べてみると値はかなり異なっています。 今回の講義の最初の方に書いた、棒グラフの幅が原因です。特にn=10だと棒も11個しかないので、その幅の影響が大きいです。 まずx=0に対して
=NORMDIST(a6+0.5,d$18,sqrt(e$18),1)と入力します。つまり幅の分0.5増やしています。

それをG16セルまでコピーします。

如何ですか。小数点以下2桁までは合いました。まだ近似としては不十分ですが、 そもそもn=10ならば直接確率関数を計算した方が話は早いです。 ここまで出来た人は、このSheet1をSheet2へコピーして、n=100の場合について 同じ計算をして見ましょう。これ以上あまりnを大きくすると、確率関数が計算出来なくなったり、出来たとしても確率関数を足すときの誤差が大きくなってしまいます。

発展

もしもExcelを既に勉強していて、今日の内容では物足りない人はもっと本格的なプログラミングに挑戦してください。但しこれ以降は当日説明できないので多めに用意しているテーマです。出来なくても統計学入門そのものの理解には困りません。
まず準備です。左上の丸いボタンを押して、「Excelのオプション」をクリックします。そして「[開発]タブをリボンに表示する」にチェックをつけてOKを押します。

すると右端に「開発」が表示されるのでクリックして、マクロのセキュリティをクリックして、「すべてのマクロを有効にする」に●をつけてOKを押します。


これで準備は完了ですので「Visual Basic」のボタンを押します。するとVisual Basicの画面が開きます。 プログラムを書く部分を用意したいので「挿入」をクリックして「標準モジュール」をクリックしてください。

現れた画面にプログラムを書きます。
まず
sub 練習
とだけ書いて、Enterキーを押してください。すると自動的に

Sub 練習()

End Sub

となり、カーソルは真ん中の空行にあります。そこに
cells(1,1)=1
と書いてください。これは上から1番目、左から1番目のセルに1を代入しなさい、という命令です。
プログラムを書いたら、上の右向きの三角をクリックしてください。するとどのプログラムを実行するか聞かれます。今は一つしか書いていないのでそのまま実行を押すと、A1セルに1が代入されます。Excelの画面で「マクロ」を押しても実行できます。

このプログラムを保存する時の注意。
左上の「上書き保存」を押すと、どの形式でファイルを保存するか尋ねられます。ファイルの種類として「Excelマクロ有効ブック」を指定してください。

さてこれでプログラムを書いて実行できるようになったので、具体的なプログラミングを始めましょう。
先ほどのCells(1,1)=1とEnd Subの間に
cells(2,1)=2
cells(3,1)=3
と書き込んで実行してみてください。
あるいは
cells(1,2)=-2
cells(1,3)=-3
と書いて、cellsの二つの添え字がExcelのどのセルに対応しているか確認しましょう。

10個続けて書くには、
cells(1,1)=1
cells(2,1)=2
cells(3,1)=3
cells(4,1)=4
cells(5,1)=5
cells(6,1)=6
cells(7,1)=7
cells(8,1)=8
cells(9,1)=9
cells(10,1)=10

と書くのは大変なので、これをFor文を使って

for i=1 to 10
 cells(i,1)=i
next i

と書きます。

次に下のような九九の表ができるようにプログラムを考えて見ましょう。

シミュレーション

VBAで
Rnd()
と書くと[0,1]区間上の一様乱数が得られます。これを用いて
Sqr(-2 * Log(Rnd())) * Cos(2 * Application.Pi() * Rnd())
と書くと標準正規分布に従う乱数が得られます。(Box-Muller method)

推定方法の良し悪しを比較するために、シミュレーションしてみましょう。

  1. 標準正規分布に従うデータを、乱数を用いて10個得ます。1行のAからJまで、つまりCels(1,1)からCells(1,10)までに書き込んでください。
    データを得たらひとまず「このデータは標準正規分布に従う乱数から得られた」ことを忘れます。
    そしてデータだけを見て、この分布の平均、分散を推定してみましょう。元は標準正規分布ですから、平均の推定値はは0、分散の推定値は1に近いほうが良いです。
  2. まず平均を推定します。10個のデータを足して10で割った値が分布の平均の推定値です。これをL列、つまりCells(1,12)に書き込んでください。
  3. 次に10個のデータそれぞれから今求めた平均を引いて二乗して足します。足したものをデータの個数である10で割った値をM列、つまりCells(1,13)に書き込んでください。ぴったり平均0、分散1にはならないと思います。
  4. そこでこのデータ観測と推定を1000回繰り返して、1000個の平均の推定値、分散の推定値を求めて、それら推定値の平均を求めてみましょう。
    先ほどは1行目に書きましたが、これを同じことを1000行目まで繰り返します。するとL列、つまりCells(1,12)からCells(1000,12)までに1000個の平均の推定値が、M列、つまりCells(1,13)からCells(1000,13)までに1000個の分散の推定値が得られます。
    Cells(1,15)にCells(1,12)からCells(1000,12)までの平均を、 Cells(2,15)にCells(1,13)からCells(1000,13)までの平均を書き込んでください。
    Cells(1,15)は0に近いと思いますが、Cells(2,15)は1よりも小さく、0.9前後になるでしょう。
  5. では今度は1行目から1000行目までの各行に関して、10個のデータから平均を引いて二乗したものを足して(データの個数-1)である9で割ってN列に書き込んでください。
    そしてCells(1,14)からCells(100,14)までの平均をCells(3,15)に書き込んでください。
    今度は1に近いと思います。
このように、データに基づいて分布の分散を推定するときには(データの個数-1)で割ります。

2008-06-19

行列

先週の続き

先週の記述を少し付け加えたので、まず先週のページを読んで、決定係数まで求めてください。

修正

先週の方法には二つの欠点があります。
  • 「昨日の終値から今日の終値までの変化率」と「今日の終値から明日の終値までの変化率」に関係があったとしても、今日の終値が分かるときには既に今日の取引は終わっているので実際には売買できない。
  • そもそも決定係数が小さすぎる
そこで、実際に売買に利用できる別の時系列をいくつか考えて、決定係数が大きなものを探してみましょう。例えば
yi=i日目の始値から終値までの変化率
zi=i日目の終値からi+1日目の始値までの変化率
などが考えられます。

行列

もっと前のデータも予測に利用する、つまり
Xi=a0+a1Xi-1+a2Xi-2
を考えて、係数a0, a1, a2を求めたいと思います。この場合、多変量回帰と同じように、行列演算が必要になります。
そこでExcelを使って行列の積、特に逆行列の計算をしましょう。

行列の扱い方と転置

VBAで行列を扱うには、まず「Excelのシートのこの部分は行列Aです」と設定します。
Dim A As Range
と書くことで「Aはエクセルのシートの範囲を用いた行列」と宣言し
Set A = Range(Cells(1, 1), Cells(2, 2))
「Cells(1, 1)セルからCells(2, 2)セルまでの長方形が行列Aです」と設定します。
一番簡単な行列演算として、転置行列を求めてみましょう。

Sub tenchi()
Dim A As Range, B As Range
Set A = Range(Cells(1, 1), Cells(2, 2))
Set B = Range(Cells(4, 1), Cells(5, 2))
Cells(1, 1) = 11
Cells(1, 2) = 12
Cells(2, 1) = 21
Cells(2, 2) = 22
B = Application.Transpose(A)
End Sub

これでCells(1, 1)からCells(2, 2)までに入力した行列の転置がCells(4, 1)からCells(5, 2)までに出力されます。

行列演算

行列の積はMMult, 逆行列はMInverse, 行列式はMDetermです。 上のプログラムに続けて、Aの逆行列を計算してCに代入し、積ACを計算してDに代入し、最後にDの行列式を求めるプログラムは

Sub matrix()
Dim A As Range, B As Range, C As Range, D As Range
Cells(1, 1) = 11
Cells(1, 2) = 12
Cells(2, 1) = 21
Cells(2, 2) = 22
Set A = Range(Cells(1, 1), Cells(2, 2))
Set B = Range(Cells(4, 1), Cells(5, 2))
Set C = Range(Cells(7, 1), Cells(8, 2))
Set D = Range(Cells(10, 1), Cells(11, 2))
B = Application.Transpose(A)
C = Application.MInverse(A)
D = Application.MMult(A, C)
Cells(13, 1) = Application.MDeterm(D)
End Sub

となります。誤差が出るので0の筈なのに0にならない成分があるかもしれません。

練習

逆行列と行列の積を用いて、次の連立一次方程式の解を求めてください。
2x+4y+4z=18
2x- y-6z=-2
2x+3y-2z=-6

正解はx=11, y=-6, z=5です。

2008-06-18

Suica一体型イオンカード後日談

Suica一体型イオンカードを頼んだら何故かWAON一体型が送られてきました???
お持ちのクレジットカードで、“SMART ICOCA”をお申し込みいただけるようになりますとのことです。
PASMO一体型クレジットカードで年会費無料のものは 東京メトロ To Me CARD東武カード京急カードです。迷いますね。

全然関係ないですがカネゴンの78ちゃんねるまとめブログ、証拠を押さえられる | デジタルマガジン面白かったです。

2008-06-16

周杰倫

個人的なメモ、というかブックマーク
【方道‧文山流】
青花瓷
菊花台
周大侠
もっと良いのを見つけたら入れ替えます。

2008-06-12

自己回帰モデル

レポートの解答例

Sub renshu2()
i = 2
Do While Cells(i, 1) <> ""
 i = i + 1
Loop
last = i - 1

For i = 2 To last - 1
 Cells(i, 7) = Log(Cells(i, 5)) - Log(Cells(i + 1, 5))
Next i

wa = 0
For i = 2 To last - 1
 wa = wa + Cells(i, 7)
Next i
heikin = wa / (last - 2)
Cells(3, 9) = heikin '平均

wa = 0
For i = 2 To last - 1
 wa = wa + (Cells(i, 7) - heikin) ^ 2
Next i
hensa = Sqr(wa / (last - 2))
Cells(4, 9) = hensa '標準偏差

End Sub

回帰の復習

2変量(X,Y)の観測データ(x1,y1),(x2,y2),...,(xn,yn)に対して、回帰式
Y=aX+b+ε
を考えた時、二乗和
Σi=1n {yi-(axi+b)}2
を最小にするaとbを求めたいと思います。まずxとyそれぞれの平均
μX=1/n Σi=1n xi
μY=1/n Σi=1n yi
を求めておくと
a=(XとYの共分散)/(Xの分散)
  1/n Σi=1n (xi-μX)(yi-μY)
=--------------------------------
  1/n Σi=1n (xi-μX)2
および
b=μY-aμX
で求められます。
またXがどれくらいYの予測に役立っているかを測るために、まずXを用いずにYを予測することを考えて
Σi=1n (yi-c)2
を最小にするcを求めます。するとc=μYになります。これらのa,b,cを用いて
Σi=1n (yi-c)2 と比べて Σi=1n {yi-(axi+b)}2 が凄く小さくなっていたらXはYの予測に役立っていて、逆にあまり小さくなっていなかったらXはYの予測に役立っていない、ということになります。数値的に評価するためにどれくらい小さくなったかという比
   Σi=1n (yi-c)2-Σi=1n {yi-(axi+b)}2
R2=------------------------------------------
        Σi=1n (yi-c)2
を計算して、これを決定係数と呼びます。

自己回帰

2変量の回帰ではx1を用いてy1を予測し、x2を用いてy2を予測し,…,xnを用いてynを予測するのですが、時系列の場合はx1を用いてx2を予測し、x2を用いてx3を予測し,…,xn-1を用いてxnを予測します。
つまりY=aX+b+εの代わりにXi=aXi-1+b+εを考え、 2変量回帰の時のn組のデータ(x1,y1),(x2,y2),...,(xn,yn)の代わりにn-1組のデータ(x1,x2),(x2,x3),...,(xn-1,xn)を用います。
計算方法は大体2変量回帰の場合と同じです。但し2変量の時の全く同じように計算するならμXは1番目からn-1番目までのn-1個の平均で
μX=1/(n-1) Σi=1n-1 xi,
μYは2番目からn番目までのn-1個の平均で
μY=1/(n-1) Σi=2n xi
と計算する筈ですが、自己回帰の場合はμXに相当する部分もμYに相当する部分も共通の
μ=1/n Σi=1n xi
を使います。分散もXに相当する部分はxn-1までっぽいですが
1/n Σi=1n (xi-μ)2 で計算します。
また共分散はn-1組に対して計算しているのでn-1個足してn-1で割る、つまり
1/(n-1) Σi=2n (xi-μ)(xi-1-μ)
と計算するべきに思えますが、nで割って
1/n Σi=2n (xi-μ)(xi-1-μ)
で計算します。
決定係数も同様に、一つ前のデータを予測に使わない時の誤差Σi=2n (xi-c)2と比べて、一つ前のデータを予測に使った時の誤差 Σi=2n {xi-(axi-1+b)}2 がどれくらい小さくなったかを比較します。

練習

TOPIXのデータに関して、この方法で予測してください。さらに決定係数を求めて、この予測がどれくらい役立つか調べてください。

2008-06-09

エアコンの温度

A206号教室のエアコン設定温度は24度だそうです。
低すぎるのでは、と思ったのですが、教室が傾斜していて奥のほうは温度も高くなるので、それくらいにしないと奥のほうは暑くなるのだそうです。
ですから、暑いと感じる人は前の方に座ってください。

笛田薫の脳内
楽しいことばかり考えているようです。

2008-06-05

対数正規分布

Sub report()
For j = 1 To 1000
  For i = 1 To 10
    Cells(j, i) = Sqr(-2 * Log(Rnd())) * Cos(2 * Application.Pi() * Rnd())
  Next i
  
  wa = 0
  For i = 1 To 10
    wa = wa + Cells(j, i)
  Next i
  heikin = wa / 10
  Cells(j, 12) = heikin
  
  wa = 0
  For i = 1 To 10
    wa = wa + (Cells(j, i) - heikin) ^ 2
  Next i
  bunsan = wa / 10
  Cells(j, 13) = bunsan
Next j

wa = 0
For j = 1 To 1000
  wa = wa + Cells(j, 12)
Next j
Cells(1, 15) = wa / 1000

wa = 0
For j = 1 To 1000
  wa = wa + Cells(j, 13)
Next j
Cells(2, 15) = wa / 1000

For j = 1 To 1000
  wa = 0
  For i = 1 To 10
    wa = wa + Cells(j, i)
  Next i
  heikin = wa / 10
  
  wa = 0
  For i = 1 To 10
    wa = wa + (Cells(j, i) - heikin) ^ 2
  Next i
  bunsan = wa / 9
  Cells(j, 14) = bunsan
Next j
Cells(1, 15) = wa / 1000

wa = 0
For j = 1 To 1000
  wa = wa + Cells(j, 14)
Next j
Cells(3, 15) = wa / 1000

End Sub

対数変換

一昨日から今日までの株価の変化率と、昨日から今日、一昨日から昨日の変化率の間には
 今日の株価  今日の株価 昨日の株価
------=-----×------
一昨日の株価 昨日の株価 一昨日の株価
という関係があります。よってこの間の平均変化率を求めるには、この右辺の平方根を計算して相乗平均を求める必要があります。
一般に掛け算とかn乗根は計算しづらいですし、統計で広く用いる平均と違うので面倒です。

そこで掛け算を足し算に変換するために、対数を考えることにします。すると
 今日の株価  今日の株価 昨日の株価
------=-----×------
一昨日の株価 昨日の株価 一昨日の株価

Log(今日の株価)-Log(一昨日の株価)=(Log(今日の株価)-Log(昨日の株価))+(Log(昨日の株価)-Log(一昨日の株価))
という、足し算、引き算の式になります。
これを先ほど計算したF列の隣、G列に書きます。
対数の底は10でもeでも上記の計算は成り立ちますが、底がe、つまり自然対数の方が
log(x)≒x-1
という近似式が成り立つので、
log(今日の株価÷昨日の株価)≒今日の株価÷昨日の株価-1≒(今日の株価-昨日の株価)÷昨日の株価
なので先ほど求めた変化率と似た値になります。

計算 G2セルに
=LN(E2)-LN(E3)
と書いても計算できますが、先ほど同様VBAを使って計算して下さい。但し自然対数はExcelのセルに書くときはLnですが、VBAで書くときにはLogです。

練習

TOPIXの自然対数の前日との差を求め、その平均をCells(3,9)、標準偏差を(4,9)に表示するプログラムを書いてください。

ヒストグラム

全部出来た人は、F列の変化率や、G列の対数の差のヒストグラムを書いて見ましょう。Excelでのヒストグラムの書き方の概略は統計学Iに書いています。
ヒストグラムの階級は、-7.5%から7.5%まで0.5%間隔、つまり-0.075から0.075まで0.005間隔にしてみてください。
今回のデータではどちらも正規分布っぽく見えますが、一般には対数の差の方が正規分布に従います。このように、対数にすると正規分布に従う分布を「対数正規分布」と呼びます。

預金金利

http://www.bk.mufg.jp/tameru/yen/sp_teiki/btm/pdf/t_st_setsumei.pdf
http://www.smbc.co.jp/setsumeisho/pdf/sonotaen005.pdf
http://www.mizuhobank.co.jp/setsumeisho/pdf/teiki_super.pdf
定期預金を解約すると、解約した時の普通預金の金利で計算されるそうです。
今後金利が上がった場合は、定期預金を途中解約して預けなおしても、それまでの定期預金の金利がもらえなくて損、ということはないかも知れませんね。
koukinri @Wikiに金利一覧がありました。

2008-06-02

高精度計算サイト

カシオ計算機の 「高精度計算サイト」

Windows7のスクリーンショット
バージョンが6.1と書かれています。

一つ疑問があるのですが、マイクロソフトユーザー向け特別優待プログラムって、そもそもWindows用のこのソフトをマイクロソフトユーザー以外が買うことあるのでしょうか?