Chapter 7 記述統計

7.1 統計とは

統計学はおおまかに記述統計推測統計の2つから成り立っている。記述統計は得られたデータからその特徴を抜き出す統計であり、推測統計は全体の把握が難しいような大きな対象やまだ起こっていないことなどに対して推測を行う統計である。

7.1.1 記述統計

記述統計の代表的なものに人口統計がある。その国や地域に現在人口が何人いるか?男女比は?年齢構成は?などの特徴を把握するための手続きである。

記述統計を行うためには、ヒストグラムなどのビジュアライゼーションと、平均値・標準偏差などの統計量による記述の方法がある。

7.1.2 推測統計

たとえば、日本人全員の身長を知ろうとして、全員を調査するのは難しい。しかし、全員を調査をできなくても、一部の人を調査することで全体を推測することができる。

身近なものには選挙の当確がある。例えば、AさんとBさんのいずれかを選ぶ投票を行い、1万人が投票したとする。過半数を取らないと当選にならないので、少なくともいずれかが5000票獲得するまでは勝負は決まらない。しかし、開票率1%で当確が出ることがある。1万票の1%は100票である。それだけしか開票していないのになぜ「当選確実」といえるのだろうか。

 票が入った箱をよく混ぜてそこから100票を取り出すとしよう。そして、90票がAさんで、のこり10票がBさんだったどうだろうか。おそらくAさんが勝つだろうということになる。かなり高い確率で、残りの9900票の多数もAさんに投票されていると考えるのが妥当だからだ。もちろん確率の問題であるため、当確が取り消されることもまれにある。しかし、ある程度の間違いがあるとしたうえで、まだわからないもの、もしくは規模が大きすぎてわからないものを少ないサンプルで推測しようとするのが推測統計である。    このような推測統計を行う際には「よく混ぜる」ことが重要である。イメージとしてはコーヒーにミルクを混ぜる場合である。しっかりとかき混ぜれば、スプーンで掬った一部とカップの中は同じ濃さのはずであるが、きちんと混ざっていなければ、まだ良く混ざっていないコーヒーの部分を掬ってもカップの中の味を再現することはできない。

7.2 準備

あらたにRスクリプトを作成し、stats.Rという名前をつけて保存する。

そして、以下のライブラリを読み込んでおく。ライブラリがなくてエラーが出る場合はインストールしてから再度読み込む。

library(tidyverse)
library(psych)
library(skimr)

# もしインストールしてない場合は、Rstudioの右下ペーンのPackagesタブからインストールするか、以下のコード
install.packages("psych")
install.packages("skimr")

7.3 データとは

統計において分析する対象はデータである。データには様々な形があるが、一般的には数値や文字情報の集まりである。

以下のコードを実行してみよう。すると、100個の数値が並ぶ。これをランダムにサンプリングして計測した日本人男性の身長だとしよう。

set.seed(3)
height <- rnorm(100,mean=170,sd=10) |> round()

height
##   [1] 160 167 173 158 172 170 171 181 158 183 163 159 163 173 172 167 160 164 182 172
##  [21] 164 161 168 153 165 163 182 180 169 159 179 179 177 177 166 177 183 170 160 178
##  [41] 178 167 187 162 173 147 168 181 165 161 177 162 173 153 156 165 160 184 179 162
##  [61] 176 179 173 174 182 165 166 180 157 172 170 175 180 173 172 177 182 174 160 168
##  [81] 187 166 177 182 178 170 172 161 174 161 161 160 163 181 166 169 165 175 179 168

この数字を見てどう思うか?

「ああ、数字が並んでいるなぁ」

「自分はこの中では高いほうかな」

などと思うかもしれない。 まず、身長はみんな同じではない。言い換えると、様々な数値を取る。これを分布すると呼ぶ。

なぜ数値は分布するのだろうか。それは、データを生み出す背景に不確実性があるから。日本人男性の身長が決まるメカニズムが存在する。また個々人で条件が異なる。そういった背景が身長という数値となって現れている。

一方で、数字の決まり方には特徴や癖がある。たとえば身長1cmや身長100mの人はいない。「普通」の身長に近いひとは多く、特に低い人や高い人は数としては少ない。こういった分布の特性がある。どうやって特徴や癖を把握すればいいのか?

数字がざっと並んでいるだけでは、イマイチよくわからない。そこで、生データ(生の現実)から、特徴や癖を引き出す手法が統計なのである。

ではどのように特徴や癖を引き出すか。これにはデータの縮約を行う。 縮約とはデータとして並んでいるたくさんの数字を、なにかの基準で整理整頓して、意味のある情報だけを抽出することである。

縮約には大きく分けて二つの方法がある。一つ目は、1つの数字で特徴を代表させる方法である。この代表される数字を統計量である。二つ目は、グラフ化してその特徴をとらえようとすることである。近年ではVisualizationとも呼ばれる。

この章では代表的な統計量をおさらいし、そのRでの計算方法を学ぶ。

7.4 代表的な統計量

7.4.1 数式

まず、数式の読み方について簡単におさらいする。数式は英語と同じで意味がわかれば怖いものではないので、一つずつ確認しよう。

統計学では、データを表現するのによく文字を使う。例えば\(x\)である。しかし、データが100個ある場合には、\(x_{1},x_{2},\ldots,x_{100}\)といったように、右下に添え字をつけてデータを区別する。このとき、一般的な言い方をするために\(i\)番目のデータを\(x_{i}\)と表記することがある。

ここで、厳密には統計量ではないが、データの合計の計算方法を勉強しよう。 例えば上の身長の例のように、100個のデータを合計するためには、100個の数値を足す必要がある。それを数式で表現すると、

\[ x_1 + x_2 + x_3 +\cdots + x_{100} \] のように、100個の数字を書く必要があるが、現実には書けない。

そこで、数列の和の記号であるシグマを使う。

\[ \sum^{100}_{i=1}x_i = x_1 + x_2 + x_3 +\cdots + x_{100} \]

上の左辺のシグマ記号で書かれたものは、右辺と同じ意味である。 つまり上のシグマ記号\(\sum\)は、「\(i=1\)から、\(100\)までの\(x_i\)を足し合わせる」という意味を持つ。

合計をRで計算するときには、sum()という関数を使って以下のようになる。ここではheightというオブジェクトに100個の数値を持つベクトルが入っているため、sum()はベクトルのすべての数値を足し合わせる。

sum(height)
## [1] 17008

7.4.2 平均

もっとも身近な統計量は平均であろう。統計学において平均値とは一般的に算術平均(相加平均)を指す。これはすべてのデータを合計し、それをデータの個数で割ることで求められる。

統計ではよくデータ\(x_{i}\)の平均を、\(x\)に棒をつけて\(\bar{x}\)と表現する。

\[ \bar{x} = \frac{1}{n}\sum^{n}_{i=1}x_i \]

これをRで計算するときには、mean()という関数が用意されている。

mean(height)
## [1] 170.08

7.4.3 中央値

中央値は、一言でいうと「真ん中」にある数値である。数値を小さい順に並べ、その真ん中にある数値を代表値として選ぶ。これは平均値と一致することもあれば、異なることもある。

もう少し厳密に定義すると、 \(n\)個の観測値からなるデータ(\(x_1,x_2,\ldots,x_n\))を小さい順に並べたものを(\(x_1',x_2',\ldots,x_{n}'\)) とする。中央値\(Q_{\frac{1}{2}}\)

\[ Q_{\frac{1}{2}} = \begin{cases} x_{\frac{n}{2}} & \text{もし } n \text{が奇数の場合} \\ \frac{1}{2}(x_{\frac{n}{2}} + x_{\frac{n}{2}+1}) & \text{もし } n \text{が偶数の場合} \end{cases} \]

難しく見えるかもしれないが、単純なことを行っている。\(n\),つまりデータの個数が奇数ならば、「真ん中」の数値が中央値となる。データの個数が5なら3番目, 99なら50番目である。 もし、データが偶数ならば、「真ん中」の数値はない。そこで、ちょうど真ん中を挟む二つの数字の平均を取る。100個のデータがあるならば、50番目と51番目の数字の平均を取ることで中央値とする。

Rでの計算はmedian()関数を用いる。medianは文字通り英語で中央値という意味である。

median(height)
## [1] 170

7.4.4 最大値・最小値

データの中で最も大きい数値、小さい数値もデータの特徴を表す。

Rではmax()関数, min()関数で算出できる。

# データの最大値
max(height)
## [1] 187
# データの最小値
min(height)
## [1] 147

7.4.5 分散

分散は、データのばらつきを示す統計量である。数値が大きければデータは互いに大きく異なる数値を取っており、小さけば近い数値を取っている。分散は、それぞれのデータの数値から平均値を引き、それを二乗することで求められる。

\[ \sigma^2 = \frac{1}{n}\sum^{n}_{i=1}( x_i - \bar{x})^2 \]

Rで分散を計算する関数はデフォルトでは用意されていない。なぜないのかは、Section 9の不偏分散の項で説明する。

分散をRで計算すると、自分で数式を表現する必要があるが以下のようになる。

height_mean <- mean(height) # heightの平均値
height_n <- length(height)  # heightのデータの個数


sigma2 = sum((height-height_mean)^2)/height_n
sigma2
## [1] 72.9936

7.4.6 もう一つの分散:不偏分散

不偏分散は同じくデータの散らばりを示す統計量である。標本分散と呼んだり、文脈によっては単に分散と呼んでこちらを指す場合もある。 詳しくは推定統計量の項で説明する。

分散との違いは、nで割るか、n-1で割るかの違いである。

\[ s^2 = \frac{1}{n-1}\sum^{n}_{i=1}( x_i - \bar{x})^2 \]

Rではvar()関数で計算できる。

s2 = var(height)
s2
## [1] 73.73091

7.4.7 標準偏差

標準偏差もデータのばらつきを表す。 分散もばらつきを表す統計量なので、なぜ二つあるのか?と思うかもしれない。 分散は、データのばらつきを二乗してから合計してデータ数で割っている。そのため、数値大きさはばらつきを示すが、その数値の単位は二乗されてしまっている。身長のケースで言えば\(cm^2\)となっているのである。

これでは平均に対してばらつきが大きいのか小さいのかわかりにくい。 そこで、標準偏差は分散の平方根(ルート)を取ることで、計算される。 二乗のルートなので、単位がもとに戻って解釈しやすくなるのである。

\[ \sigma = \sqrt{\sigma^2} \]

ここでは単純に上で計算した分散のルーとしてを計算しよう。ルートはsqrt()という関数で計算できる。

sigma = sqrt(sigma2)
sigma
## [1] 8.543629

7.4.8 不偏標準偏差

標準偏差を計算するために、不偏分散を用いたものが不偏標準偏差である。標本標準偏差と呼ばれたり、文脈によっては単に標準偏差とよんでこちらを指す場合もある。 以下の記述統計などではこちらが一般的に使われる。 理由は推定統計量の項を参照してほしい。

\[ s = \sqrt{s^2} \] 不偏標準偏差は上と同様にルートでも計算できるが、sd()という関数が用意されている。確認するために、いずれの方法でも計算してみよう。

s = sqrt(s2)
s
## [1] 8.58667

sd関数を使う場合

s = sd(height)
s
## [1] 8.58667

7.5 Rによる記述統計のテクニック

ここでは、簡単に記述統計を示すテクニックを紹介する。 データ分析を行う上で、手元のデータがどういうデータなのかを記述統計で見るのは重要である。 また、論文にする際にも、まずはデータの説明として記述統計表を示すのが一般的である。

7.5.1 使用するデータ

ここではRにもともと入っているmtcarsというデータを使用する。 1974年にアメリカのMotor Trendという雑誌に掲載された燃費などの性能を比較したデータである。

例えばmpgは燃費(1ガロン当たりのマイル)、cylはシリンダーの数、hpはエンジンの馬力、wtは重さ、などである。 詳しく知りたい人は、RStudioの右下ペーンの[Help]タブから、mtcarsと検索してみよう。

data(mtcars) #データの呼び出し

mtcars
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

7.5.2 summary関数

summaryというRデフォルトの関数(base関数と呼ぶ)を使うと、最小・最大・平均・中央値・四分位点などが表示される。

summary(mtcars)
##       mpg             cyl             disp             hp             drat      
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0   Min.   :2.760  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5   1st Qu.:3.080  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0   Median :3.695  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7   Mean   :3.597  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0   3rd Qu.:3.920  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0   Max.   :4.930  
##        wt             qsec             vs               am              gear      
##  Min.   :1.513   Min.   :14.50   Min.   :0.0000   Min.   :0.0000   Min.   :3.000  
##  1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:3.000  
##  Median :3.325   Median :17.71   Median :0.0000   Median :0.0000   Median :4.000  
##  Mean   :3.217   Mean   :17.85   Mean   :0.4375   Mean   :0.4062   Mean   :3.688  
##  3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:4.000  
##  Max.   :5.424   Max.   :22.90   Max.   :1.0000   Max.   :1.0000   Max.   :5.000  
##       carb      
##  Min.   :1.000  
##  1st Qu.:2.000  
##  Median :2.000  
##  Mean   :2.812  
##  3rd Qu.:4.000  
##  Max.   :8.000

7.5.3 describe関数

describe関数を使うと、簡単にデータ数(n)、平均、標準偏差や範囲を計算することができる。ここで計算されている標準偏差は不偏標準偏差である。

library(psych)
describe(mtcars, skew=FALSE)
##      vars  n   mean     sd median   min    max  range    se
## mpg     1 32  20.09   6.03  19.20 10.40  33.90  23.50  1.07
## cyl     2 32   6.19   1.79   6.00  4.00   8.00   4.00  0.32
## disp    3 32 230.72 123.94 196.30 71.10 472.00 400.90 21.91
## hp      4 32 146.69  68.56 123.00 52.00 335.00 283.00 12.12
## drat    5 32   3.60   0.53   3.70  2.76   4.93   2.17  0.09
## wt      6 32   3.22   0.98   3.33  1.51   5.42   3.91  0.17
## qsec    7 32  17.85   1.79  17.71 14.50  22.90   8.40  0.32
## vs      8 32   0.44   0.50   0.00  0.00   1.00   1.00  0.09
## am      9 32   0.41   0.50   0.00  0.00   1.00   1.00  0.09
## gear   10 32   3.69   0.74   4.00  3.00   5.00   2.00  0.13
## carb   11 32   2.81   1.62   2.00  1.00   8.00   7.00  0.29

7.5.4 skim関数

skim関数を使うと、記述統計に加えて簡単なヒストグラムも図示してくれる。ここで計算されている標準偏差は不偏標準偏差である。

library(skimr)
skim(mtcars)
Table 7.1: Data summary
Name mtcars
Number of rows 32
Number of columns 11
_______________________
Column type frequency:
numeric 11
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
mpg 0 1 20.09 6.03 10.40 15.43 19.20 22.80 33.90 ▃▇▅▁▂
cyl 0 1 6.19 1.79 4.00 4.00 6.00 8.00 8.00 ▆▁▃▁▇
disp 0 1 230.72 123.94 71.10 120.83 196.30 326.00 472.00 ▇▃▃▃▂
hp 0 1 146.69 68.56 52.00 96.50 123.00 180.00 335.00 ▇▇▆▃▁
drat 0 1 3.60 0.53 2.76 3.08 3.70 3.92 4.93 ▇▃▇▅▁
wt 0 1 3.22 0.98 1.51 2.58 3.33 3.61 5.42 ▃▃▇▁▂
qsec 0 1 17.85 1.79 14.50 16.89 17.71 18.90 22.90 ▃▇▇▂▁
vs 0 1 0.44 0.50 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▆
am 0 1 0.41 0.50 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▆
gear 0 1 3.69 0.74 3.00 3.00 4.00 4.00 5.00 ▇▁▆▁▂
carb 0 1 2.81 1.62 1.00 2.00 2.00 4.00 8.00 ▇▂▅▁▁