グラフをつくる際によく用いられるのはExcelやGoogle Spread Sheetだと思うが、見栄えの調整を手で行わなければならないのと、大量のデータ処理には時間がかかるので、そろそろRに移行しようと思っている(心情の吐露)。

今回は、Rで描画する場合スタンダードとされているggplot2パッケージを利用して帯グラフを作ってみた。

使うデータ

使うのは標準で組み込まれているUCBAdmissionsデータだ。 データフレームに変換し要約統計量をみる。

ucb<-data.frame(UCBAdmissions)
dim(ucb)
## [1] 24  4

まず、観察数は24、変数は4つあるようだ。

summary(ucb)
##       Admit       Gender   Dept       Freq      
##  Admitted:12   Male  :12   A:4   Min.   :  8.0  
##  Rejected:12   Female:12   B:4   1st Qu.: 80.0  
##                            C:4   Median :170.0  
##                            D:4   Mean   :188.6  
##                            E:4   3rd Qu.:302.5  
##                            F:4   Max.   :512.0

それぞれの変数と具体的な分布は以上のようになっている。学部ごとに、落ちた人・受かった人×女性・男性の4パターンがあるということだろう。それぞれの人数が、Freq変数に収められている。

今回調べること

このデータは、本来であれば入試の男女差別などを調べるのに適したデータなのだろうが、今回は入学した人の男女比を学部別に見ていくことにしたい。日本以外の大学の学部の男女比とかよく知らないから面白そうだなーと思ったのである。

前処理的な段階

今回は標準で付いている整形済みのデータなので整然データに直す必要はないが、ggplot関数を発動させる前に、下準備を少しする必要がある。

#入学者だけのサブセットを作る
ucb.students<-subset(ucb, subset = (ucb$Admit=="Admitted"), select=c("Gender", "Dept", "Freq"))

#一番上にくるA学部で男性の方が多いので、男性がグラフで左側に来るようにジェンダーの順序を固定した変数に変換
ucb.students$Gender.b<-factor(ucb.students$Gender, levels = c("Female", "Male"))

#学部の順序を固定した変数に変換
ucb.students$Dept.b<-factor(ucb.students$Dept, levels = c("F", "E", "D", "C", "B", "A"))

まず今回は入学者のデータしか使わないから、入学者のみのサブセットを作る。また、下の2行はグラフの順序を整えるために、後から付け加えたものだが、こちらに書いておく。

描画する

library(ggplot2)

p<-
  #データと描画空間の設定
  ggplot(ucb.students, aes(x=Dept.b, y=Freq, fill=Gender.b))+
  
  #種類を棒グラフに設定
  geom_bar(stat = "identity") +
  
  #テーマの設定、サイズを決める、日本語対応させる
  theme_classic(base_size = 10, base_family = "HiraKakuProN-W3")+ 
    
  #軸ラベルとタイトルをつける
  xlab("学部")+ylab("新入生数")+ggtitle("UCバークレーの学部別新入生数と男女比")+ 
    
  #色と凡例名、凡例順序の指定 #RColorBrewer::display.brewer.all()で確認できる
  scale_fill_brewer(palette = "Dark2",name=NULL, breaks=c("Male", "Female"), labels=c("男性", "女性"))+
    
  #ひっくり返して帯グラフに
  coord_flip()+
  
  #観察数のラベルつける
  geom_text(aes(label = Freq), size = 4, color="white", position=position_stack(vjust=0.5))
  
#出力
print(p)

無事出力された。男女比をみると、A,B学部を除くと、女性の方が多いかほぼ同じくらいである。しかし、人数の多いA,B学部でかなり比が偏っているので、全体としては女性が少ないように見える。具体的にどこが何学部か、調べればわかるんだろうが、そこまではしません。

ちなみに何年のデータなんだろう? help(UCBAdmissions)で調べると、1973年らしい。古っ。道理で女性が少なすぎると思ったんだ。

参考サイト

参考にしたサイトがたくさんあるので紹介するとともに備忘録としておく。