毎回やる儀式

Rことはじめ

Rは一問一答式のプログラム言語です。 四則演算,関数の使い方,代入方法などについて順に説明していきます。 コピペでいいので,自分の環境で実行しながらついてきてください。

四則演算

2+3
## [1] 5
3-4
## [1] -1
5*6
## [1] 30
6/3
## [1] 2

関数を使う

sqrt(4)
## [1] 2
help(sqrt)
## starting httpd help server ...
##  done

オブジェクトに代入する

obj <- 2
obj
## [1] 2
obj <- 3
obj
## [1] 3
obj2 <- 2
obj3 <- 3
obj2 + obj3
## [1] 5

ベクトルで扱う

obj <- c(1,2,3)
obj
## [1] 1 2 3
obj <- c(1:10)
obj
##  [1]  1  2  3  4  5  6  7  8  9 10
obj * 2
##  [1]  2  4  6  8 10 12 14 16 18 20

行列形式

obj <- matrix(c(1:10),nrow=5)
obj
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
obj <- matrix(c(1:10),nrow=5,byrow=T)
obj
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8
## [5,]    9   10
obj *2
##      [,1] [,2]
## [1,]    2    4
## [2,]    6    8
## [3,]   10   12
## [4,]   14   16
## [5,]   18   20

行列の計算や,行列用の関数については自分で調べてね。

データセットとして:リスト形式

obj <- list(name=c("kosugi","tanaka","suzuki"),
            gender=c("male","female","male"),
            hight=c(170,160),
            weight=c(70.6,80.9,90.6,40.3)
            )
obj
## $name
## [1] "kosugi" "tanaka" "suzuki"
## 
## $gender
## [1] "male"   "female" "male"  
## 
## $hight
## [1] 170 160
## 
## $weight
## [1] 70.6 80.9 90.6 40.3
obj$name
## [1] "kosugi" "tanaka" "suzuki"
obj$weight
## [1] 70.6 80.9 90.6 40.3
str(obj)
## List of 4
##  $ name  : chr [1:3] "kosugi" "tanaka" "suzuki"
##  $ gender: chr [1:3] "male" "female" "male"
##  $ hight : num [1:2] 170 160
##  $ weight: num [1:4] 70.6 80.9 90.6 40.3

データセットとして:データフレーム形式

obj <- data.frame(
            list(name=c("kosugi","tanaka","suzuki"),
                gender=c(1,2,1),
                hight=c(170,160,170),
                weight=c(70.6,80.9,90.6)
                )
            )
obj
##     name gender hight weight
## 1 kosugi      1   170   70.6
## 2 tanaka      2   160   80.9
## 3 suzuki      1   170   90.6
str(obj)
## 'data.frame':    3 obs. of  4 variables:
##  $ name  : Factor w/ 3 levels "kosugi","suzuki",..: 1 3 2
##  $ gender: num  1 2 1
##  $ hight : num  170 160 170
##  $ weight: num  70.6 80.9 90.6
obj$gender
## [1] 1 2 1
obj$gender <- factor(obj$gender,labels=c("male","female"))
obj
##     name gender hight weight
## 1 kosugi   male   170   70.6
## 2 tanaka female   160   80.9
## 3 suzuki   male   170   90.6
str(obj)
## 'data.frame':    3 obs. of  4 variables:
##  $ name  : Factor w/ 3 levels "kosugi","suzuki",..: 1 3 2
##  $ gender: Factor w/ 2 levels "male","female": 1 2 1
##  $ hight : num  170 160 170
##  $ weight: num  70.6 80.9 90.6
obj$hight
## [1] 170 160 170
obj[3,]
##     name gender hight weight
## 3 suzuki   male   170   90.6
obj[,2]
## [1] male   female male  
## Levels: male female
obj[3,2]
## [1] male
## Levels: male female
obj[3,2] <- NA
obj
##     name gender hight weight
## 1 kosugi   male   170   70.6
## 2 tanaka female   160   80.9
## 3 suzuki   <NA>   170   90.6
summary(obj)
##      name      gender      hight           weight     
##  kosugi:1   male  :1   Min.   :160.0   Min.   :70.60  
##  suzuki:1   female:1   1st Qu.:165.0   1st Qu.:75.75  
##  tanaka:1   NA's  :1   Median :170.0   Median :80.90  
##                        Mean   :166.7   Mean   :80.70  
##                        3rd Qu.:170.0   3rd Qu.:85.75  
##                        Max.   :170.0   Max.   :90.60

簡単な描画

Rが持っているサンプルデータを使ってプロットしてみましょう。

data(iris)
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
hist(iris$Sepal.Length)

plot(iris$Sepal.Length,iris$Sepal.Width)

plot(iris$Sepal.Length,iris$Sepal.Width,pch=21,bg=c(2,3,4)[iris$Species])

boxplot(iris$Sepal.Length~iris$Species)

Rで記述統計

mean(iris$Sepal.Length)
## [1] 5.843333
median(iris$Sepal.Length)
## [1] 5.8
var(iris$Sepal.Length)
## [1] 0.6856935
sd(iris$Sepal.Length)
## [1] 0.8280661
cor(iris$Sepal.Length,iris$Sepal.Width)
## [1] -0.1175698

データ・ハンドリング

実際に自分のデータを分析する時は,外部ファイルから読み込むことが一般的です。 配布済みのデータセットを読み込んでみましょう。

baseball <- read.csv("baseball2016.csv",na.strings="*")
summary(baseball)
##            name               team         pay          position 
##  T-岡田    :  1   ソフトバンク:17   Min.   : 4500   外野手:29  
##  エリアン    :  1   日本ハム    :15   1st Qu.: 7200   投手  :62  
##  エルドレッド:  1   巨人        :14   Median :10800   内野手:44  
##  エルナンデス:  1   西武        :13   Mean   :14780   捕手  : 8  
##  ギャレット  :  1   オリックス  :12   3rd Qu.:20000              
##  クルーズ    :  1   ヤクルト    :12   Max.   :60000              
##  (Other)     :137   (Other)     :60                              
##       year            age            height        weight      
##  Min.   : 1.00   Min.   :20.00   Min.   :167   Min.   : 66.00  
##  1st Qu.: 4.00   1st Qu.:28.00   1st Qu.:177   1st Qu.: 80.00  
##  Median : 8.00   Median :31.00   Median :180   Median : 87.00  
##  Mean   : 8.28   Mean   :30.64   Mean   :182   Mean   : 87.76  
##  3rd Qu.:12.00   3rd Qu.:33.50   3rd Qu.:185   3rd Qu.: 95.00  
##  Max.   :21.00   Max.   :41.00   Max.   :203   Max.   :122.00  
##                                                                
##      games             Hit              HR       
##  Min.   : 13.00   Min.   : 25.0   Min.   : 0.00  
##  1st Qu.: 27.50   1st Qu.: 60.0   1st Qu.: 3.00  
##  Median : 70.00   Median :104.0   Median : 8.00  
##  Mean   : 77.93   Mean   :102.3   Mean   :10.19  
##  3rd Qu.:121.00   3rd Qu.:140.0   3rd Qu.:14.00  
##  Max.   :143.00   Max.   :195.0   Max.   :44.00  
## 
head(baseball)
##           name       team   pay position year age height weight games Hit
## 1     T-岡田 オリックス  6400   外野手   11  28    186     98   123 129
## 2     エリアン       DeNA  8000   内野手    1  31    180     93    79  56
## 3 エルドレッド       広島 12500   内野手    5  36    196    122    95  93
## 4 エルナンデス       中日  4500   内野手    3  33    178     87    64  58
## 5   ギャレット       巨人 30000   外野手    1  35    196    107   123 109
## 6     クルーズ       巨人 24400   内野手    3  32    183     95    81  75
##   HR
## 1 20
## 2  5
## 3 21
## 4  5
## 5 24
## 6 11
tail(baseball)
##           name         team   pay position year age height weight games
## 138 牧田 和久         西武  7500     投手    6  31    177     83    50
## 139 野上 亮磨         西武  5800     投手    8  29    177     76    22
## 140 野村 祐輔         広島  5200     投手    5  27    177     82    25
## 141 涌井 秀章       ロッテ 22000     投手   12  30    185     85    26
## 142   和田 毅 ソフトバンク 40000     投手   10  35    180     81    24
## 143 澤村 拓一         巨人 10000     投手    6  28    184    101    63
##     Hit HR
## 138  54  3
## 139 112 10
## 140 139 11
## 141 195 15
## 142 138 22
## 143  60  5

データの部分抽出

身長と体重のデータだけ抜き出してみましょう。

# 抜き出す関数
physical <- subset(baseball,select=c("height","weight"))
# プロットしてみる
hist(physical$height)

hist(physical$weight)

plot(physical$height,physical$weight)

# 相関関係
cor(physical)
##           height    weight
## height 1.0000000 0.6997203
## weight 0.6997203 1.0000000

プレイ年数が第一4分位より長い人はexpertというラベルを張ることにします。

hist(baseball$year)

quantile(baseball$year,prob=c(0,0.25,0.5,0.75,1))
##   0%  25%  50%  75% 100% 
##    1    4    8   12   21
baseball$grade <- ifelse(baseball$year>=13,1,2)
baseball$grade <- factor(baseball$grade,labels=c("expert","normal"))
table(baseball$grade)
## 
## expert normal 
##     30    113

探索的データプロット

** データは図にする。プロットする。** これが分析の基本です。まずデータがどういう特徴を持っているかを,しっかりと目で把握しましょう。 それができていないと,データにモデルを当てはめるという話が始まりませんので。

ggplot2の導入

探索的データプロットのパッケージ,ggplot2をインストールします。

install.packages("ggplot2")

インストールしただけでは使えません。library関数(またはrequire関数)で装備します。

library(ggplot2)

まずはデータと全体設定を持ったggplotオブジェクトを作ります。

gp <- ggplot(baseball,aes(x=year,y=pay,color=team))

点を打ってみましょう。

gp_point <- gp + geom_point()
plot(gp_point)

色だけじゃなく,大きさや形状を変えてプロットすることもできます。

gp <- ggplot(baseball,aes(x=year,y=pay,color=team,shape=position,size=height))
gp_point <- gp + geom_point()
plot(gp_point)

タイトルや軸ラベルも書いておきましょう。

gp <- ggplot(baseball,aes(x=year,y=pay,color=team,shape=position))
gp_point <- gp + geom_point()+xlab("プレイ期間")+ylab("年俸")+ggtitle("野球選手の年棒とプレイ期間の関係")
plot(gp_point)

画を複数に分けることもできます。

gp <- ggplot(baseball,aes(x=year,y=pay,color=team,shape=position))
gp_point <- gp + geom_point()+facet_wrap(~team)
plot(gp_point)

横軸がカテゴリカルであれば,箱ひげ図や棒グラフになります。

gp <- ggplot(baseball,aes(x=team,y=pay,fill=position))
gp_box <- gp + geom_boxplot()
plot(gp_box)

gp_bar <- gp + geom_bar(stat="identity",position="dodge")
plot(gp_bar)

# 平均が見たい
gp_bar <- gp + stat_summary(fun.y=mean,geom="bar",position="dodge")
plot(gp_bar)

# 中央値が見たい
gp_bar <- gp + stat_summary(fun.y=median,geom="bar",position="dodge")
plot(gp_bar)

エラーバーを追加する例。

gp <- ggplot(baseball,aes(x=position,y=pay,fill=position))
gp_bar <- gp + stat_summary(fun.y=mean,geom="bar",position="dodge") + 
                stat_summary(fun.data=mean_se,geom="errorbar",width=0.5)
plot(gp_bar)

様々な角度からデータをプロットし,分布の形状や変数間関係をしっかり見極める癖をつけましょう。

本日の課題

  • 野球選手のBMIを計算してください。計算した値は,同じデータセットにBMIという変数を作って入れてください。
  • 年俸と守備位置とBMIの関係をグラフにして表現してください。何グラフを用いても良い。