Rで統計学を学ぶ(1): はじめに

これは、白井の「確率統計学B」の資料です。

この講義では、 山田、杉澤、村井(2008)「R」によるやさしい統計学を使用します。

この講義では、教科書の第2章「1 つの変数の記述統計」をとりあげます。 このウェブページと合わせて教科書を読み進めてください。

学習項目です

一つの変数の要約

この章は一つの変数をどのように記述するか、について説明しています。

[変数とは]

例えば、数学のテストの点数や辛いものの好き嫌いを考えましょう。これらは人それぞれで違う値をとります。 それを統計学では『変数』と呼んでいます。

数学テストの点数」という変数は、人によって例えば80点, 60点, 75点などの値をとります。これらの値は大小比較ができますので、量的変数といいます。

それに対し、『辛いものの好き嫌い』も人それぞれで違う値をとりますが、『好き』『嫌い』『どちらでもない』の3種類に値が分けられるでしょう。このように「種類(カテゴリ)」による分類を値とする変数は質的変数と言います。

ここでは数値要約に焦点をあてます。数値要約とは、データの持つ特徴を一つの数値にまとめる、ということで、後で取り上げる平均や中央値がその代表的なものです。

ここで、変数の種類に二通りあることに注意してください。

課題1-1

質的変数と量的変数の違いについてなるべく自分の言葉で説明してください。 また、値が0と1の2つだけを取る変数は二値変数と言いますが、これは 質的変数でしょうか、量的変数でしょうか。二値変数の具体的な例をあげて、それが質的変数なのか量的変数なのかの理由を含めて答えてください。

データの視覚的表現

量的変数ではその値の範囲の分類 (例えば、値が100未満、100以上200未満、200以上、のように分類する)や、質的変数では、その値であるカテゴリをとりあげましょう。 それぞれの分類(カテゴリ)に含まれるデータの個数を調べることはよく行われています。 それぞれの分類に含まれるデータの個数を度数といい、すべての分類について度数を求めたものを度数分布といいます。

質的データや、量的データでも値が離散型のデータにおいて、そのデータの値とそれが現れる度数(頻度)をまとめたものを度数分布といい、それを表で表したものを度数分布表といいます。例えば、80名の学生の物理学の成績をS, A, B, C, Dの5ランクに分けたとき、それぞれのランクの人数の分布は度数分布といえます。

成績のランク  S   A  B  C  D
度数 3 5 283410

これはもともと次のような分布の成績でした:

Buturi <- c("D", "B", "C", "B", "D", "B", "D", "C", "C", "C", "S", "C", "A", "B", "B", "C", "B", "C",
    "S", "B", "A", "A", "C", "B", "B", "C", "B", "B", "C", "B", "C", "A", "B", "C", "D", "C", "B", "C",
    "D", "C", "D", "D", "C", "C", "B", "B", "C", "C", "B", "C", "B", "D", "C", "B", "C", "C", "B", "A",
    "B", "B", "B", "B", "B", "C", "C", "C", "B", "D", "C", "C", "B", "C", "C", "C", "C", "S", "C", "C",
    "D", "B")
このデータから度数分布表を作るにはtable関数を用います:
> table(Buturi)
Buturi
 A  B  C  D  S 
 5 28 34 10  3 
このようにtable関数は、ベクトルの様子の頻度を表にしたものを出力します。
[tableにおいて分類尺度の順番を変えて表示するには]
今のtable関数は、名義尺度をアルファベット順で(つまり、ABCDSという順に)表示しました。 これを変えるための方法を述べます。それには2ステップ必要です。まず、要素の値を文字型ではなく因子型にします。 そこでlevelsというオプションで表示する順番を指定します。こうして因子型に変換されたものであれば、table関数ではその順番にしたがって表示されます。
> SeisekiBunrui <- factor(Buturi, levels=c("S","A","B","C","D"))
	# S,A,B,C,Dの順番を指定して因子型(factor)のデータに変換
> table(SeisekiBunrui)
SeisekiBunrui
 S  A  B  C  D 
 3  5 28 34 10 

実は、元をたどるとButuriの成績、次のような素点(100点満点で成績をつけたもの)から得られたものでした:

 Seiseki <- c(59, 74, 64, 73, 59, 71, 57, 60, 68, 65, 99, 61, 86, 75, 78, 66, 73, 61, 91, 
     77, 87, 81, 64, 71, 71, 63, 72, 76, 66, 72, 67, 84, 73, 68, 57, 66, 74, 60, 52, 69, 54,
     59, 65, 65, 71, 79, 64, 67, 73, 68, 70, 59, 64, 71, 61, 62, 74, 83, 77, 74, 75, 75, 75, 
     65, 65, 69, 73, 58, 69, 64, 75, 67, 68, 61, 62, 90, 69, 60, 57, 73)
先にあげた度数分布は、90点以上をS、80点以上90点未満をA, 70点以上80点未満をB、60点以上70点未満をC、60点未満をDとして分類し、それぞれの分類に該当する人数を表にしたものでした。ちなみに、S,A,B,C,Dは名義尺度の質的データです。 [素点を成績分類するには(Seiseki からButuriへの変換方法)]
素点を成績分類するには、次のようにすれば良い。
 Buturi <- rep("", length(Seiseki))		# 空のベクトルを用意
 for(i in 1:length(Seiseki)) {			# 値で分類
     if (Seiseki[i] < 60) Buturi[i] <- "D" else
     if (Seiseki[i] < 70) Buturi[i] <- "C" else
     if (Seiseki[i] < 80) Buturi[i] <- "B" else
     if (Seiseki[i] < 90) Buturi[i] <- "A" else
     Buturi[i] <- "S" }

度数分布から、横軸にデータの分類を、縦軸にその度数を表すグラフを書いたものをヒストグラム(histogram)と言います。 Rでは hist という関数で表示させることができます。

hist(Seiseki)
これを実行して表示されるのが(1)のグラフです。成績データを10個に分類し、それぞれの分類にはいる人数を縦軸に表示しています。何通りに分類されるかはコンピュータ任せですが、この場合は、5点刻みで分類されています。

histにはどこで分類するかをbreaksオプションで指定することができます。次は50点(最小値)、60点、70点、80点、90点、100点(最大値) という分類範囲を指定したものです。

 hist(Seiseki,breaks=c(50,60,70,80,90,100))
この結果表示されるのが(2)のグラフです。

もっともこれは意図したものではありませんでした。狙いはButuriの度数分布表のヒストグラムでした。 例えばD判定(60点未満)の人数は10名のはずなのに、この図では13名となっているように見えます。この原因は、histの範囲指定は『以下』がデフォルトだからです。つまり、 breaks=c(50,60,70,80,90,100)は「50点より大きく60点以下、60点より大きく70点以下、70点より大きく80点以下、 80点より大きく90点以下、90点より大きく100点以下」、という分類を表していました。ここで欲しかったのは、 例えば「60点以上70点未満」というように範囲の右側を「含まない」度数分布のグラフでした。

そこで次のようにright=FALSEオプションを付け加えます。これで望む結果の(3)の図が得られます。

 hist(Seiseki,breaks=c(50,60,70,80,90,100),right=FALSE)
(1)Seisekiのヒストグラム(2)breaksを指定(3)right=FALSEを(2)に加えて指定

課題1-2

以下のような数学のテストの素点がある。ヒストグラムを表示せよ。 また、10点未満は"D", 10点以上12点以下は"C", 13点以上15点以下は"B"、16点以上は"A"と分類するものとし、度数分布表を作れ。
Math <- c(17,13,14,7,12,10,6,8,15,4,14,9,6,10,12,5,12,8,8,12,15,18)
[ヒント]
素点を成績分類して度数分布用を作るには、前にあげた「素点を成績分類するには(Seiseki からButuriへの変換方法)」を参照してください。
成績を反映させるようにヒストグラムを作るには breaksを使います。breaksの使い方の一例が次ですが、これを解答とは考えないでください。なお、これを実行すると警告が出ますが無視してよいです。ここで使われているいろいろなパラメタの意味は調べてください:
hist(Math, breaks=c(min(Math),10,13,16,max(Math)), right=FALSE, include.lowest=TRUE, freq=TRUE,
	xlim=c(min(Math),max(Math)),ylim=c(0,10))

代表値

代表値とは、データを代表する値のことで、 後述しますが、データの分布の型が「正規分布である」というように分かっている場合はそのパラメタ(正規分布の場合は平均と分散)、そうでない場合はデータの分布の中心的な値が代表値となります。要約統計量ということもあります。

代表値としては、次の三つの値がよく使われます:

課題1-3

教科書を読み、(算術)平均、中央値、最頻値、それぞれの定義を簡潔に説明しなさい。 また、代表値として(平均値や中央値ではなく)最頻値を用いる場合はどのような場合かも答えなさい。
[課題1-3のヒント]
平均値や中央値が計算出来ない場合に、最頻値を使います。 つまり、最頻値を代表値として使う場合は、データの値が数量として意味を持たない場合です。 それは変数の種類としてはどういうものだったでしょうか。具体的に答えてください。

課題1-4

次を実行して得られたdataの値に対し、(算術)平均、中央値、最頻値、それぞれの値を求めなさい。 また、求めるために用いたRのコードもあわせて答えなさい。
 set.seed(k)                 #  kには学籍番号の下3桁の数をいれておくこと
 data <- ceiling(runif(100,0,100))
[課題1-4について]
runifとは、一様分布に基づく乱数生成の関数です。 runif(n,min,max)により、min以上max以下の乱数がn個生成されます。
また、ceiling関数は小数点以下を切り上げる関数です。なお、floor関数は小数点以下を切り下げる関数です。

Rには平均値、中央値を求める関数はありますが、 最頻値を求める関数は組込みでは用意されていないので、工夫してみてください。 ", as.integer(x)) ---------->

散布度

散布度とは、変数の値の散らばりのことです。 どんなデータでも、平均だけではその特徴はわかりません。 平均のまわりにどのようにデータが散らばっているかも、データも性質を考える上でとても重要な情報です。

散布度を表すのによく使われる標本分散 (sample variance)の定義は以下のとおり(nはデータの個数):
標本分散 = (データ1 - 平均)2 + (データ2 - 平均)2 + … + (データn - 平均)2
n

これに対し、不偏分散(unbiased variance) の定義は以下のとおりです(nはデータの個数):
不偏分散 = (データ1 - 平均)2 + (データ2 - 平均)2 + … + (データn - 平均)2
n - 1

不偏分散の定義では、分母は(標本分散ではnに対して) n-1 です。

標本分散と不偏分散の違いについて説明します。 標本分散は、手元にあるデータの「散らばり」を表す値です。 それに対し、不偏分散は、「手元にあるデータは何らかの大きなデータの集まり (これを母集団といいます)から抽出したもの」と考え、 母集団のデータの散らばりを推定した値です。 そして、Rでは不偏分散を計算するための関数var が用意されています。(標本分散のための関数はありません)

[母集団と標本(長い説明)]

統計におけるとても重要な用語の一つが母集団です。まずはこれが何を意味しているか、例を使って説明します。母集団のおおまかな意味は「推測対象の要素の集まり」ということです。先ほどの「あなたが作った機械の製品」の例では、「その機械が将来にわたって作る製品の不良品の割合」が推測したいものでした。これは「作り出される製品すべて」と「その中の不良品すべて」が分かれば計算できます。そこで推測対象として「機械が作り出す製品(の良さ)」を考えましょう。そしてこの「製品(の良さ)」が母集団となります。もちろんこの中にはまだ存在していないものも含まれています。そこでこの場合、母集団の要素の個数は無限個とみなせます。このときの母集団を無限母集団といいます。このように、母集団の要素数が多かったり、実際には存在していないものだったりすることがあるので、母集団をそのまま扱うことは一般に難しいのです。

この母集団に対して、標本(サンプル)という用語があります。先の機械の例で言えば、その機械で作られ、実際に手元にある製品100個(の良さの割合)が「標本」に相当します。このように、標本とは母集団の一部です。そして、統計学は、この標本(サンプル)の性質を調べることによって、母集団の性質を予測したり、比較したりする手段を与えてくれます。

別な例として選挙を例にします。大きな選挙があるたびに、新聞やテレビなどのメディアでは選挙結果の予測を行います。この予測はどのような方法で行われているのでしょうか。
この場合、母集団の要素は、選挙人それぞれによる投票結果といえます。人口200万人の名古屋市くらいの都市なら、選挙人(要するに投票権がある人)の総数は100万人以上いるでしょう。その人達一人ひとりに、どの政党に投票するかを聞いて回るのはとても大変ですし、お金もかかります。 そこで、メディアではランダムに電話をかけどの政党に投票するかを聞くという方法(Random Digit Sampling)をとっています。そうやって標本を集めます。およそ1千分の1から1万分の1くらいの人数、200万人ならば1,000人くらいを調査の対象としているようです。

この場合は、機械の例と異なり、有限で実在する人たちの投票が母集団でした。投票そのものはまだ行われていないので母集団の要素は実在しませんが、そこにいる人達の考えがそのまま投票に反映されるとすれば、母集団は無限でも存在しない要素を含まないともみなせます。そこで、この母集団は有限母集団といえるでしょう。それでも、母集団をすべて調べるのではなく、標本の性質を調べることによって母集団の振る舞いを予測することが行われています。

各データの値から平均を引いたものを平均からの偏差といい、 平均偏差とは、「平均からの偏差」の絶対値の平均で、平均からどの程度ずれているか を表す数値です: mean(abs(テスト結果 – mean(テスト結果)))

また範囲(レンジ)とは、データの最大値と最小値の差のことで、 データの値の変化の大きさを表します。

なお、平均偏差と紛らわしいのですが、」 標準偏差(standard deviation) は(不偏)分散の正の平方根の値で、とても大事な指標です。Rでは sd という関数が用意されています。 [分散と標準偏差についての注意]

この講義では、標本分散を「標本の分散」として、母集団の分散の推定値である不偏分散とは区別しています。また、標準偏差は不偏分散の正の平方根としており、これは標本分散の正の平方根ではないとしています。

このような扱いは残念ながら、統計学の教科書で一致していません。後で取り上げるz値や偏差値の計算には、標準偏差を標本分散の平方根とする方が扱いやすいからかもしれません。

ですから、他の統計学の本を読む場合には、分散と標準偏差の定義にまず気をつけてください。

課題1-5

課題1-4で用いた data の値を使って、標本分散、その正の平方根、不偏分散、その正の平方根(標準偏差)をそれぞれ求めよ。また、その計算に用いたRのコードを答えよ。 さらに、標本分散と不偏分散の大きさを比較して、不偏分散の方が大きいことを確かめよ。 [課題1-5のヒント]
Rには不偏分散とその平方根(標準偏差)を計算するための関数があります。しかし、 標本分散とその平方根を求める関数はありません。 そこで、まず標本分散を求め、sqrtを用いてその平方根を求めます。 これには、Rの基礎(1)演習2-4で作成した関数を参考にしてください。

課題1-6

課題1-4で用いた data の値を使って、次を計算せよ(計算に用いたRのコードも示すこと)。そしてこれが標本分散の値と一致することを確かめよ。
(データの要素の2乗)の和
データの要素数
- データの平均の2乗

[課題1-6のヒント]

「データの要素の2乗の和」はRでは簡単に求められます。変数dataにデータの要素が入っているとすると、 data^2で「データの要素の2乗」を要素とするベクトルが得られます。 そして関数 sum によりその和を求めることができます。

標準化

標準化とは、平均と標準偏差がある特定の値になるように、すべてのデータの値を変換することをいいます。標準得点とは、標準化によって変換された得点のことで、 z得点と偏差値の2つがよく用いられます。

z得点とは、平均が0、標準偏差が1になるよう変換した標準得点のことです。ただしここでは後述する偏差値と同様に、標準偏差は標本分散の平方根とします。

z得点 =
データの値 - 平均
標準偏差

また、平均が50、標準偏差が10になるよう変換した標準得点のことを偏差値といいます。偏差値とz得点の間には以下の関係が成り立ちます:

偏差値 = z得点 * 10 + 50

課題1-7

  1. 以下に示す変数「心理学テスト」の値を用いて、平均、標本分散、(標本分散の平方根としての)標準偏差をそれぞれ求めよ。
    心理学テスト <- c(13, 14, 7, 12, 10, 6, 8, 15, 4, 14, 9, 6, 10, 12, 5, 12, 8,  8, 12, 15)
    
  2. 「心理学テスト」のデータをすべてz得点に変換せよ。
  3. z得点に変換したデータの平均が0、標準偏差が1であることを確認せよ。
  4. どのようなデータでも、そのデータをz得点に変換すると、平均が0、標準偏差 が1となることの理由を数学的に説明せよ。
  5. 「心理学テスト」のデータをすべて偏差値に変換せよ。
  6. 偏差値に変換したデータの平均が50、標準偏差が10であることを確認せよ。
[課題1-7のヒント]
変数dataのデータをz得点に変換数ためのアルゴリズムを書きます。
  1. mにdataの平均値をセットしておきます: m <- mean(data)
  2. nにdataの長さをセットしておきます: n <- length(data)
  3. sd に dataの標本分散の平方根をセットします : 課題1-5参照
  4. dataの各要素に対し、mを引きsdで割った値がz得点です: (data - m)/sd
偏差値はz得点から求めるのが簡単です。

関数のまとめ

目的 関数名と書式 使い方
関数分布(表)の作成 table(データ) table(指導法)
ヒストグラムの描画 hist(データ) table(心理学テスト)
合計 sum(データ) sum(10, 13, 8, 15, 9)
データの個数 length(データ) length(心理学テスト)
平均値を求める mean(データ) mean(心理学テスト)
中央値を求める median(データ) median(心理学テスト)
平方根を求める sqrt(データ) sqrt(2.0)
不偏分散を求める var(データ) var(心理学テスト)
標準偏差を求める sd(データ) sd(心理学テスト)
絶対値を求める abs(データ) abs(-3.5)
最大値を求める max(データ) max(心理学テスト)
最小値を求める min(データ) min(心理学テスト)

演習問題

問題1-1

教科書54ページの練習問題を解きなさい。コードと、表示された結果を提出しなさい。
Auniv <- c(60,100,50,40,50,230,120,240,200,30)
Buniv <- c(50,60,40,50,100,80,30,20,100,120)

問題1-2

あるクラスで行った統計学の試験の結果は以下のような結果であった。
 20, 55, 30, 82, 75, 66, 40, 60, 50, 29, 81, 60, 88, 91, 86, 91, 99, 73, 42
以下の質問に答えなさい。
  1. このデータを(ベクトルとして) testという変数の値とせよ。(ヒント: 問題1-1で示されているコード)
  2. ヒストグラム(histogram)を書きたい。そのためのRのコードと結果を示せ。
  3. 平均を求めたい。そのためのRのコードと結果を示せ。
  4. 不偏分散を求めたい。そのためのRのコードと結果を示せ。
  5. 標準偏差を求めたい。そのためのRのコードと結果を示せ。
  6. 不偏分散と標本分散の違いはなにか、簡潔に答えよ。 (ヒント; 散布度の項で述べられている それぞれの定義と「母集団と標本(長い説明)」の説明)
  7. 偏差値に変換せよ。そのためのRのコードと結果を示せ。

Rで確率を学ぶ         トップページに戻る        Rで統計学(2)