Rの基礎

まずはRを電卓として使ってみましょう。

> 123 + 456
[1] 579

最後に出てくる [1] は,出力結果が長さ 1 のベクトル (vector) であることを示しています。

デフォルトの桁数を例えば 16 桁にしたければ options(digits=16) と打ち込みます。元に戻すには options(digits = 7) とします。これは表示桁数だけで,途中の計算は16桁程度以上で行われています。統計計算には十分な精度です。

変数(オブジェクト)は大文字・小文字を区別します。

複数の値を持つデータベクトルを作成するには,連結(concatenate または combine)を意味する c() を使い,ベクトルの各要素をコンマで区切ります。例えば,世界人口の推定値を要素としてもつベクトルを作成してみましょう。

> world.pop = c(2525779, 3026003, 3691173, 4449049, 5320817, 6127700, 6916183)

また,c() 関数を使うことで,複数のベクトルをまとめることができます。

> pop.first = c(2525779, 3026003, 3691173)
> pop.second = c(4449049, 5320817, 6127700)
> pop.all = c(pop.first, pop.second, 6916183)
> pop.all
[1] 2525779 3026003 3691173 4449049 5320817 6127700 6916183

ベクトルの中にある要素を取り出したい場合には,角括弧([ ])を用います。一方で,番号にマイナス記号(-)を付けると,特定の要素を取り出すことができます。ただし,こうした操作を行っても元のベクトルが変わるわけではありません。

> world.pop[2]
[1] 3026003
> world.pop[c(2, 4)]
[1] 3026003 4449049
> world.pop[c(4, 2)]
[1] 4449049 3026003
> world.pop[-3]
[1] 2525779 3026003 4449049 5320817 6127700 6916183

このベクトル内の要素は数値なので,算術演算を行うことができます。演算はベクトル内の各要素に対して行われます。ベクトルの中の各要素を 1000 で割って,1000人単位から100万人単位の推定値に換算してみましょう。

pop.million = world.pop / 1000
> pop.million
[1] 2525.779 3026.003 3691.173 4449.049 5320.817 6127.700 6916.183

各年代の人口の増加率を求めてみよう。

> pop.increase = world.pop[-1] - world.pop[-7]
> percent.increase = (pop.increase / world.pop[-7]) * 100
> percent.increase
[1] 19.80474 21.98180 20.53212 19.59448 15.16464 12.86752

わかりやすくするため,各オブジェクト(各変数)の中身を示しておく。

> world.pop[-1]
[1] 3026003 3691173 4449049 5320817 6127700 6916183
> world.pop[-7]
[1] 2525779 3026003 3691173 4449049 5320817 6127700
> pop.increase
[1] 500224 665170 757876 871768 806883 788483

小数点以下を丸めるには round() 関数を使います。

> percent.increase
[1] 19.80474 21.98180 20.53212 19.59448 15.16464 12.86752
> round(percent.increase)
[1] 20 22 21 20 15 13

関数

ここではデータを要約(基本的な記述統計を計算)する場合に役立つ基本的な関数を紹介します。

> length(world.pop)
[1] 7
> min(world.pop)
[1] 2525779
> max(world.pop)
[1] 6916183
> range(world.pop)
[1] 2525779 6916183
> mean(world.pop)
[1] 4579529
> sum(world.pop)
[1] 32056704
> sum(world.pop) / length(world.pop)
[1] 4579529

seq()関数を使うと,同じ数だけ増えていく(または減っていく)等差数列のベクトルを作成できます。1950年から2010年まで10年おきのオブジェクトを作成するのであれば

> year=seq(from=1950,to=2010,by=10)
> year
[1] 1950 1960 1970 1980 1990 2000 2010

最初の引数 from は,数列の始値を示します。2番めの引数 to は終値を示します。最後の引数 by は,数列の隣り合う公差(隣り合う2項の差)を表します。

seq(1950, 2010, 10) のように始値(はじめね),終値(おわりね),増分で指定することもできます。

コロン演算子(:)は,単純な数列,すなわち,コロンの前の数から後ろの数まで1ずつ増加または減少する数列を作成する。

> names(world.pop) = year
> names(world.pop)
[1] "1950" "1960" "1970" "1980" "1990" "2000" "2010"
> world.pop
   1950    1960    1970    1980    1990    2000    2010 
2525779 3026003 3691173 4449049 5320817 6127700 6916183 

function() 関数で新しい関数を作ることができます。

my.summary = function(x) { #この関数は引数を1つとる
  s.out = sum(x)
  l.out = length(x)
  m.out = s.out / l.out
  out = c(s.out,l.out, m.out)
  names(out) = c("sum", "length", "mean")
  return(out) # 出力を呼び出して関数を閉じる
}
> my.summary(z)
   sum length   mean 
  55.0   10.0    5.5 
> my.summary(world.pop)
     sum   length     mean 
32056704        7  4579529
## “world.pop”変数から奇数番目の要素を取り出す
> UNpop$world.pop[seq(from=1,to=nrow(UNpop),by=2)]
[1] 2525779 3691173 5320817 6916183

Rでは,欠損値はNAと表示される。ここでは,mean()関数など多くの関数を実行する際に欠損値を除外してくれる引数na.rm = TRUE を紹介しておく。以下の例では,ベクトルの8番目が欠損しており,欠損値が除外されるまで平均が計算できない。

> world.pop=c(UNpop$world.pop, NA)
> world.pop
[1] 2525779 3026003 3691173 4449049 5320817 6127700 6916183      NA
> mean(world.pop)
[1] NA
> mean(world.pop, na.rm = TRUE)
[1] 4579529

オブジェクトを保存する

Rを保存する際,作業スペースを保存するかどうか訊かれる。このとき,必要なもののみ保存することを習慣づけるために,noを選択するようにしよう。

参考

Rの初歩というページ(https://oku.edu.mie-u.ac.jp/~okumura/stat/first.html)の中の「終了のしかた」参照。

データフレームオブジェクトを,RDataファイルではなくCSVファイルとして保存したい場合もある。以下の例のように,オブジェクト名とファイル名を指定してwrite.csv()関数を使う。

練習問題

自己申告に基づく投票率のバイアス

問題1

> summary(turnout)
      year           VEP              VAP             total       
 Min.   :1980   Min.   :159635   Min.   :164445   Min.   : 64991  
 1st Qu.:1986   1st Qu.:171192   1st Qu.:178930   1st Qu.: 73179  
 Median :1993   Median :181140   Median :193018   Median : 89055  
 Mean   :1993   Mean   :182640   Mean   :194226   Mean   : 89778  
 3rd Qu.:2000   3rd Qu.:193353   3rd Qu.:209296   3rd Qu.:102370  
 Max.   :2008   Max.   :213314   Max.   :230872   Max.   :131304  
                                                                  
      ANES           felons         noncit         overseas   
 Min.   :47.00   Min.   : 802   Min.   : 5756   Min.   :1803  
 1st Qu.:57.00   1st Qu.:1424   1st Qu.: 8592   1st Qu.:2236  
 Median :70.50   Median :2312   Median :11972   Median :2458  
 Mean   :65.79   Mean   :2177   Mean   :12229   Mean   :2746  
 3rd Qu.:73.75   3rd Qu.:3042   3rd Qu.:15910   3rd Qu.:2937  
 Max.   :78.00   Max.   :3168   Max.   :19392   Max.   :4972  
                                                              
    osvoters  
 Min.   :263  
 1st Qu.:263  
 Median :263  
 Mean   :263  
 3rd Qu.:263  
 Max.   :263  
 NA's   :13   
> dim(turnout)
[1] 14  9
> range(turnout$year)
[1] 1980 2008

14の観察と9つの変数が含まれており,1980年から2008年までのデータが含まれている。

問題2

> 投票率1 = (total / (VAP + overseas)) * 100
> 投票率1
 [1] 52.03972 40.24522 52.53748 36.07845 49.72260 35.93884 54.04097
 [8] 38.03086 47.53376 34.83169 49.34211 35.82850 54.54777 55.67409

次に有権者人口(VEP)を使って投票率(以下「投票率2」)を計算してみる。

> 投票率2 = (total / VEP) * 100
> 投票率2
 [1] 54.19551 42.13701 55.24860 38.14115 52.76848 38.41895 58.11384
 [8] 41.12625 51.65793 38.09316 54.22449 39.51064 60.10084 61.55433
> 投票率2 - 投票率1
 [1] 2.155785 1.891789 2.711115 2.062703 3.045878 2.480105 4.072866
 [8] 3.095397 4.124166 3.261470 4.882388 3.682145 5.553078 5.880239
> range(投票率2 - 投票率1)
[1] 1.891789 5.880239
> mean(投票率2 - 投票率1)
[1] 3.492794
> round(mean(投票率2 - 投票率1))
[1] 3

約3ポイントほど有権者人口を使った投票率の方が高い。