統計環境r_データ入出力編2016

44
R プププププププ — プププププププ — 2016/09/29 プププププププR プププ

Upload: wada-kazumi

Post on 23-Jan-2017

19 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 統計環境R_データ入出力編2016

R プログラミング

— データ入出力編 —

2016/09/29 統計解析ソフト「 R 」の基礎

Page 2: 統計環境R_データ入出力編2016

目 次I. データの入力方法A) コンソールでの直接入力B) データエディタの利用C) csvファイル  [ その1、その2]D) 固定長テキストファイルE) 複数の csv ファイルをまとめて

II. 基本的な出力方法A) ワークスペース全体の保存

B) コードの履歴の保存

C) バイナリファイル

D) csv ファイル

2

III. 関連知識 作業領域の掃除方法 ディレクトリやファイル

の操作 ダブルクォーテーション 円記号

プログラミングの留意点 繰り返し処理 条件分岐 比較演算子 論理演算子 欠損値 NA とその対処方法 NaN, Null, Inf

演習用コードファイル :      R デモ 02_ 入出力編 .r

Page 3: 統計環境R_データ入出力編2016

Ⅰ. データの入力方法

Page 4: 統計環境R_データ入出力編2016

• 変数は、車のスピードと制動距離の二つ• それぞれ speed と dist という変数名を設定し、

「 c() 」の中に要素をカンマ区切りで並べて付置することにより、ベクトルデータを作成し、次に dat1 にそれぞれのベクトルを cbind で横に並べて行列データを作成している

A) コンソールでの直接入力

speed <- c(4, 4, 7, 7, …, 25)dist <- c(2, 10, 4, 22, …, 85) dat1 <- cbind(speed, dist)

4

例 1. 車の制動距離データ [50×2]

※ 上のコマンドではデータを途中省略しているため、このスライドに対応しているデモコードファイル「 R デモ 02_ 入出力編 .r 」を参照してください

Page 5: 統計環境R_データ入出力編2016

ちょっと脱線 : R がお勧めな理由plot(dat1) # 散布図描画summary(dat1) # データの基本統計量表示lm1 <- lm(dist~speed) # 回帰分析summary(lm1) # 回帰分析結果表示abline(lm1, col= "red") # 回帰線描画

データを入力すれば、散布図を描き、回帰分析を行い、回帰線を散布図に表示させる作業がコマンド数行で終わる。

※ lm 関数の戻り値はリスト5

Page 6: 統計環境R_データ入出力編2016

• まずは空のデータフレーム dat2 を作成• コンソールのメニューバーから「編集」 => 「データ

エディタ」を選ぶとデータエディタが起動するので、必要なデータを入力する

• メニューバー操作の代わりに fix 関数でも同じことができる

• fix 関数の代わりに edit 関数を使用する場合は付値が必要 

B) データエディタの利用

dat2 <- data.frame() # 空のデータフレーム作成fix(dat2) # データエディタの起動

6※ 行列の要素は全て同じ型のデータという制約があるが、データフレームは列毎に型の違うデータを保持できる

Page 7: 統計環境R_データ入出力編2016

• read.csv 関数は、表形式の csv を読み込むための関数

• File.choose 関数を使用することにより、ファイル選択のダイアログボックスが開き、任意のファイルを指定することができる

• データは、 cars.csv を使用する  (cars.csv は、 R の組込みデータ cars を csv ファイルにしたもの )

C) CSV ファイル、その 1

data1 <- read.csv(file.choose())head(data1) # データの冒頭だけ表示

tail(data1) # データの末尾だけ表示

7※ データを読み込んだ後、内容確認をしておく。特に末尾は空レコードなどが入る場合があるので、必ずチェックする。

Page 8: 統計環境R_データ入出力編2016

• 大量データ処理にはダイアログボックスよりも、ファイル名を指定して csv ファイルを読む方が効率が良い

• データは、 cars2.csv を使用する

C) CSV ファイル、その 2

setwd("c:/Rdemo/") # ファイルを置いたディレクトリを指定

dat3 <- read.csv("cars2.csv", header=TRUE)# データにヘッダがない場合は header=FALSE を指定

head(dat3) # データの冒頭だけ表示

tail(dat3) # データの末尾だけ表示 8

cars.csv と cars2.csv のファイルの中身を、 EXCEL で確認してみよう !

cars.csv と cars2.csv のファイルの中身を、テキストエディタで確認してみよう !

csv データの内容確認は、 EXCEL ではなくテキストエディタで !

Page 9: 統計環境R_データ入出力編2016

• read.fwf 関数は、区切り文字のない固定長データを読み込むための関数

• データは、 cars.txt を使用する• ヘッダはない• 一行 18桁で、 10桁がスピード、 8桁が距離で左詰

D) 固定長テキストファイル

wt1 <- c(10, 8) # 桁数

cn1 <- c("speed", "dist") # 項目名

dat4 <- read.fwf("cars.txt", widths=wt1, col.names=cn1)head(dat4) # データの冒頭だけ表示

tail(dat4) # データの末尾だけ表示

9

Page 10: 統計環境R_データ入出力編2016

E) 複数の CSV ファイルをまとめて より複雑な読込み処理に挑戦 !

E-1. 擬似ミクロデータについてE-2. ファイル一覧E-3. レイアウトと符号表E-4. まず 1 ファイル読んでみるE-5. 変数名の付与E-6. さらに楽をしよう !

10

Page 11: 統計環境R_データ入出力編2016

E-1. 擬似ミクロデータについて• 統計調査の集計表をもとに、乱数を用いて再現し

た擬似的な個別データ• (独 ) 統計センターが平成 16年全国消費実態調査

について作成し、平成 27年度まで HP 上で提供(現在は提供終了)• 利用要件

申出者及び利用者以外の者に利用させないこと集計表から擬似的に作成したデータなので、

分析結果は実証研究の結果と見なすことができないことを理解すること

利用者アンケートの提出

11

Page 12: 統計環境R_データ入出力編2016

平成 16年全国消費実態調査

総務省統計局が 5年毎に実施。世帯を対象に、家計の収入・支出及び貯蓄・負債、耐久消費財、住宅・宅地などの家計資産を総合的に調査。

標本の大きさ二人以上の世帯 約 5万 5千、単身世帯 約 4千

疑似ミクロデータは二人以上の勤労者世帯データ約 3万 2千件を収録。

調査の詳細は、http://www.stat.go.jp/data/zensho/2004/index.htm

12

Page 13: 統計環境R_データ入出力編2016

13

データファイル(7分割の CSV ファイル)

E-2. ファイル一覧

Page 14: 統計環境R_データ入出力編2016

データファイルをエディタで表示すると

SAMPLE

14

内容を理解するためには、「データレイアウト」や

「符号表」が必要

Page 15: 統計環境R_データ入出力編2016

解凍した擬似ミクロデータファイル一覧

データレイアウトと符号表( Excel ファイル)

15

データファイル(7分割の CSV ファイル)

E-3. レイアウトと符号表

Page 16: 統計環境R_データ入出力編2016

• read.csv 関数

GIJI_2004zensho_dataset(00001~ 05000).csvE-4. まず 1 ファイル読んでみる

setwd("c:/Rdemo/giji") giji1 <- read.csv("GIJI_2004zensho_dataset(00001~05000).csv", header=FALSE)head(giji1)tail(giji1)

変数名は V1, V2, … として自動で設定される

どれがどんな変数なのかすぐにわからず不

便 ! 16

Page 17: 統計環境R_データ入出力編2016

hd1 <- read.csv("GIJI_2004zensho_vname.csv", header=FALSE)   # hd1 はデータフレームになる

colnames(giji1) <- as.vector(hd1[,1])

E-5. 変数名を付与するには

変数名ファイル GIJI_2004zensho_vname.csv が容易されているので、それを使って giji1 に変数名を付与

方法1

方法2

任意の変数名を予めデータファイルの一行目にセットしておき、ヘッダつきファイルとして再読み込み

giji1 <- read.csv("GIJI_2004zensho_dataset(00001~05000).csv", header=TRUE)

17

Page 18: 統計環境R_データ入出力編2016

i. コンスタント作成 (Excel 作業 )  データレイアウト付属の符号表( Excel ファイル)を加工して、 擬似ミクロデータを R に変数名を付加させながら読み込ませるための情報ファイル(コンスタント)を作成

ii. コンスタント読込み ( R 作業 )iii. データファイル読込み ( R 作業 )  作業フォルダから複数あるデータファイルの名前を取得し、データファイルを連結させながら読み込むと同時に、コンスタントを用いて変数名や属性を指定する。

E-6. さらに楽をしよう !•  変数名、漢字の項目名と、データが因子か数量かを区別できる情報を持つ符号表を活用•  複数のデータファイルの読み込みを自動化

18

Page 19: 統計環境R_データ入出力編2016

カンマ区切りの固定長データ => Rへの読み込みに必要なのは「変数名」と、各変数が数量データであるかカテゴリデータであるかを示す「型」だけ

後で役に立つかもしれないので、ここでは参照用に「行番号」と「階層」、表示用に「項目名」も残しているが、必須ではない

紫色で囲んだ行(「変数名」のある行)

を利用

19

符号表を Excel で表示すると

Page 20: 統計環境R_データ入出力編2016

- EXCEL での作業手順 -1. ヘッダより上の行を削除2. 「変数名」で並べ替え、ブランク行削除3. 「型」で並べ替え、ブランクを 2 に書き換え4. 「行番号」順に並べ替え5. 必要のない列を削除6. ヘッダを半角文字に7. CSV ファイルとして保存[ここでは code.csv]

20

i. コンスタント作成

    1 :     数量データ    ブランク : カテゴリデータ

R に読み込むとブランクはNA に化けるので 2 に書き換える

ヘッダ

Page 21: 統計環境R_データ入出力編2016

ii. コンスタント読込み~ EXCEL で作った CSV ファイルの最後にはよくゴミが残る~

21

rm(list=ls(all=TRUE)) # 作業領域のお掃除setwd("c:/Rdemo/giji/") # ファイルを置いたディレクトリの指定cd1 <- read.csv("code.csv", header=TRUE)tail(cd1)a1 <- which(!is.na(cd1$ren)) # コンスタントファイル末尾のcd1 <- cd1[a1,] # ブランク行削除tail(cd1) # cd1 の末尾確認

no koumoku lvl   type namae192 517  土地家屋借金返済 4   1 Youto178193 519  他の借金返済 4   1 Youto179194 521  分割払・一括払購入借入金返済 4   1 Youto180195 523 財産購入 4   1 Youto181196 525 その他 4   1 Youto182197 527 繰越金 3   1 Youto183

# 因子属性への変換抑制フラグ作成 ft1 <- rep(TRUE, dim(cd1)[1]) ft1[which(cd1$type == 2)] <- FALSE

Page 22: 統計環境R_データ入出力編2016

iii. データファイル読込み~ 分割ファイルがたくさんあっても怖くない~

22

#  命名規則を指定してデータファイル名の一覧を取得 (f.list <- list.files(path=getwd(), pattern="*).csv"))

[1] "GIJI_2004zensho_dataset(00001~ 05000).csv"[2] "GIJI_2004zensho_dataset(05001~ 10000).csv"[3] "GIJI_2004zensho_dataset(10001~ 15000).csv"[4] "GIJI_2004zensho_dataset(15001~ 20000).csv"[5] "GIJI_2004zensho_dataset(20001~ 25000).csv"[6] "GIJI_2004zensho_dataset(25001~ 30000).csv"[7] "GIJI_2004zensho_dataset(30001~ 32027).csv"  

dt1 <- do.call("rbind", lapply(f.list, read.csv, col.names=cd1$namae, as.is=ft1, header=FALSE))

dim(dt1)   [1] 32027 197

Page 23: 統計環境R_データ入出力編2016

Ⅱ. 基本的な出力方法

Page 24: 統計環境R_データ入出力編2016

A. 作業領域全体の保存save.image() で作業領域にある全ての変数や関数を保存することができる  [拡張子は「 .rdata 」 ]setwd("c:/Rdemo/") # ファイルを作る場所を指定save.image("Kensyuu1")

方法1

方法2メニューバーから「ファイル」⇒ 「作業スペースの保存」 ⇒ ファイル名を指定する

24

※ このとき保存されるものは ls() で一覧表示される

方法3R 終了時にダイアログボックス「作業スペースを保存しますか ? 」が表示されるので「 Yes 」を選ぶ

Page 25: 統計環境R_データ入出力編2016

方法 2

25

Page 26: 統計環境R_データ入出力編2016

B. コード履歴の保存

26

• メニューバーから「ファイル」⇒「履歴の保存」でファイル名選択のダイアログが表示される• 保存する履歴コードファイルの拡張子は「 .r 」

Page 27: 統計環境R_データ入出力編2016

C. バイナリファイル• A の方法で保存すると、バイナリファイルとなり

保存効率が高いが、作業領域全てを保存する場合、わざわざ消去しない限り必ずしも必要がない一時的なデータも含まれてしまい、ファイルのサイズが大きくなりがち• 必要なデータだけを選んで保存することも可能• 次のコマンドは、擬似ミクロデータのデータレ

イアウト情報 cd1 とデータ dt1 を giji.rdata というファイル名で保存する

27

save(cd1, dt1, file="giji.rdata")

ファイル giji.rdata は後の演習で使用します !

Page 28: 統計環境R_データ入出力編2016

D. CSV ファイル

28

• 次のコマンドは、 R に組込データとして収録されているあやめ (iris) の花のサイズに関するデータを呼び出し、 csv ファイルに書き出す• iris データは、蕚 ( がく )片の長さと幅、花弁

の長さと幅、あやめの品種の 5 変数を持つ

data(iris) # 5 変数 150 レコードのあやめデータwrite.csv(iris, file="iris.csv")

Page 29: 統計環境R_データ入出力編2016

Ⅲ. 関連知識

Page 30: 統計環境R_データ入出力編2016

■ 作業領域の掃除方法• 作業領域にある全オブジェクト一覧 ls()• 全オブジェクトを消去  rm(list=ls()) •オブジェクト x1, x2 を消去 rm(x1, x2)• 関数オブジェクト以外の全てのオブジェクトを消去

rm(list=ls()[!sapply(ls(), FUN=exists, mode="function")])

30

Page 31: 統計環境R_データ入出力編2016

■ ファイルやディレクトリの操作•現在のディレクトリを取得  getwd()• ファイル一覧取得 list.files()• ディレクトリ変更  setwd("mydirectory")• ディレクトリを作成 dir.create("mydirectory")• ファイルの削除  file.remove ("myfile") 31

Page 32: 統計環境R_データ入出力編2016

ダブルクォーテーション

 ファイル名や色名、文字列などの指定はダブルクォーテーションで囲んで指定するが、そのダブルクォーテーションは半角でなければならない  plot(dat1) # 散布図描画abline(lm1, col= “red”) # 全角abline(lm1, col= "red") # 半角

Word やパワーポイントは勝手に半角のダブルクォーテーションを全角に変えてしまうので、 R のコードがうまく動かないときはここをチェック ! 32

Page 33: 統計環境R_データ入出力編2016

円記号 [\]

  Windows でディレクトリのパス指定に使われる円記号 \ は、二重 [\\] にするか、あるいはスラッシュ [/] に置き換える  

setwd("e:/R研修 ")setwd("c:\\")

Windows での問題

33

Page 34: 統計環境R_データ入出力編2016

R プログラミングの留意点• 思考をそのままコードに落とせる自由度の高いプログラ

ミング言語だが、それを逆に考えれば人のコードは読み難い。メンテも困難。

• コーディング後一ヶ月も経過すれば、自分のコードも何だかわからなくなることもある。

• 他人に読ませたりメンテを引継ぐ必要のあるコードは、特に可読性を意識して書く。

• 一ヵ月後の自分のために、きめ細かく # を頭につけてコメントを書き込む習慣をつける。

• R ではコード中の空白や改行は無視される

• 一連の処理を複数行に改行し、それぞれの行にコメントを付けることも可能 34

Page 35: 統計環境R_データ入出力編2016

i <- 5while (i > 0){ print("Hello!") i <- i - 1 }

繰り返し処理• for

• while

35

for (i in 1:5) print("Hello")nm1 <- c("Mio", "Ryo", "John", “Yuki", "Taro")for (i in 1:5) { print(paste("Hello, ", nm1[i], "!", sep="") )}

Page 36: 統計環境R_データ入出力編2016

条件分岐• if() else{}

• ifelse

36

b <- c <- 0if (a > 0) { b <- b + 1; print("a > 0")} else { c <- c + 1; print ("a <= 0")}

outcome <- ifelse (score > 0.5, print("Passed"), print("Failed"))

Page 37: 統計環境R_データ入出力編2016

比較演算子

比較演算子記号 意味== 等しい!= 等しくない>= 以上(≥)> より大きい

<= 以下(≤)< より小さい

37

Page 38: 統計環境R_データ入出力編2016

論理演算子

記号 意味 要素の種類! NOT(ではない) 値、ベクトル

&& AND(かつ) 値|| OR(または) 値& AND(かつ) ベクトル| OR(または) ベクトル

38

Page 39: 統計環境R_データ入出力編2016

欠損値 NA(1) > x1 <- c(1,,5,2,4) 以下にエラー c(1, , 5, 2, 4) : 引数 2 が空です > x1 エラー : オブジェクト 'x1' がありません > x1 <- c(1,NA,5,2,4)> x1[1] 1 NA 5 2 4> x1 == 5[1] FALSE NA TRUE FALSE FALSE> which(x1 == 5) # x1 の値が 5 であるデータ番号[1] 3>

39

Page 40: 統計環境R_データ入出力編2016

欠損値 NA(2)

40

> which(x1 == NA) # x1 の値が NA であるデータ番号integer(0) # ?????> x1 == NA[1] NA NA NA NA NA

NA に対する演算結果は全て NA で比較演算子== も使えない代わりに、 is.na という特別な関数が用意されているみ

Page 41: 統計環境R_データ入出力編2016

関数 is.na()

41

> which(x1 == NA) #x1 の値が NA であるデータ番号integer(0) # 1 つもない> x1 == NA[1] NA NA NA NA NA> sum(x1)[1] NA

NA に対する演算結果は全て NA で比較演算子 == も使えず、そのままでは合計も計算できない

代わりに、 is.na という特別な関数が用意されているみち

Page 42: 統計環境R_データ入出力編2016

NAへの対応方法

42

> x1[!is.na(x1)] # NA を単に除去[1] 1 5 2 4> sum(x1[!is.na(x1)]) # 除去後合計を計算[1] 12> x2 <- ifelse(is.na(x1), 0, x1) # 0 に置き換え> sum(x2)[1] 12> x2[1] 1 0 5 2 4

Page 43: 統計環境R_データ入出力編2016

NaN, Null, Inf• NaN: 非数。例えば 0 を 0 で割ると得られる。• Null: なにもないことを示す。 NA が欠測を示す

のに対し、 Null はなにもないことを示し、ベクトルや行列といった構造を持つことはできない。• Inf, -Inf: 無限大。例えば 5 を 0 で割ると得られる。

43

検査のための関数 機能is.nan() 非数かどうかis.null() NULL かどうか

is.finite() 有限かどうかis.infinite() 無限大かどうか

NA の仲間達

Page 44: 統計環境R_データ入出力編2016

— R データ入出力編 —

おわり