データ処理とグラフ作成

前田 和寛(@kazutan)
2014/11/29

R勉強会@広島(Hijiyama.R)

自己紹介

所属

比治山大学短期大学部

Twitter

@kazutan

キーワード

#ビールうめぇ

kazutan

免責事項

ペース速いです

  • 量が多く、時間の制約上…
  • 「後から詰まった時に見直してもらう」というコンセプトで作っております

やり方はいろいろ

  • 今回は組み込み関数を中心に説明
  • いろんなパッケージを使うと色々捗る
    • でもそれはまたの機会に

データ処理

  • データの読み込み
  • データフレーム要素へのアクセス
  • subset関数を使ってアクセス
  • データの操作
  • データフレームの結合
  • おすすめ書籍

データの読み込み(1)

CSVファイルからの読み込み

“data.csv"というファイルを読み込むなら…

x <- read.csv("data.csv")

一行目に変数名がある場合は自動で読み込みますが、うまく行かない時は…

x <- read.csv("data.csv", header = TRUE)
  • 最初の引数はファイル名(ファイルパス)

データの読み込み(2)

Excelフィアルからの読み込み

XLConnectパッケージが必要です

  # パッケージインストール
install.packages("XLConnect")
  # パッケージ読み込み
library(XLConnect)

  # ekusu.xlsxの一つ目のシートを読み込む
x <- readWorksheetFromFile("ekusu.xlsx", sheet = 1)

でも正直なところ、csvファイルに落としこんで読み込んだほうがいいですよ

データの読み込み(3)

クリップボードから読み込む(Windows)

あらかじめExcelなどで読み込ませたいデータをコピーして…

x <- read.table("clipboard", header = TRUE)
  • 先頭行が変数名ではない場合は、header = FALSE
  • Linuxでも同じコマンドで行けますが、日本語が混じると文字コード問題が発生します
  • Macの場合は以下のコードを実行
x <- read.table(pipe('pbpaste'), header = TRUE)

データの読み込み(4)

GUIでファイルを選択

(1)で指定したファイル名を以下のように変更

x <- read.csv(file.choose())
  • 実行すると、ファイルを選択するダイアログボックスが出てきます
  • 要するに「ファイル名をGUIで選択して、file.choose()の場所に放り込む」ことをしてます

データフレームの要素へアクセス(0)

これが基本かつ重要

  • データハンドリングは「操作したいターゲットを指定」が第一歩
    • 操作したいターゲットを指定可能→あとはそれを処理すればいい
    • 逆にこれができないと何もできない
    • Rで最初につまづくポイント
  • ここからはRに組み込まれているirisデータを使っていきます

データフレームの要素へアクセス(1)

行番号・列番号を使ったアクセス

行番号を指定したアクセス

iris[3,]  #3行目(全部)にアクセス
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
3          4.7         3.2          1.3         0.2  setosa

列番号を指定したアクセス(最初の5行だけ)

head(iris[,2],5)  #irisの2列目にアクセス
[1] 3.5 3.0 3.2 3.1 3.6

データフレーム要素へのアクセス(2)

複数の行番号(や列番号)へのアクセス

iris[21:24,]  #21行目から24行目へのアクセス
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
21          5.4         3.4          1.7         0.2  setosa
22          5.1         3.7          1.5         0.4  setosa
23          4.6         3.6          1.0         0.2  setosa
24          5.1         3.3          1.7         0.5  setosa

データフレーム要素へのアクセス(3)

行番号と列番号を指定してアクセス

iris[21:24,1:3]  #21-24行目の1-3列目へのアクセス
   Sepal.Length Sepal.Width Petal.Length
21          5.4         3.4          1.7
22          5.1         3.7          1.5
23          4.6         3.6          1.0
24          5.1         3.3          1.7

データフレーム要素へのアクセス(4)

ある列(番号)を除外してアクセス

iris[21:24,-5]  #21-24行目から、5列目を除外
   Sepal.Length Sepal.Width Petal.Length Petal.Width
21          5.4         3.4          1.7         0.2
22          5.1         3.7          1.5         0.4
23          4.6         3.6          1.0         0.2
24          5.1         3.3          1.7         0.5
  • マイナス記号をつけると「それは除外しろ」という意味に

データフレーム要素へのアクセス(5)

複数列(番号)を除外してアクセス

iris[21:24,-4:-5]  #21-24行目から4,5列目を除外
   Sepal.Length Sepal.Width Petal.Length
21          5.4         3.4          1.7
22          5.1         3.7          1.5
23          4.6         3.6          1.0
24          5.1         3.3          1.7
  • 応用するとこんなことも可能

データフレーム要素へのアクセス(6)

変数名(列名)を使ってアクセス

head(iris$Sepal.Width,3)
[1] 3.5 3.0 3.2
  • データフレーム名$変数名 で指定可能
  • もしデータフレーム内の変数リストがほしい時はこちら
ls(iris)  #iris内の変数(オブジェクト)リストを出力
[1] "Petal.Length" "Petal.Width"  "Sepal.Length" "Sepal.Width" 
[5] "Species"     

subset関数を使ってアクセス(1)

selectオプションで列番号指定してアクセス

head(subset(iris, select = 2:3),3) #irisの2-3列
  Sepal.Width Petal.Length
1         3.5          1.4
2         3.0          1.4
3         3.2          1.3
  • subset関数はデータフレーム(行列)の列要素にききます
  • subset(データフレーム, select=対象列)でアクセス可能
    • 数値を指定すれば列番号
    • コロンでつなげば連番として処理

subset関数を使ってアクセス(2)

変数名(列名)を使ってアクセス

head(subset(iris,select = Sepal.Width),3)
  Sepal.Width
1         3.5
2         3.0
3         3.2
  • selectオプションに変数名をいれてもOK

subset関数を使ってアクセス(3)

複数の変数名(列名)を使ってアクセス

head(subset(iris, select = c(Sepal.Length,Sepal.Width)),3)
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
  • 複数列を変数名で指定したいときは、c関数で束ねよう
    • ここの本当のポイントは「selectオプションはベクトルでもOK」
    • 要するに「必要な変数名を何かで束ねてselectに送り込めばOK」

subset関数を使ってアクセス(4)

変数の並びを使ってアクセス

head(subset(iris, select = Sepal.Length:Petal.Length),3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
  • なんと変数名の並びでも指定可能
  • データフレームで並んでいる順にアクセス
    • Sepal.Lengthは1列目、Petal.Lengthは3列目
    • なので1列目から3列目にアクセス

subset関数を使ってアクセス(5)

除外する変数を指定

head(subset(iris,select = -c(Sepal.Length,Species)),2)
  Sepal.Width Petal.Length Petal.Width
1         3.5          1.4         0.2
2         3.0          1.4         0.2
  • selectで指定するものにマイナス記号をつければOK
    • 複数の場合は今回の例みたいにすれば可能

subset関数を使ってアクセス(6)

条件を指定してアクセス

subset(iris,select=2:3, subset=Sepal.Width>4.0)
   Sepal.Width Petal.Length
16         4.4          1.5
33         4.1          1.5
34         4.2          1.4
  • subset関数のsubsetオプションで、条件を指定すればOK
    • 今回だとSepal.Widthが4より大きいレコード(行)を抽出

データの操作(1)

変数の変換(他の変数へ)

iris2 <- transform(iris, kazu=Sepal.Width+5)
head(iris2,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species kazu
1          5.1         3.5          1.4         0.2  setosa  8.5
2          4.9         3.0          1.4         0.2  setosa  8.0
3          4.7         3.2          1.3         0.2  setosa  8.2
  • transform関数で変数(列)の変換が可能
    • transform(データフレーム, 対象列=計算式)

データの操作(2)

変数の変換(更新)

先ほどのiris2データフレームを使います

iris2 <- transform(iris2, kazu=kazu^2)
head(iris2,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species  kazu
1          5.1         3.5          1.4         0.2  setosa 72.25
2          4.9         3.0          1.4         0.2  setosa 64.00
3          4.7         3.2          1.3         0.2  setosa 67.24
  • 対象列を既存の変数にするとその計算式で更新

データの操作(3)

欠損値がある行の除去

  • 下のデータxを使用
   x  y
1  1 11
2  2 12
3  3 NA
4 NA 14
5  5 15
  • 右上のコードを実行
x[complete.cases(x),]
  x  y
1 1 11
2 2 12
5 5 15
  • これを何かオブジェクトに入れればOK
  • 分析の際には、na.rmオプションで指定していく方法も

データの操作(4)

行和の算出

head(iris[,1:3],3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
head(rowSums(iris[,1:3]),3)
[1] 10.0  9.3  9.2
  • 複数項目の合計得点を算出する時に

データの操作(5)

行平均の算出

head(iris[,1:3],3)
  Sepal.Length Sepal.Width Petal.Length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
head(rowMeans(iris[,1:3]),3)
[1] 3.333333 3.100000 3.066667
  • 使い方はrowSums関数と同一

データフレームの結合(0)

サンプル1: x

  a b  c
1 1 A 11
2 2 B 12
3 3 C 13

サンプル2: y

  a b  d
1 2 B 12
2 3 C 13
3 4 D 14

データフレームの結合(1)

両方に含まれる列をキーとして結合

merge(x,y)
  a b  c  d
1 2 B 12 12
2 3 C 13 13
  • xとyで共通する列(aとb)が一致する行のみを取り出す
    • xとyの片方しかない列は、それぞれ残る(列数が増える)

データフレームの結合(2)

両方を網羅して結合

merge(x,y,all=TRUE)
  a b  c  d
1 1 A 11 NA
2 2 B 12 12
3 3 C 13 13
4 4 D NA 14
  • 共通する列(aとb)をキーとして結合
    • データがないところにはNAが入る

データ操作で躓いた時は…

おすすめ書籍

改訂2版 R言語逆引きハンドブック

  • 初心者から中級者向け
  • やりたいことはほぼこれに書いてあります
  • 持ってない人はぜひ買いましょう

gyakubiki

グラフ作成

  • ggplot2パッケージ
  • qplotを使った散布図作成
  • その他のグラフ作成
  • おすすめ書籍

ggplot2パッケージ

  • グラフ作成用パッケージ
    • 綺麗なグラフが比較的楽にかける
    • レイヤー構造
    • あちこちでよく見かけるようになった
    • 簡易版のqplotもある
  • パッケージをインストール&読み込み
install.packages("ggplot2")
library(ggplot2)

qplotを使った散布図作成(1)

基本の形

qplot(Sepal.Length, Sepal.Width, data=iris)
  • 最初に横軸の変数を
  • 次に縦軸の変数を
  • dataオプションで、使用するデータセットを指定

plot of chunk unnamed-chunk-37

qplotを使った散布図作成(2)

タイトルの追加

qplot(Sepal.Length, Sepal.Width, data=iris, main="kazutan")
  • mainオプションでタイトルを追加

plot of chunk unnamed-chunk-40

qplotを使った散布図作成(3)

軸ラベルの追加

qplot(Sepal.Length, Sepal.Width, data=iris, xlab="yoko", ylab="tate")
  • xlabオプションで横軸ラベルを設定
  • ylabオプションで縦軸ラベルを設定

plot of chunk unnamed-chunk-43

qplotを使った散布図作成(4)

軸の範囲を指定

qplot(Sepal.Length, Sepal.Width, data=iris, xlim=c(0,7), ylim=c(1,8))
  • xlimで横軸の範囲を、ylimで縦軸の範囲を指定
    • c(1,8)といった書式で与える必要あり

plot of chunk unnamed-chunk-46

qplotを使った散布図作成(5)

水準による色分け

qplot(Sepal.Length, Sepal.Width, data=iris, color=Species)
  • colorオプションにFactor型の変数を入れる
    • イギリス式のcolourというオプションでもOK

plot of chunk unnamed-chunk-49

qplotを使った散布図作成(6)

水準による形状分け

qplot(Sepal.Length, Sepal.Width, data=iris, shape=Species)
  • shapeオプションでマーカーで分けれます

plot of chunk unnamed-chunk-52

qplotを使った散布図作成(7)

平滑線を入れる

qplot(Sepal.Length, Sepal.Width, data=iris, geom=c("point","smooth"))
  • geomオプションはグラフの型を指定
    • “point”は散布図
    • “smooth”は平滑線
    • c()で束ねて重ね書きしてある

plot of chunk unnamed-chunk-55

qplotを使った散布図作成(7)

回帰直線を入れる

qplot(Sepal.Length, Sepal.Width, data=iris, geom=c("point", "smooth"), method="lm")
  • methodオプションで"lm"を指定
  • 直線の周りは95%信頼区間

plot of chunk unnamed-chunk-58

その他のグラフ作成(1)

箱ひげ図

qplot(Species, Sepal.Width, data=iris, geom="boxplot")
  • geom=“boxplot"で箱ひげ図
    • 横軸はFactor型を使う

plot of chunk unnamed-chunk-61

その他のグラフ作成(2)

棒グラフ(水準事の数え上げ)

qplot(Species, data=iris, geom="bar")
  • geom=“bar"で棒グラフ
    • 横軸に頻度を比較したい変数を
    • 今回は各水準とも数が揃っている

plot of chunk unnamed-chunk-64

その他のグラフ作成(3)

棒グラフ(すでに要約値がある場合)

xy <- data.frame(x = c("A","B","C"), y = c(3.5,4.5,4.2))
qplot(x, data=xy, geom="bar", weight=y)
  • weight=yで、xの頻度(ここでは全て1)に、yの各値を重み付け
    • もっと別の方法があるけど、今回はこれで

plot of chunk unnamed-chunk-67

その他のグラフ作成(4)

時系列グラフ

xy <- data.frame(x = 2010:2014, y = c(3.5, 4.5, 4.2, 4.9, 5.2))
qplot(x, y, data=xy, geom="line")
  • geom=“line"で折れ線

plot of chunk unnamed-chunk-70

グラフ作成は深い…

ggplot2の書籍

グラフィックスのためのRプログラミング

  • 細かい設定方法や理念などが書いてあります
  • 後ろにあるので手にとって読んでみてください
  • Webにも紹介記事はたくさんあります