このページでは、RStudio を使いながら統計学の基礎を復習する。 1回の授業で復習する範囲には限りがあるので、だいぶ大雑把な説明になっている。 基礎に不安がある場合は、統計学1, 2 の内容を復習してほしい。
RStudio にはプロジェクト機能がある。この機能を使うと、プロジェクトの管理が容易になる。ここでは、「計量経済学応用」をプロジェクトの1つと考え、新規プロジェクトを作成してみよう。
以下のステップを踏めば、プロジェクトが作れる。
これで新しいプロジェクトができる。プロジェクト名(自分で作ったフォルダの名前がそのまま使われる)は RStudioの右上に表示される。
次回以降、このプロジェクトを開くには、File -> Open Project でこのプロジェクトを選べばよい。
Rのコマンド(命令文)は、RStudio 左側(あるいは左下)の Console に直接打ち込むこともできる。しかし、通常はそのような使い方はしない。代わりに、Rの命令が書かれたファイルを別に作り、その中に命令を記入する。
RStudio で新しいR Markdown ファイルを作るには、RStudio 上部のメニューで、File -> New File -> R Markdown の順番で選ぶ。そうすると、R Markdown ファイルの基本情報を設定するためのウィンドウが出てくるので、OK を押してファイルを作成する(ここで title と author を入力してもいいが、後で入力できるので、OKボタンをクリックするだけでよい)。 すると、RStudio の左側のウィンドウが上下に2分割されるはずである。このとき、左下にはConsole が見える。左上に新たに開くのがR Markdown である。
R Markdownファイルができたら、名前をつけて保存しよう(名前の付け方はフォルダ名の付け方と同じルールで)。ファイルの拡張子は .Rmd である。このファイルに、自分が実行する分析内容の説明とRの命令の両方を書き込んでいく。
R Markdown ファイルには、通常の文章や数式、写真やリンクなどを書き込むことができる。文章については、通常のテキストエディタやワープロソフトのように、単に文章を書く。
このとき Markdown という記法が使える。Markdown記法については、ココやココやココ を参照。
Rの命令だけ書いても、命令の意味を忘れてしまったり、自分がなぜその命令を書いたのか後でわからなくなったりするので、説明する文章を積極的に(たくさん)書き込もう。
R Markdownファイルの中で、Rの命令はコードチャンクと呼ばれる部分に書く。コードチャンクは、 ```{r}(コードチャンクの開始)と ```(コードチャンクの終了)に囲まれた部分である。RStudioでは、Ctrl + Alt + i (3つのキーを同時に押す)でコードチャンクが作れる。RStudio では、コードチャンクが正しくできるとその部分の背景の色が他と少し変わる。
コードチャンクに書いた命令を実行したいときは、実行したい行にカーソルを合わせ、Ctrl と Enter (Mac の場合は、Cmd と Return) を同時に押す。すると、命令が実行され、結果がR Markdownファイル上に表示される(設定によって、Consoleにのみ表示するように変更することもできる)。
このように、R Markdownファイルには文章とRのコードの両方を書き込める。最終的には、文章と分析結果をまとめて HTMLファイルやPDFファイルに出力することができる。よって、RStudioだけでレポートや論文を書くことが可能である。(So long, MS Word!)
もう少し詳しい説明は、Rマークダウン入門にある(他にも、ネット常に有益な情報がたくさんある)。
まず、今回の実習で利用するデータをダウンロードしよう。 準備として、現在利用しているプロジェクト(上で作ったフォルダ)の中に、data という名前のフォルダを作ろう。
次にデータセット fake-data-lec02.csv をダウンロードし、今作った data フォルダの中に保存する。
download.file(url = "http://yukiyanai.github.io/jp/classes/econometrics2/contents/data/fake-data-lec02.csv",
destfile = "data/fake-data-lec02.csv")
このデータは CSVと呼ばれる形式なので(詳しくは次回復習する)、tidyverseに含まれるreadrパッケージのreadr::read_csv()
という関数を使ってデータセットを読み込むことができる。 このデータセットを myd
という名前で利用することにしよう(これはデータセットのファイル名を変えるのではなく、Rで使う上での呼び名を決めている)。
読み込んだデータを確認してみよう。 まず、データセットの最上部または最下部にある数行分だけを表示する。
## # A tibble: 6 x 6
## id sex age height weight income
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 1 male 52 174 63.1 3475810
## 2 2 male 33 175. 70.2 457018
## 3 3 male 22 175 82.6 1627793
## 4 4 male 33 170. 81.8 6070642
## 5 5 male 26 167. 51.2 1083052
## 6 6 male 37 159. 57.8 2984929
## # A tibble: 4 x 6
## id sex age height weight income
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 97 female 45 161. 48.7 1062663
## 2 98 female 53 166. 64.2 10154200
## 3 99 female 43 158. 48.5 8287163
## 4 100 female 48 154. 42 1125390
データセットに含まれる変数名を確認したいときは、
## [1] "id" "sex" "age" "height" "weight" "income"
とする。
データセットに含まれる観測数 (\(n\)) と変数の数を知りたいときは、
## [1] 100 6
とする。最初の数字が\(n\)の数(データセットの行数)、2番目の数字が変数の数(列数)である(RStudio を使うと、右上のウィンドウの“Environment” というタブに、この情報が表示される)。
データセットに含まれるすべての変数の基本的な統計量を確認したいときは、
## id sex age height
## Min. : 1.00 Length:100 Min. :20.00 Min. :148.0
## 1st Qu.: 25.75 Class :character 1st Qu.:36.00 1st Qu.:158.1
## Median : 50.50 Mode :character Median :45.00 Median :162.9
## Mean : 50.50 Mean :45.96 Mean :163.7
## 3rd Qu.: 75.25 3rd Qu.:57.25 3rd Qu.:170.2
## Max. :100.00 Max. :70.00 Max. :180.5
## weight income
## Min. :28.30 Min. : 240184
## 1st Qu.:48.95 1st Qu.: 1343679
## Median :59.95 Median : 2987818
## Mean :59.18 Mean : 4343425
## 3rd Qu.:67.33 3rd Qu.: 6072696
## Max. :85.60 Max. :23505035
とする。
また、tibble::glimpse()
も、データの概要を把握するのに便利である。
## Observations: 100
## Variables: 6
## $ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ...
## $ sex <chr> "male", "male", "male", "male", "male", "male", "male",...
## $ age <dbl> 52, 33, 22, 33, 26, 37, 50, 30, 62, 51, 55, 36, 66, 42,...
## $ height <dbl> 174.0, 175.3, 175.0, 170.1, 167.4, 159.3, 173.3, 162.5,...
## $ weight <dbl> 63.1, 70.2, 82.6, 81.8, 51.2, 57.8, 68.6, 47.2, 68.2, 5...
## $ income <dbl> 3475810, 457018, 1627793, 6070642, 1083052, 2984929, 14...
以下では、図を描くために ggplot2 というパッケージを使う。 インストール済みでない場合(大学のコンピュータには既にインストール済み(のはず)なので、この部分は実行しなくてよい)は、まず
とする。1度インストールすれば、次回からはこの過程をスキップしてよい。
インストールが済んだら、library()
を使ってggplot2 パッケージを読み込む。ただし、ggplot2もtidyverse に含まれているので、library("tidyverse")
を実行済みなら、ggplot2 を改めて読み込む必要はない。
日本語の文字化けを防ぐため、Macユーザのみ次のコードを実行する。
theme_set(theme_gray(base_size = 12, base_family = "HiraginoSans-W3"))
# これがうまくいかない(旧いOSを使っている)ときは次の行を実行
# theme_set(theme_gray(base_size = 12, base_family = "HiraKakuPro-W3"))
まず、身長 (height) のヒストグラムを作る。
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
作った図を保存したいときは、ggsave()
を使う たとえば、
とすると、最後に作った図が height-histogram.pdf という名前のPDFファイルとして保存される。 RStudio では、右下にあるウィンドウのPlots タブに保存したい図を表示し、Export で保存することもできる。
デフォルトでは縦軸が度数 (count, frequency) である。これを確率密度 (probability density) に変えてみよう。
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ヒストグラムは階級幅によって見た目が変わるので、色々変えてみる必要がある。 幅を5に変えてみよう。
これでggplot2を使わない場合のヒストグラムと似たような形になった。
ここまで作ったヒストグラムは、男女のデータを一緒に扱っている。 男女を分けて描くとどうなるだろうか。
続いて、身長の箱ひげ図を男女別に描いてみよう。
箱ひげ図だけでは、分布の形状がわからないので、バイオリンプロットを描いてみよう。
バイオリンプロットの上に、箱ひげ図を重ね描きしてみよう。
箱ひげ図よりも情報量が多く、近年よく使われるようになってきた beeswarmplot (蜂群図)を描いてみよう。 追加のパッケージが必要なので、まずインストールして読み込む。
geom_quasirandom()
でbeeswarmplot を描く。
箱ひげ図と併用してみよう。
今度は、身長と体重 (weight) の関係を散布図を使って確認してみよう。
ここでも、男女を色分けして区別しよう。
次に、身長と体重の関係を、(男女別に)直線で示してみよう。
最後に、所得 (income) も同時に図示してみよう。
変数(ベクトル)\(x\)の平均値(算術平均, mean)は \(\bar{x}\) と表し(「エックスバー」と読む)、 \[ \bar{x} = \frac{\sum_{i=1}^n x_i}{n}\] である。 Rでは、
## [1] 10.88367
とすればよい。 しかし、平均値のような基本的な統計量を求める関数はあらかじめ用意されている。 平均値は、mean()
で求められる。
## [1] 10.88367
これで、先ほど求めたものと同じ平均値が得られる。
中央値はmedian()
、 最小値はmin()
、 最大値はmax()
で求める。
## [1] 10.34832
## [1] 4.225534
## [1] 17.1569
また、分位数 (quantile) はquantile()
で求める。 百分位数 (percentile) や四分位数 (quartile) を求めるときもこの関数を使えばよい。
## 50%
## 10.34832
## 25th percentile = 1st quartile と 75th pecentile = 3rd quartile を同時に求める
quantile(x, c(.25, .75)) ## 25th percentile と 75th pecentile を同時に求める
## 25% 75%
## 8.840022 12.793482
したがって、四分位範囲 (IQR) は、
## 75%
## 3.95346
で求められる。用意されている関数を使い、
## [1] 3.95346
でもよい。 五数要約は、
## 0% 25% 50% 75% 100%
## 4.225534 8.840022 10.348323 12.793482 17.156903
とすればよい。 第1四分位数と第3四分位数の代わりに下側ヒンジと上側ヒンジ (Tukey 1977. Exploratory Data Analysis.) を求めたいときは、fivenum()
を使う。
## [1] 4.225534 8.783684 10.348323 13.492319 17.156903
変数 \(x\) の不偏分散 (unbiased variance) は\(u_x^2\) と表し、 \[u_x^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}\] である。 これをR で求めると、
## [1] 12.97088
とすればよい。 分散は最も重要な統計量であり、当然関数が用意されているので、var()
で求めることができる。
## [1] 12.97088
標準偏差 (standard deviation) は分散の平方根なので、
## [1] 3.60151
で求められるが、sd()
を利用することもできる。
## [1] 3.60151
ベクトル\(x\) が標本ではなく母集団のとき、平均は\(\mu\)、分散は\(\sigma^2\) で表される。 母集団の平均値は、標本の場合と同様、
## [1] 10.88367
で求められる。 しかし、母集団の分散は \[\sigma^2 = \frac{\sum_{i=1}^N (x_i - \mu)^2}{N}\] なので、var()
をそのまま使うことはできない。代わりに、
## [1] 12.32233
とすればよい。 自分で関数を定義することもできる。
pop_var <- function(population) {
return(sum((population - mean(population))^2) / length(population))
}
pop_var(x)
## [1] 12.32233
R には無作為抽出を行うための関数が用意されている。
たとえば、最小値 \(a\)、最大値 \(b\) の連続一様分布 (uniform distribution) から無作為に\(n\) 個の値を取り出すには、 runif(n, a, b)
とする。 試しに、\(n = 10, a = 0, b = 1\) でやってみると、
## [1] 0.3541039 0.8662398 0.2465292 0.1268161 0.9746990 0.1859792 0.2194578
## [8] 0.3532229 0.4970428 0.4781754
となる。 無作為抽出(正確には疑似乱数だが)なので、取り出される数字は毎回異なる。 したがって、もう一度同じコマンドを使うと、
## [1] 0.756197848 0.938870118 0.887824585 0.752052764 0.438574469
## [6] 0.067749247 0.575523863 0.431188120 0.365853603 0.008564131
のように、先ほどとは異なる数字が得られる。 乱数を使って論文やレポートを書くとき、同じ乱数を再現したい場合がある。そんなときは、set.seed()
で乱数の種 (seed) を指定してやればよい。
## [1] 0.45755673 0.21033244 0.94678455 0.02105657 0.91747148 0.79369380
## [7] 0.75890287 0.98959130 0.98801158 0.90748110
## [1] 0.45755673 0.21033244 0.94678455 0.02105657 0.91747148 0.79369380
## [7] 0.75890287 0.98959130 0.98801158 0.90748110
おすすめのseed(種)は、ここで使ったようにその日の日付 (年-月-日)である。
一様分布以外の分布から無作為抽出するときも r分布名()
という関数を使う。 正規分布ならrnorm()
、\(t\) 分布はrt()
、カイ二乗分布はrchisq()
という具合である。 ただし、指定しなければならない母数(parameters) は分布によって異なる。 既に見たように、一様分布では最小値 (min) と最大値 (max) を指定するが、正規分布では平均値 (mean) と標準偏差 (sd)、\(t\) 分布やカイ二乗分布では自由度 (df) を指定する。
たとえば、平均\(\mu\)、分散\(\sigma^2\) の正規分布から無作為kに \(n\) 個の値を取り出すには、rnorm(n, mean = mu, sd = sigma)
とする。平均が10、分散が4の正規分布から100個の値を取り出したいなら、
とする。
r分布名()
の“r” を“d”に変えると確率密度 \(f(x)\) が、“p” に変えると累積分布関数\(F(x)\) が得られる。