Menu

R の平均値・中央値・標準偏差

R でデータを要約する方法: mean()、median()、sd()、var()、summary()、quantile() — それぞれが何を計算するのか、sd() の背後にある n−1 の話、そして R の mode() が罠である理由。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

平均値と中央値

統計学で最もよく使われる 2 つの要約は、それぞれ 1 回の関数呼び出しで求まります。

mean() はすべてを足して個数で割ります。median() は値を並べ替えて真ん中のものを取ります(個数が偶数のときは真ん中 2 つの平均を取ります)。mtcars の 32 台では、平均燃費は約 20.1 mpg、中央値は 19.2 です。両者が近いことは、データがひどく歪んでいないことを示します。両者が大きく 食い違う 場合、それもまた情報です。最後にその話をします。

誰もが驚くことがひとつあります。ベクトルに NA が 1 つでも含まれていると、どちらの関数も NA を返します。

これは意図的なものです。R は欠測値が存在しないふりを黙ってすることを拒みます。na.rm = TRUE は「手元にある値で計算せよ」という意味です。この記事のほぼすべての要約関数がこれを受け取ります。NA がどのように伝播するかの全体像は欠測値にあります。

標準偏差と分散

sd() は散らばりを測ります。ざっくり言えば、典型的な値が平均からどれだけ離れているかを、データと同じ単位で表します。var() はその 2 乗です。

標準偏差が約 6 mpg ということは、車はおおむね平均 20.1 から 6 mpg 以内に収まるということです。sd() はデータ自身の単位なので、報告するのはこちらです。var() は主に他の式の中に現れます。

授業の課題で重要になる細部がここです。sd()var()標本 統計量を計算します — 偏差平方和を n ではなく n − 1 で割ります。

なぜ n − 1 なのでしょうか。平均を同じデータから推定したため、その推定平均のまわりの偏差は系統的に少しだけ小さくなります。n − 1 で割ることでそれを補正します。手元のデータはほぼ常に、より大きな何かからの標本なので、n − 1 の版が求めるものです。本当に 母集団全体 がある場合(クラスの全生徒、カタログの全商品)は、var(x) * (n - 1) / n と掛け直します。

平均の標準誤差

標準偏差と標準誤差は絶えず混同されるので、はっきり区別しましょう。sd はデータを、SE は平均の推定精度を表します。 R には組み込みの se() はありませんが、式は 1 行です。

標準誤差は標本が大きくなるほど小さくなります。データを 4 倍集めれば SE は半分になります。標本が大きいほど平均をより精確に絞り込めるからです。sd は標本サイズでは小さく なりません。何台測ろうと、車のばらつきはそのままです。SE は信頼区間の構成要素であり、そこで真価を発揮します。

summary() — 1 回の呼び出しで全体像

summary() は五数要約に平均を加えたものを一度に返し、データフレーム全体に対しても動きます。

データフレームに対して呼ぶとすべての列を要約します。数値の列には最小値・四分位数・平均・最大値が、因子には水準ごとの度数が表示されます。読み込んだばかりのデータセットに対してまず実行すべきものです。ありえない値(負の年齢、最大値 9999)が即座に目に飛び込んできます。

分位点、範囲、IQR

quantile() は中央値を任意の区切り点に一般化したものです。

引数なしで呼ぶと、最小値、四分位数、最大値を返します。特定の区切り点が欲しいときは probs = を渡します。上の例の第 10 百分位数と第 90 百分位数は、データの大半が存在する範囲を挟み込みます。IQR()(第 25 百分位数と第 75 百分位数の距離)は、sd() と違って外れ値に引きずられない散らばりの尺度です。range() は最小値と最大値を対で返します。

最頻値: R の mode() はこれをしません

これには誰もがちょうど一度だけ引っかかります。R には mode() という関数がありますが、統計とは何の関係もなく、オブジェクトの記憶型を報告します。

覚えるべきイディオムはこうです。table(x) が各値の出現回数を数え、which.max() が最大の度数を見つけ、names() がその値自体を取り出します。返ってくるのは文字列である点に注意してください(table の名前は常に文字列です)。それで計算したい場合は as.numeric() で包みます。2 つの値が同数の場合、which.max() は黙って最初のものだけを返します。同数がありえる状況では table を自分で確認しましょう。

平均か中央値か: どちらを報告すべきか

平均はすべての値を使います。それが強みでもあり弱みでもあります。極端な値が 1 つあるだけで引きずられます。中央値は真ん中しか気にしないので、外れ値はほとんど影響しません。

値を 1 つ加えただけで平均は約 49,300 から 155,000 超へ跳ね上がります。データの中の 誰も 表していない数値です。一方、中央値は 48,000 から 49,500 へ動くだけです。所得、住宅価格、入院日数が中央値で報告されるのはこのためです。長い裾を持つ歪んだデータでは、平均は誤解を招きます。おおむね対称なデータでは両者は一致し、平均で問題ありません(統計的にもより効率的です)。どちらの状況にいるかは手早いヒストグラムが教えてくれますし、平均と中央値を比べること自体が 1 行でできる歪みのチェックです。

この章のまとめ

  • mean(x)median(x) — 欠測値があるときは na.rm = TRUE を追加します。
  • sd(x)var(x)標本 統計量(分母が n − 1)を計算します。それが求めるものです。
  • 標準誤差は sd(x) / sqrt(length(x)) — データの散らばりではなく、平均をどれだけよく知っているかを測ります。
  • 読み込んだばかりのデータフレームへの summary() は、R で最も速い健全性チェックです。
  • 最頻値は names(which.max(table(x))) です。R の mode() は記憶型に関する関数です。
  • 歪んだデータや外れ値があるなら中央値を報告しましょう。対称なデータなら平均で構いません。

次は、2 つの変数がどれだけ連動するかを測ること — cor()cor.test() による相関です。

よくある質問

R で標準偏差を計算するにはどうしますか?

sd(x) を使います。この関数は 標本 標準偏差を計算する点に注意してください。n ではなく n − 1 で割ります。実際の分析ではほぼ常にこちらが望ましい結果です。手元のデータは母集団全体ではなく標本であることがほとんどだからです。

R で平均値と中央値を求めるにはどうしますか?

mean(x)median(x) です。ベクトルに欠測値が含まれていると、どちらも NA を返します。存在する値だけで計算するには na.rm = TRUE を追加します: mean(x, na.rm = TRUE)

R で最頻値を求めるにはどうしますか?

mode() では求まりません。この関数はオブジェクトの記憶型を返すもので、最も頻繁に現れる値ではありません。代わりに table のイディオムを使います: names(which.max(table(x))) が最も多く現れる値を返します。

R での標準誤差はどう求めますか?

組み込みの関数はありません。sd(x) / sqrt(length(x)) として計算します。標準偏差はデータの散らばりを表し、標準誤差は平均値をどれだけ精確に推定できたかを表します。標本が大きくなるほど小さくなります。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める