Michelson-Morley の実験

はじめに

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のサンプルデータとして含まれているものは,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(rep(1:5, c(20,20,20,20,20)))

attach(michelson) を元に戻すには detach(michelson) と打ち込みます。

michelsonグラフを描いてみましょう:

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(外れ値)として個々の点をプロットします。その場合,ひげの先端は外れ値を除いた最小値・最大値になります。

わざわざ attach(michelson) しないでも

plot(Speed ~ Expt, data=michelson)

という便利な書き方もあります。

このように plot() はこの場合はボックスプロットを描きます。boxplot() という関数もありますが,微妙に異なります。

michelsonほかにもいろいろなグラフが描けます。右のものは次のコマンドで描いたものです:

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)

stripchart の変形(改良版?)beeswarm(ビースウォーム)も便利です。この名前はbee(蜂)のswarm(群れ)から来ています。beeswarm パッケージには boxplot のシンプル版 bxplot() も入っています。beeswarm()boxplot() または bxplot() を組み合わせるとわかりやすくなります。

分散分析

分散分析をした結果です:

> oneway.test(Speed ~ Expt, data=michelson)

	One-way analysis of means (not assuming equal variances)

data:  Speed and Expt
F = 3.0061, num df = 4.000, denom df = 47.044, p-value = 0.02738

> oneway.test(Speed ~ Expt, data=michelson, var.equal=TRUE)

	One-way analysis of means

data:  Speed and Expt
F = 4.2878, num df = 4, denom df = 95, p-value = 0.003114

仮に第1実験を外せば変動は有意でなくなります:

oneway.test(Speed ~ Expt, data=michelson, subset=(Expt!=1))
# または oneway.test(Speed[Expt!=1] ~ Expt[Expt!=1], data=michelson)

物理実験ではこういうのは常日頃のことです。原因は温度変化などいろいろです。


Last modified: