2016年12月28日水曜日

外部とのデータのやりとり

 R にデータを取り込んだり、その逆をする方法です。いろいろなケースがありますが、代表的で使いやすい、csvファイルによる方法と、クリップボードを経由する方法の2つを紹介します。


csv は comma-separated values の略で、コンマ(,)で区切られた値という意味です。
データフレームをcsvファイルにしたり、その逆をします。
> d
  sex  w   h
1   F 45 150
2   F 48 151
3   M 55 160
4   M 54 163
5   F 50 155
> write.csv(d,"data.csv",row.names=FALSE)
データフレーム d を "data.csv" という名前で書き出しました。
書き出されたファイルは単なるテキストファイルですが、拡張子はcsvにしておくのがよいでしょう。
書き出されたファイルは以下のようになっています。
"sex","w","h"
"F",45,150
"F",48,151
"M",55,160
"M",54,163
"F",50,155


書き出したcsv ファイルを、変数 e に読み込みます。
> e=read.csv("data.csv")
> e
  sex  w   h
1   F 45 150
2   F 48 151
3   M 55 160
4   M 54 163
5   F 50 155



つぎに、クリップボード経由でやり取りする方法を述べます。

クリップボードはコンピュータの基本機能です。コピーするとクリップボードに保管されます。貼り付けるとクリップボードの内容が貼り付きます。

想定しているのは、excelで作業しているデータを取り込むことです。

 excelで、必要な範囲を選択し、コピーします。excelでのコピーはCtrlキーとCキーを一緒に押すなどの方法があります。
そのあと、Rで
> x = read.table("clipboard",header=TRUE)
1行目が項目なので、header=TRUE を付けます。
> x
   a  b
1 34 66
2 12 27

逆に、変数xの内容をクリップボードにコピーするには
write.table(x , "clipboard" , sep="\t" , row.names = FALSE )
となります。このようにコピーして、excelで貼り付ければOKです。

sepは区切り文字の指定です。separator の意味です。csvファイルのセパレータはコンマでしたが、excelでのコピー・貼り付けではセパレータは「タブ」といわれる一種の文字です。"\t"はこの「タブ」
といわれる文字を表します。

row.namesのデフォルトはTRUEで、行名を勝手につけてしまうので、それを抑制しました。

2016年12月26日月曜日

データフレーム

> d
  sex  w   h
1   F 45 150
2   F 48 151
3   M 55 160
4   M 54 163
5   F 50 155
上の変数 d は、5人の人の、性別、体重、身長のデータです。

このような形のデータをデータフレームといい、R ではよく使われます。

データフレームは次のように作ります。スクリプトファイルに書いて、実行しました。
d=data.frame( sex=c("F","F","M","M","F") ,
              w=c(45,48,55,54,50),
              h=c(150,151,160,163,155)
  ) 

最初のデータフレームの出力例で、テータの横の並びを「行」といい、上から第1行、第2行、・・・、縦の並びを「列」といい、左から順に第1列、第2列、・・・といいます。

data.frameはデータフレームを作る命令です。
その中は各列ごとに、 列名 = ベクトル の繰り返しです。

データフレームから列を取り出すには、
> d$w
[1] 45 48 55 54 50
のように、データフレーム名$列名 と指定します。

行番号、列番号で指定することもできます。
1番目の人の2番目のデータ(体重)は次のように指定します。
> d[1,2]
[1] 45
行番号、列番号の順に指定していることに注意してください。この指定方法は大変柔軟性があります。
いくつか例を挙げるので検討してみてください。
①行番号のみ指定して、列番号を省略すると、列番号はすべて選ばれます。
> d[1,]
  sex  w   h
1   F 45 150

②行番号のみの指定ですが、ベクトルで指定しました。
> d[c(2,4),]
  sex  w   h
2   F 48 151
4   M 54 163

③列番号のみの指定です。1列目は性別で、文字列M,F で指定しました。
 このような場合、データフレーム内では文字列としてではなく、
 因子(factor)として扱われるので、Lebels: などという行が付加されます。
> d[,1]
[1] F F M M F
Levels: F M

④行番号を:(コロン)で指定してみました。2~4番の人の身長です。
> d[2:4,3]
[1] 151 160 163


データフレームの扱い例です。
> summary(d)
 sex         w              h        
 F:3   Min.   :45.0   Min.   :150.0  
 M:2   1st Qu.:48.0   1st Qu.:151.0  
       Median :50.0   Median :155.0  
       Mean   :50.4   Mean   :155.8  
       3rd Qu.:54.0   3rd Qu.:160.0  
       Max.   :55.0   Max.   :163.0  
> plot(d)

summary での出力、sex欄は F が3個、M が2個あることをいっています。 w と hの出力については、以前説明ものと同じです。

plot の出力は以下のようになります。


2データずつの組み合わせで、 散布図を作っています。
wとhの散布図は以前説明したものと同じですが、縦軸と横軸を取り替えた2つがあることを確認してください。
sex(因子) との組み合わせは、Fが1、Mが2 として散布図が描かれています。
因子は1、2、3、・・・と変換されます。特に指定がなければアルファベット順です。

2変量の扱い plot cor

10人の生徒がいるとします。この10人の国語の点数は順に 46 44 45 52 32 52 36 40 43 54 点、数学の点数は順に 33 38 68 48 38 37 52 29 60 67 です。
それぞれ変数x,yに格納します。

> x=c(46,44,45,52,32,52,36,40,43,54)
> y=c(33,38,68,48,38,37,52,29,60,67)
散布図を描くには plot 関数を使います。
> plot(x,y)


国語ができる人は数学もできるという傾向があるでしょうか。

このような2変量の関係を相関といいます。相関を数値で調べるには相関係数を計算するのが一般的です。相関係数を計算する関数は cor です。相関係数は英語では Correlation coefficient といいます。
> cor(x,y)
[1] 0.2722588

相関係数の計算方法を紹介します。

まず、 xとyの共分散sxyとは、 x と y の偏差の積の平均です。言い換えると、「各人の国語の点数から国語の平均を引いたもの(国語の偏差)」と「各人の数学の点数から数学の平均を引いたもの(数学の偏差)」の積の平均です。 なお、共分散を求めるには、分散を求める関数と同じ var を用います。
> var(x,y)
[1] 27.55556

x と y の相関係数 r とは x と y の共分散 sxy を、x と y の標準偏差の積で割ったものです。式でいえば、sxy/(sx・sy) です。ただし、sx、syはx、yの標準偏差です。

> var(x,y)/(sd(x)*sd(y))
[1] 0.2722588
相関係数はー1以上1以下の値をとります。1に近いときは正の相関、-1に近いときは負の相関があるといい、1やー1に近いときは強い相関、0に近いときは弱い相関あるいは相関がないといいます。 この例ではあまり相関はなさそうです。

相関係数の計算で、分母、分子ともに平均をとっているので、どちらも平均の代わりに合計にしても同じになります。
分子は、偏差の積の総和、分母は偏差の平方の総和のルートの積です。
次のようになります。
> hx=x-mean(x)
> hy=y-mean(y)
> Sxy=sum(hx*hy)
> Sx=sqrt(sum(hx^2))
> Sy=sqrt(sum(hy^2))
> Sxy/(Sx*Sy)
[1] 0.2722588
hx、hyは偏差です。
Sxyは偏差の積の総和です。
Sx、Syは偏差平方の和のルートです。
最後の値が相関係数です。

2016年12月22日木曜日

四分位数と箱ひげ図 summary boxplot

ざっくりいうと、四分位数はデータを小さい順に並べて4等分し、区切りの数を小さい方から第1四分位数、第2四分位数、第3四分位数といいます。第2四分位数は中央値ともいいます。
厳密な定義は種々あるようですが、教科書では次のようになっていました。

①中央値・・・データを小さい順に並べたときに、中央に来る値。偶数個の場合は中央2個の平均
②第1四分位数・・・下半分の中央値。全体のデータの個数が奇数の場合は中央の値は上半分にも下半分にも含まれない。
③第2四分位数・・・中央値
④第3四分位数・・・略

Rの四分位数の定義はこれとは若干違うようです。
> x=rnorm(100)
> summary(x)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-2.43200 -0.63320  0.05018  0.02139  0.63870  3.19800 
> boxplot(x)


 
summary で最大値、最小値、四分位数、平均がわかります。

boxplot で箱ひげ図を書いてくれます。箱ひげ図の中に小さな〇が見えますが、これは外れ値といって、第1四分位数ー(第3四分位数ー第1四分位数)*1.5 より小さいものと、第3四分位数+(第3四分位数ー第1四分位数)*1.5 より大きいものです。

乱数の生成2 runif rnorm

先に述べた乱数は離散的でした。連続数の乱数を発生させることもできます。ここでは、2つ紹介します。
一様乱数はrunifで発生させます。0と1の間の一様乱数を発生させます。一様乱数はヒストグラムを見てもらえばわかりますが、どこの値も同じ確率で出現するものです。正確に言えば、0と1の間のどの区間をとってもその区間に属する確率がその区間の長さになるということです。
> runif(10)
 [1] 0.74192181 0.84109459 0.03790601 0.57752632 0.74297037
 [6] 0.14437520 0.53421387 0.73867798 0.03281839 0.21860819
> hist(runif(1000))
runif の引数は発生させる乱数の個数です。10個の乱数を発生させました。
続いて、1000個の一様乱数の分布状態です。
 
正規分布に従う乱数を発生させるにはrnormを使います。引数はやはり発生させる乱数の個数で、平均0、分散1の正規分布に従います。
 
> rnorm(10)
 [1]  0.7598543  0.8352244  2.1416279 -1.1533345  0.5850839
 [6]  0.9011274 -0.6544796  0.2424756 -1.2737129 -0.3236183
> hist(rnorm(1000))



一様分布と正規分布の分布状況の違いを確認してください。試験の点数や身長などは正規分布に近い分布をします。

問題1 runif(1000)について、平均と分散を求めてください。

問題2 rnom(1000)について、平均と分散を求めてください。

問題3 一様乱数2個の和の分布を見てください。さいころ2個の和の分布と似ていますか

一様分布と正規分布はuniform distribution と normal distribution といいます。

分散と標準偏差 var sd

次のサンプルデータを使います。
> x=sample(1:6,10,T)
> x
 [1] 6 4 5 4 4 4 5 3 2 5
平均を出してみます。
> sum(x)/length(x)
[1] 4.2
> mean(x)
[1] 4.2
各値から平均を引いたものを偏差といいます。次のyです。 > y=x-mean(x) > y [1] 1.8 -0.2 0.8 -0.2 -0.2 -0.2 0.8 -1.2 -2.2 0.8
> y=x-mean(x)
> y
 [1]  1.8 -0.2  0.8 -0.2 -0.2 -0.2  0.8 -1.2 -2.2  0.8
データが平均からどれくらい離れているかを数量化したいとします。偏差を合計すると当然0になります。
> sum(y)
[1] -1.776357e-15
あれ、0になりませんね。
この表示は、-1.776357かける10の-15乗であるといっています。これは0に大変近い数です。yの値はコンピュータの中では正確に表現できないので、合計すると誤差が積算してしまうのです。こういう現象があることは知っておきましょう。実際には0です。 これは平均より大きければプラス、小さければマイナスとなり、合計すると相殺してしまうからです。
これではどれくらい離れているかわかりません。 なので、これらをすべて2乗して正の数にしてから合計します。
> sum(y^2)
[1] 11.6
一つのデータあたりにするために平均します。
> mean(y^2)
[1] 1.16
この値を分散といいます。要約していえば、分散とは 偏差平方の平均 です。

分散を求める関数は var です。
> var(x)
[1] 1.288889
あれ、値が違いますね。
実はRの分散はデータの数をnとすると、(n-1)で割っているのです。今の例ではデータの数は10個ですから偏差平方和を9で割っているということです。
> sum(y^2)/9
[1] 1.288889
同じになりましたね。

平均といいながら(n-1)で割るとは何事かと、思うでしょう。実はexcelでの分散varも同じことをやっています。その理由はここでは述べられません。これから、勉強していけば、いつかわかります。大学へ行ってからかな?

分散は、散らばり具合を表す数として、非常に重要なものです。

分散は偏差平方の平均でした。従ってこれをルートしたものが偏差の代表と考えてよいでしょう。これを標準偏差といいます。
標準偏差を求める関数は sd です。standard deviation の略です。
> sd(x)
[1] 1.135292
> sqrt(var(x))
[1] 1.135292
nでわるか、(n-1)で割るかという問題はsdにもあります。
なお、高校で分散・標準偏差の計算をしろと言われたら、nで割ってください。

問題1 データが 1,2,3,4,5,6 の時の分散、標準偏差を求めてください。nでわったときと(n-1)で割ったときの両方の値を出してください。

問題2 さいころを1万回振るシュミレーションを行い、分散を求めてください。var を使ってよいです。

実は、問題1のnで割ったほうの分散が、サイコロを振ったときの分散の理論値になります。問題2と一致していますか?

関数について

sqrtはルートを計算する関数です。
> sqrt(5)
[1] 2.236068
( )の中の5を引数といいます。2.236068が返る値です。

sample関数の使い方は次のようになっています。?sampleで調べました。

    sample(x, size, replace = FALSE, prob = NULL)

引数は、x,size,replace,prob です。それぞれの引数には、具体的な値やベクトルが入ります。

x と size は 省略できません。

それに対して、replace と prob は省略できます。省略したとき、replaceはFALSE、probはNULLとなります。=の後の値は省略時のデフォルト値です。


sample関数を使って、関数の利用の仕方を説明しましょう。
①
> sample(1:5,10,T)
 [1] 4 1 1 2 4 4 5 4 2 4

②
> sample(size=5,x=1:6)
[1] 6 2 3 4 5

③
> sample(size=15,x=1:6,T)
 [1] 4 6 6 2 3 2 5 5 1 2 1 2 2 3 4

④
> sample(x=1:6,10,rep=T)
 [1] 5 1 1 6 1 3 2 5 2 3
①のように、単純に引数を与えると、順にx,size,replaceの値として処理されます。
②のように変数名も指定すると、引数の順序を変えてもOKです。
③のように、1・2番目は変数名を指定し、変数名を省略した3番目は順序通り3番目の値とすることも可能ですが、あまりお薦めできません。
④変数名は特定できるところまで省略可能です。この関数の場合rから始まる引数はreplaceしかないのでr=TでもOKです。

なお、引数 prob は、各値の出現の確率を変えるときに使います。たとえば、prob=c(3,1,2)とすると、出現の割合が 3:1:2 になるということです。

問題 関数 sqrt と hist について、?で調べてみてください。

sqrt の使い方は単純です。
それに対して、hist の方は、大変複雑です。しかし、だいたいの引数は省略可能なので、驚かなくてよいです。
実際に使うようになると、これらの引数が必要になることを身をもって知ることになりますが、それは先のこと。