Michelson(マイケルソン)とMorley(モーリー,モーレー)の実験は,光速が地球の動きによらず一定であることを示し,Einstein(アインシュタイン)の特殊相対性理論の礎となったことで有名です。
地球は太陽から約1.5億km(1.5×108 km,1.5e8 km)のところを1年間で一周しますので,それだけでも30km/秒で動いているはずです:
> 2*pi*1.5e8/365/24/60/60 [1] 29.88577
もし光の速度が「宇宙」(昔の言葉で「エーテル」)に対して一定であれば,光速を測る向きによって少なくとも60km/秒の違いが出るはずです。実際には太陽も銀河系の中心のまわりをもっと速く回っているはずですし,銀河系も動いているはずですから,光速は向きによってもっともっと違うはずです。
しかし,Michelsonたちの実験によれば,光速は向きによらず一定でした。歴史的なMichelsonとMorleyの1887年の論文はAIPの Albert Abraham Michelson 1852-1931 で公開されています。
RやS-PLUSのサンプルデータとして含まれているものは,1879年のデータです:
> library(MASS) # MASSライブラリをロードする > head(michelson) # 最初の数行を表示してみる Speed Run Expt 1 850 1 1 2 740 2 1 3 900 3 1 4 1070 4 1 5 930 5 1 6 850 6 1
MASSは,Modern Applied Statistics with S-PLUS(邦訳『S-PLUSによる統計解析』シュプリンガー・フェアラーク東京,2001年)という有名な本のコードやデータを収めたパッケージです。michelsonデータのExptは実験番号で1〜5まであり,そのそれぞれについてRunが1〜20まであり,全部で100の計測値が収められています。Speedは光速(km/s)から299000を引いた値と説明されています(Michelsonの原論文を調べたわけではないのですが)。現在では光速は 299792458m/s です(ぴったりそうなるように1メートルの長さが定められています)。
Speed,Run,Exptのモードは数値で,型は整数ですが,RunとExptのクラスは名義尺度の因子(factor)にしてあります。
> sapply(michelson,mode)
Speed Run Expt
"numeric" "numeric" "numeric"
> sapply(michelson,typeof)
Speed Run Expt
"integer" "integer" "integer"
> sapply(michelson,class)
Speed Run Expt
"integer" "factor" "factor"
実は,MASSパッケージを読み込まなくても,標準のdatasetsパッケージに「morley」という名前で同じデータが入っています。しかし,こちらのほうは,すべて整数扱いになっています:
> sapply(morley,class)
Expt Run Speed
"integer" "integer" "integer"
以下ではMASSパッケージのデータを使います。
データ michelson の各項目は,このままでは
michelson$Speed,
michelson$Run,
michelson$Expt
と書かないとアクセスできません。これを
> attach(michelson)
とすれば
Speed,
Run,
Expt
の名前でアクセスできるようになります。この時点で,これらは次のように打ち込んだのと同じことになります:
Speed = c(85, 74, 90, 107, 93, 85, 95, 98, 98, 88, 100, 98, 93, 65,
76, 81, 100, 100, 96, 96, 96, 94, 96, 94, 88, 80, 85, 88, 90, 84,
83, 79, 81, 88, 88, 83, 80, 79, 76, 80, 88, 88, 88, 86, 72, 72,
62, 86, 97, 95, 88, 91, 85, 87, 84, 84, 85, 84, 84, 84, 89, 81,
81, 82, 80, 77, 76, 74, 75, 76, 91, 92, 89, 86, 88, 72, 84, 85,
85, 78, 89, 84, 78, 81, 76, 81, 79, 81, 82, 85, 87, 87, 81, 74,
81, 94, 95, 80, 81, 87) * 10
Run = factor(rep(1:20,5))
Expt = factor(c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)))
グラフを描いてみましょう:
plot(Speed ~ Expt)
これだけでもいいのですが,少し色を添えましょう:
par(mgp=c(1.8,0.6,0)) # 数字を軸に少し近づける plot(Speed ~ Expt, col="wheat") # 適当な色を付ける
ここで使っている図はボックスプロット(boxplot,box-and-whisker plot,箱ひげ図)と呼ばれるものです。ボックスプロットにはいろいろな流儀がありますが,ここでは,真ん中の横線が中央値(メディアン),箱の両側が第1・第3四分位点(25%・75%点),ひげの先端が最小値・最大値を示しますが,どちらのひげも長さは箱の長さの1.5倍を限度とし,それより極端な値はoutlier(外れ値)として個々の点をプロットします。その場合,ひげの先端は外れ値を除いた最小値・最大値になります。
ほかにもいろいろなグラフが描けます。右のものは次のコマンドで描いたものです:
stripchart(Speed ~ Expt, vert=TRUE, method="stack", pch=1, at=1:5+0.1) m = tapply(Speed, Expt, mean) # 平均 s = tapply(Speed, Expt, sd) / sqrt(20) # 標準誤差 points(1:5, tapply(Speed, Expt, mean), pch=16) # 平均は黒丸で segments(1:5, m-s, 1:5, m+s) # ±標準誤差は線分で
segments()
の代わりに arrows()
を次のように使えば両端にセリフの付いたエラーバーになります:
arrows(1:5, m-s, 1:5, m+s, length=0.05, angle=90, code=3)
分散分析をした結果です:
> summary(aov(Speed ~ Expt))
Df Sum Sq Mean Sq F value Pr(>F)
Expt 4 94514 23629 4.2878 0.003114 **
Residuals 95 523510 5511
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
実験ごとに平均値が有意に変わっていることがわかります。仮に第1実験を外せば変動は有意でなくなります:
summary(aov(Speed[Expt != 1] ~ Expt[Expt != 1]))
物理実験ではこういうのは常日頃のことです。原因は温度変化などいろいろです。
Last modified: 2009-05-10 21:23:12