高校数学の「データの分析」を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)# 80max(data$Japanese) - min(data$Japanese)# 36max(data$Math) - min(data$Math)# 57英語は 12〜92点 と幅が広く、3科目の中でいちばん 散らばり が大きいことがわかります。
2. 代表値を求める
中央値(Median) は、データの真ん中の値。
最頻値(Mode) は、いちばんよく出てくる値のことです。
#中央値median(data$English)##74.5median(data$Japanese)#71median(data$Math)#76
library(DescTools)Mode(data$English)#[1] 76#attr(,"freq")#[1] 2Mode(data$Japanese)#[1] 63 71#attr(,"freq")#[1] 2Mode(data$Math)#[1] 55 79#attr(,"freq")#[1] 2最頻値は標準ライブラリにないため、DescToolsを用いて行いました。
中央値だけを見ると3科目は似ていますが、これだけでは“ばらつき”までは読み取れません。
3. 四分位範囲(IQR)で“広がり”をつかむ
範囲は外れ値の影響を受けやすいのが弱点でした。
そこで使いたいのが 四分位範囲(IQR)= Q3 − Q1 です。
#四分位範囲IQR(data$English)[1] 24IQR(data$Japanese)[1] 15.5IQR(data$Math)[1] 30.5
#四分位偏差IQR(data$English) / 2#[1] 12IQR(data$Japanese) / 2#[1] 7.75IQR(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$EnglishQ1 <- quantile(x, 0.25)Q3 <- quantile(x, 0.75)IQR_value <- IQR(x)
lower <- Q1 - 1.5 * IQR_valueupper <- 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 = "英語の点数のヒストグラム")
英語の点数のヒストグラム
ヒストグラムでも外れ値が確認でき、分布はやや右に偏った形になっています。
まとめ
外れ値に影響されやすい
- 平均値、四分位範囲 外れ値に影響されにくい
- 中央値、最頻値、範囲
次回は、ここで見えてきた“特徴”をさらに深掘りし見ようと思います。