2012-12-20

行列の計算

Excelには行列の掛け算をしたり、逆行列を求める機能があります。
マクロを使って行列の演算をしてみましょう。

行列の準備

次のように行列を入力してください。

エクセルのワークシートのどの部分が行列なのかを指定します。

Sub gyoretsu()
Dim A As Range
Set A = Range(Cells(1, 1), Cells(2, 2))

最初に、Aはワークシートの範囲を指定するものだと宣言して
次にCells(1, 1)からCells(2, 2)までの長方形が行列Aの範囲だと指定します。

演算してみましょう。
行列一つだけで計算できる例として、転置と、行列式を求めてみます。

Dim B As Range
Set B = Range(Cells(4, 1), Cells(5, 2))
B = Application.Transpose(A)

これで、行列Bの場所であるCells(4, 1)からCells(5, 2)までの長方形に行列Aの転置が出力されます。

Cells(7, 1) = Application.MDeterm(A)

これで、行列Aの行列式がCells(7, 1)に出力されます。

行列の掛け算

今度は二つの行列を掛け算した行列を求めましょう。
エクセルのシート1とシート2の両方に先ほどの行列を書いてください。

Sub kakezan()
Dim A As Range, B As Range, C As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set C = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 2))
C = Application.MMult(A, B)
End Sub

これでシート3の行列Cに、行列の積ABが出力されます。
必ず「標準モジュール」にマクロを書いてください。

連立一次方程式

を解いてみましょう。
と置くと、連立一次方程式は
Ax=b
と書けます。
この式に左からAの逆行列を掛けて
x=A-1b
ですから、エクセルを使って計算するのは
Aの逆行列A-1
A-1とbの行列の積
です。
シート1のCells(1, 1)からこの連立一次方程式の係数行列と定数項を並べて

このように代入します。
この中のCells(1, 1)からCells(2, 2)までの長方形を行列A
Cells(1, 3)からCells(2, 3)までの長方形を行列B
シート2のCells(1, 1)からCells(2, 2)までの長方形にAの逆行列を代入するのでここを行列C
シート3のCells(1, 1)からCells(2, 1)までの長方形に、答えの行列行列を代入するのでここを行列D
とします。

Sub renritsu()
Dim A As Range, B As Range, C As Range, D As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(1).Cells(1, 3), Sheets(1).Cells(2, 3))
Set C = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set D = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 1))
C = Application.MInverse(A)
D = Application.MMult(C, B)
End Sub

解けない場合の処理

は解くことが出来ません。
このような場合に対処するために、逆行列を求める前に行列式を計算して、行列式が0ではない場合だけ連立一次方程式を解くようにしましょう。
場合分けにはIf文を使います。

If 条件 Then
'ここに条件が成立した時に実行する文を書く
Else
'ここに条件が成立しなかった時に実行する文を書く
End If

このように書きます。
条件が成立しなかった時は何も実行しないなら

If 条件 Then
'ここに条件が成立した時に実行する文を書く
End If

練習

ここまでに説明したことを使って、解ける方程式は解く、解けない方程式は「解けません」と表示するマクロを書いてください。
解けないと表示するためには
msgbox("解けません")
と書きます。

出来た人は次の方程式を解いてください。

2012-12-17

2012-12-13

While文

前回の課題の確認と提出

最初に前回の課題を確認します。

While文を使って個数を数える

今回は20人のデータでしたが、一つのマクロを複数のデータに対して用いる場合は、データによって人数が一定とは限りません。
そのような場合のために、マクロの最初で人数を数えましょう。

数える操作は何回繰り返すかが分かっておらず、上から順に見ていって最後に到達するまで繰り返します。
このように、条件を指定して繰り返すにはWhile文を使います。

Do While 条件
 この部分が繰り返される
Loop

先ほどのマクロのEnd Subより後に、次のマクロを書いてみてください。

Sub 数える()
j = 1
Do While Cells(j + 1, 2) <> ""
  j = j + 1
Loop
人数=j
MsgBox (人数)
End Sub

最後のMsgBox(人数)は、人数という変数の値を表示するマクロです。
Cells(j+1,2)が空っぽではない間は繰り返す、という意味です。
正しく数えられましたか?ずれていた場合はその理由を考えましょう。

配列の大きさを変更する。

人数が分かったので配列を用意するときに

Dim x(人数)

と書きたいのですが、これではエラーになります。
配列を用意するときの(括弧)の中に変数を書くことは出来ません。
マクロの途中で配列の大きさを変えるには、まず最初に

Dim x()

のように(括弧)の中に何も書かずに
人数を数えた後で

ReDim x(人数)

と書きます。

練習

先週作ったマクロを、最初から20人に限らず、マクロの中で人数を数えて配列を用意して計算するように改造してください。

2012-12-10

二つの母集団の母平均

母平均の差を考える時に、対応があるかないかでやり方は違うものになります。
その違いを説明しました。
具体的な方法は来週やります。

小テスト

この教科書の範囲を超えますので講義では触れませんが、自分へのメモとして。
★ 2×L分割表の検定での連続性の補正 ★
2×2分割表のイエーツの補正
カイ2乗検定

統計手法の実地への適用限界

2012-12-08

Windows8

Windows8を1ヶ月くらい使ってみました。

動作は少し軽い

Core iシリーズだとWindows7でも動作は速いのであまり感じませんが、Core2 Duo以前だと、Windows7より動作が速くなった感じがします。
内部バージョンはWindows7がNT6.1でWindows8がNT6.2ということで、見た目の大きな変化とは裏腹に内部は地道な改善がなされていて、メモリの使い方が改善されたらしいです。

スタートボタンが欲しい

タッチパネルではないパソコンにとって、単に「スタートボタンがなくて不便なWindows7」です。
Classic Shellを使うとスタートボタンを復活できます。

かな漢字変換が賢い

タッチパネルでスマートフォンのように使うことも考えて、スマートフォンやgoogle IMEのように予測入力ができます。

インストールが楽

OSのインストールディスクに入っているドライバが多いので、インストール直後でもデバイスマネージャの?マークが少ないです。
Windows7だとOSのインストール後にあれこれドライバソフトを入れなければならなかったのが、Windows8では不要になりました。

対応ソフトの安定性が疑問

ThinkPadで使うと、トラックパッドの設定をカスタマイズしたのが消えることがあります。また無線のON/OFFのためのホットキーもOSに任せきりで無線LANとbluetoothそれぞれON/OFFするユーティリティーを起動できませんでした。
ASUSのP8Z77では、電源を入れた直後の起動では有線LANを認識せず、再起動が必要となります。
OS自身は悪くなくてハードウェアメーカーが作るデバイスドライバの問題なのかも知れませんが、どちらにせよ使う上で不便ですので、Windows7に戻しました。
これまでのWindows同様、最初のサービスパックが出た頃にまた使おうと思います。

2012-12-06

特性値の計算

先週の課題の続きです。 先週欠席した人は先週のブログを先に読んでください。
また、前々回に説明した準備作業を毎回行ってください。
今日は 'で始まる文章の部分を、自分でマクロを書いてください。

先週の課題

sub 身長と座高()
dim x(20)
for j=1 to 20
  x(j)=cells(j+1,2)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
end sub

身長の平均

このプログラムにどんどん続きを書いていきましょう。
まず平均を求めるために、身長の合計を20で割って、
身長の平均
という変数に代入します。

sub 身長と座高()
dim x(20)
for j=1 to 20
  x(j)=cells(j+1,2)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20
cells(24,1)="平均"
cells(24,2)=身長の平均
end sub

注意事項
身長の平均=wa/20
を代入し終わった時点で、もう身長の合計の値は要らなくなりますので、waという変数は別の目的に使って構いません。

座高の平均

座高に関しても、同様にy(1), y(2),...,y(20)という変数を用意して、座高の値を代入します。
このように(括弧)の中に番号を書いた変数を配列と言います。
シートから配列にデータを読み込むのは、一番最初にまとめておきましょう。

sub 身長と座高()
dim x(20), y(20)
for j=1 to 20
  x(j)=cells(j+1,2)
  y(j)=cells(j+1,3)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20
cells(24,1)="平均"
cells(24,2)=身長の平均
'ここに座高の合計を変数 wa に代入するマクロを書く
cells(23,3)=wa
座高の平均=wa/20 cells(24,3)=座高の平均
end sub

注意事項
身長の平均を計算し終わった時点で、waには身長の合計が入っているので、座高の合計を計算する前に必ず
wa=0
でゼロに戻してください。

身長の分散

分散は、数式で書くと となります。マクロで書くなら、2乗は ^2 なので
(x(1)-身長の平均)^2
(x(2)-身長の平均)^2

(x(20)-身長の平均)^2
これら20個を足して、20で割ったものが身長の分散です。
分散の平方根が標準偏差です。
平方根はsqr( )で計算できます。

sub 身長と座高()
dim x(20), y(20)
for j=1 to 20
  x(j)=cells(j+1,2)
  y(j)=cells(j+1,3)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20
cells(24,1)="平均"
cells(24,2)=身長の平均
'ここに座高の合計を変数 wa に代入するマクロを書く
cells(23,3)=wa
座高の平均=wa/20
cells(24,3)=座高の平均
'ここに、20人分の(身長と身長の平均の差)の2乗の合計を変数 wa に代入するマクロを書く
身長の分散=wa/20
cells(25,1)="分散"
cells(25,2)=身長の分散
身長の標準偏差=sqr(身長の分散)
cells(26,1)="標準偏差"
cells(26,2)=身長の標準偏差
end sub

座高の分散

同様に座高の分散も計算してください。

sub 身長と座高()
dim x(20), y(20)
for j=1 to 20
  x(j)=cells(j+1,2)
  y(j)=cells(j+1,3)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20
cells(24,1)="平均"
cells(24,2)=身長の平均
'ここに座高の合計を変数 wa に代入するマクロを書く
cells(23,3)=wa
座高の平均=wa/20
cells(24,3)=座高の平均
'ここに、20人分の(身長と 身長の平均 の差)の2乗の合計を変数 wa に代入するマクロを書く
身長の分散=wa/20
cells(25,1)="分散"
cells(25,2)=身長の分散
身長の標準偏差=sqr(身長の分散)
cells(26,1)="標準偏差"
cells(26,2)=身長の標準偏差
'ここに、20人分の(座高と 座高の平均 の差)の2乗の合計を変数 wa に代入するマクロを書く
座高の分散=wa/20
cells(25,3)=座高の分散
座高の標準偏差=sqr(座高の分散)
cells(26,3)=座高の標準偏差
end sub

身長と座高の共分散

共分散は、数式で書くと となりますので
(x(1)-身長の平均)*(y(1)-座高の平均)
(x(2)-身長の平均)*(y(20)-座高の平均)

(x(20)-身長の平均)*(y(20)-座高の平均)
これら20個を足して、20で割ったものが身長と座高の共分散です。

sub 身長と座高()
dim x(20), y(20)
for j=1 to 20
  x(j)=cells(j+1,2)
  y(j)=cells(j+1,3)
next j
wa=0
for j=1 to 20
  wa=wa+x(j)
next j
cells(23,1)="合計"
cells(23,2)=wa
身長の平均=wa/20
cells(24,1)="平均"
cells(24,2)=身長の平均
'ここに座高の合計を変数 wa に代入するマクロを書く
cells(23,3)=wa
座高の平均=wa/20
cells(24,3)=座高の平均
'ここに、20人分の(身長と 身長の平均 の差)の2乗の合計を変数 wa に代入するマクロを書く
身長の分散=wa/20
cells(25,1)="分散"
cells(25,2)=身長の分散
身長の標準偏差=sqr(身長の分散)
cells(26,1)="標準偏差"
cells(26,2)=身長の標準偏差
'ここに、20人分の(座高と 座高の平均 の差)の2乗の合計を変数 wa に代入するマクロを書く
座高の分散=wa/20
cells(25,3)=座高の分散
座高の標準偏差=sqr(座高の分散)
cells(26,3)=座高の標準偏差
'ここに、20人分の(身長と 身長の平均 の差)×(体重と 体重の平均 の差)の合計を変数 wa に代入するマクロを書く
共分散=wa/20
cells(27,1)="共分散"
cells(27,2)=共分散
end sub

身長と座高の相関係数

相関係数は
共分散÷(身長の標準偏差 × 座高の標準偏差)
で計算できます。
今日ここまでに書いたマクロの最後に、
相関係数を計算して、
Cells(28,2)に出力するマクロを書いてください。
来週の最初にメールに貼り付けて提出してください。

解答

次の値になったら正解です。
身長の合計3087, 座高の合計1676
身長の平均154.35, 座高の平均83.8
身長の分散18.2275, 座高の分散7.36
身長の標準偏差4.269368, 座高の標準偏差2.712932
共分散8.67
相関係数0.748543
セルの幅によって表示される桁数が違ってきますので、上のほうの位が合っていれば大丈夫です。

2012-12-01

二つの母集団の母分散の検定

予習用に公開していた内容の中で、二つの母集団の母分散の比の推定は次回に回しました。

小テスト
バッグの忘れ物があったので、A棟2階の事務室に届けています。