平均と分散
基本統計量
統計量とは,観測したデータそのものではなく,それらのデータの特徴を代表的に表す値のことを表します. そのなかでも,基本統計量 は,平均,中央値,分散,標準偏差 などを指し, データの特徴を把握するための基本的な指標となります. 今回は,これら基本統計量を,公式や関数を利用して計算してみましょう. 対象のデータとして成績のデータ(CSV形式)を使用します. このデータは15人の生徒の国語,算数,理科,英語,社会の得点で構成されています.
ファイルをダウンロードしたら,read.csv関数を利用して, 変数scoreにデータフレームとして読み込んでおきましょう(作業ディレクトリはデスクトップに変更).
score <- read.csv("score.csv")
変数scoreの出力は下記のようになります.
> score
氏名 国語 算数 理科 英語 社会
1 青木 達也 60 68 72 39 71
2 石井 健二 65 78 82 37 75
3 北村 真子 84 59 85 87 84
4 河野 尚子 50 65 65 39 78
5 高木 健 72 74 83 30 83
6 西川 知里 50 29 67 62 72
7 福島 萌子 84 40 65 86 66
8 古川 翔太 78 71 82 34 88
9 山内 香菜 77 33 65 73 88
10 渡辺 太郎 76 53 75 60 71
11 浅野 渉 68 46 77 66 86
12 星野 弘 61 27 74 70 67
13 中谷 章 86 57 72 73 65
14 小泉 美沙 68 48 73 51 68
15 木下 萌子 78 90 100 53 79
スクリプトの作成
コードを入力し保存するためのスクリプトを作成しましょう. [ファイル]-[新しいスクリプト]をクリックし,Rエディタを表示します. 次に,[ファイル]-[保存]をクリックして,スクリプトを保存します. このとき,ファイル名はchapter4としてください. また,ファイルの保存場所と作業ディレクトリをデスクトップに変更しておきます.
合計
基本統計量の前に合計を計算してみましょう. 例えば,国語の合計は,演算子**+**を利用して,次のように記述することができます. ここで,nは要素の数を表しています.
R言語では,もっと簡単に,sumという関数で合計を求めることができます. 国語の得点はデータフレームの2列目にあるため**score[,2]**と表記します.
> score[,2]
[1] 60 65 84 50 72 50 84 78 77 76 68 61 86 68 78
> sum(score[,2])
[1] 1057
国語の合計は1057になることが分かります. 同様に,算数の合計も計算してみましょう.
> score[,3]
[1] 68 78 59 65 74 29 40 71 33 53 46 27 57 48 90
> sum(score[,3])
[1] 838
算数の合計は838になります.
平均
それでは,最も有名な基本統計量である平均を計算してみましょう. 例えば,国語の平均を求めるには,次のように記述することができます.
まずは,先ほどのsum関数を利用して,国語の平均を計算してみましょう. ここで,length関数はベクトルの長さを表します.
> sum(score[,2])/length(score[,2])
[1] 70.46667
国語の平均は約70.5になることが分かります. R言語では,meanという関数で平均を求めることができます. ちなみに,Excelではaverageという関数が利用されます. 今度は関数を利用して計算してみましょう.
> mean(score[,2])
[1] 70.46667
先程,求めた値と同じであることが確認できます.
中央値
平均とよく似た基本統計量として,中央値があります. 中央値は,データを小さい順(大きい順でも構わない)から並べたときに,ちょうど中央にある値のことを指します. 例えば,[1,2,3,4,5]の中央値は,3になります. また,[1,2,3,4,5,6]など値が偶数個の場合は,(3+4/2)=3.5が中央値です.
R言語では,medianという関数で中央値を求めることができます. 国語の中央値を計算してみましょう.
> median(score[,2])
[1] 72
国語の中央値は72であることが分かります.
分散
平均や中央値は,データの代表値であり,分布の中心位置を示しています(中心の考え方によるけど). データの傾向を把握するには,上記に加えて散布度を知る必要があります. 散布度とは,データの散らばり度合のことを意味しており, 平均値や中央値からどれだけ離れているかを示した値です.
まずは,分散を考えましょう. 分散は,各データの値から平均を引いた値(偏差)の2乗の和であり,下記のように記述することができます. 分散は2乗の和であるため,常に正の値となることに注意してください.
まずは,これまでに学習したsum関数とmean関数を利用して,国語の分散を計算してみましょう. スクリプトに下記を入力して,スクリプトを読み込み実行してください.
#スコアの読込
score <- read.csv("score.csv")
#偏差を計算
hensa <- score[,2] - mean(score[,2])
#分散を計算
bunsan <- sum(hensa^2 / length(score[,2]))
では,偏差と分散の値を確認してみましょう.
> source("chapter4.R")
> hensa
[1] -10.466667 -5.466667 13.533333 -20.466667 1.533333 -20.466667
[7] 13.533333 7.533333 6.533333 5.533333 -2.466667 -9.466667
[13] 15.533333 -2.466667 7.533333
> bunsan
[1] 125.0489
国語の分散は約125になりました.
R言語では,varという関数で分散を求めることができます. 今度は,var関数で国語の分散を計算してみましょう.
> var(score[,2])
[1] 133.981
同じ値になると思いきや,なんと先程とは異なる結果となりました. 実は,先に計算した値は標本分散と呼ばれ, データの全ての値が(もしくは,ほぼ全て)分かっているときに用いられ, データの一部(サンプル)しか分からない場合は,真の分散より小さな値となります. そこで,用いられるのが不偏分散であり,下記のように分母をn-1で割って求めます.
では,スクリプトを修正して,再度,分散を計算してみましょう.
#分散を計算
bunsan <- sum(hensa^2 / (length(score[,2])-1))
> bunsan
[1] 133.981
国語の分散は約134となり,var関数の値と一致しました.
標準偏差
最後に,標準偏差を計算しましょう. 標準偏差は,分散の値の平方根をとった値です.
国語の標準偏差を計算するために, スクリプトに下記を入力して,スクリプトを読み込み実行してください. 平方根を取るにはsqrt関数を利用します.
#標準偏差
hyojyun_hensa <- sqrt(bunsan)
では,標準偏差を確認してみましょう.
> hyojyun_hensa
[1] 11.57501
標準偏差は約11.6になりますね. R言語では,sdという関数で,標準偏差を計算できます. 今度は,sd関数で標準偏差を計算してみましょう.
> sd(score[,2])
[1] 11.57501
先程の値と一致することが分かります.
課題
関数を利用して,数学の合計,平均,中央値,分散,標準偏差を計算して出力してください. ソースはchapter4.Rに記述し,chapter4.R を提出すること.