クラス平均と個人平均

データの読込

成績データ seiseki.xls を機械可読データ形式に保存しなおして(カンマ区切りのcsv形式が代表的)、これを読み込む。 以下の例では、Windows環境 Z:/R/data 内に、csv形式で seiseki.csv として保存したとしている(自分用に適宜解釈し直すこと)。

次の関数 read.csv( ) は関数 read.table( ) 関数のラッパークラスで、csv形式のデータを読み込む場合に使う(オプション sep="," がデフォルトになっている程度だけど。。)。

> Seiseki <- read.csv("seiseki.csv", header=TRUE, skip=8)
> str(Seiseki)
'data.frame':	200 obs. of  6 variables:
 $ StNum  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Sex    : int  0 1 0 1 1 1 1 0 0 0 ...
 $ English: int  68 38 51 62 82 44 48 47 77 89 ...
 $ Lang   : int  76 62 62 77 69 72 72 64 77 58 ...
 $ Math   : int  71 33 88 52 93 57 66 57 55 25 ...
 $ Ave    : logi  NA NA NA NA NA NA ...
.......
読み込んだデータの次元構造を dim( ) で探る。
> dim(Seiseki)
[1] 200   6
この結果は、データフレーム Seiseki が200行 x 6列に行列データであることを示している。

列データの取得

データフレーム Seiseki の列データ、たとえば英語Eng、国語Lang、数学Mathの各列(データ数200人分)は

Seiseki$Eng, Seiseki$Lang, Seiseki$Math

などのようにドルマーク記号 ($) で取得できて、データの並び(ベクトルという)として扱うことができる。 実際、次のようになる。 Seiseki$Engは200個の英語得点データがベクトルとして並んでいることが確かめられる。

> str(Seiseki$Eng)
 int [1:200] 68 38 51 62 82 44 48 47 77 89 ...
> Seiseki$Eng
  [1] 68 38 51 62 82 44 48 47 77 89 51 61 73 48 44 74 57 47 60 50 65 46
 [23] 91 53 83 74 79 45 64 67 54 49 72 43 64 44 62 70 51 56 59 53 44 42
 [45] 37 61 62 28 73 54 60 64 44 67 30 71 69 58 55 87 70 64 91 37 63 68
 [67] 59 78 69 49 57 61 68 97 58 57 29 55 71 52 87 67 56 47 36 55 54 74
 [89] 64 95 56 82 40 50 57 76 94 64 68 57 49 73 64 56 57 53 50 57 85 46
[111] 80 57 64 69 74 61 58 61 55 74 52 39 74 62 71 36 78 38 98 61 42 50
[133] 62 71 72 73 59 71 74 53 61 71 54 82 51 46 79 65 64 48 82 29 60 58
[155] 63 62 62 71 97 61 58 85 83 67 53 48 71 75 73 54 53 68 63 40 46 89
[177] 57 65 89 47 68 77 60 49 82 60 46 71 46 60 51 45 74 35 53 71 64 67
[199] 71 90

クラスの科目平均

関数 mean( ) は与えた数値ベクトルの平均を返す。 たとえば、クラス200人分の英語平均値を EngAve とするには次のようにすればよい。
> EngAve <- mean(Seiseki$Eng)
> EngAve
[1] 61.61
同様に、国語と数学のクラス平均も次で求められる。
> LangAve <- mean(Seiseki$Lang)
> MathAve <- mean(Seiseki$Math)
> LangAve
[1] 70.47
> MathAve
[1] 53.83
これら3つの平均値を並べてベクトルとする。
> ClassAve <- c(EngAve, LangAve, MathAve)
> ClassAve
[1] 61.61 70.47 53.83
データの並び ClassAve の次元構造を調べる。
> dim(ClassAve)
NULL
この結果は、データフレームSeisekiのような行列構造ではないことを示している。 また、ClassAve のように単なるベクトルデータ並びは、3つの数字が何んであるかを教えてくれない。

そこで、関数 cbind( )(Column Bind)を使って、Class Aveを次のように定義する。 ClassAveは1行3列の行列構造を持ち、スカラー値が代入されている変数名を各列のラベル名となっていることがわかる。

> ClassAve <- cbind(EngAve, LangAve, MathAve)
> dim(ClassAve)
[1] 1 3
> ClassAve
     EngAve LangAve MathAve
[1, ]  61.61   70.47   53.83

各列の平均を一気に計算する関数 colMeans( )

1行3列の行列構造を持ち、各列にラベル名が付いた構造として各科目平均を得たければ、改めて次のように一気に計算することができる。 行列構造を持つデータセットに対して、その各列の平均を返す関数 colMeans( ) を次のように使うのである。 便利なことに、その結果には元のデータの列ラベル名が付いた1行N列の平均値を一気に計算してくれる。
> ClassAves <- colMeans(Seiseki[,c(3,4,5)])
> dim(ClassAve)
[1] 1 3
> ClassAve
  Eng  Lang  Math 
61.61 70.47 53.83 
ここでは、データフレームSeisekiの3列(Eng), 4列(Lang)および5列(Math)をSeiseki[,c(3,4,5)]で取り出して200行3列とし、その行列データの列平均を関数 mean( ) を使って求めている。

確かに、データフレーム Seiseki の3,4,5列を取り出していることは、次で確認できる。

> Seiseki[,c(3,4,5)]
    Eng Lang Math
1    68   76   71
2    38   62   33
3    51   62   88
4    62   77   52
5    82   69   93
...

Seisekiデータの3,4,5列と連続している列範囲を取り出しているので、3:5と表記できて、次のように書いてもよい。

> ClassAve <- mean(Seiseki[,3:5])

行列データから指定した任意列、任意行を取り出す

ここでやってみせたように、行列構造データから任意に指定した列または行データの取り出し方を知っておくと便利である。 たとえば、データフレーム Hogehoge から、2,3,4,5列と4,7,9列の7列を取り出したければ、Hogehoge[,c(2:5,4,7,9)]と指定するのである。

実際、次のようにして確かめることができる。

> c(2:5,4,7,9)
[1] 2 3 4 5 4 7 9
同様にして、データフレーム Hogehoge から、1,2,3,4,5行と10,11,12,13行の8行を取り出したければ、Hogehoge[c(1:5,10:13), ]と指定するのである。 実際、次のようになる。
> Seiseki[c(1:5,10:13), ]
   Stnum Sex Eng Lang Math Ave
1   a111   0  68   76   71  NA
2   a112   1  38   62   33  NA
3   a113   0  51   62   88  NA
4   a114   1  62   77   52  NA
5   a115   1  82   69   93  NA
10  a120   0  89   58   25  NA
11  a121   0  51   76   57  NA
12  a122   1  61   65   45  NA
13  a123   0  73   81   58  NA

棒グラフ

ClassMean をつかって、棒グラフを描く(以下は、1行で表されている)。
> barplot(ClassAve, names=c("EngAve","LangAve","MathAve"), ylim=c(0,100), main="Class averages")

個人平均

データフレーム Seiseki の3,4,5列にセットされている3科目の得点を使って、その平均値を6列の Ave 列に計算したい。 そのために、行列データの各行にある列データの平均値を返す関数
rowMeans( ) を使う。

Seisekiの3,4,5列を Seiseki[,c(3,4,5)] によって取り出し、その各行の平均値をラベル名Aveでラベルされた列(いまの場合は6列)Seiseki$Ave に代入するには次のようにする。

> Seiseki$Ave <- rowMeans(Seiseki[,c(3,4,5)])
> Seiseki
    StNum Sex English Lang Math      Ave
1       1   0      68   76   71 71.66667
2       2   1      38   62   33 44.33333
3       3   0      51   62   88 67.00000
4       4   1      62   77   52 63.66667
5       5   1      82   69   93 81.33333
6       6   1      44   72   57 57.66667
...
代入した後のデータフレームSeisekiのデータ構造を確かめておこう。Ave列に注意する。
> str(Seiseki)
'data.frame':	200 obs. of  6 variables:
 $ Stnum: Factor w/ 200 levels "a111","a112",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Sex  : int  0 1 0 1 1 1 1 0 0 0 ...
 $ Eng  : int  68 38 51 62 82 44 48 47 77 89 ...
 $ Lang : int  76 62 62 77 69 72 72 64 77 58 ...
 $ Math : int  71 33 88 52 93 57 66 57 55 25 ...
 $ Ave  : num  71.7 44.3 67 63.7 81.3 ...