グループごとの平均値などをまとめて算出する方法。
Rを用いて統計解析をする際に、データフレームに格納されているデータの各グループごとに平均値や合計などを計算したいことがあります。
例えば以下のデータフレームにある会社の営業部、サービス部、総務部の従業員の性別と年収が格納されています。
>data
部署 性別 年収
1 営業部 男性 550
2 営業部 男性 600
3 営業部 男性 600
4 営業部 男性 700
5 営業部 男性 800
6 営業部 男性 500
7 営業部 男性 600
8 営業部 男性 750
9 営業部 女性 700
10 営業部 女性 800
11 サービス部 男性 500
12 サービス部 男性 400
13 サービス部 男性 400
14 サービス部 女性 350
15 サービス部 女性 350
16 総務部 男性 600
17 総務部 女性 350
18 総務部 女性 400
19 総務部 女性 400
20 総務部 女性 350
部署 性別 年収
1 営業部 男性 550
2 営業部 男性 600
3 営業部 男性 600
4 営業部 男性 700
5 営業部 男性 800
6 営業部 男性 500
7 営業部 男性 600
8 営業部 男性 750
9 営業部 女性 700
10 営業部 女性 800
11 サービス部 男性 500
12 サービス部 男性 400
13 サービス部 男性 400
14 サービス部 女性 350
15 サービス部 女性 350
16 総務部 男性 600
17 総務部 女性 350
18 総務部 女性 400
19 総務部 女性 400
20 総務部 女性 350
このデータフレームは以下のコードで作成することができます。
data=data.frame( 部署=c(rep("営業部",10), rep("サービス部",5), rep("総務部",5)), 性別=c(rep("男性",8),rep("女性",2), rep("男性",3),rep("女性",2), rep("男性",1),rep("女性",4)), 年収=c(550,600,600,700,800,500,600,750, 700,800, 500,400,400, 350,350, 600, 350,400,400,350) )
このデータの部署ごと、性別ごと、部署x性別ごとの年収の平均値を出す方法を紹介します。
データフレームの各グループごとの平均値を出したいときは、aggregate()関数を使用します。
部署ごとの平均を出すには以下のコードを両します。
aggregate(年収~部署, # 部署ごとの年収 data=data, # データフレームdataを利用 FUN=mean) # 平均値を指定
このコードで以下のように部署ごとの平均年収が出力されます。
> aggregate(年収~部署,data=data,FUN=mean)
部署 年収
1 サービス部 400
2 営業部 660
3 総務部 420
部署 年収
1 サービス部 400
2 営業部 660
3 総務部 420
同じように性別ごとの年収の平均値は以下の通りです。
aggregate(年収~性別,data=data,FUN=mean)
>aggregate(年収~性別,data=data,FUN=mean)
性別 年収
1 女性 462.5000
2 男性 583.3333
性別 年収
1 女性 462.5000
2 男性 583.3333
次に部署x性別ごとの平均値の出し方です。
aggregate(年収~部署+性別, # 部署x性別ごとの年収を指定 data=data, # データフレームdataを指定 FUN=mean) # 平均値を算出
これにより、以下の通り部署x性別ごとの年収の平均値を出すことができます。
> aggregate(年収~部署+性別,data=data,FUN=mean)
部署 性別 年収
1 サービス部 女性 350.0000
2 営業部 女性 750.0000
3 総務部 女性 375.0000
4 サービス部 男性 433.3333
5 営業部 男性 637.5000
6 総務部 男性 600.0000
部署 性別 年収
1 サービス部 女性 350.0000
2 営業部 女性 750.0000
3 総務部 女性 375.0000
4 サービス部 男性 433.3333
5 営業部 男性 637.5000
6 総務部 男性 600.0000
このaggregate()関数においては平均値だけでなく様々な関数の値を出すことができます。
例えば、各部署x性別ごとの年収の最大値を出したい場合にはFUN=meanの代わりにFUN=maxを指定します。
> aggregate(年収~部署+性別, data=data, FUN=max # 最大値maxを指定)
> aggregate(年収~部署+性別,data=data,FUN=max)
部署 性別 年収
1 サービス部 女性 350
2 営業部 女性 800
3 総務部 女性 400
4 サービス部 男性 500
5 営業部 男性 800
6 総務部 男性 600
部署 性別 年収
1 サービス部 女性 350
2 営業部 女性 800
3 総務部 女性 400
4 サービス部 男性 500
5 営業部 男性 800
6 総務部 男性 600