Post on 23-Jun-2015
<#>
続はじめての
TOKYO.R #21
簑田 高志
目次
1.自己紹介2.前回までのあらすじ3.続・はじめての R4. まとめ
※ スクリーンショットや機能等は 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 で注文しておいてください。(¥3,990)
今日の TokyoR に参加している人が!持ってくるとサインもらえるかも?!
これ前回もやりました
<#>
条件分岐
条件分岐• ある条件で場合分けをしたい場合に利用する。
値: A
条件
値: Z 値: K
A >= 0 → KA < 0 → Z
条件分岐• 条件分岐とは?
• ある条件で場合分けをしたい場合は If 文、 Else 文を使う。• if ( 条件文 ) {処理内容}
• 例えば…• 売上金額が 10 万以上であれば、 A-Class 、それ以外は Other 。
x <- 100000if (x >= 100000)
{print ("A-Class")} else {print("Other")}
条件分岐• IFELSE 文
• IFELSE 文で一つのコードで IF 文ができる。• ifelse( 条件,データが真の場合,偽の場合 )
• 例えば…• 売上金額が 10 万以上であれば、 A クラス、それ以外は Other 。
x <- 100000ifelse(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 <- 0for (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 の着く数字は Ahotrue_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…
データ
散布図• データがどのような散らばり具合をしているのかを調査したい場合、散布図を描きます。
• plot(x , y)
# ベクトルの表示data <- c(1:100)plot(data)#iris の Sepal.length と Sepal.Width の散布図plot(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)])
散布図
# 複数変数の散布図組合せ(対散布図) # 複数変数の対散布図(種類による色分け)
線グラフ(折れ線グラフ)• データがどのように変化しているのかを分かるようにする。• 実は折れ線グラフは散布図にラインを引いただけなので比較的簡単に作
成できます。 (type = “l” を指定)• plot( データ , type = “l”)
#aho_data を使って折れ線グラフplot(aho_data[,1] , type = "l”)
棒グラフ( 1 )• データがどの因子でどのぐらいボリュームになっているかを一目で分かる。
• barplot( データ )
#単純な棒グラフbarplot(1:10)#色つき棒グラフbarplot(matrix(1:20, 5), col=rainbow(5))
#単純な棒グラフ #色つき棒グラフ
棒グラフ(2)• データがどの因子でどのぐらいボリュームになっているかを一目で分かる。
• barplot( データ )
#種類ごとでの棒グラフbarplot(table(iris[,5]))#色を付けたい場合barplot(table(iris[,5]),col = c("red" , "green" ,"yellow"))
#単純な棒グラフ #色つき棒グラフ
棒グラフ( 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)
参考( 3 ):グラフサンプル集• ネット上では有益なサンプル集がありますので、それを利用しない手は
ありません。■R Graphical Manualhttp://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.htmlThe R tips : http://ow.ly/9yFPs ggplot2 :http://had.co.nz/ggplot/
ご清聴ありがとうございましたm(___)m