Chapter 3 データ

Rでデータ分析を行う前に、Rでのデータの使い方を理解する。

  • プログラミングの練習
  • 変数
  • Rのデータ構造(ベクトル、データフレーム、tibble)
  • 欠損値
  • 外部データの読み込み(csv, xlsx, その他SPSSやStataのファイルなど)
  • データの書き出し
  • サンプルデータ

3.1 はじめに(パッケージのロード)

この章ではtibble,readr,havenといったパッケージを使うので、あらかじめロードをしておく(未インストールの場合はインストールする必要あり。パッケージのインストール方法については第2章を参照のこと)。

library(tibble)
library(readr)
library(haven)

注意:
以降のプログラムでは、パッケージに入っている関数を呼び出す際に「XXXX::YYYY」というかたちでプログラムを書いている。

readr::read_csv("data.csv")

これらは「XXXXパッケージに入っているYYYYという名前の関数を使う」ということを意味している。XXXX::の部分は基本的に省略しても問題ないが、例えば複数のパッケージをロードしていて、同じ名前の関数が別のパッケージに含まれている場合には、思った通りの結果が表示されない場合もある。外部パッケージの関数を使う場合は、できる限りXXXX::を付けてどのパッケージの関数を使うのかを明示して使うのが良い。


3.2 プログラミングの練習

ここでは、Rで使える識別子(operator)の解説を通して、プログラミングの練習を行う。

3.2.1 コメント文

文頭に#を挿入すると、#から改行まではコメント文として理解され、プログラムが実行されない。スクリプトにメモを残しておきたいときに便利である。

#1 + 1 
#この部分は実行されない

3.2.2 算術識別子

+-*/で、四則演算(足し算・引き算・割り算・掛け算)を行える。

1 + 1 #足し算
## [1] 2
1 - 1 #引き算
## [1] 0
2 * 3 #掛け算
## [1] 6
10 / 2 #割り算
## [1] 5

他にも演算用の識別子として、^%%%/%がある。それぞれ、累乗、割り算の余り、割り算の整数部分の計算を結果を返す。

2 ^ 3 #2の3乗
5 %% 3 #5/3の余り
5 %/% 3 #5/3の整数部分

カッコ()を使うと、カッコ内の演算が優先される。

(1 + 3)/2
## [1] 2

3.2.3 比較識別子

数値の大小関係などを扱うときに用いる。その式が成り立っていればTRUE、成り立っていなければFALSEが出力される。

2 == 1 #2 と 1 は同じか?
## [1] FALSE
2 != 1 #2 と 1 は同じではないか?
## [1] TRUE
2 < 1 #2 は 1 よりも小さいか?
## [1] FALSE
2 <= 1 #2 は 1 以下か?
## [1] FALSE
2 > 1 #2 は 1 より大きいか?
## [1] TRUE
2 >= 1 #2 は 1 以上か?
## [1] TRUE

3.3 変数

数値を変数に代入して扱うことができる。

x = 5 + 8 
x
## [1] 13
y = x - 2 
y
## [1] 11

=の代わりに<-を使っても良い。

x <- 5 + 8
x
## [1] 13

変数の使い方の注意

Rは小文字と大文字を区別する。たとえば、a(小文字)と入力して実行すると結果が出力されるが、A(大文字)では出力されない。

a = 2 #aに2を代入する。
a - 2 #ゼロが出力されるはず。
A - 2 #Aでは答えが表示されない。Aという変数は作られていないので。

また、数値を全角で入力していないかにも注意すること。全角文字は数値ではなく、文字として認識される。数値は常に半角で入力すること。

x = 2 #半角の2
x =#全角の2

3.4 変数の型

R では変数の種類として、数値型文字列日付論理型の区別をする。

a = 1
b = "1"
c = as.Date("2020-06-15")
d = TRUE
#class()でその変数の型を確認することができる
class(a) 
class(b) 
class(c) 
class(d) 

3.4.1 数値型(numeric)

数値型として格納した変数は、数値として扱うことができる。数値型の変数同士で、演算(足し算・引き算・掛け算・割り算)を行うことができる。

x = 5
y = 1.2
x + y #数値型同士は演算することができる
## [1] 6.2

数値型には、整数型(integer)と浮動小数点型(double)の区別もある(データ分析においては意識して区別することはあまりない)。

x = 1.5
as.integer(x) #整数型に変換
## [1] 1
as.double(x) #浮動小数点型に変換
## [1] 1.5

3.4.2 文字列(character)

文字として扱われる。文字列同士は演算をすることができない。 文字を変数として代入したい場合は、文字をクオテーションマーク""で囲む。

x = "hello"
x
## [1] "hello"
y = "1" #数値でもクオテーションマークで囲むと文字として扱われる
y
## [1] "1"

同じ文字でも、因子型(factor)というものもある。因子型には順序情報を付与することができる。グラフで軸がカテゴリの場合で順序を並び替えたいときや、順序変数を用いた分析の際に活用することがある。

x = c("Good", "Very Bad", "Moderate", "Very Good", "Bad")
factor(x, ordered = TRUE, levels = c("Very Bad", "Bad", "Moderate", "Good", "Very Good"))
## [1] Good      Very Bad  Moderate  Very Good Bad      
## Levels: Very Bad < Bad < Moderate < Good < Very Good

3.4.3 日付(date)

Date型は日付のみを保存し、POSIXct型は日付と時間を保存する。 日付型同士で日数や秒数などの演算をすることができる。

x = as.Date("2020-06-15")

x_1 = as.POSIXct("2020-06-14 12:00")
x_2 = as.POSIXct("2020-06-15 12:00")
x_2- x_1
## Time difference of 1 days

3.4.4 論理型(logical)

TRUEFALSEの2つの値のどちらかを取る変数の型である。比較や条件式を扱う際に関わってくる。

x = TRUE
y = FALSE
x
## [1] TRUE
y
## [1] FALSE

3.5 データ構造

複数の数値や文字列などをまとめた構造を、データと呼ぶ。R には、データを扱うための形式がいくつか用意されている。

3.5.1 ベクトル

同じ型の要素を集めたものであり、最も単純なデータ型である。c()関数で、ベクトルを作成することができる。

x = c(1, 2, 3, 4, 5) #数値の並びのベクトル
x
## [1] 1 2 3 4 5
y = c("a", "b", "c", "d", "e") #文字の並びのベクトル
y
## [1] "a" "b" "c" "d" "e"

ベクトル[x]の表記でカッコの中に数値を入れると、そのベクトルの x 番目の要素を取り出せる。

x[2] #ベクトルxの2番目の要素
## [1] 2
y[3] #ベクトルyの3番目の要素
## [1] "c"

カッコの中に条件式を入れると、その条件に当てはまる要素を取り出せる。

x[x >= 3] #3以上の要素を取り出す
## [1] 3 4 5
y[y == "c"] #3cを取り出す
## [1] "c"
y[y != "c"] #3c以外を取り出す
## [1] "a" "b" "d" "e"

ベクトルが数値で構成されている場合は、演算をすることもできる。

x * 2 #ベクトル内の全ての要素に2を掛ける
## [1]  2  4  6  8 10
x_2 = c(6, 7, 8, 9, 10)
x + x_2 #(ベクトルに格納されている変数の数が同じならば、ベクトル同士で演算ができる)
## [1]  7  9 11 13 15

3.5.2 データフレーム

複数のベクトルを行列でまとめたデータ構造を、R ではデータフレームと呼ぶ。データフレームは頻繁に使うので、構造を覚えよう。

2つのベクトルを作成し、この2つのベクトルからなるデータフレームを作成する。data.frame()は、データフレームを作るための関数である。

x_vec = c(1, 2, 3, 4, 5)
y_vec = c("a", "b", "c", "d", "e")
dat = data.frame(x = x_vec, y = y_vec)
dat
##   x y
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e

データフレームでの変数の使い方

以下のように、データフレーム$変数名で、データフレームの変数をベクトルとして取り出すができる。

dat$x
## [1] 1 2 3 4 5

データフレームに新たに変数を加えることも出来る。

dat$x_2 = c(6, 7, 8, 9, 10)
dat
##   x y x_2
## 1 1 a   6
## 2 2 b   7
## 3 3 c   8
## 4 4 d   9
## 5 5 e  10
dat$x_3 = dat$x + dat$x_2
dat
##   x y x_2 x_3
## 1 1 a   6   7
## 2 2 b   7   9
## 3 3 c   8  11
## 4 4 d   9  13
## 5 5 e  10  15

データフレーム$変数名でデータ内の変数にアクセスする方法は、今後もよく使うので覚えておこう。

データの抽出

データフレーム[行数,列数]のかたちで指定することで、データフレームの行列を取り出すことができる。

dat[1, 2] #1行目, 2列目に該当する部分を抽出
## [1] "a"
dat[1,] #1行目を抽出(列を指定しなければ,データフレームの全ての列が抽出される)
##   x y x_2 x_3
## 1 1 a   6   7
dat[,1] #1列目を抽出(行を指定しなければ,データフレームの全ての行が抽出される)
## [1] 1 2 3 4 5
dat[1:3,] #1行目から3行目を抽出
##   x y x_2 x_3
## 1 1 a   6   7
## 2 2 b   7   9
## 3 3 c   8  11
dat[c(1,3,5),] #1行目, 3行目, 5行目を抽出
##   x y x_2 x_3
## 1 1 a   6   7
## 3 3 c   8  11
## 5 5 e  10  15

カッコ内に条件式を入れると、その条件と一致する部分を取り出せる。

dat[dat$x > 2,] #xが2を超える行を抽出
##   x y x_2 x_3
## 3 3 c   8  11
## 4 4 d   9  13
## 5 5 e  10  15
dat[dat$x > 2 & dat$y != "c",] #xが2を超え,かつyがc以外の行を抽出
##   x y x_2 x_3
## 4 4 d   9  13
## 5 5 e  10  15

3.5.3 tibble

更に、Rにはデータフレームの可読性を向上させたtibbleというデータ形式が用意されている。tibble形式のデータを扱うには、tibbleパッケージが必要となる。

as_tibble()でデータフレームをtibble形式にすることができる。Rにあらかじめ入っているサンプルデータirisを試しにtibble型にしてみよう。

dat_tibble = tibble::as_tibble(iris) 
dat_tibble
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ℹ 140 more rows

tibble形式のデータは、コンソールにデータ全てではなく最初の10行程度のみが表示される。列も画面に入る範囲のみが表示される。データの行数と列数、データの変数の型なども表示される。

tibbleだとデータをすべて閲覧することはできないが、すべて閲覧したい場合はView()を使えばよい。別ウィンドウが開いて、データを閲覧することができる。

View(dat_tibble)

3.6 欠損値

Rでは、欠損値(データが空の部分)はNAで扱う。

先程の例で作ったデータフレームdatに、欠損値を含む変数x_4を入れてみよう。

dat$x_4 <- c(1, 2, NA, 4, 5)
dat
##   x y x_2 x_3 x_4
## 1 1 a   6   7   1
## 2 2 b   7   9   2
## 3 3 c   8  11  NA
## 4 4 d   9  13   4
## 5 5 e  10  15   5
dat$x + dat$x_4
## [1]  2  4 NA  8 10

欠損値を含むベクトルは、計算に用いることができない。例えば、R には平均値を計算するためのmean()という関数がある。しかし、欠損値を含むベクトルの場合は結果が出力されない。

mean(dat$x_4) 
## [1] NA

関数によっては、欠損値を含むデータを使うときには欠損値の処理を指定する必要がある。例えば、mean()ならば、オプションとしてna.rm =TRUEを入れると欠損値を除いた上で平均値を計算してくれる。

mean(dat$x_4, na.rm = TRUE)
## [1] 3

3.7 データの読み込み

上述の例では自分でプログラムを書いてデータフレーム等を作成したが、大抵の場合はデータを ファイルなどに保存したデータを読み込んで使うことが多い。以下では、RでCSVやExcelファイルなどを読み込む方法を確認していく。

3.7.1 ワーキングディレクトリの設定

データを読み込む前に、ワーキングディレクトリ (Working directory)について理解する必要がある。ワーキングディレクトリとは、「現在居る場所」のことである。ファイルを読み込む際には、Rにデータがどこに有るかを教える必要がある。Rはワーキングディレクトリを起点にして、読み込むファイルを探す。

試しに、現在のワーキングディレクトリを確認しよう。以下のプログラムをコンソールに入力して実行する。

getwd()

出力された場所が、現在のワーキングディレクトリである。

読み込みたいファイルをデスクトップに保存してある場合を例として理解していこう。すなわち、デスクトップをワーキングディレクトリとして指定する必要がある。

ワーキングディレクトリをデスクトップに変更するには、以下のプログラムを書き込んで実行する。

#Windowsの場合
setwd("C:/Users/ユーザー名/Desktop") #ユーザー名には設定しているアカウント名を入れる。

#Macの場合
setwd("~/Desktop") 

#正しく設定されたかを確認する
getwd() 

3.7.2 外部ファイルの読み込み

csvファイルの読み込み

read.csv()関数で読み込むことが出来る。

dat = read.csv("data.csv") #ファイル名をクオテーションで囲んで入れる。ここでは読み込んだデータを「dat」という名前で保存した。

また、readrパッケージのread_csv()関数でもcsvファイルを読み込むことができる。更に、読み込まれたデータはtibble型になる。

read.csv()ではなく、read_csv()なので注意(ドットではなく、アンダースコア)。

library(readr)
dat = readr::read_csv("data.csv")

Excelファイルの読み込み

readxlパッケージのread_excel()で、xlsx形式のデータも読み込むことができる。

library(readxl)
dat = readxl::read_excel("data.xlsx")

特にオプションを指定しなければ、1番目に保存されているシートの中身をtibble形式で読み込んでくれる。読み込みたいシートや読み込む範囲を指定したい場合など、細かい点についてはread_excelのヘルプを参照のこと。

その他の形式

havenパッケージにある関数で、SPSS, Stata, SASなどの統計アプリケーションのファイルも読み込むことができる。

library(haven)
dat = haven::read_dta("data.dta")
dat = haven::read_sav("data.sav")
dat = haven::read_sas("data.sas7bdat")

相対パス

上記の例では、デスクトップ上に読み込みたいファイルを保存し、デスクトップをワーキングディレクトリに指定してデータを読み込んだ。しかし、例えばデスクトップにあるフォルダの中にデータを保存してあってそのファイルを読み込みたい場合、いちいちワーキングディレクトリを設定し直すのは面倒である。

このような場合、相対パスでファイルを指定するのが便利である。

#デスクトップをワーキングディレクトリに指定する
##Windowsの場合
setwd("C:/Users/ユーザー名/Desktop") #ユーザー名には設定しているアカウント名を入れる。
##Macの場合
setwd("~/Desktop") 

#デスクトップにあるDataフォルダの中の「0_sample.csv」を読み込む
dat = read.csv("./Data/0_sample.csv")

.(ピリオド)は、ワーキングディレクトリを意味する。/(スラッシュ)でフォルダの階層を区切ることで、下の層のフォルダにアクセスすることができる。

3.8 データの書き出し

作成したデータを書き出すこともできる。以下に、readrパッケージのwrite_csv()を使ってCSVファイルを書き出す例を示す。

readr::write_excel_csv(dat, "./Data/data_2.csv") #保存したいデータとパス名を指定する。

3.9 サンプルデータ

R には予めサンプルデータがいくつか用意されている。このテキストでもところどころで、R に入っているサンプルデータを使って解析の練習を行う。

iris #有名なフィッシャーのあやめデータ
cars #自動車の速度と停止距離との関係

data() #data()で、入っているデータを確認できる

3.10 補足

3.10.1 RStudioの機能でファイルを読み込む

自分でプログラムを書かなくとも、RStudio機能でファイルの読み込みもできる。RStudioの右上のウィンドウにある「Import Dataset」を選ぶ。

読み込むファイルの種類を選ぶ。CSVファイルならば「From Text (base)」を選び、読み込む CSV ファイルを選ぶ。

Name には任意のデータ名を入力する。ファイルの1行目に変数名を入力している場合は Heading は「Yes」を選ぶ。設定ができたら、「Import」を選ぶ。

3.10.2 RStudioの機能でワーキングディレクトリを指定する

直接自分でプログラムを書かなくとも、RStudioの機能でワーキングディレクトリの変更をすることができる。RStudioの右下のウィンドウにある「File」タブにデスクトップを表示し、「Set As Working Directory」を選ぶ。

他にも、メニューバーの「Session」から「Set Working Directory」、「Choose Working Directory」で指定する方法もある。