データ分析の基本である、分散 標準偏差について、Rとエクセルで比較してみましょう。ExcelやRを使って、自分で計算するとより理解が深まると思います。
データの散らばり 分散 標準偏差
偏差 平均値からどれだけずれているか?
偏差とは、個々のデータから平均値を引いて得られる値です。つまり、平均値からのズレです。平均値からどれだけズレているかをあらわす偏差を考えることで、それぞれのデータがどのような個性をもっているのかがわかります。
偏差
$$ x_i – \overline{x} $$
分散 全体の散らばりはどの程度か?
データ1つ1つの平均値からのズレは偏差でわかりました。全体の散らばりは、これらを足しあわせて考えることができます。しかし、平均値からのズレには「+」「-」があるので、単純に総和を求めると相殺されてしまいます。そこで、各偏差を2乗して考えることにします。これらの全てを足したものを、変動や偏差平方和などと呼びます。これをデータ数で割って平均化したものが分散です。尚、「データ数-1」で割ると不偏分散が求まります。
分散
$$ \sigma^2 = \frac{1}{n} \sum_{i=1}^n (x_i – \overline{x}) $$
不偏分散
$$ \mu^2 = \frac{1}{n-1} \sum_{i=1}^n (x_i – \overline{x}) $$
不偏分散とは、サンプルから母集団の分散を推定したものです。一方、(標本)分散とは、データが母集団全体であるときの分散です。例えば、工場などで一部サンプルをとって全体のばらつきを推定する場合は「不偏分散」、校内模試の全体結果から分散を求める場合は「(標本)分散」を計算するというように使い分けます。
標準偏差 分散よりもわかりやすい?
分散の正の平方根をとったものが標準偏差です。分散は、2乗した数で表されるので、元のデータと単位が異なります。例えば、ある測定データについて分散を計算すると、「長さ」や「重さ」の分散は「その平方(2乗)」で表されるので、元のデータと比較しにくいという面があります。それに比べて、正の平方根をとった標準偏差は元のデータと同じ単位なので、分散よりも散らばり具合をよく表現します。
標準偏差
$$ \sigma = \sqrt{\sigma^2} $$
分散 標準偏差 計算する
データの準備
データは、RのデータセットairqualityのOzoneデータを使いました。write.table
関数を使って、ファイルに保存して使うと便利です。
> data <- subset(airquality, complete.cases(airquality)) > data$Ozone 41 36 12 18 23 19 8 16 11 14 18 14 34 6 30 11 1 11 4 32 23 45 115 37 29 71 39 23 21 37 20 12 13 135 49 32 64 40 77 97 97 85 10 27 7 48 35 61 79 63 16 80 108 20 52 82 50 64 59 39 9 16 122 89 110 44 28 65 22 59 23 31 44 21 9 45 168 73 76 118 84 85 96 78 73 91 47 32 20 23 21 24 44 21 28 9 13 46 18 13 24 16 13 23 36 7 14 30 14 18 20 > write.table("data.tsv", data$Ozone, sep="\t", quote=F)
Excel 分散 標準偏差 計算する
分散
エクセルで不偏分散を求めるには、VAR.S
関数、または、VAR
関数を使います。
=VAR.S(セル範囲) または、=VAR(セル範囲)
標準偏差
エクセルで標準偏差を求めるには、STDEV.S
関数、または、STDEV
関数を使います。
=STDEV.S(セル範囲) または、=STDEV(セル範囲)
「母集団」についての標本分散と標本標準偏差を計算する場合は、前者がVAR.P
関数(VARP
関数)、後者がSTDEV.P
関数(STDEVP
関数)を使います。
=VAR.P(セル範囲) =STDEV.P(セル範囲)
Excel 分散 標準偏差 計算する 自分で計算!
エクセルで、関数を使わずに不偏分散を計算してみましょう。
偏差
偏差は、各データから平均値を引いたものです。全てのデータから平均値を引きます。平均値は固定のセルなので、「$列名$行番号」で参照先を固定します。(例では、B2-$G$2
)
偏差の2乗 偏差平方和
偏差の2乗を全ての偏差について計算します。
不偏分散
不偏分散を求めます。「偏差の2乗」をSUM
で合計して、「データ数-1」で割ります。
R 分散 標準偏差 計算する
Rで不偏分散を計算するには、var
関数を使います。
> var(data$Ozone) [1] 1107.29
Rで標準偏差を計算するには、sd
関数を使います。
> sd(data$Ozone) [1] 33.27597
「母集団」についての標本分散と標本標準偏差を計算する場合は、不偏分散を $$ \frac{n-1}{n} $$ 倍すると求められます。
分散
$$ \sigma^2 = \frac{1}{n} \sum_{i=1}^n (x_i – \overline{x}) $$
不偏分散
$$ \mu^2 = \frac{1}{n-1} \sum_{i=1}^n (x_i – \overline{x}) $$
> data <- subset(airquality, complete.cases(airquality)) > data$Ozone 41 36 12 18 23 19 8 16 11 14 18 14 34 6 30 11 1 11 4 32 23 45 115 37 29 71 39 23 21 37 20 12 13 135 49 32 64 40 77 97 97 85 10 27 7 48 35 61 79 63 16 80 108 20 52 82 50 64 59 39 9 16 122 89 110 44 28 65 22 59 23 31 44 21 9 45 168 73 76 118 84 85 96 78 73 91 47 32 20 23 21 24 44 21 28 9 13 46 18 13 24 16 13 23 36 7 14 30 14 18 20 > var(data$Ozone) [1] 1107.29 # 不偏分散 > sd(data$Ozone) [1] 33.27597 > hyouhon_var <- function(x) var(x) * (length(x)-1)/length(x) > hyouhon_var(data$Ozone) [1] 1097.315 # 標本分散 > sqrt(hyouhon_var(data$Ozone)) [1] 33.12574
Excelで計算したものと同じ結果が得られました。