データセット&分析レシピ

Rにおけるデータの取り扱いとファイルの読み込み

Rの使い方(2)

2015.11.05小谷 祐一朗=おたに代表取締役

R

ビッグデータ分析を行うには統計分析ができるソフトウェアが必須であるが、その中でも、よく使われる統計環境に「R」がある。本記事ではデータの取り扱いとファイルの読み込み方法を説明する。

 当然だが、統計ソフトの目的はデータを分析することである。Rにはプログラミング言語としての機能が用意されており、これを使用することで様々データ分析ができるようになる。本稿では、Rを使いこなすための第一歩として、Rのデータ型と構造及び関数、そして外部ファイルの読込とデータの取り扱い方について説明する。

 まず、Rには様々な変数の型と構造があるが、変数の型は「数値」「文字」「因子」「論理値」の4つ、構造は「ベクトル」「行列」「データフレーム」「リスト」など5つが基本である。まずは、これらを見ていこう。

数値型に関しては「c(1,2,3)」等と入力すればよい。下記のように入力すると、数値が3つの要素を持つ「ベクトル」の構造でxという変数に代入される。

> x <- c(1.2,1.5,-0.5)
> x
[1] 1.5 1.2 -0.5

 文字の要素を持つベクトルを作成する場合は、次のように入力する。

> x <- c("ABC","DEF")
> x
[1] "ABC" "DEF"

 因子型というと聞き慣れないかもしれないが、血液型等のカテゴリカルデータ(名義尺度)を思い浮かべればよい。血液型の場合、A型に0、B型に1、O型に2、AB型に3等を割り振ることがあり、数値に意味がないデータである。因子の要素を持つベクトルを作成する場合は、「as.factor」関数を用いて次のように入力する。

> x <- as.factor(c("A","B","AB","O"))
> x
[1] "A" "B" "AB" "O"

 論理値とはTRUEまたはFALSEの2つの値をしかとらないデータである。ベクトルを作成する場合は、次のように入力する。

> x <- c(TRUE,FALSE)
> x
[1] TRUE FALSE

TRUEの代わりにT、FALSEの代わりにFを使うこともできる。

> x <- c(T,F,F,T)
> x
[1] TRUE FALSE FALSE TRUE

 x[2]等とアクセスしたい要素番号を鍵括弧で囲むと、指定したベクトルの要素を取り出すことができる。

> x[2]
[1] FALSE

 行列を作成する場合は、「matrix」関数の引数にベクトルを指定し、nrowで行数を、ncolで列数を指定すればよい。次のように入力すると、要素に0から9を持つ5行2列の行列が作成される。

> matrix(c(0,1,2,3,4,5,6,7,8,9),nrow=5,ncol=2)
[,1] [,2]
[1,] 0 5
[2,] 1 6
[3,] 2 7
[4,] 3 8
[5,] 4 9

 文字ベクトルを指定することで、文字を要素とした行列を作成することもできる。

> X <- matrix(c("A","B","C","D"),nrow=2,ncol=2)
> X
[,1] [,2]
[1,] "A" "C"
[2,] "B" "D"

 X[2,1]等とすれば、2行1列目の要素にアクセスできる。

> X[2,1]
[1] "B"

 次に、「データフレーム」であるが、これは表計算ソフトを思い浮かべればよい。表計算ソフトでは列に数値や文字等の様々な型のデータを入力できる。データフレームも同じで、数値型や因子型等のデータを列単位で保持できる。また各列には必ず列を表すラベルがつく。以下が、ラベル名がAの列に1から3までの数値ベクトル、ラベル名がBの列にx,y,zの因子ベクトルを持つデータフレームの作成例である。

> X <- data.frame(A=c(1,2,3),B=c("x","y","z"))
> X
A B
1 1 x
2 2 y
3 3 z

 各ラベルの列は変数名とラベル名を「$」でつなげることで、ベクトルとして取り出せる。

> X$A
[1] 1 2 3
> X$B
[1] x y z
Levels: x y z
> X$B[3]
[1] z
Levels: x y z

 データフレームも行列と同じで、行と列を数字で指定すると、要素にアクセスできる。

> X[2,2]
[1] y
Levels: x y z

 また、 as.data.frame関数を使用すると、データの構造をデータフレームに変換できる。

> X <- matrix(c("A","B","C","D"),nrow=2,ncol=2)
> X <- as.data.frame(X)
> X
V1 V2
1 A C
2 B D
> X$V2
[1] C D
Levels: C D

 上記の場合は、ラベル名を指定していないため、ラベル名がV1、V2となっている。

 最後に「リスト」であるが、これはベクトル、行列、データフレーム等の異なるデータ構造を1つにまとめたものである。次のようにすればリストを作成できる。

> X <- list(c(1,2,3),c("x","y","z"),data.frame(A=c(1,2,3),B=c("x","y","z")))
> X
[[1]]
[1] 1 2 3
[[2]]
[1] "x" "y" "z"
[[3]]
A B
1 1 x
2 2 y
3 3 z

 リストの各要素にはデータフレームと同じで、ラベルをつけることもできる。

> X <- list(.numeric=c(1,2,3),.factor=c("x","y","z"),.df=data.frame(A=c(1,2,3),B=c("x","y","z")))
> X
$.numeric
[1] 1 2 3
$.factor
[1] "x" "y" "z"
$.df
A B
1 1 x
2 2 y
3 3 z
[1] 1 2 3

リストの各要素にはラベル名または要素番号(この場合は[[1]]等と鍵括弧を2重にする)でアクセスできる。

> X$.numeric
[1] 1 2 3
> X[[3]]
A B
1 1 x
2 2 y
3 3 z
> X$.df
A B
1 1 x
2 2 y
3 3 z

さらに、Rでの関数の作成だが、次のように入力すると、f(x) = x + 1の関数を定義できる。

> plus.1 <- function(x){
+ x <- x+1
+ return(x)
+ }
> plus.1(1)
[1] 2
> plus.1(99)
[1] 100

 returnの引数が定義した関数の返す値となる。なお、関数はデータフレームやリスト等も返すように指定することもできる。

> plus.1 <- function(x){
+ return(data.frame(A=x,B=x+1,C=x+2))
+ }
> plus.1(99)
A B C
1 99 100 101

外部データを取り込む

 Rには外部データを取り込むことができるが、最も扱いやすい形式はCSV(comma-separated values)である。ここでは、用意したCSVファイルをRに読み込んでみよう。CSVファイルのパスが「時系列分析/家計調査2015-キャベツ-タケノコ-豚肉-時系列データの分解-sjis.csv」の場合、read.csvを使って下記のように入力すると、「.d」という変数にCSVのデータがデータフレームの構造で取り込まれる。

> .d <- read.csv("~/Dropbox/時系列分析/家計調査2015-キャベツ-タケノコ-豚肉-時系列データの分解-sjis.csv", fileEncoding="sjis")

 「fileEncoding=”sjis”」というのは、ファイルのエンコーディングを「sjis」に指定する引数である。なお、上記のファイルは1行目が列名になっている(ラベルにはスペース等は使えないため注意が必要である)。

 ここで、「.d」と入力すれば、読み込んだデータ全てが表示される。「head(.d)」とすれば最初の5行が表示される。「tail(.d)」と入力すると、最後の5行が表示される。

> head(.d)
月 日 消費支出 キャベツ たけのこ 豚肉
1 4 1 9392.41 8.24 4.41 81.24
2 4 2 6041.88 8.02 6.63 76.61
3 4 3 5850.20 6.79 6.25 76.91
4 4 4 7318.27 10.39 9.48 88.29
5 4 5 6902.76 9.95 7.66 98.50
6 4 6 5826.94 8.29 8.57 71.25
> tail(.d)
月 日 消費支出 キャベツ たけのこ 豚肉
56 5 26 5651.95 11.57 1.91 81.66
57 5 27 5680.21 9.19 1.43 70.96
58 5 28 5350.29 8.72 1.63 65.83
59 5 29 6437.05 8.52 2.63 68.09
60 5 30 6400.60 9.74 2.26 76.86
61 5 31 7320.59 10.89 1.60 87.60

 読み込んだデータの構造はデータフレームであるため、「$」でラベルを指定すれば取り出せる。消費支出を取り出す場合は次のようになる。

> .d$消費支出
[1] 9392.41 6041.88 5850.20 7318.27 6902.76 5826.94 5243.82 5308.46 5043.08
[10] 6029.67 7308.30 7897.15 4481.09 4957.91 7832.07 8932.93 5868.92 6763.84
[19] 6442.34 6272.94 6571.39 5101.08 6128.60 8111.84 8495.99 6985.18 6781.84

 次に、取り出した消費支出の平均を平均値を計算する関数であるmeanを使って計算してみよう。次のようになる。

> mean(.d$消費支出)
[1] 6540.128

 標準偏差の場合は「sd」、分散の場合は「var」を使う。

> sd(.d$消費支出)
[1] 1156.734
> var(.d$消費支出)
[1] 1338033

 最小値の場合は「min」、最大値の場合は「max」、中央値は「median」で求められる。

> min(.d$消費支出)
[1] 4481.09
> max(.d$消費支出)
[1] 10418
> median(.d$消費支出)
[1] 6346.03

 また、「summary」を使うと、データの要約(四分位数、平均値等)を出力できる。

> summary(.d[,3:6])
消費支出 キャベツ たけのこ 豚肉
Min. : 4481 Min. : 6.79 Min. : 1.430 Min. : 65.83
1st Qu.: 5736 1st Qu.: 9.75 1st Qu.: 2.290 1st Qu.: 73.41
Median : 6346 Median :10.74 Median : 5.180 Median : 78.86
Mean : 6540 Mean :10.79 Mean : 5.517 Mean : 80.39
3rd Qu.: 7308 3rd Qu.:11.93 3rd Qu.: 7.790 3rd Qu.: 85.43
Max. :10418 Max. :15.52 Max. :14.030 Max. :107.44

 本稿ではRのデータ型と構造、外部ファイルの読み込みと簡単な関数を使ったデータの取り扱いについて触れた。これらはRを使用する上では基本的なことだが重要である。言語としての基本的な考え方を知っておくことはRを本格的に活用して、高度な分析を行うためには欠かせないものである。

印刷

日経ビッグデータの最新号

3月号特集

オンリーワンデータで成長戦略を描く

現場に出向けば、価値あるデータを創出できる

年間購読のご案内

申し込む

お問い合わせ

日経ビッグデータのサイトへ

本サイトは更新を終了しました

 「日経ビッグデータ」は2018年4月2日、「日経クロストレンド」に名称を変更しました。データ活用やAI関連の最新記事は日経クロストレンドでお読みください。

 本サイトは更新を終了し、19年3月31日に閉鎖する予定です。長い間のご利用、ありがとうございました。