ロゴ

高校数学の「データの分析」をRを使って分析しました①

投稿日:2026-2-23

今回は、Copilotで作成したテストの点数データを使って、データ分析の基本を解説していきます。 全部で3回ほどに分けて執筆する予定です。

🍀前提条件 : Rの基本操作がわかる、高校数学「データの分析」を学んだことがある
🔑キーワード : 代表値/ヒストグラム/箱ひげ図/外れ値


#データ
library(dplyr)
data <- tibble::tribble(
~English, ~Japanese, ~Math, ~Class,
78, 72, 81, "A",
65, 70, 59, "B",
88, 84, 92, "C",
55, 60, 48, "A",
91, 85, 95, "B",
73, 68, 70, "C",
82, 77, 88, "A",
60, 58, 62, "B",
47, 52, 40, "C",
85, 80, 90, "A",
69, 74, 65, "B",
92, 88, 97, "C",
58, 63, 55, "A",
76, 71, 79, "B",
83, 78, 86, "C",
49, 57, 45, "A",
87, 82, 91, "B",
72, 69, 73, "C",
12, 63, 55, "C",
76, 71, 79, "A",
)

1. まずは”範囲”でざっくりチェック!

点数のばらつきを一番わかりやすい方法が 範囲(Range) です。
最大値 − 最小値で求められます。

max(data$English) - min(data$English)
# 80
max(data$Japanese) - min(data$Japanese)
# 36
max(data$Math) - min(data$Math)
# 57

英語は 12〜92点 と幅が広く、3科目の中でいちばん 散らばり が大きいことがわかります。

2. 代表値を求める

中央値(Median) は、データの真ん中の値。

最頻値(Mode) は、いちばんよく出てくる値のことです。

#中央値
median(data$English)
##74.5
median(data$Japanese)
#71
median(data$Math)
#76
library(DescTools)
Mode(data$English)
#[1] 76
#attr(,"freq")
#[1] 2
Mode(data$Japanese)
#[1] 63 71
#attr(,"freq")
#[1] 2
Mode(data$Math)
#[1] 55 79
#attr(,"freq")
#[1] 2

最頻値は標準ライブラリにないため、DescToolsを用いて行いました。
中央値だけを見ると3科目は似ていますが、これだけでは“ばらつき”までは読み取れません。

3. 四分位範囲(IQR)で“広がり”をつかむ

範囲は外れ値の影響を受けやすいのが弱点でした。
そこで使いたいのが 四分位範囲(IQR)= Q3 − Q1 です。

#四分位範囲
IQR(data$English)
[1] 24
IQR(data$Japanese)
[1] 15.5
IQR(data$Math)
[1] 30.5
#四分位偏差
IQR(data$English) / 2
#[1] 12
IQR(data$Japanese) / 2
#[1] 7.75
IQR(data$Math) / 2
#[1] 15.25

外れ値の影響を抑えても、やはり英語のばらつきが大きいことが確認できます。

また、四分位偏差とは同じく散らばりを荒らしていますが、2で割ることによって中央値の周りの 散ら張り度合いが大きいか小さいかを見ることができます。

これらの値は summary() でも一括で確認できます。

summary(data)
# English Japanese Math Class
# Min. :12.0 Min. :52.0 Min. :40.0 Length:20
# 1st Qu.:59.5 1st Qu.:63.0 1st Qu.:58.0 Class :character
# Median :74.5 Median :71.0 Median :76.0 Mode :character
# Mean :69.9 Mean :71.1 Mean :72.5
# 3rd Qu.:83.5 3rd Qu.:78.5 3rd Qu.:88.5
# Max. :92.0 Max. :88.0 Max. :97.0

で求めることができます。

4. 外れ値を探してみる

外れ値は「エラー」ではなく、単に“その生徒がたまたま解けなかった”というケースもあります。
分析から除外するかどうかは慎重に判断したいところです。

外れ値の基準は
Q1 − 1.5×IQR より小さい値
Q3 + 1.5×IQR より大きい値
として求められます。

英語を例に計算してみます。

#英語
x <- data$English
Q1 <- quantile(x, 0.25)
Q3 <- quantile(x, 0.75)
IQR_value <- IQR(x)
lower <- Q1 - 1.5 * IQR_value
upper <- Q3 + 1.5 * IQR_value
x[x < lower | x > upper]
#[1] 12
#国語と数学には見られなかった。
#numeric(0)と表示された。

英語では 12点 が外れ値として検出されました。
国語と数学には外れ値はありませんでした。

5. グラフで可視化してみる

最後に、データをグラフで“見える化”してみましょう。

まず、箱ひげ図から作ってみます。
ここでは英語のみ例として紹介します。

可視化にはggplot2を用いました。

library(ggplot2)
ggplot(data, aes(x = Class, y = English)) +
geom_boxplot() +
labs(title = "英語の点数の箱ひげ図")

箱ひげ図

英語の点数の箱ひげ図

クラスCに外れ値があることがひと目でわかります。
また、クラスBはQ1がほかより低く、点数の下側に広がりがあることも読み取れます。

次にヒストグラムを作ってみます。

ggplot(data, aes(x = English)) +
geom_histogram(binwidth = 5) +
labs(title = "英語の点数のヒストグラム")

ヒストグラム

英語の点数のヒストグラム

ヒストグラムでも外れ値が確認でき、分布はやや右に偏った形になっています。

まとめ

外れ値に影響されやすい

次回は、ここで見えてきた“特徴”をさらに深掘りし見ようと思います。