統計環境r_データ入出力編2016
TRANSCRIPT
R プログラミング
— データ入出力編 —
2016/09/29 統計解析ソフト「 R 」の基礎
目 次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
Ⅰ. データの入力方法
• 変数は、車のスピードと制動距離の二つ• それぞれ 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 」を参照してください
ちょっと脱線 : R がお勧めな理由plot(dat1) # 散布図描画summary(dat1) # データの基本統計量表示lm1 <- lm(dist~speed) # 回帰分析summary(lm1) # 回帰分析結果表示abline(lm1, col= "red") # 回帰線描画
データを入力すれば、散布図を描き、回帰分析を行い、回帰線を散布図に表示させる作業がコマンド数行で終わる。
※ lm 関数の戻り値はリスト5
• まずは空のデータフレーム dat2 を作成• コンソールのメニューバーから「編集」 => 「データ
エディタ」を選ぶとデータエディタが起動するので、必要なデータを入力する
• メニューバー操作の代わりに fix 関数でも同じことができる
• fix 関数の代わりに edit 関数を使用する場合は付値が必要
B) データエディタの利用
dat2 <- data.frame() # 空のデータフレーム作成fix(dat2) # データエディタの起動
6※ 行列の要素は全て同じ型のデータという制約があるが、データフレームは列毎に型の違うデータを保持できる
• 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※ データを読み込んだ後、内容確認をしておく。特に末尾は空レコードなどが入る場合があるので、必ずチェックする。
• 大量データ処理にはダイアログボックスよりも、ファイル名を指定して 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 ではなくテキストエディタで !
• 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
E) 複数の CSV ファイルをまとめて より複雑な読込み処理に挑戦 !
E-1. 擬似ミクロデータについてE-2. ファイル一覧E-3. レイアウトと符号表E-4. まず 1 ファイル読んでみるE-5. 変数名の付与E-6. さらに楽をしよう !
10
E-1. 擬似ミクロデータについて• 統計調査の集計表をもとに、乱数を用いて再現し
た擬似的な個別データ• (独 ) 統計センターが平成 16年全国消費実態調査
について作成し、平成 27年度まで HP 上で提供(現在は提供終了)• 利用要件
申出者及び利用者以外の者に利用させないこと集計表から擬似的に作成したデータなので、
分析結果は実証研究の結果と見なすことができないことを理解すること
利用者アンケートの提出
11
平成 16年全国消費実態調査
総務省統計局が 5年毎に実施。世帯を対象に、家計の収入・支出及び貯蓄・負債、耐久消費財、住宅・宅地などの家計資産を総合的に調査。
標本の大きさ二人以上の世帯 約 5万 5千、単身世帯 約 4千
疑似ミクロデータは二人以上の勤労者世帯データ約 3万 2千件を収録。
調査の詳細は、http://www.stat.go.jp/data/zensho/2004/index.htm
12
13
データファイル(7分割の CSV ファイル)
E-2. ファイル一覧
データファイルをエディタで表示すると
SAMPLE
14
内容を理解するためには、「データレイアウト」や
「符号表」が必要
解凍した擬似ミクロデータファイル一覧
データレイアウトと符号表( Excel ファイル)
15
データファイル(7分割の CSV ファイル)
E-3. レイアウトと符号表
• 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
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
i. コンスタント作成 (Excel 作業 ) データレイアウト付属の符号表( Excel ファイル)を加工して、 擬似ミクロデータを R に変数名を付加させながら読み込ませるための情報ファイル(コンスタント)を作成
ii. コンスタント読込み ( R 作業 )iii. データファイル読込み ( R 作業 ) 作業フォルダから複数あるデータファイルの名前を取得し、データファイルを連結させながら読み込むと同時に、コンスタントを用いて変数名や属性を指定する。
E-6. さらに楽をしよう !• 変数名、漢字の項目名と、データが因子か数量かを区別できる情報を持つ符号表を活用• 複数のデータファイルの読み込みを自動化
18
カンマ区切りの固定長データ => Rへの読み込みに必要なのは「変数名」と、各変数が数量データであるかカテゴリデータであるかを示す「型」だけ
後で役に立つかもしれないので、ここでは参照用に「行番号」と「階層」、表示用に「項目名」も残しているが、必須ではない
紫色で囲んだ行(「変数名」のある行)
を利用
19
符号表を Excel で表示すると
- EXCEL での作業手順 -1. ヘッダより上の行を削除2. 「変数名」で並べ替え、ブランク行削除3. 「型」で並べ替え、ブランクを 2 に書き換え4. 「行番号」順に並べ替え5. 必要のない列を削除6. ヘッダを半角文字に7. CSV ファイルとして保存[ここでは code.csv]
20
i. コンスタント作成
1 : 数量データ ブランク : カテゴリデータ
R に読み込むとブランクはNA に化けるので 2 に書き換える
型
ヘッダ
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
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
Ⅱ. 基本的な出力方法
A. 作業領域全体の保存save.image() で作業領域にある全ての変数や関数を保存することができる [拡張子は「 .rdata 」 ]setwd("c:/Rdemo/") # ファイルを作る場所を指定save.image("Kensyuu1")
方法1
方法2メニューバーから「ファイル」⇒ 「作業スペースの保存」 ⇒ ファイル名を指定する
24
※ このとき保存されるものは ls() で一覧表示される
方法3R 終了時にダイアログボックス「作業スペースを保存しますか ? 」が表示されるので「 Yes 」を選ぶ
方法 2
25
B. コード履歴の保存
26
• メニューバーから「ファイル」⇒「履歴の保存」でファイル名選択のダイアログが表示される• 保存する履歴コードファイルの拡張子は「 .r 」
C. バイナリファイル• A の方法で保存すると、バイナリファイルとなり
保存効率が高いが、作業領域全てを保存する場合、わざわざ消去しない限り必ずしも必要がない一時的なデータも含まれてしまい、ファイルのサイズが大きくなりがち• 必要なデータだけを選んで保存することも可能• 次のコマンドは、擬似ミクロデータのデータレ
イアウト情報 cd1 とデータ dt1 を giji.rdata というファイル名で保存する
27
save(cd1, dt1, file="giji.rdata")
ファイル giji.rdata は後の演習で使用します !
D. CSV ファイル
28
• 次のコマンドは、 R に組込データとして収録されているあやめ (iris) の花のサイズに関するデータを呼び出し、 csv ファイルに書き出す• iris データは、蕚 ( がく )片の長さと幅、花弁
の長さと幅、あやめの品種の 5 変数を持つ
data(iris) # 5 変数 150 レコードのあやめデータwrite.csv(iris, file="iris.csv")
Ⅲ. 関連知識
■ 作業領域の掃除方法• 作業領域にある全オブジェクト一覧 ls()• 全オブジェクトを消去 rm(list=ls()) •オブジェクト x1, x2 を消去 rm(x1, x2)• 関数オブジェクト以外の全てのオブジェクトを消去
rm(list=ls()[!sapply(ls(), FUN=exists, mode="function")])
30
■ ファイルやディレクトリの操作•現在のディレクトリを取得 getwd()• ファイル一覧取得 list.files()• ディレクトリ変更 setwd("mydirectory")• ディレクトリを作成 dir.create("mydirectory")• ファイルの削除 file.remove ("myfile") 31
ダブルクォーテーション
ファイル名や色名、文字列などの指定はダブルクォーテーションで囲んで指定するが、そのダブルクォーテーションは半角でなければならない plot(dat1) # 散布図描画abline(lm1, col= “red”) # 全角abline(lm1, col= "red") # 半角
Word やパワーポイントは勝手に半角のダブルクォーテーションを全角に変えてしまうので、 R のコードがうまく動かないときはここをチェック ! 32
円記号 [\]
Windows でディレクトリのパス指定に使われる円記号 \ は、二重 [\\] にするか、あるいはスラッシュ [/] に置き換える
setwd("e:/R研修 ")setwd("c:\\")
Windows での問題
33
R プログラミングの留意点• 思考をそのままコードに落とせる自由度の高いプログラ
ミング言語だが、それを逆に考えれば人のコードは読み難い。メンテも困難。
• コーディング後一ヶ月も経過すれば、自分のコードも何だかわからなくなることもある。
• 他人に読ませたりメンテを引継ぐ必要のあるコードは、特に可読性を意識して書く。
• 一ヵ月後の自分のために、きめ細かく # を頭につけてコメントを書き込む習慣をつける。
• R ではコード中の空白や改行は無視される
• 一連の処理を複数行に改行し、それぞれの行にコメントを付けることも可能 34
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="") )}
条件分岐• 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"))
比較演算子
比較演算子記号 意味== 等しい!= 等しくない>= 以上(≥)> より大きい
<= 以下(≤)< より小さい
37
論理演算子
記号 意味 要素の種類! NOT(ではない) 値、ベクトル
&& AND(かつ) 値|| OR(または) 値& AND(かつ) ベクトル| OR(または) ベクトル
38
欠損値 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
欠損値 NA(2)
40
> which(x1 == NA) # x1 の値が NA であるデータ番号integer(0) # ?????> x1 == NA[1] NA NA NA NA NA
NA に対する演算結果は全て NA で比較演算子== も使えない代わりに、 is.na という特別な関数が用意されているみ
ち
関数 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 という特別な関数が用意されているみち
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
NaN, Null, Inf• NaN: 非数。例えば 0 を 0 で割ると得られる。• Null: なにもないことを示す。 NA が欠測を示す
のに対し、 Null はなにもないことを示し、ベクトルや行列といった構造を持つことはできない。• Inf, -Inf: 無限大。例えば 5 を 0 で割ると得られる。
43
検査のための関数 機能is.nan() 非数かどうかis.null() NULL かどうか
is.finite() 有限かどうかis.infinite() 無限大かどうか
NA の仲間達
— R データ入出力編 —
おわり