<#>
続
はじめての
TOKYO.R #33
簑田 高志
目次
1. 自己紹介
2. 前回までのあらすじ
3. 続・はじめてのR
4. まとめ
※ スクリーンショットや機能等はMac版となります。
• 名前 :簑田 高志
• Twitter :aad34210
• ブログ :http://pracmper.blogspot.com/
• 出身地 :熊本県
• 出身学部 :法学部
• 仕事 :インターネット広告のビジネスアナリ
スト
自己紹介
前回までのあらすじ
• はじめてRをさわる方、Rを触り初めて数カ月の方に向
けて、Rの基礎的な部分をお話ししました。
• どんな内容だったかというと…
1. インストール
2. 起動と終了
3. demo()の利用
4. データへのアクセス方法
5. データ集計方法
6. 関数
7. 自作関数(Function)
8. パッケージ
• 前回の資料はSlideshareに公開しています。
 http://www.slideshare.net/aad34210/tokyo-r18
今回の話
• 今回の話は前回の続き。
• Rの基礎編です。
i. 条件分岐
ii. ループ
iii.グラフ作成
iv.統計解析
• 資料中は、コードと例文を以下のようにハイライト
しています。
• 基本コード:Sample
• 例文: Sample
そんな話を知ってるよ!という方は…
• 私は初心者ではないので、そんな話
は聞かなくても大丈夫!という方。
• そういう方は…
この本をAmazonで注文し
ておいてください。
今日のTokyoRに参加している人が!
持ってくるとサインもらえるかも?!
そんな話を知ってるよ!という方は…
• 最近はこういう本も出されたようで
…
¥2,079 by Amazon
• 持ってくるとサインを貰えるかも。
<#>
条件分岐
条件分岐
• ある条件で場合分けをしたい場合に利用する。
値:A
条件
値:Z 値:K
A >= 0 → K
A < 0 → Z
条件分岐
• 条件分岐とは?
• ある条件で場合分けをしたい場合はIf文、Else文を使う。
• if (条件文){処理内容}
• 例えば…
• 売上金額が10万以上であれば、A-Class、それ以外はOther。
x <- 100000
if (x >= 100000)
{print ("A-Class")} else {print("Other")}
条件分岐
• IFELSE文
• IFELSE文で一つのコードでIF文ができる。
• ifelse(条件,データが真の場合,偽の場合)
• 例えば…
• 売上金額が10万以上であれば、Aクラス、それ以外はOther。
x <- 100000
ifelse(x >= 100000 , "A-Class" , "B-Class")
条件分岐
• SWITCH文
• 複数の条件で分岐させたい場合
• switch(データ,ケース1 , ケース2 , 一致する場合がないケース)
• 例えば…
• Tokyoから売上が上がっている場合は、Japanを。それ以外はOther
city <- "Tokyo”
switch(city ,"Tokyo" = print("Japan") , print("Other"))
<#>
ループ
ループ
• For文は他のプログラミング言語と同じように、「繰り返し」処理ができ
る。
• 幾つもの同じような処理をコピペして処理をさせなくても、ループ処理
を利用することにより、大幅に作業時間を減らすことができる。
処理A
処理A 処理A
処理A 処理A
4回同じ処理を繰り返す
繰り返し文を利用
して処理を4回行
う。
FOR文
• For文
• ある処理を繰り返し行いたい場合に利用する。
• for (ループ変数 in リスト) {処理}
• 例えば…
• 1〜5までを合計する。
• ベクトルを表示させる。
x <- 0
for (i in 1:5) {x <- x +1}
x
x <- c(10000 , 20000 , 30000)
for (i in 1:length(x)){print(x[i])}
WHILE文
• While文
• ある条件が成り立っている場合にずっとループ処理をし続ける。
• 注意:ずっと条件が成り立っている場合は、無限ループしてしまう
ので、気をつけること。
• while (条件式) {処理}
• 例えば…
• 5以下を足し続ける。
x <- 0
while (x <= 4) {x <- x +1}
x
例題(1)
• IF文(条件分岐)、For文(繰り返し)、Function(自作関数(前回説
明))を組み合わせると、処理がまとまり、関数化することができる。
• → 処理の自動化が可能。
for (i in 1:100) {print(ifelse( i%%2 == 0 , "Fizz" , i ))}
• 問題
• 1〜100までの数字の中で、2の倍数であれば、“Fiz”、それ以外は数を
表示するプログラムを作成しなさい。
• 回答
• For文で1:100までをベクトル生成
• 2の倍数:“%%”で余りを計算
• 2の倍数の余りをIFELSE文で判定。
• Print文で表示
例題(2)
• 前のページの問題は意外とすぐにとける
• 問題
• 1〜100までの数字の中で、
• 3の倍数 :“Aho” と表示
• 5 の倍数 :“アホ” と表示
• 回答
• For文で1:100までをベクトル生成
• 3の倍数:“%%”で余りを計算し割り切れる数を判定
• 5の倍数:“%%”で余りを計算し割り切れる数を判定
• それぞれIF文で“Aho”か“アホ”か判定
• Print文で表示
• では、世界のナベアツでやってみよう。
例題(3)
for( i in 1:100) {
if (i%%3 == 0 ) {print("Aho")}
else if (i%%5 == 0) {print("アホ")}
else {print(i)}
}
nabeatsu <- function(n , baisuu1 , baisuu2) {
for( i in 1:n) {
if (i%%baisuu1 == 0 ) {print("Aho")}
else if (i%%baisuu2 == 0) {print("アホ")}
else {print(i)}
}
}
関数化(Function)にしてみよう。
利用する変数
・ベクトル数 :n
・Ahoと表示する倍数 :baisuu1
・アホと表示する倍数 :baisuu2
例題(3)本当の世界のナベアツを実装してみた
• 問題で使ったナベアツ問題
• 1〜100までの数字の中で、
• 3の倍数 :“Aho” と表示
• 5 の倍数 :“アホ” と表示
• 本当のナベアツは…
• 1〜100までの数字の中で、
• 3の倍数 :“Aho” と表示
• 3のつく倍数 :“アホ” と表示
3のつく倍数をアホに
しなきゃいけない
• 数字のベクトルであれば「%%」を利用することで、判定が可能。
• でも「3がつく数」ってどう判定するのか?
• → grepを利用して判定すれば良いかも。
例題(3)本当の世界のナベアツを実装してみた
# 3の倍数はアホ、3の着く数字はAho
true_nabeatsu <- function(n , baisuu1 , baisuu2) {
for( i in 1:n) {
if (i%%baisuu1 == 0 ) {print("Aho")}
else if (!i%%baisuu2|grepl(baisuu2,i) == TRUE) {print("アホ")}
else {print(i)}
}
}
true_nabeatsu(100 , 5 , 3)
• 問題
• 1〜100までの数字の中で、
• 3の倍数 :“Aho” と表示
• 3がつく数 :“アホ” と表示
<#>
グラフ作成
グラフ作成
• データを解析する前に、変数がどのような分布になっているかをビジュ
アルで確認して、データの分布等を確かめる。
• 結果をレポートとしてまとめ、レビュアー(報告者)への理解を深める
ためにグラフを作成する。
• グラフ作成は「奥が深い」ため、今回は代表的なグラフのみ紹介して、
残りのパッケージ等はAppendixとして紹介します。
1,2,3,
4,5,6,
7,8,9
…
データ
Sepal.Length
2.0 2.5 3.0 3.5 4.0 0.5 1.0 1.5 2.0 2.5
4.55.56.57.5
2.02.53.03.54.0
Sepal.Width
Petal.Length
1234567
4.5 5.5 6.5 7.5
0.51.01.52.02.5
1 2 3 4 5 6 7
Petal.Width
Edgar Anderson's Iris Data
-35-30-25-20-15-10
165 170 175 180 185
165 170 175 180 185 165 170 175 180 185
-35-30-25-20-15-10
long
lat
100 200 300 400 500 600
Given : depth
1 2 3 4 5 6 7 8 9 10
0246
Notched Boxplots
Group
散布図
• データがどのような散らばり具合をしているのかを調査したい場合、散
布図を描きます。
• plot(x , y)
#ベクトルの表示
data <- c(1:100)
plot(data)
#irisのSepal.lengthとSepal.Widthの散布図
plot(iris[,1] , iris[,2])
0 20 40 60 80 100
020406080100
Index
data
#ベクトルの表示
4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0
2.02.53.03.54.0
iris[, 1]
iris[,2]
#irisのSepal.lengthと
Sepal.Widthの散布図
散布図
• 変数が多くある場合、変数の1つずつの組み合わせだと手間がかかるので、
一気に組み合わせてみてみたい場合。
• plot(dataframe)
• pars(dataframe)
#複数変数の散布図組合せ(対散布図)
plot(iris[-5])
#複数変数の対散布図(種類による色分け)
pairs(iris[1:4], pch = 21,bg = c("red" , "green3" ,
"blue")[unclass(iris$Species)])
Sepal.Length
2.0 2.5 3.0 3.5 4.0 0.5 1.0 1.5 2.0 2.5
4.55.56.57.5
2.02.53.03.54.0
Sepal.Width
Petal.Length
1234567
4.5 5.5 6.5 7.5
0.51.01.52.02.5
1 2 3 4 5 6 7
Petal.Width
散布図
Sepal.Length
2.0 2.5 3.0 3.5 4.0 0.5 1.0 1.5 2.0 2.5
4.55.56.57.5
2.02.53.03.54.0
Sepal.Width
Petal.Length
1234567
4.5 5.5 6.5 7.5
0.51.01.52.02.5
1 2 3 4 5 6 7
Petal.Width
#複数変数の散布図組合せ(対散布図) #複数変数の対散布図(種類による色分け)
線グラフ(折れ線グラフ)
• データがどのように変化しているのかを分かるようにする。
• 実は折れ線グラフは散布図にラインを引いただけなので比較的簡単に作
成できます。(type = “l”を指定)
• plot(データ , type = “l”)
#aho_dataを使って折れ線グラフ
plot(aho_data[,1] , type = "l”)
0 20 40 60 80 100
020406080100
Index
aho_data[,1]
棒グラフ(1)
• データがどの因子でどのぐらいボリュームになっているかを一目で分か
る。
• barplot(データ)
#単純な棒グラフ
barplot(1:10)
#色つき棒グラフ
barplot(matrix(1:20, 5), col=rainbow(5))
0246810
#単純な棒グラフ
020406080
#色つき棒グラフ
棒グラフ(2)
• データがどの因子でどのぐらいボリュームになっているかを一目で分か
る。
• barplot(データ)
#種類ごとでの棒グラフ
barplot(table(iris[,5]))
#色を付けたい場合
barplot(table(iris[,5]),col = c("red" , "green" ,"yellow"))
#単純な棒グラフ #色つき棒グラフ
setosa versicolor virginica
01020304050
setosa versicolor virginica
01020304050
aho
01020304050
棒グラフ(3)
• 先ほどの“Aho”、“アホ”をそれぞれカウントして棒グラフを作ってみま
しょう。
#データフレームの作成
aho_data <- data.frame(1:100)
#グラフ用データの作成
aho_data$hantei <- ifelse(aho_data[,1]%%3 == 0,"aho",ifelse(aho_data[,1]%%5 == 0 ,"アホ","天才
"))
#Barplotの作成
barplot(table(aho_data[,2]) , col = c("green" , "blue" , "red"))
参考(1):ggplot2
• これまで紹介したのはRのデフォルトで利用できるパッケージ。
• 自分で色々と細かく設定できるのがメリットですが、簡単に綺麗なグラ
フを書きたい場合は、ggplot2というパッケージがおすすめ。
• 過去に発表しています。
• http://www.slideshare.net/aad34210/ggplot2-110129-6739813
参考(2):demo()
• demo()という関数を利用することで、パッケージの参照デモをみること
ができます。
#demo()のgraphicsを見てみる
demo(graphics)
Sepal.Length
2.0 2.5 3.0 3.5 4.0 0.5 1.0 1.5 2.0 2.5
4.55.56.57.5
2.02.53.03.54.0
Sepal.Width
Petal.Length
1234567
4.5 5.5 6.5 7.5
0.51.01.52.02.5
1 2 3 4 5 6 7
Petal.Width
Edgar Anderson's Iris Data
-35-30-25-20-15-10
165 170 175 180 185
165 170 175 180 185 165 170 175 180 185
-35-30-25-20-15-10
long
lat
100 200 300 400 500 600
Given : depth
1 2 3 4 5 6 7 8 9 10
0246
Notched Boxplots
Group
参考(3):グラフサンプル集
• ネット上では有益なサンプル集がありますので、それを利用しない手は
ありません。
■R Graphical Manual
http://rgm2.lab.nig.ac.jp/RGM2/images.php?show=all&pageID=1958
• 過去に発表しています。
• http://www.slideshare.net/aad34210/tokyo-r-no8
<#>
統計解析
統計解析
• グラフ作成と同様に奥のふかーい分野。
• 今回はデータ全体がどのような分布になっているかを簡単に調査するための関数を紹
#最大値
max(aho_data[,1])
#最小値
min(aho_data[,1])
#レンジ(最大値、最小値)
range(aho_data[,1])
#平均
mean(aho_data[,1])
#中央値
median(aho_data[,1])
#四分位点
quantile(aho_data[,1] )
#サマリ(平均値、中央値、四分位点)
summary(aho_data[,1])
各種統計パッケージの話は、過去や今後のTokyoRで見てみてください!
<#>
まとめ
まとめ
• IF文
• 条件分岐をさせたい時に利用する。ifelse も使えるよ
• For文
• 繰り返し処理を行いたい場合に利用する。
• 条件が正の場合に繰り返し処理をするWhileもある。
• FizzBuzz
• IF文とFor文を使って、FizzBuzz問題を解く。
• 世界のナベアツもできるよ!
• グラフ作成
• 奥の深い世界…
• demo(graphics)で試してみよう。
• plot,barplot
• ggplot2など様々なパッケージがある。
• 統計解析
• 簡単な関数で、統計量を計算することができる。
• max,min,range,quantile,summary
参考文献・資料
R-Tipe :http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
The R tips :http://ow.ly/9yFPs
ggplot2 :http://had.co.nz/ggplot/
ご清聴ありがとうございました
m(___)m

Tokyo r33 beginner