このページでは、RStudio を使いながら統計学の基礎を復習する。 1回の授業で復習する範囲には限りがあるので、だいぶ大雑把な説明になっている。 基礎に不安がある場合は、統計学1, 2 の内容を復習してほしい。

RStudio 入門

プロジェクトの作成

RStudio にはプロジェクト機能がある。この機能を使うと、プロジェクトの管理が容易になる。ここでは、「計量経済学応用」をプロジェクトの1つと考え、新規プロジェクトを作成してみよう。

以下のステップを踏めば、プロジェクトが作れる。

  1. コンピュータの自分のファイルが保存できる場所に、計量経済学応用のフォルダ(ディレクトリ; directory)を作る
  • フォルダ名はアルファベットと数字のみを利用する
  • フォルダ名の最初の文字はアルファベットにする
  • ファルダ名にスペースを使わない
  • 例: econometrics_KUT
  1. 上部のメニューで、File -> New Project を選ぶ
  2. Existing Directory(既存のディレクトリ)を選ぶ
  3. browse(閲覧)を押して、自分が作ったフォルダ(ディレクトリ)を選び、右下の Create Project をクリックする

これで新しいプロジェクトができる。プロジェクト名(自分で作ったフォルダの名前がそのまま使われる)は RStudioの右上に表示される。

次回以降、このプロジェクトを開くには、File -> Open Project でこのプロジェクトを選べばよい。

R Markdown ファイルの作成と利用

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の命令

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 フォルダの中に保存する。

このデータは 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 パッケージを読み込む。ただし、ggplot2tidyverse に含まれているので、library("tidyverse") を実行済みなら、ggplot2 を改めて読み込む必要はない。

日本語の文字化けを防ぐため、Macユーザのみ次のコードを実行する。


ヒストグラム (histogram)

まず、身長 (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を使わない場合のヒストグラムと似たような形になった。

ここまで作ったヒストグラムは、男女のデータを一緒に扱っている。 男女を分けて描くとどうなるだろうか。


箱ひげ図 (box [and whiskers] plot)

続いて、身長の箱ひげ図を男女別に描いてみよう。

箱ひげ図だけでは、分布の形状がわからないので、バイオリンプロットを描いてみよう。

バイオリンプロットの上に、箱ひげ図を重ね描きしてみよう。

箱ひげ図よりも情報量が多く、近年よく使われるようになってきた beeswarmplot (蜂群図)を描いてみよう。 追加のパッケージが必要なので、まずインストールして読み込む。

geom_quasirandom() でbeeswarmplot を描く。

箱ひげ図と併用してみよう。


散布図 (scatter plot)

今度は、身長と体重 (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
##       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

とすればよい。 自分で関数を定義することもできる。

## [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)\) が得られる。



授業の内容に戻る