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)
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をインストールします。
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)
様々な角度からデータをプロットし,分布の形状や変数間関係をしっかり見極める癖をつけましょう。