2009-12-25

今年使った現像ソフト

現像ソフトの気に入った点、そうでない点
CaptureNX2
気に入った点
Nikonのデジカメ本体が記録するJPEGと全く同じ画像を出力できるので、そこから少しだけ変更した画像も出力出来る。ピクチャーコントロール、アクティブD-ライティングの設定も引き継げる
倍率色収差、周辺減光、ニコンのレンズなら歪曲収差を補正できる。
気に入らない点
画像の調整範囲が狭く、Nikonのデジカメ本体が記録するJPEGが気に入らない場合はCaptureNX2でどのように変更してもあまり気に入らない。
歪曲収差、周辺減光の補正があまり正確でない(DxOの方が正確)
ホワイトバランスを調整するとき、撮影時のオートホワイトバランスの色温度を表示しないので、オートホワイトバランスから少しだけ調整することが出来ない。
ホワイトバランスの色温度を、自由に選べるのではなく、まず晴天、曇天などを選び、そこからの微調整しか出来ない。

DxO
気に入った点
歪曲収差、周辺減光の補正が正確。歪曲収差の補正によって元の画像サイズをはみ出した部分を切り捨てずに画像サイズを少し大きくして残すことが出来る。
画像内の白とび部分が、RAWでは飛んでいなくて暗くすることで取り戻すことが出来る場合、どの程度暗くするかを自動設定出来る
高感度ノイズリダクションが優れている。
クアッドコアなら速い。
気に入らない点
バグが多い。
回転したときにはみ出た部分をトリミングする設定にしておくと、時々大幅に必要以上にトリミングする。
歪曲収差補正のためにはズームレンズの撮影時の焦点距離が必要ですが、Exifからの情報はおおざっぱすぎるので手動での微調整を求められます。ところが微調整範囲が撮影時の焦点距離を含まないことがあります。当然収差補正がおかしくなります。同じファイルでもその症状が出たり出なかったりするのでソフト側のバグでしょう。
プリセットを記憶するときに、倍率色収差補正に関しては補正レベルがAUTOであることを記録できますが、それ以外はAUTOであることは記録できず、具体的な数値しか記録しませんので一枚ずつAUTOのボタンを押す必要があります。まぁ前述の焦点距離のバグが発生していないかチェックするついでにAUTOのボタンを押しましょう。
ニコンのピクチャーコントロールの設定を無視するので、カラーレンダリングを調整してもデジカメ本体が記録するJPEGと似た色に出来ない。
倍率色収差が少し残る。
このソフトが出力したTIFFは何故かRalphaで読めない。一旦CaptureNX2で読み込んで保存しなおす。
ライセンス違反防止のために仕方ないが、オンラインアクティベーションが必要なので、再インストール時にメーカーに連絡する必要あり。
シングル、デュアルコアだと遅い。

Lightroom
気に入った点
多くのメーカーのデジカメに対応している。
画像ごとに明るさ、コントラスト、明部、暗部を調べて、自動設定出来る。
気に入らない点
自動収差補正が出来ない。
ノイズ補正が乏しい。カメラ、撮影時の感度に応じた自動設定が出来ない。

Silkypix(Lumix付属のパナソニック専用版)
気に入った点
パナソニックに限り、倍率色収差、歪曲収差を自動補正する。
気に入らない点
画像ごとの自動設定が明るさだけなので、一枚ごとに設定を変えたければ手動で行う必要がある。
評判の良い点
http://komin.blog.so-net.ne.jp/2009-10-27
http://takedashin.blog10.fc2.com/blog-entry-247.html
来年はSilkypixを使ってみようかな。
と思ったのですが
http://bbs.kakaku.com/bbs/03309921360/SortID=9593952/
という話を聞いたので止めます。
http://komin.blog.so-net.ne.jp/2008-04-27
によるとLightroomよりも格段に良いと言うわけでもなさそうですし、LightroomにTIFF16で出力させてそれをCaptureNX2で読み込んでExif情報に基づいて収差補正してくれるなら、この組み合わせにしようかと思いましたが、TIFFにレンズ情報が入っていても、CaptureNX2もDxOもそのレンズ情報に基づいた歪曲収差補正はしてくれませんし、これまで試行錯誤を繰り返してきたDxOの方がLightroomよりも好みに合った色を出すので、DxOをバグに注意しながら使うことにしました。

一つ一つの機能を補うソフト
Ralpha:リサイズにはこれが一番良い。
Neat Image:ノイズ除去にはこれが一番良いらしい。フリー版はExif情報を保存しない。
私の用途だとPro版$59.90が必要。http://www.neatimage.com/featuremap.html
PT Lens:収差補正ならこれが一番対象が多い。歪曲収差は自動、倍率色収差と周辺減光は手動。
元の画像サイズ内に収まるように縮小方向で歪曲収差を補正するので、補正後に余った部分を削除すると画像サイズが小さくなる。
http://epaperpress.com/ptlens/index.html

http://www.nikon-image.com/jpn/event/special/pcs/other/approximation.htm

http://blog.livedoor.jp/businesslaw/archives/51913906.html

ピント位置が異なる写真を合成して被写界深度が深い写真を作るソフト
D3とD3sの差はD300とD300sとの差より大きいらしいです。
~MPzero~ [コスプレイベント画像][Nikon D3] : ●Nikon AF-S NIKKOR 50mm F1.4G50mm F1.4ならすべての撮影の基本となる、デジタル対応大口径標準レンズ 50mm F1.4 EX DG HSM  株式会社シグマの方がきちんと作られているようですね。ニコンD700【第6回】50mm F1.4を撮り比べてみる

CCDの原理
GIN-ICHI オンラインショップ - BushHawk(ブッシュホーク) プロフェッショナルキット タン
HAL(Hybrid Assistive Limb®)について - CYBERDYNE

2009-12-24

ブートストラップ

母比率を推定する場合は、観測値の分布が二項分布だと確定していますから、推定量の確率分布も、推定したい母数を用いて書き表すことが出来ます。従って母数の値毎に推定量の確率分布を求め、95%の確率で`起こりやすい'区間に、観測値から計算した推定値が入っているか否かによって信頼区間も理論通りに求めることが出来ます。
しかし一般のパラメータ推定では、観測値の分布も推定量の分布も分かりませんので信頼区間も理論どおりには作ることが出来ません。
そこで、ブートストラップ法を用いて推定量の分布を推定し、区間推定を行う方法を説明します。

まず、得られた観測値をx1,...,xnとし、これらから計算した推定値をθとします。本当はθの上に^を付けたいのですがブログではつけられません。観測値の確率分布の分布関数をF(x)=P(X≦x)とします。
ブートストラップ法は、観測値x1,...,xnに基づいて分布関数F(x)=P(X≦x)を経験分布関数Fn(x)=(x以下の観測値xiの個数)/nによって推定します。推定量の確率分布を推定するためには確率分布が分布関数F(x)=P(X≦x)であるn個一組の観測値をB組、つまりx1(b),...,xn(b), b=1,...,Bを得る必要がありますが、実際には一組だけしか観測出来ないわけですから、代わりに確率分布がFn(x)=(x以下の観測値xiの個数)/nであるn個一組の観測値をB組得る、つまり元の観測値x1,...,xnから復元抽出を行うことでx1*(b),...,xn*(b), b=1,...,Bを得て、各b毎にn個の観測値から推定値θ*(b)を計算します。これらを用いてθの確率分布を経験分布関数G(q)=(q以下のθ(b)の個数)/Bと推定出来ます。
θの推定量が95%の確率で`起こりやすい'区間としては、θ(1),...,θ(B)の中の95%が入る最も短い区間、つまりθ+a≦θ(b)≦θ+cを満たすbがB×0.95個以上でしかもc-aが一番短くなるように選びます。θ(1),...,θ(B)を大きさの順番に並べ替えれば選びやすいでしょう。
この区間[θ+a,θ+c]が、パラメータの値がθだった場合の95%の確率で`起こりやすい'区間とします。さらにパラメータの値がθ+qだった場合は区間も平行移動して[θ+a+q, θ+c+q]であるとします。この区間が、元の観測値から計算した推定値θを含むようなqを求めるとθ+a+q≦θ≦θ+c+qなので-b≦q≦-aとなりますから、信頼区間は[θ-c,θ-a]となります。
a,cの符号が逆になり、区間の左右も逆になっていますね。例えばcが大きいと言うことは、推定量の分布が大きい方に伸びていると言うことであり、それはつまりθの本当の値がかなり小さくても今回のような推定値が得られることを意味します。

課題

別の講義ですがExcelを使った統計解析入門の例1.1のデータの、平均と分散の95%信頼区間を求めてください。ブートストラップ法は乱数を使いますので、実行する度に若干数字が異なるはずです。抽出回数B=1000にしてください。
復元抽出のための1から60までの乱数は Int(60 * Rnd()) + 1 で発生させることが出来ます。

2009-12-23

i-Blue 747A+

i-Blue 747 A+はAGPS対応の66チャンネルGPSロガーです。
いくつかのソフトウェアが付属しています。でも添付のソフトウェアは古かったのでホームページからダウンロードしました。
32bit版WindowsならばTransystem社のホームページからGPS Photo Taggerをダウンロードしてインストールすると、ソフトウェアと一緒にドライバもインストールされます。
但しWindows7などの64bit版の場合は別途Transystem社のホームページのDriversをクリックしてドライバをダウンロードします。
GPS Photo Taggerを最初に起動するときに、製品付属CDに書かれたシリアル番号が必要となります。一つのGPSを複数のパソコンで使うために複数のパソコンにインストールしたら「このシリアル番号は既に使われています」というメッセージが表示されました。GPS本体を買った人でも、複数のパソコンにインストールしてはいけないようです。

というわけで他のソフトを探したのですがMtkDLut - MTK GPS Logger download Utilityがシンプルですが、GPSログのパソコンへのダウンロード、ログ取得の条件設定など必要なことは出来ます。ダウンロードして解凍したらすぐ使えます。
もう一つbt747 - MTK GPS Datalogger Device ControlはJAVAで動くのでWindows以外でも使えます。

他に、日本語マニュアルはGISupply (GPSGDPS.COM)から、CP210xドライバ はチップの製造メーカーから、locr GPS Photoはソフトのメーカーから、VisualGPSはソフトメーカーから、Data LoggerはTransystem社ホームページからダウンロードできます。

GPSDGPS Webshop topicsも参考になります。

ViewNXを使うと、これで記録したログファイルを使ってニコンのNEFファイルにGeo Tagを埋め込むことが出来ます。ViewNXのGPSトラックを使用したジオタギング « GeoLifeに方法が書かれています。
JPEGのExif情報はタイムゾーンを記録しないので、単に8時と記録していてもそれが日本時間なのか現地時間なのか分かりません。だから旅行へ行った直後でカメラの時計を現地時間に合わせていない場合は、GPSログとのマッチングが出来ません。しかしNEFファイルはタイムゾーンも記録しているので、カメラを現地時間に合わせ忘れていてもGMTに換算してマッチング出来ます。
ニコンの一眼レフに接続してジオタグ情報を記録するタイプのGPSは、ケーブルが邪魔ですし接触不良になりがちです。旅ライターが使ってみた ニコン「GP-1」。 i-Blue 747A+のような独立型で記録してmatchingした方が良いと思います。

関係ないですが
PC組んだらこれだけは入れとけってフリーソフト2009

2009-12-21

母比率の区間推定の解説

前回のプログラムの解説と、用いることによって分かるいくつかの興味深いことを説明しました。

2009-12-17

If文による条件分岐

今日の内容

  • 前回の課題提出
  • 条件分岐

課題提出

前回作った、個数を数えて合計を計算して表示するプログラムを提出してください。平均、分散も計算するプログラムを書いた人はそれを提出してください。
件名:学籍番号と「Do Loop文」、本文:プログラムと名前

条件分岐

前回はInputBoxを使って、正の数が入力されるまで繰り返しましたが、今回は、正の数が入力された時だけ計算するプログラムを書きましょう。このような条件判断にはIf文を使います。
書き方は

If 条件 Then
 条件が成り立つときに実行する文
End If

です。数字の入力は前回同様

n = InputBox("幾つまでの和を計算しますか")

ですので、この後に前回も書いた

wa = 0
For j = 1 To n
 wa = wa + j
Next j
Cells(1, 1) = "合計"
Cells(1, 2) = wa

If IsNumeric(n) And n > 0 Then

End If

の間に挟まれるように書きます。つまり

If IsNumeric(n) And n > 0 Then
 wa = 0
 For j = 1 To n
  wa = wa + j
 Next j
 Cells(1, 1) = "合計"
 Cells(1, 2) = wa
End If

となります。

インデント

IfとEnd If、ForとNextのように、ペアになるもので挟まれた部分は少し左に空白を入れて右にずらして書くと、どことどこが対になっているか分かりやすいです。
キーボードの一番左の列の上の方にあるTabと書かれたキーを押すと右にずれます。

ELSE

条件が成り立たなかった場合に実行する文がある時には

If 条件 Then
 条件が成り立つときに実行する文
Else
 条件が成り立たなかったときに実行する文
End If

のように書きます。

練習

  • 正の数が入力されたらその数までの和を計算して表示する
  • 正の数が入力されなかったら、「正の数を入力してください」というメッセージを表示する
プログラムを書いてください。
メッセージを表示するには

MsgBox ("正の数を入力してください")

と書きます。

MsgBox

MsgBox( )の(括弧)の中に" "で囲まれた文字を書くと、その文字が表示されます。

MsgBox ("正の数を入力してください")

" "なしで変数の名前を書くと、その変数の値が表示されます。
例えば、和を計算するプログラムで
Cells(1, 2) = wa
の代わりに
MsgBox(wa)
と書いてみてください。

MsgBoxによる質問

MsgBoxは、単に文字を表示するだけでなく、OK、キャンセルなど、どのボタンがクリックされたかを知ることも出来ます。
試しに

x = MsgBox("あなたはお昼ごはんを食べましたか", 4, "質問")
If x = 6 Then
  MsgBox ("午後も元気ですね")
Else
  MsgBox ("ちゃんと食べてくださいね")
End If

を実行して、質問に答えてください。

使い方一覧

aとかbの文字は必要に応じて書き換えてください。

x = MsgBox("a", 0, "b")

x = MsgBox("a", 1, "b")

OKをクリックするとxに1が代入され、キャンセルをクリックするとxに2が代入されます。

x = MsgBox("a", 1, "b")
MsgBox (x)

を実行して、xの値を確かめてください。
0,1の他にも、次のメッセージボックスの種類があります。

2[中止]、[再試行]、[無視]
3[はい]、[いいえ]、[キャンセル]
4[はい]、[いいえ]
5[再試行]、[キャンセル]

クリックしたボタンとxに代入される値の関係

1OK
2キャンセル
3中止
4再試行
5無視
6はい
7いいえ

課題

この流れ図をプログラムに書いてください。

2009-12-14

母比率の区間推定

母比率の推定

インターネット通販での商品評価で、「10人中8人が『良い』と答えた」とか「3人中3人が『良い』と答えた」というのを見かけます。単純に「良いと答えた人の比率」を見れば、前者は80%で後者は100%ですが、後者は3人しか答えていないので100%という数字もあまり信頼出来ません。
そこで、仮にその商品を買った人全員に丁寧にお願いして、良かったかどうか尋ねた場合の「良いと答えた人の比率」を、ランダムに選ばれた少数の回答から推測する問題を考えます。実際には、凄く良かったと感激した人や、凄く不満で腹がたった人が回答する可能性が高いので、「ランダムに選ばれた」も怪しいのですが、そこまで考えると「どれくらい感激、立腹するとどれくらい回答するか?」「どのようにすればランダムに選ばれた回答を得られるか」まで調べなければなりません。今回の講義の目的は比率の推定方法ですので、そこはばっさり省いてランダムに選ばれた回答だと見做せる問題について考えます。

区間推定

例えば「10人中8人が『良い』と答えた」場合、商品を買った人全員の中で満足している人の比率は恐らく80%と推定出来ますが、もしかしたら81%かもしれませんし79%かもしれません。
でも「いや、1000人中満足したのは8人だけで、今回は偶々その8人選ばれた」とか、「1000人中不満なのは2人だけで、今回は偶々その2人選ばれた」と言われると、その可能性はゼロではありませんが、そのようなことを言い出すと「満足している人の比率は約0%から約100%の間」という全く意味のない推定しか得られませんので、そのような確率の低いことは無視します。
どれくらい確率が低いことを無視するか、というのが信頼水準で、例えば信頼水準95%と言うと「最も起こりそうな95%だけに注目して、残り5%は無視する」ということになります。
「いやいや、5%も無視してはいけない」という場合は信頼水準を例えば99%にして、1%しか無視しないことにします。
言い換えると、ある程度確率の低いことを無視する時にしか信頼区間(に限らず検定なども)は使えなくて、「どんなに可能性の低いことも考慮しなければならない」場合には、最初に戻って「いや、1000人中満足したのは8人だけで、今回は偶々その8人選ばれた」場合も考慮して「満足している人の比率は約0%から約100%の間」という結論になります。

信頼区間の求め方

説明のために、10人に質問したら8人が満足と答えた場合、そして信頼水準を95%とします。他の値を使うときは以下の数字を読み替えてください。
「商品を買った人全員の中で満足している人の比率」として様々な値を想定します。そして各々の比率の値に対して、95%の確率で最も起こりやすそうな範囲を求めます。
例えば比率として80%を想定した場合は
人数確率
00%
10%
20%
30%
41%
53%
69%
720%
830%
927%
1011%
になります。四捨五入のために足して100%にならないのは気にしないでください。実際に計算するときにはもっと有効桁を増やしますから。
この中で、確率の高い方から順に、合計が95%を超えるまで足していきます。この場合は6人の場合から10人の場合まで足すと97%になって95%を超えます。従って
  • もし10人に聞いて6人(あるいはそれ以上の人)が満足と答えたら、「満足している人の比率はもしかしたら80%で、今回は偶々6人が満足と答えた」と考えて、80%は信頼区間の中に入ります。
  • もし10人に聞いて5人(あるいはそれ以下の人)が満足と答えたら、「満足している人の比率はもしかしたら80%なのに今回は運悪く5人しか満足と答えなかっただけかもしれない。でもその確率は低いので無視する」と考えて、80%は信頼区間の中に入りません。
例として想定している調査結果は10人中8人ですので、80%は信頼区間の中に入ります。
同様に様々な比率を想定して、それが「10人中8人」という結果に対する信頼区間に入るかどうか調べることで、信頼区間がどこからどこまでなのかが分かります。

計算法

実際にはこんな計算はやっていられないので、正規分布で近似して解析的に扱えるようにしてから逆算しています。How Not To Sort By Average Rating
でも回答者数が少ないときは正規近似が良くないですし、最近のパソコンは性能が上がっているので、近似に頼ることなく信頼区間の定義通りに計算するプログラムをExcel VBAを使って書いてみましょう。

まずエクセルのA1セルから以下のように入力します。

試行回数10
発生回数8
信頼水準0.95
最低桁数2
推定値
信頼下限
信頼上限
そして以下のプログラムを貼りつけて、ConfidenceIntervalを実行すると、推定値、信頼限界がB5~B7セルに書かれます。
受講生以外で、VBAを使ったことがない人はこの講義の第一回を見てください。
試行回数が多く、発生回数の比率が50%付近の場合は、正規近似とほぼ同じ結果になります。でも10回しか試行しなかったとか、1万回中1回しか発生しなかった、という場合は正規近似が良くないので、近似を使わずに直接求めるこのプログラムを使ってください。

Sub ConfidenceInterval()
' (c) 2009 Kaoru Fueda
Dim n As Long, x As Long, level As Double, decimals As Integer, mean As Double, sup As Double, inf As Double
n = Cells(1, 2) ' 標本数
If n < 1 Then MsgBox ("少なくとも1回は試行してください")
x = Cells(2, 2) '成功数
If x < 0 Or x > n Then MsgBox ("発生回数は0回以上かつ試行回数以下でしょう")
level = Cells(3, 2) 'level 信頼水準
If level < 0 Or level > 1 Then MsgBox ("信頼水準は確率ですから0から1の間です")
decimals = Cells(4, 2)
If decimals < 1 Then decimals = 1

decimals = decimals - 1
Do
  decimals = decimals + 1
  mean = x / n
  sup = Application.Min(1, Round(mean + Application.NormInv(1 - (1 - level) / 2, 0, 1) * Sqr(mean * (1 - mean) / n), decimals + 1))
  inf = Application.Max(0, Round(mean - Application.NormInv(1 - (1 - level) / 2, 0, 1) * Sqr(mean * (1 - mean) / n), decimals + 1))

  Cells(5, 2) = Round(mean, decimals)

  If shinraikukan(n, inf, level, 1) >= x Then
    Do
      inf = Application.Max(0, inf - 1 / (10 ^ (decimals + 1)))
    Loop While inf > 0 And shinraikukan(n, inf, level, 1) >= x
    If shinraikukan(n, inf, level, 1) < x Then
      inf = inf + 1 / (10 ^ (decimals + 1))
    End If
  Else
    Do
      inf = inf + 1 / (10 ^ (decimals + 1))
    Loop Until shinraikukan(n, inf, level, 1) >= x
  End If
  Cells(6, 2) = Round(inf, decimals)

  If shinraikukan(n, sup, level, 0) <= x Then
    Do
      sup = Application.Min(1, sup + 1 / (10 ^ (decimals + 1)))
    Loop While sup < 1 And shinraikukan(n, sup, level, 0) <= x
    If shinraikukan(n, sup, level, 0) > x Then
      sup = sup - 1 / (10 ^ (decimals + 1))
    End If
  Else
    Do
      sup = sup - 1 / (10 ^ (decimals + 1))
    Loop Until shinraikukan(n, sup, level, 0) <= x
  End If
  Cells(7, 2) = Round(sup, decimals)
Loop Until ((x = n Or x = 0) And Cells(7, 2) > Cells(6, 2)) Or (Cells(5, 2) > Cells(6, 2) And Cells(7, 2) > Cells(5, 2))
End Sub

Function shinraikukan(n As Long, p As Double, level As Double, flag As Integer) As Long
' (c) 2009 Kaoru Fueda
'二項分布B(n,p)で確率level以上の最も短い区間の上端、下端を返す。
Dim upper As Long, lower As Long
'n 標本数
If n <= 0 Then n = 1
'p 母比率
If p < 0 Then p = 0
If p > 1 Then p = 1
'level 信頼水準
If level < 0 Then level = 0
If level > 1 Then level = 1
'一応変な値は訂正していますが、呼び出す側でチェックしてください。

upper = Round(n * p, 0)
lower = Round(n * p, 0)

'lower=0かつupper=nになったら、計算誤差によりlevelに達しなくても終了
Do While BinomialDistribution(upper, n, p, 1) - BinomialDistribution(lower - 1, n, p, 1) < level And (lower > 0 Or upper < n)
  If lower = 0 Then
    upper = upper + 1
  Else
    If upper = n Then
      lower = lower - 1
    Else
      If BinomialDistribution(lower - 1, n, p, 0) > BinomialDistribution(upper + 1, n, p, 0) Then
        lower = lower - 1
      Else
        If BinomialDistribution(lower - 1, n, p, 0) < BinomialDistribution(upper + 1, n, p, 0) Then
          upper = upper + 1
        Else
          lower = lower - 1
          upper = upper + 1
        End If
      End If
    End If
  End If
Loop
If flag = 0 Then
  shinraikukan = lower
Else
  shinraikukan = upper
End If
End Function

Function BinomialDistribution(x As Long, n As Long, p As Double, flag As Integer) As Double
' (c) 2009 Kaoru Fueda
'組み込み関数BinomDistは0≦x≦nを満たさなければエラーになるので、その点を定義通りに拡張
'BinomDistで計算出来無いほど数が多い場合は正規近似の近似精度は高いので正規近似を用いる
If flag = 0 Then
  If x < 0 Or x > n Then
    BinomialDistribution = 0
  Else
    temp = Application.BinomDist(x, n, p, 0)
    If IsNumeric(temp) Then
      BinomialDistribution = temp
    Else
      temp = Application.BinomDist(n - x, n, 1 - p, 0)
      If IsNumeric(temp) Then
        BinomialDistribution = temp
      Else
        BinomialDistribution = Application.NormDist(x, n * p, Sqr(n * p * (1 - p)), 0)
      End If
    End If
  End If
Else
  If x < 0 Then
    BinomialDistribution = 0
  Else
    If x >= n Then
      BinomialDistribution = 1
    Else
      temp = Application.BinomDist(x, n, p, 1)
      If IsNumeric(temp) Then
        BinomialDistribution = temp
      Else
        temp = Application.BinomDist(n - x - 1, n, 1 - p, 1)
        If IsNumeric(temp) Then
          BinomialDistribution = 1 - temp
        Else
          BinomialDistribution = Application.NormDist(x + 0.5, n * p, Sqr(n * p * (1 - p)), 1)
        End If
      End If
    End If
  End If
End If
End Function

計算例

10人中8人満足なら、満足している人の比率の95%信頼区間は45%~96%
100人中80人なら71%~87%
1000人中800人なら77%~82%になります。
80%に関して左右対称ではありませんね。比率50%付近はバラツキ(標準偏差)が大きく、0%,100%付近では小さいので、信頼区間は50%側が広く0%, 100%側が狭くなります。

練習

これまでswanを1万回観測したら1万回すべて白いswanだった。swanの中の「黒いswan」の比率を信頼水準99%で推定しなさい。
注意:点推定すれば比率は0と推定されます。

2009-12-13

夜景を背景に人物撮影

スローシンクロ

この季節、綺麗なイルミネーションなど夜景を背景に記念写真を撮る事が多いと思います。
こんな時、フラッシュを使わないと手前の人物が暗くなるし、だからと言って普通にフラッシュを使うと、背景がちゃんと写らなくて真っ暗なところに人がいる写真になります。
こんな時はフラッシュを使いつつシャッター速度をぶれない程度に遅くすると、背景からの光も写るようになります。
これをスローシンクロと言いますが、この時、シャッター速度、感度、フラッシュの明るさの調整が大切です。
自分で調整するのは難しいので、カメラに自動的に調整してもらう方法を探しました。

ニコンのデジタル一眼レフの場合

追記:D5000以降ではこのようなことをしなくても背景も写るそうです。
  1. ファンクションボタンか、AE/AF-Lボタンのどちらか、使っていない方の機能をFVロックに設定する。
    これは一度設定しておけば普段は変更しないでしょう。
  2. 感度自動制御をONにして、制御上限感度を高めにする。D90ならISO3200, D60ならISO1600。
  3. シャッター速度優先AEにして、シャッター速度をブレない限りで出来るだけ遅くする。
    手持ちなら、手ぶれ補正がなければ60分の1秒、手ぶれ補正があっても30分の1秒くらいでしょう。三脚でも、8分の1秒か遅くても4分の1秒にしないと被写体の人物がブレます。
  4. 構図を決めたら、シャッターを押す前に1.で設定したFV-Lボタンを押します。するとフラッシュがテスト発光して、感度やフラッシュの明るさを自動調整します。
  5. そのままシャッターを押すと綺麗に写せます。
絞り優先AEやプログラムAEを使うときは
フラッシュをスローシンクロではない通常モードにします。スローシンクロ撮影をしたいのにスローシンクロモードにしないのは変な感じですが、ここでスローシンクロモードにすると感度が最低になって本当に際限なくシャッター速度が遅くなります。
そしてスローシンクロ撮影するために、フラッシュ時シャッター速度制限を遅くします(上記、シャッター速度優先AEの時と同じくらいに)
但し、絞り優先AEやプログラムAEで後幕発光モードにすると自動的にスローシンクロモードになってしまうので、後幕発光にするならシャッター速度優先AEにするしかありません。

説明書によると、FVロックは構図を変えても発光量を変えないため、と書かれていますが、上で書いたように構図を変えない場合も、FVロックのために一度テスト発光を行った方が露出が適切になるようです。
参考にしたのは
スピードライトSB-800~カスタマイズ8 - with Nikon F6
イルミネーションを背景にモデル撮影 ~ニコンD90 レビューその5 :: SorryFull ::

フラッシュの話ではないですが30D後ピンの怪: 【にけの独り言】 -にけ@横浜-オートフォーカスの仕組みについて詳しいです。

関係ないけどオープンダイアリー・インサイド: 「L704iはどうですか」というコメントスパム
バイク王呼んだら 女性社員に泣き落としされたでござるよ の巻 - 『姉ログ』
バイク王について - Yahoo!知恵袋
私自身が裏をとったわけではないので、本当かもしれないし、ライバル業者が捏造した話かもしれません。

飛行機での機長のジョーク - にくろぐ。

2009-12-12

Sigma 30mm F1.4 EX DC HSM

Sigma 30mm F1.4 EX DC HSMは、ピント合わせがなかなか難しかったです。
開放F1.4なら被写界深度が浅いので難しいのも当然ですが

この写真はF6.3です。CaptureNX2でフォーカスポイントを表示させた画面をキャプチャーしました。

画面中央です。少し左下の実にピントが合っています。
フォーカスポイントは中央一点で、ワイドではなくノーマルです。

ピントを合わせた場所より少し後ろ側にピントが合うのは後ピンと言いますが、このレンズの場合、後ピンとは違い手前のものにピントが合うこともありました。
また、絞ることでピント位置が移動することもありますが、このレンズの場合、絞りを変えずカメラも動かさずAFを作動させなおすたびに、ピント位置が変わりました。

カメラのフォーカスポイントがずれているのかなと思いAF-S DX NIKKOR 16-85mm F3.5-5.6G ED VRで色々試してみると、ファインダーのフォーカスエリアの中の左半分の場所にピントを合わせているようです。でもフォーカスエリアの外側にピントが合うことはありませんでした。

他の人のニコン機を借りて試したのですが、やはり合焦音が鳴っても実際にはピントが合っていないことが度々あります。シャッターボタン半押しを繰り返して何度か合わせ直しているとやっと合う、という感じです。

追記:メーカーに症状を伝えようと思って、どのような時にピントがずれるか色々試していたら、ピントがずれなくなりました。

CaptureNX2でフォーカスポイントを表示させて、画面中央を等倍でキャプチャーしました。
角砂糖の文字にピントを合わせたつもりでしたが、僅かにその先の花にピントが合いました。
斜めになっていると、狙ったところにピントが合わないことがあります。これはこのカメラに限ったことではありませんが。


テーブルの木目にピントを合わせたら、角砂糖の花がピンボケになりました。
このように被写界深度は非常に薄いのですが、ちゃんと狙ったところにピントが合っています。


手前の列にピントを合わせました。


真ん中の列にピントを合わせました。


奥の列にピントを合わせたら、手前が大きくボケました。
被写界深度は奥のほうが深いですので、真ん中より少し手前にピントを合わせるのが良さそうです。
F1.4 1/50s ISO450です。手ぶれ補正がないのでシャッター速度を速くしています。
結構暗いのですがちゃんと狙ったところにピントが合っています。
真ん中の列にピントを合わせた写真は、本当はお刺身にピントを合わせたかったのですが手前の枠にピントがあってしまいました。今回のようにテストでなければ、一段絞った方が良いでしょうね。

いま買えるニコン用35mm単焦点レンズ - デジカメWatch
ニコンD700 50mm F1.4を撮り比べてみる

2010年9月追記:カメラも被写体も動かずAFを作動させなおすたびにピント位置が変わる症状が再発しました。F8まで絞っても被写界深度の外に出てしまいますので修理に出そうと思いますが、ボディが手元からなくなるのは困ります。Nikonの他のボディとSigmaの他のレンズでも似たような症状があるので、やはりNikonのAF性能を求めるならボディだけでなくレンズもNikonの方が良いのでしょうか。NikonにはAF-S DX NIKKOR 35mm f/1.8Gがありますので、こちらの方が無難だと思います。AFを信頼できずにMFで撮るならDistagon T*2/28もありますし。

2010年10月追記:修理から戻ってきました。カメラも被写体も動かずAFを作動させなおすたびにピント位置が変わる症状が毎回発生していたのが3回に1回しか発生しなくなりました。また10枚撮って5枚以上ピンボケ写真が撮れていたのが3枚程度のピンボケにまで改善しました。とは言えNikon純正レンズの安定性には全く及びません。やはりNikonならではのAFの正確さを得るにはレンズもNikonにすべき、当たり前と言えば当たり前ですね。17-50mm F2.8 EX DC OS HSMを買おうかなと思っていたのですがやめておきます。じっくり何度もピントを合わせなおしながら何枚も撮ればちゃんとピントが合った写真が撮れるのですが、急いで1枚だけしか撮れない場合には向きません。

2009-12-11

Excelを使った統計解析入門

第一章、第二章の内容のうち、パソコンを使った方が効率的なものについて説明します。
Excelを使ったことが無い人は、総合情報基盤センター利用の手引き第2分冊第三章も読みながらこのホームページを読んで下さい。

準備

下図のようにメニューを辿ってExcelを立ち上げましょう。

初めて使う時にはいくつか聞かれますので、共にOKを押してください。

左上の丸いボタンを押して、「Excelのオプション」をクリックします。そして左側の「アドイン」をクリックして、下の「管理:Excelアドイン」の横の「設定」をクリックします。

するとアドインの画面に切り替わるので、下のほうの「管理」が「Excelアドイン」になっていることを確かめてその右の「設定」をクリックします。

「分析ツール」にチェックをつけてOKをクリックします。 「インストールしますか」と聞かれたら「はい」と答えます。

教科書第一章の例

皆さんが持っている教科書のデータを、一つ一つ入力していると時間がかかりますので、あらかじめ書いておきました。
例1.1例1.2例1.6
120
106
112
168
120
140
160
160
116
118
104
172
130
124
134
142
112
112
110
120
134
136
138
144
120
120
160
108
140
98
142
130
138
126
108
120
136
118
118
122
128
124
110
134
116
138
116
158
106
166
118
158
124
124
110
166
132
126
122
132
4
5
5
6
6
8
8
8
8
8
9
9
10
10
11
11
11
11
12
12
13
13
15
16
16
16
17
18
20
20
生徒身長座高
115988
215084
315786
415381
515883
615285
715583
815783
914576
1015885
1116185
1215083
1314879
1415484
1515485
1615985
1714983
1815586
1915384
2016088

例1.1 度数分布表とヒストグラム

1変量データをエクセルに入力します。キーボードから入力するか、あるいは上の表をコピーして、エクセルに貼り付けます。
Internet Explorerを使うときには「コピー」してからExcelで「貼り付け(P)」を選びます。
FireFoxを使うときは「貼り付け(P)」ではなく「形式を選択して貼り付け(S)」を選んで「テキスト」を選んでください。


次に、階級の境界の数字をC2セル以降に入力します。

右上の「データ分析」をクリックして「ヒストグラム」をクリックしてOKを押します。

以下のように入力してOKを押します。

教科書で度数と書かれている部分が、エクセルでは頻度と表示されます。その右には累積相対度数が表示されます。
教科書と同じ結果になりましたか?もし違うなら、その理由を考えてみてください。

例1.2、例1.4 1変量の特性値を求める

エクセル左下のSheet2をクリックして、新しいシートに切り替えます。

そして例1.2のデータをコピーしてA1セルから貼り付けます。A30セルまでデータが30個並んでいるはずです。

平均値などの求め方は、実演した方がわかりやすいので講義中にやってみせます。よく見ておいてください。
講義の説明より早く進んだ人のために一応書いておきます。
まず平均を求めましょう。B1セルに「平均値」と書いてください。
Excelで平均を求める関数はAVERAGEです。C1セルに=AVERAGE(A1:A30)と書いてください。
次に中央値を求めます。B2セルに「中央値」、C2セルに=MEDIAN(A1:A30)を入力します。
次に分散と標準偏差を求めます。まずB3セルに「分散」、B4セルに「標準偏差」と書きます。
第一章では分散を推定するのではなく、単にデータの分散を計算するだけです。このように推定する必要がない場合は分散はVARP、標準偏差はSTDEVPという関数を使いますので、C3セルに=VARP(A1:A30)、C4セルに=STDEVP(A1:A30)と書きます。
ちなみに、推定する場合はVARとSTDEVを使います。

例1.6 2変量の相関を調べる。

エクセル左下のSheet3をクリックして、新しいシートに切り替えて、例1.6のデータをコピーして貼り付けます。
散布図を描きましょう。
B2セルの上でマウスの左ボタンを押して、押したままC21セルまでマウスを移動させて左ボタンを離します。
そして画面上の「挿入」から「散布図」の「散布図(マーカーのみ)」を選びます。

すると図のような散布図が得られます。マウスを合わせるとそれが何番目のデータで、x,yの値が何であるか表示されます。

次に回帰直線をExcelに書いてもらいましょう。データ点のどれかにマウスを合わせて右ボタンを押して、表示されるメニューから「近似曲線の追加」を選びます。

「近似または回帰の種類」は「線形近似」を選び、また式も見たいので、「グラフに数式を表示する」にチェックをつけて、閉じるをクリックすると、回帰直線とその式が表示されます。
「近似または回帰の種類」を変更するといろいろな曲線が表示されます。

第二章:確率関数、分布関数の値の求め方

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

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

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

練習: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…に精度が上がります。

2009-12-10

While文とUntil文

今日の内容

  • 前回の課題プログラム提出
  • 条件が成立するまで繰り返す

課題提出

前回の最後に作った、20人の身長の合計と平均を求めるプログラムを提出してください。
件名:学籍番号と「For文」、本文:プログラムと名前

InputBox

先週、1から10までの和、1から100までの数を足すプログラムを作りました。
今度は、プログラムを実行するときに、幾つまでの和を求めるか尋ねるプログラムを書いてみましょう。
プログラムを実行するときに尋ねるためにはInputBoxを使います。

n = InputBox("幾つまでの和を計算しますか")

と書くと、プログラムを実行するときに入力が求められて、入力した数字がnに代入されます。
そして、先週のプログラムを1からnまでの数を足すように変更して

wa = 0
For j = 1 To n
wa = wa + j
Next j
Cells(1, 1) = "合計"
Cells(1, 2) = wa

とします。

While文とUntil文

但し、InputBoxに負の数字を入れたり、文字を入れるとプログラムが動きません。
だから、ちゃんと正の数字を入れるまで繰り返すようにします。

Do
n = InputBox("幾つまでの和を計算しますか")
Loop Until IsNumeric(n) And n > 0

DoとLoopの間を、Untilの後の条件が成り立つまで繰り返します。IsNumericは数字なのかを判別します。

データの個数を数える

前回までに勉強したFor文は、あらかじめ何回繰り返すか決まっています。
例えば For i = 1 To 10 と書けば10回繰り返します。
言い換えると、プログラムを各時点で、データが幾つ有るか分かっていなければなりません。

でも実際には、先にプログラムを書いておいて、後から様々な個数のデータを貼り付けて計算することも多いです。
そんな時には、データが有る限り繰り返すプログラムが必要です。
つまり、
Cells(1,1)にデータが存在するか調べる。
なかったら終わり。
あったら一つ下のCells(2,1)にデータが存在するか調べる。
なかったら終わり。
あったら一つ下のCells(3,1)にデータが存在するか調べる。

ということを、データが終わるまで繰り返します。
これをプログラムに書くと

j = 1
Do Until Cells(j, 1) = ""
  j = j + 1
Loop
Cells(1, 2) = "データの個数"
Cells(1, 3) = j

となります。
Untilの後に条件を書くと、条件が成立するまで繰り返します。""は二つの"の間に何もない、つまりデータが存在しないことを意味します。

練習

Excelのシートに幾つか数字を書いて、このプログラムを実行して、ちゃんと個数を数えられているか確かめてください。もし間違っていたら、理由を考えてください。

その他の繰返し文

Do While 条件
 文
Loop

このように書くと、条件が成り立つ間繰り返します。先程のプログラムは

j = 1
Do While Cells(j, 1) <> ""
  j = j + 1
Loop
Cells(1, 2) = "データの個数"
Cells(1, 3) = j

となります。<>は「大きい、または小さい」つまり「等しくない」という意味です。

一度プログラムを実行しないと条件を判定出来ない場合もあります。

あるプログラム
Do While 条件
 同じプログラム
Loop

これだと同じプログラムを2回書かなければなりません。このような場合は条件を繰り返しの後に書いて

Do
 あるプログラム
Loop While 条件

と書くことも出来ます。Untilも同様に

Do
 あるプログラム
Loop Until 条件

と書くことが出来ます。

配列の使い方

配列を使うために前回は
Dim x(60)
と書きました。このDim文はプログラムの先頭に書かなければならず、60の部分を変数にすることは出来ません。つまり

n = 60
Dim x(n)

のような書き方は出来ません。
このように途中で配列の個数を変える場合は、最初に

Dim x()

のように個数を指定せずに書いて、次に何個必要か数えてから

ReDim x(数えた個数)

と書くと、その後は配列を使えるようになります。
従って、流れとしては

Sub 合計()
Dim x()
個数を数えてnに代入するプログラム
ReDim x(n)
先週の合計を計算して表示するプログラムで、個数がnのもの
End Sub

のようになります。

課題

個数を数えて合計を計算して表示するプログラムを書いてください。

できた人は、平均、分散を計算するプログラムにも挑戦してください。

2009-12-09

ピオーネユニオンのATM

研究室に近いので見に行きました。e-netのATMでした。
中国銀行郵便局は入出金とも手数料がかかるので、ちょっと遠いですが一般教育棟の近くのATMへ行った方が良さそうです。
住信SBIネット銀行は月5回まで無料
三菱東京UFJ銀行住友信託銀行は平日昼間は無料
三井住友銀行条件を満たせば時間外も含めて無料
みずほ銀行条件を満たせば時間外も含めて無料、残高50万円以上だと振り込みも無料なので学会費の支払いに便利そうです。

コンビニATMとしてはセブン銀行のATMの方が無料の金融機関が多いのですが、セブンイレブンでなければ置けないのでしょうね。

2009-12-07

自己共分散とARモデル

前回までに季節成分とトレンドを推定し、除去しました。
残った変動成分の自己共分散関数を求め、AR2モデルを当てはめました。

2009-12-04

Google日本語入力をWindowsXPで使う

予測変換が面白いです。流行語には強いですが、googleの特性として、多くの人が間違って使っている用法がそのまま用いられています。
この点、市販のかな漢字変換ソフトならばきちんと人手(人件費)をかけて正しい用法を調べていますので、単にGoogle日本語入力が無料だという理由で市販のかな漢字変換ソフトが売れなくなることはないと思います。
寧ろGoogle日本語入力は、間接的に他社のかな漢字変換の辞書の内容の一部を「ぶっこ抜いて」いるのか?:坂本英樹の繋いで稼ぐBtoBマーケティング:ITmedia オルタナティブ・ブログ
> また、Windows上では付属のものをつかうという流れが強くなっているなか、わざわざインストールして使うIMEを注目させたということで、専業メーカーにはかえってチャンスかもしれません。
と書かれているように、これまでWindows標準のMSIMEを使っていた人が「かな漢字変換ソフトを変更するとこんなに使いやすくなるのか!」と思って「それなら仕事にも使える正しい日本語に変換してくれる市販のかな漢字変換ソフトを買おう」と思うようになるかもしれません。

笑った予測変換の例
あなたと→あなたとは違うんです
ただしい→ただしイケメンに限る
ものう→物売るっていうレベルじゃねぇぞ
ひえいは→飛影はそんなこと言わない
この他、これまで「宇多田ヒカル」の漢字がわからない時「うただひかる」をgoogleで検索していたのですが変換できるようになりましたし、胡錦涛、温家宝など最近(WindowsXP発売後という意味)の人名や、廬山昇龍覇、邪王炎殺黒龍波、魔貫光殺砲など普段使わない単語が簡単に変換出来ます。

WindowsXPの場合は、地域と言語のオプションの言語の詳細設定で
詳細なテキストサービスのサポートをプログラムのすべてに拡張する(E)
にチェックを付けなければ使えません。

個人的に気になるのはgoogle update.exeも同時にインストールされて、便利なことは便利なのですが、勝手に色々されるのも嫌ですので、単独でインストールする方法を調べました。
http://dl.google.com/japanese-ime/0.8.186.0/googlejapaneseinput.msi
からインストーラーを直接ダウンロードできます。これを実行すればgoogle updateはインストールされないようです。
但し0.8.186.0は今後のバージョンアップによって変化しますから、調べる必要はあります。

google chromeも同様にインストール出来ます。入手先は
http://dl.google.com/chrome/install/195.33/chrome_installer.exe
で、195.33の部分は
http://googlechromereleases.blogspot.com/
を見てstableの最新版のバージョン番号の末尾です。
Google Earthなら
http://dl.google.com/edgedl/earth/client/GE5/release_5_1_0/GoogleEarth-Win-5.1.3533.1731.exe
追記:2010/01/13の最新版は
http://dl.google.com/earth/client/GE5/release_5_1_0/GoogleEarth-Win-5.1.7894.7252.exe
と思ったのですが、5.1.3533.1731と同じものでした。

中国語版は谷歌拼音输入法があります。

Google 日本語入力をWin2000で使ってみました(ただし非実用的) - Windows 2000 Blog

DNSサーバーも公開されました。
Google,高速DNSサーバー「Google Public DNS」を公開 - ニュース:ITpro

2009-12-03

VBAで足し算

今日の内容

  • 九九のプログラム提出
  • 足し算のプログラム
講義で扱うと遅いので講義ではやりませんが、Google Street View岡山にも対応しました。

大きな地図で見る

課題提出

前回作ったExcel VBAのプログラムを提出してください。
メールの件名は学籍番号と「VBA九九」と書いて、九九のプログラムをSubからEnd Subまでコピーしてメール本文に貼り付けて、本文最後に名前を書いてください。

足し算

前回のファイルに続けて書きましょう。 別のプログラムを書くには、前回のプログラムのEnd Subの下の行に
Sub 別のプログラムの名前
と書いてEnterを押すと、区切りの線が自動的に引かれます。

1から10までの数の合計は、Excelのセルに =1+2+3+4+5+6+7+8+9+10 と入力すれば計算できます。 では1から100までの数の合計はどうやって計算しましょうか。等差数列の和の公式を使って =100*(100+1)/2 でも計算できますが、今後色々な数を足す機会もありますから、公式を使わずに足し算してみましょう。
1+2+3+…+99+100と入力していては大変ですので、For文を使った繰り返しで計算しましょう。まず
 wa = 0
としておいて
 wa = wa + 1 (この時点でwaは1)
 wa = wa + 2 (この時点でwaは1+2)
 wa = wa + 3 (この時点でwaは1+2+3)
 wa = wa + 4
 wa = wa + 5

 wa = wa + 98
 wa = wa + 99
 wa = wa + 100
とするとwa=1+2+3+…+99+100になりますので、最後に
 Cells(1,1) = wa
と書いて計算結果を表示しましょう。

練習

上記のプログラムを、実際に100行も書くことは出来ませんから、For文を使って書いて、1から100までの数の合計を求めてください。
5050になれば正解です。

データの読み込み

例えば、Excelの講義の最初の頃に使った
県名人口総数男比率女比率
鳥取294321
島根368402
岡山9391014
広島13981484
山口734817
この表で、男性人口を足し算するプログラムを書きましょう。
 x1 = cells(2,2)
 x2 = cells(3,2)
 x3 = cells(4,2)
 x4 = cells(5,2)
 x5 = cells(6,2)
 wa = x1 + x2 + x3 + x4 + x5
 cells(7,1) = "合計"
 cells(7,2) = wa
と書くと、7つの数字を足すことが出来ます。ではもっと沢山のデータを足すにはどうすればよいでしょうか。
そのために、配列というものを使います。

配列

これまでの変数はxとかx1のように書きましたが、数学で使うx1, x2のように添え字付の変数を使うことも出来ます。添え字付の変数はx(1), x(2)のように書きます。
使う場合は、プログラムの先頭で

Dim x(60)

のように、何個まで使うか明示しておく必要があります。
もしx(1)は使わなくてx(2)からx(10)まで使うのなら

Dim x(2 To 10)

と書きます。

11月19日の講義で使った1変量のデータをA1セルから貼り付けてください。
復習:Firefoxから貼り付けるときは「形式を選択して貼り付け」を選んで「テキスト」を選択します。

Cells(1,1)からCells(60,1)までに貼り付けられた数字をx(1)からx(60)へ読み込むには

For i = 1 To 100
 x(i) = Cells(i, 1)
Next i

と書きます。
次に、これらを足すには、1+2+…+60の計算同様

wa = 0
For i = 1 To 60
 wa = wa + x(i)
Next i

と書きます。

これらを繋げて、

Sub 合計()
Dim x(60)

For i = 1 To 60
 x(i) = Cells(i, 1)
Next i

wa = 0
For i = 1 To 60
 wa = wa + x(i)
Next i

Cells(1,2) = "合計"
Cells(1,3) = wa

End Sub

というプログラムで60個のデータを足すことが出来ます。

練習

11月19日の講義で使った2変量のデータで、20人の身長の合計と平均を求めるプログラムを書いてください。

2009-12-02

VBAで別のプログラムに配列を渡す

VBAの一つのプログラムから何かの計算のために別のプログラムを呼び出す場合、計算する値が一つだけなら単にFunctionを呼び出せば良いです。しかし計算結果が複数の値の場合、Functionでは一つしか返せませんので、配列に値を入れて返して貰う必要があります。
Sub 呼ぶ側()
Dim a(2)
Call 配列(a)
Cells(1, 1) = a(1)
Cells(2, 1) = a(2)
End Sub

Sub 呼ばれる側(b)
b(1) = 1
b(2) = 10
End Sub
呼ぶ側でまず配列を用意してその名前を渡します。C流に言えばアドレスを渡しています。 呼ばれた側で計算した結果をその配列に代入すると、呼んだ側が用意した配列に値が入っています。