ハイ、あります。ファイルから読み込みましょう。データとプログラムを分離するためにも。
ここでは、中日ドラゴンズの選手の体格を分析することを例に説明します。 なお、以下のリンクをクリックする際にはマウスの右クリックを使って「新しいウインドウで開く」で開くようにしてください。単にクリックするとMoodle内で開いてしまうので非常に見辛くなります。
今回の例では、データはWeb上に提示されているものの、手元にデータが 存在するわけではない。そこで、これらの選手データをファイルの形で 保存したい。そのためのツールとして、Excelは非常にパワフルなツールだと 考えている。
このWebからデータをもらってきて、Excelに入力ください。
[蛇足] パソコン処理に慣れた方なら、Webの数値群をExcelに コピーペーストで入力できてしまうことをご存知かもしれません。 対面講義であれば、どの程度の人数がそのことをご存知か リアルタイムで確認できるのですが。
ここでは、もう既に電子化したファイルを提供することにします。 Moodleにファイルを保存しておきますので、 各自のPCにダウンロードください。 本来は各自で入力したと想定くださいね。
● Dragons20.xlsx
ファイルを開けてこのサンプルファイルをご覧いただきたいのですが、 ファイルの最初の方に、いくつかの説明が記入されていることが判る。
CSV形式とは、Comma Separated Valueの略で、各値がコンマ区切りの テキストファイルで保存されたファイルを指す。 CSV形式であればRから容易に読み込めるので、この形式でファイルを保存する。Excelで通常の形式(.xlsx)で保存した後、 [ファイル]-[名前をつけて保存]で ウインドウの左下にある[ファイルの種類]に「CSV(コンマ区切り)(.csv)」を選択し保存する。その際、警告ウインドウが表示されることがあるが無視してかまわない。 保存した場所とファイル名を忘れないように。
CSV形式で保存したファイル(Dragons20.csv)を Rのホームディレクトリ(各自で異なる)にコピーする。 先週紹介したサイトの例をそのまま踏襲された方は、作業ディレクトリが「Cドライブの中の、R_practiceというフォルダ」としておられると思います。 私は「D:/home_sub3/R_Dir」と指定しているので、 このディレクトリの下に、「Dragons」というディレクトリを作成し、 そこに「Dragons20.csv」をコピーしました。
【余談】本講義では皆さんに「各自で興味あるデータ」の分析を してもらうことをお知らせしています。皆さんが持参されたデータが どのような媒体で持ち込まれるかは判りませんが、例えば本や雑誌といった 紙媒体なら、上記の方法で手入力してCSVファイルの形式にしてください。 また、Web等の電子媒体の場合も、データの形式を整えてCSVファイルを 準備するようにしてください。 電子化する際は本節が役に立つと思います。 お解りにならない方は遠慮なくご質問ください。
来週はこのCSV形式のファイルを既にお手元に用意いただいたという前提で講義を進行することにする。準備を怠らないように。
お待たせしました。やっとR側からファイルを読み込む方法をご紹介します。 まず、保存先のディレクトリに移動します。 私はRのホームディレクトリを「D:/home_sub3/R_Dir」と指定しているので、 明示的に移動を示すなら以下の指示を入れます。 RStudioの設定で既に指定してあれば、敢えては必要ありません。
setwd("D:/home_sub3/R_Dir") # ホームディレクトリに移動(Set Working Directory)
getwd() # 現在のディレクトリを表示(Get Working Directory)
## [1] "D:/home_sub3/R_Dir"
list.files() # ファイル名一覧
## [1] "Dragons" "grain" "KougiDS" "Unemployment"
setwd("Dragons") # ディレクトリを移動
list.files() # ファイル名一覧
## [1] "Dragons20.csv" "Dragons20.xlsx" "Dragons20_org.csv"
## [4] "DS02.R" "DS02_1b.html" "DS02_1b.Rmd"
## [7] "DS02_2b.html" "DS02_2b.R" "DS02_2b.Rmd"
## [10] "DS02_3a.html" "DS02_3a.pdf" "DS02_3a.Rmd"
## [13] "DS02_3c.html" "DS02_3c.R" "DS02_3c.Rmd"
## [16] "DS02_3f.html" "DS02_3f.Rmd" "DS02b.R"
## [19] "DS02c.R" "DS03_1a.R" "OldFiles"
ファイルを読み込みます。その際、先頭の6行には説明等の分析に必要ない 情報が書き込まれていますので、読み飛ばす(スキップ)します。 また、それに続く行に変数名が指定されているので「header=TRUE」を 指定しておきます。Excel入力時にこの行を準備してもらったのは このように指定できるからです。この行を準備していない場合は システム側が任意の変数名を付けてくれますが、無味簡素な名称なので、 意味が理解しやすい変数名を自分で付ける方が効率が上がると思います。
ズレがないかを目視で確認します。ただ、ブラウザの都合で漢字の横幅が不均等のためややズレたように見えることをご容赦ください。
Drag20<-read.csv("Dragons20.csv", skip=6, header=TRUE) # CSVデータの読み込み
Drag20 # データの表示
## No. Name Position BoY BoM BoD height weight Tou Da
## 1 11 小笠原 慎之介 投手 1997 10 8 180 95 左 左
## 2 12 田島 慎二 投手 1989 12 21 181 84 右 右
## 3 13 橋本 侑樹 投手 1998 1 8 180 71 左 左
## 4 14 谷元 圭介 投手 1985 1 28 167 72 右 右
## 5 16 又吉 克樹 投手 1990 11 4 181 74 右 右
## 6 17 柳 裕也 投手 1994 4 22 180 85 右 右
## 7 19 吉見 一起 投手 1984 9 19 182 90 右 右
## 8 21 岡田 俊哉 投手 1991 12 5 178 67 左 左
## 9 22 大野 雄大 投手 1988 9 26 183 83 左 左
## 10 24 福谷 浩司 投手 1991 1 9 183 90 右 右
## 11 25 佐藤 優 投手 1993 6 29 187 85 右 左
## 12 28 梅津 晃大 投手 1996 10 24 187 90 右 右
## 13 29 山井 大介 投手 1978 5 10 179 86 右 右
## 14 30 阿知羅 拓馬 投手 1992 11 20 190 95 右 右
## 15 33 祖父江 大輔 投手 1987 8 11 175 80 右 左
## 16 34 福 敬登 投手 1992 6 16 180 88 左 左
## 17 36 岡野 祐一郎 投手 1994 4 16 180 85 右 右
## 18 38 松葉 貴大 投手 1990 8 14 178 82 左 左
## 19 40 石川 翔 投手 1999 12 14 179 81 右 左
## 20 41 勝野 昌慶 投手 1997 6 12 183 89 右 右
## 21 43 三ツ間 卓也 投手 1992 7 22 183 92 右 右
## 22 46 鈴木 博志 投手 1997 3 22 181 95 右 右
## 23 47 笠原 祥太郎 投手 1995 3 17 177 85 左 左
## 24 50 清水 達也 投手 1999 11 3 182 83 右 右
## 25 53 ゴンサレス 投手 1992 1 17 188 93 左 右
## 26 54 藤嶋 健人 投手 1998 5 8 177 85 右 右
## 27 59 山本 拓実 投手 2000 1 31 167 71 右 右
## 28 61 垣越 建伸 投手 2000 4 3 184 96 左 左
## 29 62 竹内 龍臣 投手 2001 12 11 178 77 右 右
## 30 64 小熊 凌祐 投手 1990 8 11 178 84 右 右
## 31 65 伊藤 準規 投手 1991 1 7 187 80 右 左
## 32 67 ロドリゲス 投手 1997 3 10 186 97 右 右
## 33 69 濱田 達郎 投手 1994 8 4 185 95 左 左
## 34 70 ロメロ 投手 1991 1 24 190 103 左 右
## 35 82 マルク 投手 1995 7 18 184 83 右 右
## 36 97 R.マルティネス 投手 1996 10 11 193 93 右 左
## 37 98 木下 雄介 投手 1993 10 10 183 80 右 右
## 38 99 鈴木 翔太 投手 1995 6 16 183 75 右 右
## 39 27 大野 奨太 捕手 1987 1 13 177 78 右 右
## 40 35 木下 拓哉 捕手 1991 12 18 183 92 右 右
## 41 44 郡司 裕也 捕手 1997 12 27 180 86 右 右
## 42 52 加藤 匠馬 捕手 1992 4 29 175 76 右 右
## 43 57 A.マルティネス 捕手 1996 5 28 190 95 右 右
## 44 58 石橋 康太 捕手 2000 12 7 180 87 右 右
## 45 68 桂 依央利 捕手 1991 7 9 185 90 右 右
## 46 0 髙松 渡 内野手 1999 7 2 176 65 右 左
## 47 1 京田 陽太 内野手 1994 4 20 184 88 右 左
## 48 2 石川 昂弥 内野手 2001 6 22 185 93 右 右
## 49 3 高橋 周平 内野手 1994 1 18 180 85 右 左
## 50 5 阿部 寿樹 内野手 1989 12 3 185 80 右 右
## 51 7 根尾 昂 内野手 2000 4 19 177 80 右 左
## 52 9 石川 駿 内野手 1990 5 26 178 82 右 右
## 53 32 石垣 雅海 内野手 1998 9 21 181 85 右 右
## 54 37 三ツ俣 大樹 内野手 1992 5 11 177 84 右 右
## 55 48 溝脇 隼人 内野手 1994 5 17 179 75 右 左
## 56 55 福田 永将 内野手 1988 7 23 181 88 右 右
## 57 63 堂上 直倫 内野手 1988 9 23 184 86 右 右
## 58 66 ビシエド 内野手 1989 3 10 185 108 右 右
## 59 4 藤井 淳志 外野手 1981 5 20 183 82 右 左右
## 60 6 平田 良介 外野手 1988 3 23 177 87 右 右
## 61 8 大島 洋平 外野手 1985 11 9 176 75 左 左
## 62 23 遠藤 一星 外野手 1989 3 23 182 83 右 左
## 63 26 井領 雅貴 外野手 1989 11 4 174 82 右 左
## 64 31 渡辺 勝 外野手 1993 10 14 172 80 右 左
## 65 42 アルモンテ 外野手 1989 6 10 183 98 右 左右
## 66 45 シエラ 外野手 1988 9 24 185 105 右 右
## 67 49 伊藤 康祐 外野手 2000 2 3 174 75 右 右
## 68 51 滝野 要 外野手 1996 7 8 185 76 右 左
## 69 56 武田 健吾 外野手 1994 4 18 183 85 右 右
## 70 60 岡林 勇希 外野手 2002 2 22 175 74 右 左
## 71 201 ブリトー 育成-投手 1996 7 19 185 80 右 右
## 72 202 浜田 智博 育成-投手 1992 10 1 184 80 左 左
## 73 204 丸山 泰資 育成-投手 1995 2 5 176 80 右 右
## 74 206 大藏 彰人 育成-投手 1994 5 15 190 88 右 右
## 75 207 松田 亘哲 育成-投手 1997 5 16 176 80 左 左
## 76 205 石岡 諒太 育成-内野手 1992 5 25 187 90 左 左
データ自身以外に、データのサイズ(行数、列数)や変数名も確認してみましょう。 選手数が76名で、変量数が10個(No., Name, Position, …, height, weight, Tou, Da)のデータであることが判る。 電子化した際のデータが全て正確に読み込まれているか確認せよ。
dim(Drag20) # データサイズの表示
## [1] 76 10
colnames(Drag20) # 変量名の表示
## [1] "No." "Name" "Position" "BoY" "BoM" "BoD"
## [7] "height" "weight" "Tou" "Da"
# 基本情報を外観してみる
str(Drag20) # データの内容を情報付きで表示(Structure)
## 'data.frame': 76 obs. of 10 variables:
## $ No. : int 11 12 13 14 16 17 19 21 22 24 ...
## $ Name : chr "小笠原 慎之介" "田島 慎二" "橋本 侑樹" "谷元 圭介" ...
## $ Position: chr "投手" "投手" "投手" "投手" ...
## $ BoY : int 1997 1989 1998 1985 1990 1994 1984 1991 1988 1991 ...
## $ BoM : int 10 12 1 1 11 4 9 12 9 1 ...
## $ BoD : int 8 21 8 28 4 22 19 5 26 9 ...
## $ height : int 180 181 180 167 181 180 182 178 183 183 ...
## $ weight : int 95 84 71 72 74 85 90 67 83 90 ...
## $ Tou : chr "左" "右" "左" "右" ...
## $ Da : chr "左" "右" "左" "右" ...
これらの結果から、76名、10変量のデータである。 各変量はそれぞれ、文字型(chr)か整数型(int)かが判る。 右側には例示もされている。
そこで、今度は読み込んだデータの一部を閲覧してみましょう。 その際の指定方法は前節で紹介したベクトルや行列の要素位置を明示的に指定する表記方法が使われます。
Drag20[1,] # 1人目だけの表示
## No. Name Position BoY BoM BoD height weight Tou Da
## 1 11 小笠原 慎之介 投手 1997 10 8 180 95 左 左
Drag20[5,] # 5人目だけの表示
## No. Name Position BoY BoM BoD height weight Tou Da
## 5 16 又吉 克樹 投手 1990 11 4 181 74 右 右
Drag20[1:10,] # 先頭10人の選手を表示
## No. Name Position BoY BoM BoD height weight Tou Da
## 1 11 小笠原 慎之介 投手 1997 10 8 180 95 左 左
## 2 12 田島 慎二 投手 1989 12 21 181 84 右 右
## 3 13 橋本 侑樹 投手 1998 1 8 180 71 左 左
## 4 14 谷元 圭介 投手 1985 1 28 167 72 右 右
## 5 16 又吉 克樹 投手 1990 11 4 181 74 右 右
## 6 17 柳 裕也 投手 1994 4 22 180 85 右 右
## 7 19 吉見 一起 投手 1984 9 19 182 90 右 右
## 8 21 岡田 俊哉 投手 1991 12 5 178 67 左 左
## 9 22 大野 雄大 投手 1988 9 26 183 83 左 左
## 10 24 福谷 浩司 投手 1991 1 9 183 90 右 右
Drag20[20:30,] # 20番目から30番目までの11人の選手を表示
## No. Name Position BoY BoM BoD height weight Tou Da
## 20 41 勝野 昌慶 投手 1997 6 12 183 89 右 右
## 21 43 三ツ間 卓也 投手 1992 7 22 183 92 右 右
## 22 46 鈴木 博志 投手 1997 3 22 181 95 右 右
## 23 47 笠原 祥太郎 投手 1995 3 17 177 85 左 左
## 24 50 清水 達也 投手 1999 11 3 182 83 右 右
## 25 53 ゴンサレス 投手 1992 1 17 188 93 左 右
## 26 54 藤嶋 健人 投手 1998 5 8 177 85 右 右
## 27 59 山本 拓実 投手 2000 1 31 167 71 右 右
## 28 61 垣越 建伸 投手 2000 4 3 184 96 左 左
## 29 62 竹内 龍臣 投手 2001 12 11 178 77 右 右
## 30 64 小熊 凌祐 投手 1990 8 11 178 84 右 右
Drag20[,7] # 身長を全員分表示(方法1)
## [1] 180 181 180 167 181 180 182 178 183 183 187 187 179 190 175 180 180 178 179
## [20] 183 183 181 177 182 188 177 167 184 178 178 187 186 185 190 184 193 183 183
## [39] 177 183 180 175 190 180 185 176 184 185 180 185 177 178 181 177 179 181 184
## [58] 185 183 177 176 182 174 172 183 185 174 185 183 175 185 184 176 190 176 187
Drag20$height # 身長を全員分表示(方法2)
## [1] 180 181 180 167 181 180 182 178 183 183 187 187 179 190 175 180 180 178 179
## [20] 183 183 181 177 182 188 177 167 184 178 178 187 186 185 190 184 193 183 183
## [39] 177 183 180 175 190 180 185 176 184 185 180 185 177 178 181 177 179 181 184
## [58] 185 183 177 176 182 174 172 183 185 174 185 183 175 185 184 176 190 176 187
データが準備できましたので、分析していきましょう。 まずは手始めに簡単な統計量から見ていきましょう。
summary(Drag20) # 要約統計量(一気に全部を表示)
## No. Name Position BoY
## Min. : 0.00 Length:76 Length:76 Min. :1978
## 1st Qu.: 22.75 Class :character Class :character 1st Qu.:1990
## Median : 42.50 Mode :character Mode :character Median :1993
## Mean : 52.42 Mean :1993
## 3rd Qu.: 61.25 3rd Qu.:1997
## Max. :207.00 Max. :2002
## BoM BoD height weight
## Min. : 1.000 Min. : 1.00 Min. :167.0 Min. : 65.00
## 1st Qu.: 4.000 1st Qu.: 9.00 1st Qu.:178.0 1st Qu.: 80.00
## Median : 6.000 Median :16.00 Median :181.0 Median : 85.00
## Mean : 6.368 Mean :15.34 Mean :181.2 Mean : 84.76
## 3rd Qu.: 9.250 3rd Qu.:22.00 3rd Qu.:184.2 3rd Qu.: 90.00
## Max. :12.000 Max. :31.00 Max. :193.0 Max. :108.00
## Tou Da
## Length:76 Length:76
## Class :character Class :character
## Mode :character Mode :character
##
##
##
summary(Drag20$height) # 要約統計量(指定した変量だけを表示)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 167.0 178.0 181.0 181.2 184.2 193.0
mean(Drag20$height) # 平均値
## [1] 181.1579
sd(Drag20$height) # 標準偏差
## [1] 4.953255
table(Drag20$Tou) # 頻度表(投球腕)
##
## 右 左
## 61 15
table(Drag20$Da) # 頻度表(打席)
##
## 右 左 左右
## 46 28 2
table(Drag20$Tou, Drag20$Da) # 頻度表(2次元)
##
## 右 左 左右
## 右 44 15 2
## 左 2 13 0
table(Drag20$height)
##
## 167 172 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 190 193
## 2 1 2 3 4 6 5 3 8 5 3 10 5 8 1 4 1 4 1
[答え] 連続変量の個々の値の頻度が表示される。 これは我々が求めている結果であろうか? もし、ある区切り幅の中に 含まれる人数を頻度として調べたいのであれば、 区切り幅を指定する必要がある。以下では165cmから5cm刻みで 195cmまでの各区間に含まれる頻度を表示している。
category_height<-cut(Drag20$height,
breaks=seq(165,195,5), right=FALSE)
table(category_height)
## category_height
## [165,170) [170,175) [175,180) [180,185) [185,190) [190,195)
## 2 3 21 31 14 5
区間の左側が閉区間、右側が開区間になっているのが、 カッコの違いで理解できる。 デフォルトでは右側が閉区間になってしまうので、 「right=FALSE」を指定して、右側を開区間とすることを指定している。
stem(Drag20$height) # 樹葉図(Stem and Leaf)
##
## The decimal point is 1 digit(s) to the right of the |
##
## 16 | 77
## 17 | 244
## 17 | 555666677777788888999
## 18 | 0000000011111222333333333344444
## 18 | 55555555677778
## 19 | 00003
樹葉図は電車の時刻表のような表示形式である。 一の位の内容が目視できて便利に感じる。
hist(Drag20$height, right=FALSE) # ヒストグラム
hist(Drag20$height, breaks = seq(160,200,10),
ylim=c(0,50), right=FALSE) # 区切りを指定
abline(h=seq(0,50,10), lty=3) # 点線を追記
ヒストグラムもデフォルトでは意図通りの区切りになっていないのであれば、こちらから陽に指定することができる。 また読み易さの観点から、点線を追記してある。 lty(点線, Line Typeか)にはいくつか種類があり、 補助線の場合は3番が適当ではないか?
boxplot(Drag20$height) # 縦方向に箱ひげ図
boxplot(Drag20$height, horizontal=TRUE) # 横方向に箱ひげ図
abline(v=seq(170,190,5), lty=3) # 点線を追記
横方向に伸びる箱ひげ図を表示したい場合は、「horizontal=TRUE」を指定する。なお、「TRUE」は真偽の「真」であり、デフォルトでは偽(FALSE)となっているため陽に指定する必要がある。また、それぞれは「T」、「F」と短縮して指定してもかまわない。
plot(Drag20$height,Drag20$weight) # 散布図
abline(v=seq(160,200,5),lty=3) # 点線を追記
abline(h=seq(70,100,10),lty=3) # 点線を追記
cor(Drag20$height,Drag20$weight) # 相関係数
## [1] 0.6119032
# setwd(”../”) # ホームディレクトリに移動
このページで取り扱ったプログラムだけを抜き出して以下に列挙しておく。
setwd("D:/home_sub3/R_Dir") # ホームディレクトリに移動(Set Working Directory) getwd() # 現在のディレクトリを表示(Get Working Directory) list.files() # ファイル名一覧 setwd("Dragons") # ディレクトリを移動 list.files() # ファイル名一覧 Drag20<-read.csv("Dragons20.csv", skip=6, header=TRUE) # CSVデータの読み込み Drag20 dim(Drag20) # データサイズの表示 colnames(Drag20) # 変量名の表示 str(Drag20) # データの内容を情報付きで表示(Structure) Drag20[1,] # 1人目だけの表示 Drag20[5,] # 5人目だけの表示 Drag20[1:10,] # 先頭10人の選手を表示 Drag20[20:30,] # 20番目から30番目までの11人の選手を表示 Drag20[seq(1,10),] # 先頭10人の選手を表示(別表現) Drag20[seq(20,30),] # 20番目から30番目までの11人の選手を表示(別表現) Drag20[,7] # 身長を全員分表示(方法1) Drag20$height # 身長を全員分表示(方法2) summary(Drag20) # 要約統計量(一気に全部を表示) summary(Drag20$height) # 要約統計量(指定した変量だけを表示) mean(Drag20$height) # 平均値 sd(Drag20$height) # 標準偏差 table(Drag20$Tou) # 頻度表(投球腕) table(Drag20$Da) # 頻度表(打席) table(Drag20$Tou, Drag20$Da) # 頻度表(2次元) table(Drag20$height) category_height<-cut(Drag20$height, breaks=seq(165,195,5), right=FALSE) table(category_height) stem(Drag20$height) # 樹葉図(Stem and Leaf) hist(Drag20$height, right=FALSE) # ヒストグラム hist(Drag20$height, breaks = seq(160,200,10), ylim=c(0,50), right=FALSE) # 区切りを指定 abline(h=seq(0,50,10), lty=3) # 点線を追記 boxplot(Drag20$height) # 縦方向に箱ひげ図 boxplot(Drag20$height, horizontal=TRUE) # 横方向に箱ひげ図 abline(v=seq(170,190,5), lty=3) # 点線を追記 plot(Drag20$height,Drag20$weight) # 散布図 abline(v=seq(160,200,5),lty=3) # 点線を追記 abline(h=seq(70,100,10),lty=3) # 点線を追記 cor(Drag20$height,Drag20$weight) # 相関係数 setwd(”../”) # ホームディレクトリに移動