統計学とは、データを集め、整理し、分析して、そこから意味のある情報を引き出す学問です。例えば、次のような場面で統計の考え方が使われています。
昔ながらの統計学の教科書 (一般向けの入門書)では、思想の異なる2つの統計に分けて説明が展開されることが多いです。
- 記述統計
データを分かりやすく整理し、特徴をまとめる。 - 推測統計
集めたデータから全体の傾向を予測する。
「記述統計」の思想は、「統計はデータの要約をする道具である」という立場です。
カール・ピアソン(Karl Pearson, 1857–1936)は、データを整理し、パターンを見つけることの重要性を強調しました。ピアソンの考え方が記述統計の思想の基礎になっています。
ピアソンは、数値の羅列である生のデータはそのままでは理解しにくいため、平均・分散・標準偏差などの数値を使って、データの全体像を把握するべきであると考え、統計の基礎を構築しました。また、データを可視化し、分布などを見ることで、より深い洞察がえられるということを強調しました。
ということで、今回は記述統計のお話です。
(以下の記事は、私が昔、とある私立大学で1,2年生向けに統計の講義を担当していたときに作った資料の内容を書き直したものです)
記述統計でデータを整理
例1:クラスの試験結果を整理する
あるクラスで筆記試験を行い、30人の点数を集めまたとします。以下の表は、その試験結果 (架空のデータ)を示しています。
【30人の試験結果 (3列になってます)】
番号 | 得点 | 番号 | 得点 | 番号 | 得点 |
---|---|---|---|---|---|
1 | 83 | 11 | 51 | 21 | 70 |
2 | 54 | 12 | 100 | 22 | 35 |
3 | 73 | 13 | 51 | 23 | 50 |
4 | 56 | 14 | 74 | 24 | 42 |
5 | 77 | 15 | 67 | 25 | 84 |
6 | 47 | 16 | 56 | 26 | 50 |
7 | 58 | 17 | 54 | 27 | 78 |
8 | 81 | 18 | 75 | 28 | 58 |
9 | 19 | 19 | 72 | 29 | 52 |
10 | 61 | 20 | 50 | 30 | 70 |
このままでは点数の分布が分かりにくいので、整理してみます。
度数分布表
データが多いと、すべての数値を見て全体の傾向をつかむことは困難です。データを整理する方法として、一定の範囲ごとにデータをまとめる方法があります。この範囲を 「階級」 といい、各階級に入るデータの数を 「度数」 といいます。
【試験結果の度数分布表】
点数の範囲(階級) | 人数(度数) |
---|---|
80 ~ 100点 | 4人 |
60 ~ 79点 | 10人 |
40 ~ 59点 | 14人 |
20 ~ 39点 | 1人 |
0 ~ 19点 | 1人 |
合計 | 30人 |
上の表は、80~100点の階級だけ、ちょっと (1点分)幅が広くなっていますので注意してください。
Rで度数分布表を作成するスクリプトはこんな感じです。
# 学生30名の試験得点データ scores <- c(83, 54, 73, 56, 77, 47, 58, 81, 19, 61, 51, 100, 51, 74, 67, 56, 54, 75, 72, 50, 70, 35, 50, 42, 84, 50, 78, 58, 52, 70) # 度数分布表の作成 breaks <- seq(0, 100, by=20) # 0〜100点を10点ごとに区切る score_table <- table(cut(scores, breaks, right=FALSE)) # 区間ごとに度数を計算 # 100点をカウントして、追加 names(score_table)[5] <- "[80,100]" score_table[[5]] <- score_table[[5]] + sum(scores==100) # 度数分布表をデータフレームに変換 score_df <- as.data.frame(score_table) # 度数分布表の表示 print(score_df, row.names=FALSE)
このスクリプトで、度数分布表の作成しているのは、以下の部分です。
breaks <- seq(0, 100, by=20) # 0〜100点を20点ごとに区切る score_table <- table(cut(scores, breaks, right=FALSE)) # 区間ごとに度数を計算
breaks <- seq(0, 100, by=20)
で、0点から100点までを20点ごと(0-19, 20-39, 40-59, 60-79, 80-99)に区切った階級を定義しています。
cut(scores, breaks, right=FALSE)
で、データである scores
の各得点を、breaks
で定義した範囲に分類します。
ここで、right=FALSE
にすることで、範囲の上端を含めないことを指定しています。
table()
を使えば、各階級に属するデータの数(度数)を数え、度数分布表を作成することができます。
ただし、上の命令では、[80,100)
の階級には100点が含まれないので、今回は100点を手動で追加しています。それを行っているのが、以下の部分です。
# 100点をカウントして、追加 names(score_table)[5] <- "[80,100]" score_table[[5]] <- score_table[[5]] + sum(scores==100)
最高点・最低点
テストの出来が良ければ最高点、出来が悪ければ最低点が気になるかもしれません。この計算は、目で見て探すだけです。
- 最高点:100点(最も高い点数)
- 最低点:19点(最も低い点数)
Rで最大値と最小値を求める場合は、max
とmin
をそれぞれ使ってください。
# 学生30名の試験得点データ scores <- c(83, 54, 73, 56, 77, 47, 58, 81, 19, 61, 51, 100, 51, 74, 67, 56, 54, 75, 72, 50, 70, 35, 50, 42, 84, 50, 78, 58, 52, 70) # 最大値 (Maximum) max_score <- max(scores) # 最小値 (Minimum) min_score <- min(scores) # 結果の出力 cat("最高点 (最大値):", max_score, "\n") cat("最低点 (最小値):", min_score, "\n")
平均点
テストの結果発表では、平均点も良く登場します。
データを とすれば、その平均は、以下の式で求められます。
計算が面倒なのでRで計算すれば、
# 学生30名の試験得点データ scores <- c(83, 54, 73, 56, 77, 47, 58, 81, 19, 61, 51, 100, 51, 74, 67, 56, 54, 75, 72, 50, 70, 35, 50, 42, 84, 50, 78, 58, 52, 70) # 平均 (Mean) mean_score <- mean(scores) # 結果の出力 cat("平均点:", mean_score, "\n")
平均点は、61.6点です。
ヒストグラムとは?
ヒストグラム、度数分布を 棒グラフにしたものです。
Rでヒストグラムを描いてみます。
# 学生30名の試験得点データ scores <- c(83, 54, 73, 56, 77, 47, 58, 81, 19, 61, 51, 100, 51, 74, 67, 56, 54, 75, 72, 50, 70, 35, 50, 42, 84, 50, 78, 58, 52, 70) # ヒストグラムを描く hist(scores, breaks = seq(0, 100, by=20), # 20点ごとの区切り col = 4, # 棒の色 main = "試験得点のヒストグラム", # タイトル xlab = "得点", # X軸のラベル ylab = "人数", # Y軸のラベル border = "black") # 棒の境界線の色
このグラフを見ると、40~59点の学生が最も多いことが一目で分かります。
例2:血液型の分布を整理する
次に、ある大学の学生20人の血液型を調べた仮定として、結果を整理してみます。
【血液型のデータ (2列になってます)】
番号 | 血液型 | 番号 | 血液型 |
---|---|---|---|
1 | B | 11 | A |
2 | B | 12 | A |
3 | A | 13 | A |
4 | O | 14 | O |
5 | B | 15 | B |
6 | A | 16 | O |
7 | A | 17 | AB |
8 | O | 18 | A |
9 | AB | 19 | O |
10 | B | 20 | A |
度数分布表を作る
試験結果と同じように、血液型ごとの度数分布表を作ると、データを整理できます。
血液型 | 人数(度数) | 割合 | 百分率(%) |
---|---|---|---|
A型 | 8人 | 0.4 | 40% |
B型 | 5人 | 0.25 | 25% |
O型 | 5人 | 0.25 | 25% |
AB型 | 2人 | 0.1 | 10% |
合計 | 20人 | 1.0 | 100% |
これを見れば、A型の人が最も多く、AB型が最も少ないことが分かります。
血液型の度数分布表とヒストグラムを、Rで作成するRスクリプトの例をのせておきます。
# 血液型データ blood_types <- c("B", "B", "A", "O", "B", "A", "A", "O", "AB", "B", "A", "A", "A", "O", "B", "O", "AB", "A", "O", "A") # 度数分布表の作成 blood_table <- table(blood_types) # 血液型ごとの人数を集計 blood_df <- as.data.frame(blood_table) # データフレームに変換 blood_df$percentage <- blood_df$Freq/sum(blood_df$Freq)*100 # データフレームに変換 # 度数分布表の表示 print(blood_df) # ヒストグラムを描く barplot(blood_table, col = 4, # 棒の色 main = "血液型のヒストグラム", # グラフのタイトル xlab = "血液型", # X軸ラベル ylab = "人数", # Y軸ラベル border = "black") # 棒の境界線の色
尺度水準
上で考えた2つの例では、扱うデータの種類が異なり、一方は数値、もう一方は記号として表されていました。データにはさまざまな種類があり、その種類によって適切な扱い方が異なります。心理学で扱う統計では、データの種類を明確にすることが重要であり、その説明が最初に登場することが多いです。データの種類の違いは「尺度水準」と呼ばれています。
アメリカの心理学者 スタンレー・スティーヴンズ (Stanley Smith Stevens) は、データを分類する方法として 「尺度水準」 という考え方を提案しました。これは、データの種類を理解し、適切な分析方法を選ぶために役立ちます。
データの尺度水準には、次の4種類があります。
名義尺度(nominal scale)
- 特徴: 順番をつけることができないデータ。
- 例: 県名(東京都・大阪府・福岡県)、学科名(理学部・工学部・文学部)、学生番号(A12345・B67890)。
- ポイント: データに「違い」はあっても、「大小」や「順番」の概念はない。
順序尺度(ordinal scale)
- 特徴: 順番をつけることができるが、間隔の違いには意味がない。
- 例: スポーツの順位(1位・2位・3位)、アンケートの満足度(「とても満足」→「やや満足」→「普通」→「不満」→「とても不満」)。
- ポイント: 順序はあるが、数値の差に意味がない(1位と2位の差が、2位と3位の差と同じとは限らない)。
間隔尺度(interval scale)
- 特徴: 順番があり、データの「間隔」に意味があるが、ゼロには特別な意味がない。
- 例: 摂氏温度(0 ℃ (= 273 K)は「無い」ことを示さない)、西暦(0年は存在しないが、2000年と2020年の差は20年)。
- ポイント: 数値の差は意味があるが、ゼロが絶対的な基準ではない(0℃は「温度が無い」わけではない)。
比例尺度(ratio scale)
- 特徴: ゼロには明確な意味 (「無いこと」)があり、数値の比率に意味がある。
- 例: 絶対温度(0Kは「全く熱がない」状態)、金額(0円は「お金が無い」ことを意味する)、身長や体重(0cmや0kgは存在しない)。
- ポイント: ゼロが基準となり、数値の比率に意味がある(例えば、10kgは5kgの2倍の重さ)。
データの尺度水準を知ることで、適切な統計手法を選ぶことができます。例えば、
- 名義尺度 のデータには 平均 を求める意味がない(「東京都」と「大阪府」の平均は存在しない)。
- 順序尺度 では 足し算や引き算はできない(「とても満足」と「やや満足」の差と、「普通」と「不満」の差が同じとは限らない)。
- 間隔尺度 では 比率に意味がない(40℃は20℃の2倍の暑さではない)。
- 比例尺度 では 比率を考えられる(10万円は5万円の2倍)。
このように、データの尺度水準に応じて、使うべき統計手法も変わります。
まとめ
データを整理し、わかりやすくまとめることは、とても大切です。