です。
平均値を意味する英語は mean と average の二通りがあります。平均値を求めるのにExcelでは average()
という関数を使いますが,Rでは短いほうの mean()
が関数名になっています。
> x = c(0, 7, 8, 9, 100) > mean(x) [1] 24.8
上で定義したものを相加平均または算術平均(arithmetic mean)ともいいます。これに対して,積の
を相乗平均または幾何平均(geometric mean)といいます。これは
と書けるので,
運動競技などの採点で,極端な点数を付ける審査員の影響を少なくするために,点数を大きさの順に並べて,両側から同数ずつ削除してから平均を求めることがあります。このような平均を,トリム平均(トリムド平均),調整平均,刈り込み平均(trimmed mean)などと呼びます。Rでは mean()
に trim=...
というオプションを与えて計算します。次の例では20%ずつ両側から(合わせて約40%)外します(正確には,個数×0.2 を切り捨てて整数にした個数ずつ両側から外します)。
> mean(x, trim=0.2) [1] 8
このトリム平均を推し進めて,両側からどんどん外していき,残りが1個または2個になったときのトリム平均を,中央値またはメジアン(メディアン,median)といいます(学習指導要領では中学校1年の数学に「中央値」という用語が現れます)。つまり,median()
という関数で求めます。
> median(x) [1] 8
これら三つの代表値の使い分けとしては,データの分布が後で説明する正規分布に近いなら平均値,後で説明するコーシー分布のように極端な値が非常に多いならメジアンのほうが安定した結果が得られます。トリム平均は,分布にかかわらず,最善ではないけれども妥当な代表値となるものとして,近年よく使われています。
ウィンザライズド平均(Winsorized mean)は,両側から同数を外すところまではトリム平均と同じですが,残ったものの最大値・最小値を両側に延ばしていって,元と同じ長さにします。例えば 0,7,8,9,100 の20%ウィンザライズド平均は 7,7,8,9,9 の平均になります。Winsorは人名です。
ミッドレンジ(midrange,範囲の中央)は,最大値と最小値の平均です。分布が一様分布なら,ミッドレンジが最も安定した代表値となります。
分布の形が左右非対称の場合,例えば所得(収入)の分布のような場合に,平均値を使うかメジアンを使うかで結果が大きく異なります。どちらが正しいということはなく,全員の収入をプールして均等に再分配したらどうなるかという意味では平均値ですし,「平均的な」人の収入という意味ではメジアンのほうが妥当です。
ネットで商品や作品の評価を投票できるサイトがたくさんあります。星一つ(★☆☆☆☆)から星五つ(★★★★★)までの5段階で評価するとき,星の数のどういう代表値を表示するのが妥当でしょうか。一般にどの代表値を使っているのでしょうか。調べてみましょう。
選挙で,似た政策を掲げる候補者が複数いると,共倒れすることがよくあります。例えば,2000年のアメリカ大統領選挙では,緑の党のラルフ・ネーダーが立候補したためにゴアの票が食われたのが,ブッシュ当選の一因と考えられます。このような現象をスポイラー効果(spoiler effect)といいます。スポイラー効果を防ぐために,一人にしか投票できない今の方式をやめて,複数の候補者に点数(または順位)を付けて投票できるようにしようという運動があります(例:Range Voting)。しかし,点数(または順位)の付け方や代表値の求め方が少しずつ違うたくさんの方式が提案され,まさに共倒れ現象で,従来の多数決投票方式を変えるに至っていません。詳しくは,ウィリアム・パウンドストーン『選挙のパラドクス―なぜあの人が選ばれるのか?』(青土社,2008年)をお読みください。
中央値は全体の50%の点です。同様に,0%の点(最小値),25%の点(第一四分位数),75%の点(第三四分位数),100%の点(最大値)もよく使われます。これらは quantile()
という関数で求められます。例:
> quantile(1:10) 0% 25% 50% 75% 100% 1.00 3.25 5.50 7.75 10.00
ある変数
上の定義はいいかげんです。以下ではさらに,毎回の値が独立(independent)であり,確率分布が同じ(identically distributed)であるという条件(i.i.d. または iid)を暗黙のうちに仮定しています。
確率変数
一つの標本の中に
確率変数
統計学のことばでは,
期待値については次の式が成り立ちます(
ここで
も成り立ちます。
「独立」の定義を先に言わないといけませんでした。事象
確率変数
この平方根
を標準偏差(standard deviation)といいます。
確率変数
ですが,母集団の平均値
です。そこで,
と置くと,
期待値が母分散に一致するということは,偏りがないということなので,
上の証明:
となります。この最後の式は
ですが,この右辺の2乗を展開すると
なぜ
という一つの制約条件を満たすので,次元の一つ少ない
別の言い方をすれば,同じデータから平均と分散を両方求めるなら,平均を求めた時点で自由度を一つ使ってしまっているので,分散は
数学的な話が続いてしまいましたが,要するに,
で求め,同じデータから求めた平均
で求めるのが正しいのです。しかし,高校の数学の教科書では
標本から求めた母分散の推定量を一般に標本分散(sample variance)といいます。しかし,本によって,定義がまちまちです。
母分散の推定量の記号も
Excelには varp()
という関数があります(Excel 2010以降は var.p()
も同義)。var()
という関数で求めます(Excel 2010以降は var.s()
も同義)。Excelの varp()
に相当するものはRにはありません(だってそんなものを統計学者は使わないので)が,次のように打ち込めば作ることができます:
> varp = function(x) { var(x) * (length(x)-1) / length(x) }
これらを試してみましょう:
> x = 1:3 # x = c(1,2,3) でも同じ > var(x) [1] 1 > varp(x) [1] 0.6666667
母集団からランダムに取り出した標本でなくても,例えば10個の固定した値を4個と6個に分ける場合,両者を比較するには何で割った分散を使うかという問題についても,一貫して
> x = 1:10 > var(x) # n-1で割る分散 [1] 9.166667 > mean(combn(x, 4, var)) # xから4個選んだ組合せのvar()の平均 [1] 9.166667 > mean(combn(x, 6, var)) # xから6個選んだ組合せのvar()の平均 [1] 9.166667 > varp(x) # nで割る分散 [1] 8.25 > mean(combn(x, 4, varp)) # xから4個選んだ組合せのvarp()の平均 [1] 6.875 > mean(combn(x, 6, varp)) # xから6個選んだ組合せのvarp()の平均 [1] 7.638889
ここで combn(x, n, func)
は,ベクトル x
から n
個選んだすべての組合せについて関数 func(x)
を適用した結果からなるベクトルを求める関数です。
正規分布の場合,真の分散
標準偏差
Rで標準偏差 sd()
を使います。
> x = 1:10 > sd(x) [1] 3.027650
varp()
の計算式は,数学上は
と変形することができますが,こうすると非常に大きい数どうしの引き算となり,桁落ちと呼ばれる数値計算上の誤差が生じやすくなります。古いExcelはこの式を使って分散や標準偏差を計算していましたが,Excel 2003で修正されました。このことは単なる一つの例ですが,概してExcelは業界標準の計算法を使っていなかったり,そもそもどういう計算法を使っているかの情報公開が不十分であったため,数値計算や統計の専門家からは「Excelを使うな!」と言われてきました。varp()
はこの声を反映して修正されたものと思われます。他にもたくさんExcelのおかしなところが指摘されているのですが,Excel 2007になってもこうした外部からの指摘をMicrosoftはほとんど製品の改良に反映していないように見えます。
Excelについての上の記述は,かなり古いものです。今は当時と比べて大きく改良されているはずです・・・と言いたいところですが,2022年時点でも,数値計算に関してはこのページの冒頭に書いたようなびっくりする仕様が残っています。ほかに,科学技術用途については,BOMなしUTF-8のCSVファイルをExcelで単純に開くと文字化けすることや,"Oct4"
のような遺伝子名をCSVファイルから読み込むと化けることなど,たくさんの落とし穴がまだ残っています。
確率変数
の期待値は
となり,
一般に,
一番簡単な乱数は,ある範囲の数がまんべんなく出る一様乱数(uniform random numbers)です。Rの関数 runif(n)
は,RNGkind()
で変更できます)。
> runif(1) [1] 0.388267 > runif(10) [1] 0.2146394 0.2765450 0.5433135 0.4784538 0.8147103 0.1141375 [7] 0.6488306 0.7947468 0.1698610 0.2440027
もっとたくさんの数,例えば百万個でやってみましょう。
> x = runif(1000000) % 百万個の乱数 > hist(x, freq=FALSE) % ヒストグラム(度数分布図)を描く
ヒストグラム(度数分布図)を描く hist()
を使いました。オプション freq = FALSE
は縦軸の目盛りを,デフォルトの個数(frequency)でなく,密度(density)にすることを意味します。密度とは,棒グラフの棒の面積の和が 1 になるように付けた目盛りです。下で説明する確率密度関数の縦軸と同じものになります。
このヒストグラムを関数で表したものを確率密度関数(probability density function,略してp.d.f.)または単に密度関数といいます。数学的にいえば,任意の runif()
の確率密度関数は
と表すことができます。
この runif()
を二つ加えたらどうなるでしょうか。2倍するのではなく,独立な乱数を二つ加えるのです。
> x = runif(1000000) + runif(1000000) > hist(x, freq=FALSE)
三個ならどうなるでしょうか。
> x = runif(1000000) + runif(1000000) + runif(1000000) > hist(x, freq=FALSE)
だんだん釣り鐘の形になってきました。
runif()
は平均値が0.5ですので,0.5を引いて範囲を
ですので,12個加えるとちょうど分散が1になります。
次の図が,runif() - 0.5
を12個加えた分布のヒストグラムです。
滑らかな曲線は
を描いたものです。ここで
integrate()
を使えば簡単にできます。積分範囲の指定には,無限大を表す Inf
を使いました。
> integrate(function(x){exp(-x^2/2)}, -Inf, +Inf) 2.506628 with absolute error < 0.00023 > sqrt(2*pi) [1] 2.506628
よって,
乱数を足し合わせる上の実験は,一様分布の乱数 runif()
から出発しましたが,どんな分布から出発しても,まったく同じことが成り立ちます。
ただし分散が有限でなければなりません。後述のコーシー分布のような分散が無限大の分布では成り立ちません。
数学的に言えば,平均
の分布は,平均値が元と同じ
の分布は平均 0,分散 1 になります。ここまでは
なお,正規分布を研究した数学者ガウス(Carl Friedrich Gauss,1777-1855)に敬意を表して,正規分布のことをガウス分布(Gaussian distribution)ともいいます。
変数がある範囲に入る確率を求めるには,密度関数を積分しなければなりません。そこで,あらかじめ密度関数
を求めておくと便利です。この
分布関数
Rには標準正規分布
dnorm(x)
pnorm(q)
qnorm(p)
rnorm(n)
があります。下の図の色を付けた部分の面積が dnorm(x)
です。
上の図の描き方:
x = (-35:15)/10 y = dnorm(x) plot(NULL, xlim=c(-3.5,3.5), ylim=c(0,0.4), xlab="", ylab="") polygon(c(x,x[length(x)],x[1]), c(y,0,0), col="gray") curve(dnorm, lwd=2, add=TRUE)
これらは,dnorm(x, mean=μ, sd=s)
のように平均と標準偏差を与えることもできます。省略すれば dnorm(x, mean=0, sd=1)
の意味になります。
正規分布の乱数を正規乱数といいます。
物理現象の測定では,測定誤差がほぼ正規分布することがよくあります。これに対して,他の多くの分野では,観測値そのものが正規分布することはまずありませんが,中心極限定理のおかげで,観測値の平均値はほぼ正規分布します。
正規分布
> pnorm(1) - pnorm(-1) [1] 0.6826895
正規分布が左右対称であることを使えば,次のようにするほうが簡単です。
> 1 - 2 * pnorm(-1) [1] 0.6826895
つまり,ほぼ68%の確率で正規分布は
同様にして,
逆に,qnorm()
を使います。例えば 95% の場合は
> qnorm(0.025) [1] -1.959964
ですので,ほぼ
現実のテストの分布は正規分布といえるでしょうか。2015年全国学力テスト中学理科の正答数の度数分布をrika_hist.csv(SJIS)・rika_hist-utf8.csv(UTF-8)として置いておきましたので,ヒストグラムを描き,平均と分散の同じ正規分布の密度関数を重ね書きしてみてください。
Scrapboxのほうに書いた正規分布の何がいいの?もご参照ください。
どれだけ正規分布から離れていても,分散が有限であれば,中心極限定理が成り立つので,その平均値は正規分布に近づきます。
しかし,世の中には中心極限定理の前提が満たされない本当に困る分布もあります。その有名な例が,密度関数が
分野によってはブライト・ウィグナー(Breit-Wigner)分布またはローレンツ(Lorentz)分布とも呼びます。自由度1の
この分散を計算しようとしても,
Rには密度関数が
dcauchy(x)
pcauchy(q)
qcauchy(p)
rcauchy(n)
があります。
実験をしてみましょう。100万個のコーシー分布の乱数を作ります。
x = rcauchy(1000000)
この度数分布を表示するために hist(x)
としても,まともに表示されません。x = sort(x)
で並べ替えて,最初の数個を head(x)
で表示させたり,最後の数個を tail(x)
で表示させたりすると,6〜7桁のとんでもない値が含まれることがわかります。そのため,平均 mean(x)
を求めると,0からかなり外れてしまいます。このような分布は,分散はもとより,平均値を求めることにも意味がありません。強いて求めるなら,メジアンが最適です。
分散についても,平均を求める操作をメジアンに焼き直したMAD(median absolute deviation)と呼ばれるものを使えば,このような分布でも求めることができます。これは,データからメジアンを引いたものの絶対値のメジアン,つまりRで書くと
median(abs(x - median(x)))
になります。
ところで,標準正規分布の median(abs(x - median(x)))
は qnorm(0.75)
≒ 1/1.4826 なので,正規分布の場合に標準偏差と比較しやすくするために,MADの定義を1.4826倍しておくことがあります。Rで mad(x)
で求められる値はデフォルトでは
1.4826*median(abs(x - median(x)))
になっています。
MAD以外に,四分位範囲(interquartile range)もよく使われます。これは,順位が全体の1/4と3/4の値の差です。Rでは IQR()
で求められます。補正しないMADのほぼ2倍に相当します。
正規分布に比べて外れ値(outliers)が非常に多い場合の分布のモデルにコーシー分布が使われることがあります。
以下の分布は頻繁に現れるので,Rの練習にもなりますので,乱数を発生させて度数分布を描き,理論的な密度関数と比べてみてください。
の分布を「自由度 df
と書かれています。
自由度
Rには自由度
dchisq(x, ν)
pchisq(q, ν)
qchisq(p, ν)
rchisq(n, ν)
が備わっています。
の分布は(定数倍を除いて)
の分布を,自由度
自由度
特に,
は自由度
replicate()
を使うのが簡単でしょう。
tt = function() { x = sample(1:5, 50, replace=TRUE) (mean(x) - 3) / sqrt(var(x) / 50) } t = replicate(1000000, tt())
これが本物の
> t0 = -qt(0.025, 50-1) > mean(abs(t) > t0) [1] 0.050288
となり,正しい値 0.05 と非常に近い値になります。1:5
を c(1,2,2,3,3,3,4,4,4,4,5,5,5,5,5)
のような適当な分布に変えてみてください)。ちなみに abs(t) > t0
は t
と同じ長さのベクトルで,t
の要素が t0
より大きければ TRUE
,そうでなければ FALSE
を要素に持ちます。それの平均 mean()
を計算すると,TRUE
= 1,FALSE
= 0 として計算するので,結局 abs(t) > t0
が真である割合を数えていることになります。
アンケートなどのいわゆるリッカート尺度(Likert scale)と称される例えば5段階の選択肢は,sample()
の引数で 1:5
としているところの間隔を変えて例えば c(1,4,5,6,10)
などとしてみます。(mean(x) - 3)
の 3
も分布の平均値に変えます。sample()
に確率分布を例えば prob = c(0.1, 0.2, 0.4, 0.2, 0.1)
のような形で与えることもできます。
Rには自由度
dt(x, ν)
pt(q, ν)
qt(p, ν)
rt(n, ν)
が備わっています。
の分布を,自由度
自由度
特に,
は自由度
Rには自由度
df(x, ν1, ν2)
pf(q, ν1, ν2)
qf(p, ν1, ν2)
rf(n, ν1, ν2)
が備わっています。
高校「数学B」では,おもに正規分布に基づいて,仮説検定や区間推定の考え方を学びます。
例えば,歪んでいない硬貨を100回投げて表が
この「棄却する」という考え方は,誤解されやすいので,注意が必要です。例えば平均から
実際には,仮説検定を適用するのは,たいへん費用がかかるなどの理由で何度も繰り返すことができない場合に限られます。例えば新型コロナのワクチンが効くかどうかを調べるには大規模な治験が必要ですので,あらかじめ「まったく効かないという帰無仮説から(正規分布と仮定した場合)
言い換えれば,データを中心として
高校「数学B」でよく扱われるのは,データが正規分布
このように簡単に不等式が反転できるのは正規分布のような連続分布の特徴です。2項分布のような離散分布の信頼区間は,データによって棄却されない
上の議論では,データが正規分布に従うと仮定しました。でも,現実のデータは正規分布に従うわけではありません。それなら上の議論は使えないかというと,そうではありません。データが正規分布から外れていても,そこからとった大きさ
上の議論のもっと大きな問題点は,
このあたりの議論をもうちょっと詳しくすれば,このような場合に信頼区間を求めるには,正規分布ではなく,それより少し裾
R には t.test()
という関数が備わっています。例えば大きさ 5 のサンプル
> t.test(c(1, 2, 3, 4, 5)) One Sample t-test data: c(1, 2, 3, 4, 5) t = 4.2426, df = 4, p-value = 0.01324 alternative hypothesis: true mean is not equal to 0 95 percent confidence interval: 1.036757 4.963243 sample estimates: mean of x 3
データの平均値は
なお,仮説検定で t.test()
がよく使われるのは次のような場合です。集団 X から大きさ 5 の標本を取り出したら
> x = c(1, 2, 3, 4, 5) > y = c(3, 4, 5, 6, 7, 8) > t.test(x, y) Welch Two Sample t-test data: x and y t = -2.4019, df = 8.9894, p-value = 0.0398 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -4.8549526 -0.1450474 sample estimates: mean of x mean of y 3.0 5.5
これは
なお,X,Y 両群の母分散が何らかの理由で等しいと仮定できる場合は,次のようにします。
> t.test(x, y, var.equal=TRUE) Two Sample t-test data: x and y t = -2.3619, df = 9, p-value = 0.04247 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -4.8944379 -0.1055621 sample estimates: mean of x mean of y 3.0 5.5
結果がほんの少し変わりました。通常は母分散が等しいと仮定できる理由はないので,先ほどの Welch の検定のほうを使います。
母分散が等しいかどうかの検定をしてからどちらの
より詳しくは t検定 のページをご覧ください。
Last modified: