毎回やる儀式

Rの基礎

前期にある程度やっていますので,ここは各自で復習しておいてください。

Rは一問一答式のプログラム言語です。 四則演算,関数の使い方,代入方法などについて順に説明していきます。 å ### 四則演算

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

関数を使う

sqrt(4)
## [1] 2
help(sqrt)

オブジェクトに代入する

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

データ・ハンドリング

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

# ファイルを読み込んでbaseballという名前にする
# ファイルのコード形式は今回UTF-8
# head=Tは「1行目が変数名ですよ」という意味
baseball <- read.csv("ball2017.csv",fileEncoding = "UTF-8",head=T)

# 要約を見る
summary(baseball)
##            name              team        league       height     
##  T-岡田    : 1   ソフトバンク: 8   Central:36   Min.   :171.0  
##  ウィーラー  : 1   巨人        : 8   Pacific:42   1st Qu.:177.0  
##  エルドレッド: 1   広島        : 8                Median :180.0  
##  ゲレーロ    : 1   日本ハム    : 8                Mean   :180.7  
##  ダフィー    : 1   オリックス  : 7                3rd Qu.:183.8  
##  デスパイネ  : 1   西武        : 7                Max.   :198.0  
##  (Other)     :72   (Other)     :32                               
##      weight             PA              AB              HR       
##  Min.   : 66.00   Min.   :156.0   Min.   :137.0   Min.   : 0.00  
##  1st Qu.: 79.25   1st Qu.:310.2   1st Qu.:270.8   1st Qu.: 3.00  
##  Median : 86.00   Median :469.0   Median :402.5   Median : 9.00  
##  Mean   : 87.95   Mean   :437.6   Mean   :382.9   Mean   :12.67  
##  3rd Qu.: 95.00   3rd Qu.:575.5   3rd Qu.:503.8   3rd Qu.:19.75  
##  Max.   :122.00   Max.   :679.0   Max.   :575.0   Max.   :35.00  
##                                                                  
##        K               pay       
##  Min.   : 21.00   Min.   : 4300  
##  1st Qu.: 56.25   1st Qu.: 7000  
##  Median : 73.00   Median :11000  
##  Mean   : 77.55   Mean   :15772  
##  3rd Qu.: 99.50   3rd Qu.:22375  
##  Max.   :157.00   Max.   :50000  
## 
# データの頭,最後だけ見る
head(baseball)
##           name         team  league height weight  PA  AB HR   K   pay
## 1     T-岡田   オリックス Pacific    187    100 593 504 31 141 10000
## 2   ウィーラー         楽天 Pacific    178    100 605 542 31  98 10000
## 3 エルドレッド         広島 Central    196    122 405 344 27 111 11000
## 4     ゲレーロ         中日 Central    182     99 510 469 35  98 15000
## 5     ダフィー       ロッテ Pacific    191     98 183 164  6  61  8200
## 6   デスパイネ ソフトバンク Pacific    175     95 545 478 35 119 40000
tail(baseball)
##          name         team  league height weight  PA  AB HR   K   pay
## 73 明石 健志 ソフトバンク Pacific    175     66 339 290  1  57  5500
## 74 柳田 悠岐 ソフトバンク Pacific    188     93 551 448 31 123 26500
## 75       雄平     ヤクルト Central    174     83 300 281  2  42  7000
## 76   陽 岱鋼         巨人 Central    183     89 381 330  9  80 16000
## 77 鈴木 誠也         広島 Central    181     90 512 437 26  80  6000
## 78 鈴木 大地       ロッテ Pacific    175     79 588 508 11  85 10000

データの部分抽出

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

# 抜き出す関数
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.6888977
## weight 0.6888977 1.0000000

探索的データプロット

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

histやplotなどの基本的な描画関数でも図を書くことはできますが,この授業ではggplot2というパッケージを推奨します。 その理由は,「図版の設計図に基づく書き方をする」,という考えがしっかりと身につくからです。

ggplotでは,一枚の図を書くのに次のような手順をとります。

  1. まず描画するカンバスを用意する。データは何で,x軸,y軸は何にする,群わけ・色分けどうしよう,というのを決める
  2. それから何を書くかを決める。
  • 散布図(geom_point)
  • 折れ線(geom_line)
  • ヒストグラム(geom_histogram)
  • 密度曲線(geom_density)
  • 棒グラフ
  • 箱ひげ図(geom_boxplot)
  1. 分割表示の指定,色・フォントの指定,軸ラベルの指定などがあれば追加する
  2. 描画する

最初に自分がどういう絵を描くか,イメージしてください!

注意点

データは「データフレーム型」で渡す必要があります。 read.csvなどで読み込んだ場合はデータフレーム型にもうなっているので気にしなくていいです。

また,群わけなどを行う場合は,「factor型」(名義尺度水準)になっていることが重要です。 str関数などで,ファイルの形をしっかり確認しておきましょう。

str(baseball)
## 'data.frame':    78 obs. of  10 variables:
##  $ name  : Factor w/ 78 levels "T-岡田","ウィーラー",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ team  : Factor w/ 12 levels "DeNA","オリックス",..: 2 6 8 11 5 3 5 4 11 8 ...
##  $ league: Factor w/ 2 levels "Central","Pacific": 2 2 1 1 2 2 2 1 1 1 ...
##  $ height: int  187 178 196 182 191 175 191 185 185 180 ...
##  $ weight: int  100 100 122 99 98 95 91 100 108 91 ...
##  $ PA    : int  593 605 405 510 183 545 289 519 367 252 ...
##  $ AB    : int  504 542 344 469 164 478 269 445 332 219 ...
##  $ HR    : int  31 31 27 35 6 35 10 32 18 15 ...
##  $ K     : int  141 98 111 98 61 119 97 112 52 72 ...
##  $ pay   : int  10000 10000 11000 15000 8200 40000 14000 33000 17000 7340 ...

ggplot2の導入

持ってない人は,探索的データプロットのパッケージ,ggplot2をインストールしてください。

install.packages("ggplot2")

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

library(ggplot2)

# 次のコードはマックユーザ必須。フォントサイズとフォントの指定をしています。
# Windowsユーザは特にしなくても文字化けとかしないので気にしなくてOK
ggplot()+theme_set(theme_bw(base_size = 14,base_family="HiraKakuProN-W3"))

1.カンバスの用意

まずはデータと全体設定を持ったggplotオブジェクトを作ります。 aesはaesthetic(美学)の意味です。x軸,y軸の指定,色分けの指定をまずします。

# データセットをわたし,その中の変数でx軸,y軸の情報を追加。
gp <- ggplot(baseball,aes(x=height,y=K,color=team))

点を打ってみましょう。

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

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

gp <- ggplot(baseball,aes(x=height,y=K,color=team,shape=league,size=weight))
gp_point <- gp + geom_point()
plot(gp_point)

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

gp_point <- gp + geom_point()+xlab("身長")+ylab("三振の数")+ggtitle("野球選手の身長と三振の関係")
plot(gp_point)

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

gp_point <- gp + geom_point()+facet_wrap(~team)
plot(gp_point)

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

# チームごとの年収に変えます
gp <- ggplot(baseball,aes(x=team,y=pay,fill=team))
# 箱ひげ図
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_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)

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

本日の課題

もう一つのデータセットを読み込んでグラフを描くのが課題です。

  • 次の図を描くコードを提出してください。

ヒント;baseballのデータセットを使います。

ヒント;owarai1.csvのデータセットを使います。

ヒント;owarai2のデータセットを使います。