Rによる成績データ分析入門

 Rによる成績データ分析入門

第49回 日本言語テスト学会 (JLTA) 研究例会
2019年7月20日(土)
於 中央大学後楽園キャンパス

D30e0f518b8130ededbd7a435f536ac0?s=128

Yuichiro Kobayashi

July 20, 2019
Tweet

Transcript

  1. 2.

    自己紹介 • 小林 雄一郎 (こばやし ゆういちろう) – 学歴 – 法政大学

    文学部 英文学科 卒業(文学士) – 法政大学大学院 人文科学研究科 修了(文学修士) – 大阪大学大学院 言語文化研究科 修了(博士(言語文化 学)) – 職歴 – 日本学術振興会 特別研究員DC2 – 日本学術振興会 特別研究員PD – 東洋大学 社会学部 メディアコミュニケーション学科 助教 – 日本大学 生産工学部 教養・基礎科学系 助教(現在) 2
  2. 4.

    • 関心領域 – コーパス言語学 – テキストマイニング • 主な研究テーマ – 学習者コーパスに基づく言語習得研究(英語)

    – 機械学習と自然言語処理の技術を用いた自動採点(英語ライティン グ、スピーキング) – 計量文体論(英語、日本語の文学作品、歌詞など) etc. 4
  3. 5.

    5

  4. 6.

    • 単著 – 『Rによるやさしいテキストマイニング』(オーム社、2017) – 『Rによるやさしいテキストマイニング[機械学習編]』(オーム社、2017) – 『仕事に使えるクチコミ分析―テキストマイニングと統計学をマーケティ ングに活用する』(技術評論社、2017) –

    『Rによるやさしいテキストマイニング[活用事例編] 』(オーム社、2018) – 『ことばのデータサイエンス』(朝倉書店、近刊) • 主な共著 – 『言語研究のための統計入門』(くろしお出版、2010) – 『英語学習者コーパス活用ハンドブック』(大修館書店、2013) – 『テキストマイニングによる言語研究』(ひつじ書房、2014) – 『文章を科学する』(ひつじ書房、2017) – 『コーパスと多様な関連領域』(ひつじ書房、2017) etc. 6
  5. 7.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 7
  6. 8.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 8
  7. 9.

    成績データ分析 • 多様なデジタルデータの例 – 入学時・進学時のプレースメントテスト(マークシート形式) – 単位取得状況 – 外部試験(e.g., TOEIC

    IP, TOEFL ITP) – e-learningシステムのログ – 出欠管理システム – アンケートの回答(自由記述を含む) – その他の学生情報(e.g., 出身校、資格) • 教育的データマイニング(educational data mining) – 多様なメタデータに基づく評価 – 学習者集団(e.g., 学校、学部・学科、クラス、入学年度)の傾向分析 – 退学・休学・留年などのリスク予測 etc. 9
  8. 11.

    • データの層別分析 – データ分析の基本は、何かと何かを比べること – 単一のデータだけから、画期的な結論を導くのは困難 • 成績データの層別分析 – 科目別(e.g.,

    英語 vs 数学、リーディング vs リスニング) – 時間別(e.g., 1年生時 vs 2年生時) – 学部・学科・クラス別 – 担当教員別 – 入学年度別 – 入学形式別(e.g., 一般入試 vs 推薦 vs 付属校) – 出席状況別 etc. 11
  9. 12.

    12

  10. 14.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 14
  11. 15.

    Rによるデータ分析 • R – 多様なデータ解析手法とグラフィックス作成機能を備えたデータ解析 環境 – 誰でも無料で利用可能 – Windows,

    Mac, Linuxといった複数のOS上で動作可能 – 拡張機能が無料の「パッケージ」という形で配布 (=最新のデータ解析手法をすぐに試すことができる) – 最先端の統計学研究から様々なビジネス領域まで幅広く活用 – 統計計算の共通語(lingua franca) 15
  12. 16.

    • Rでプログラミング – 利点 • 既存のツールと異なり、分析の目的に合わせた独自の解析が可 能 • マウスで操作するツールと比べて、大規模なデータを高速で処理 •

    自分の研究に使いやすいような出力が可能 – 欠点 • プログラミングの作法を学ぶ必要 • 特殊なプログラミング文法(e.g., Pythonの方が汎用的なプログラ ミング言語としては優秀、Rは統計解析に特化) • フリーソフトなので、エラーが出た場合などは自分たちで解決 (ただし、ウェブ上に情報が非常に多く、質問できるサイトなどもあ り) 16
  13. 17.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 17
  14. 27.

    基本的なプログラミング 27 > # 入力練習 > 1 + 2 [1]

    3 > > # 引き算 > 2 - 1 [1] 1 > # 掛け算 > 2 * 3 [1] 6 > # 割り算 > 4 / 2 [1] 2 > # 累乗 > 3 ^ 4 [1] 81 > # 「基本的には」半角スペースの有無はなし(例外あり)
  15. 28.

    28 > # 変数に代入 > x <- 2 > #

    変数の中身の確認 > x [1] 2 > # 代入と同時に変数の中身を確認 > (x <- 2) [1] 2 > # 変数を使った計算 > x + 1 [1] 3 > # 別の変数を作成 > y <- 3 > # 変数同士の計算 > x + y
  16. 29.

    29 > # ベクトルの作成と代入 > # c関数は,ベクトルを作成するための関数 > x <-

    c(1, 2, 3, 4, 5) > > # ベクトルの中身の確認 > x [1] 1 2 3 4 5 > # ベクトルの長さ(要素数)の確認 > length(x) [1] 5 > > # ベクトルの3番目の要素だけを取り出す > x[3] [1] 3 > # ベクトルの2番目から4番目の要素だけを取り出す > x[2 : 4] [1] 2 3 4
  17. 30.

    30 > # ベクトルを使った計算 > x * 2 [1] 2

    4 6 8 10 > # 別のベクトルを作成 > y <- c(6, 7, 8, 9, 10) > # ベクトル同士の計算 > x + y [1] 7 9 11 13 15 > # x, yの順番でベクトルを結合 > vector.1 <- append(x, y) > vector.1 [1] 1 2 3 4 5 6 7 8 9 10 > # y, xの順番でベクトルを結合 > vector.2 <- append(y, x) > vector.2 [1] 6 7 8 9 10 1 2 3 4 5
  18. 31.

    31 > # 行列の作成 > # ベクトルの用意 > z <-

    c(1, 2, 3, 4, 5, 6) > # 行列の形式に変換 > matrix.1 <- matrix(z, nrow = 2, ncol = 3) > matrix.1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > > # matrix関数の引数byrowでTRUEを指定 > matrix.2 <- matrix(z, nrow = 2, ncol = 3, byrow = TRUE) > matrix.2 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 > # 行数の確認 > nrow(matrix.2) [1] 2 > # 列数の確認 > ncol(matrix.2) [1] 3
  19. 32.

    32 > # 行列を使った計算 > matrix.2 + 1 [,1] [,2]

    [,3] [1,] 2 3 4 [2,] 5 6 7 > # 別の行列を作成(matrix関数とc関数を入れ子にする) > matrix.3 <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 2, ncol = 3, byrow = TRUE) > # 行列同士の計算 > matrix.2 + matrix.3 [,1] [,2] [,3] [1,] 8 10 12 [2,] 14 16 18 > > # 行列の結合(行方向) > rbind(matrix.2, matrix.3) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 10 11 12
  20. 33.

    33 > # 行列の結合(列方向) > cbind(matrix.2, matrix.3) [,1] [,2] [,3]

    [,4] [,5] [,6] [1,] 1 2 3 7 8 9 [2,] 4 5 6 10 11 12 > > # 元の行列 > matrix.2 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 > # 2行目・3列目の要素を取り出し > matrix.2[2, 3] [1] 6 > # 2行目の要素全てを取り出し > matrix.2[2, ] [1] 4 5 6 > # 3列目の要素全てを取り出し > matrix.2[, 3] [1] 3 6 > # 2行目の要素以外の全てを取り出し > matrix.2[-2, ] [1] 1 2 3
  21. 34.

    34 > # 3列目の要素以外の全てを取り出し > matrix.2[, -3] [,1] [,2] [1,]

    1 2 [2,] 4 5 > > # 元の行列 > matrix.2 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 > # 行列の転置 > t(matrix.2) [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6
  22. 35.

    35 > # 行ラベルの付与 > rownames(matrix.2) <- c("R1", "R2") >

    # 列ラベルの付与 > colnames(matrix.2) <- c("C1", "C2", "C3") > # ラベルの確認 > matrix.2 C1 C2 C3 R1 1 2 3 R2 4 5 6 > > # c関数のヘルプを参照 > help(c) starting httpd help server ... done
  23. 36.

    • 練習問題 1 – 1) 以下のような行列を作成しなさい Taro Hanako Kokugo 72

    65 Eigo 81 76 Sugaku 58 90 Rika 64 85 Syakai 77 70 – 2) その行列から、Taroの成績だけを抜き出しなさい – 3) その行列から、英語(Eigo)の成績だけを抜き出しなさい – 4) その行列から、理科(Rika)以外の成績を抜き出しなさい – 5) その行列から、Hanakoの数学の成績だけを抜き出しなさい 36
  24. 37.

    37 > # ベクトルの作成 > x <- c(1, 2, 3,

    4, 5) > # ベクトルの総和 > sum(x) [1] 15 > # ベクトルの2番目から4番目の要素の総和 > sum(x[2 : 4]) [1] 9 > > # 平均値 > mean(x) [1] 3 > # 中央値 > median(x) [1] 3 > > # グループAの5人の年収の調査(単位は万円) > a <- c(100, 200, 300, 400, 500) > mean(a) [1] 300 > median(a) [1] 300
  25. 38.

    38 > # グループBの5人の年収の調査(単位は万円) > b <- c(100, 200, 300,

    400, 5000) > mean(b) [1] 1200 > median(b) [1] 300 > # 最大値 > > max(x) [1] 5 > # 最小値 > min(x) [1] 1 > # 分散 > var(x) [1] 2.5 > # 標準偏差 > sd(x) [1] 1.581139 > # 要約統計量 > summary(x) Min. 1st Qu. Median Mean 3rd Qu. Max. 1 2 3 3 4 5
  26. 39.

    39 > matrix.4 <- matrix(c(1, 2, 3, 4, 5, 6,

    7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE) > matrix.4 [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 > # 行列の総和 > sum(matrix.4) [1] 45 > # 行列の平均値 > mean(matrix.4) [1] 5 > > # 行列の1行目の総和 > sum(matrix.4[1, ]) [1] 6 > # 行列の2〜3列目の平均値 > mean(matrix.4[, 2 : 3]) [1] 5.5
  27. 40.

    40 > # 行ごとの総和 > rowSums(matrix.4) [1] 6 15 24

    > # 列ごとの総和 > colSums(matrix.4) [1] 12 15 18 > # 行ごとの平均値 > rowMeans(matrix.4) [1] 2 5 8 > # 列ごとの平均値 > colMeans(matrix.4) [1] 4 5 6 > > # 行ごとの総和(rowSums(matrix.4)と同じ) > apply(matrix.4, 1, sum) [1] 6 15 24 > # 列ごとの平均値(colMeans(matrix.4)と同じ) > apply(matrix.4, 2, mean) [1] 4 5 6 > # 行ごとの最大値 > apply(matrix.4, 1, max) [1] 3 6 9
  28. 41.

    41 > # 列ごとの要約統計量 > apply(matrix.4, 2, summary) [,1] [,2]

    [,3] Min. 1.0 2.0 3.0 1st Qu. 2.5 3.5 4.5 Median 4.0 5.0 6.0 Mean 4.0 5.0 6.0 3rd Qu. 5.5 6.5 7.5 Max. 7.0 8.0 9.0
  29. 42.

    • 練習問題 2 – 1) 以下のような行列を作成しなさい Taro Hanako Kokugo 72

    65 Eigo 81 76 Sugaku 58 90 Rika 64 85 Syakai 77 70 – 2) 2人の5科目合計点を一度にまとめて出しなさい – 3) 2人の5科目平均点を一度にまとめて出しなさい – 4) 5科目それぞれの平均点を一度にまとめて出しなさい 42
  30. 43.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 43
  31. 44.

    2つのデータの比較 • よくあるパターン – 中間テストと期末テスト – 1年生時と2年生時(e.g., 年度始めのプレースメントテスト) – 2科目(e.g.,

    TOEIC Listening & Reading) – 2クラス etc. 44 Student A B S001 88 75 S002 78 80 S003 69 73 S004 63 57 S005 75 63 … … …
  32. 46.

    46 > # CSVファイルの読み込み(ヘッダーがある場合) > # seiseki_A.csvを選択 > seiseki <-

    read.csv(file.choose(), header = TRUE) > # 読み込んだデータの最初の3行の確認 > head(seiseki, 3) Student A B 1 S001 88 75 2 S002 78 80 3 S003 69 73 > > # 行数と列数の確認(nrow()とncol()をまとめて実行するイメージ) > dim(seiseki) [1] 50 3 > テストAの平均点 > mean(seiseki[, 2]) > 各テストの平均点 > colMeans(seiseki[, 2 : 3]) A B 63.8 60.3 > # 各学生の平均点 > rowMeans(seiseki[, 2 : 3]) [1] 81.5 79.0 71.0 60.0 69.0 63.0 (以下略)
  33. 47.

    47 > # 参考 > # 偏差値 > # テストAのz得点を計算

    > z <- (seiseki[, 2] - mean(seiseki[, 2])) / sd(seiseki[, 2]) > # テストAの偏差値を計算 > dev.val <- z * 10 + 50 > dev.val [1] 64.45068 58.47933 53.10511 49.52229 56.68792 56.68792 [7] 53.10511 44.74521 49.52229 49.52229 45.93948 41.16239 [13] 45.34234 46.53661 42.95380 43.55093 50.11943 47.73088 [19] 44.14807 47.73088 38.17671 41.75953 56.68792 60.86787 [25] 66.24209 69.22777 67.43636 62.65928 65.04782 60.86787 [31] 54.29938 54.89651 56.09078 51.91083 42.35666 37.57958 [37] 38.17671 42.35666 24.44259 31.01108 40.56526 49.52229 [43] 45.93948 63.85355 40.56526 35.19103 39.37098 53.70224 [49] 59.07646 59.07646 > # テストBの偏差値を計算 > z.2 <- (seiseki[, 3] - mean(seiseki[, 3])) / sd(seiseki[, 3]) > dev.val.2 <- z.2 * 10 + 50 > dev.val.2 (省略)
  34. 48.

    48 > # ヒストグラムによるTest Aの可視化 > hist(seiseki[, 2]) > #

    x軸のラベル、y軸のラベル、メインタイトルの指定 > hist(seiseki[, 2], xlab = "Score", ylab = "Number of students", main = "Test A") > # 色を指定 > hist(seiseki[, 2], xlab = "Score", ylab = "Number of students", main = "Test A", col = "red") > > # Rで指定できる色の確認 > colors() [1] "white" "aliceblue" "antiquewhite" "antiquewhite1" (以下略)
  35. 49.

    49 > # 幹葉図による可視化 > stem(seiseki[, 2]) The decimal point

    is 1 digit(s) to the right of the | 2 | 1 3 | 29 4 | 3446889 5 | 01123456778 6 | 0033334799 7 | 0124555899 8 | 225789 9 | 136
  36. 50.

    50 > # 箱ひげ図による可視化 > boxplot(seiseki[, 2]) > # range

    = 0は、外れ値がある場合に表示するオプション > boxplot(seiseki[, 2], range = 0) > # メインラベルの指定 > boxplot(seiseki[, 2], range = 0, main = "Test A") > # 色の指定 > boxplot(seiseki[, 2], range = 0, main = "Test A", col = "lightgreen")
  37. 51.

    51

  38. 52.

    52 > # 複数のグラフの表示 > # 1行2列で配置 > par(mfrow =

    c(1, 2)) > hist(seiseki[, 2], xlab = "Score", ylab = "Number of students", main = "Test A", col = "red") > hist(seiseki[, 3], xlab = "Score", ylab = "Number of students", main = "Test B", col = "blue")
  39. 53.

    • 練習問題 3 – 1) Test Bのヒストグラムを描きなさい – 2) Test

    Bの箱ひげ図を描きなさい – 3) Test AとTest Bの箱ひげ図を横に並べて表示しなさい * 可能であれば、色やラベルなどを適宜指定すること 53
  40. 54.

    54 > # 参考 > # 追加パッケージのインストール(初回のみ) > # Rのバージョンによっては、インストールできない場合あり

    > install.packages("beeswarm", dependencies = TRUE) > # パッケージの読み込み > library(beeswarm) > # beeswarmによる可視化 > beeswarm(seiseki[, 2]) > # 点の色と形の指定 > beeswarm(seiseki[, 2], pch = 16, col = "black") pchで指定できる形
  41. 55.

    55 > # 箱ひげ図にbeeswarmを重ね描き > boxplot(seiseki[, 2], range = 0,

    main = "Test A", col = "lightgreen") > # 重ね描きする際は、add = TRUE > beeswarm(seiseki[, 2], col = "black", pch = 16, add = TRUE)
  42. 56.

    56 > # t検定 > # paired = TRUEだと対応あり、var.equal =

    FALSEだと等分散性を仮定し ない(Welchの方法) > t.test(seiseki[, 2], seiseki[, 3], paired = TRUE, var.equal = FALSE) Paired t-test data: seiseki[, 2] and seiseki[, 3] t = 2.1301, df = 49, p-value = 0.03821 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: 0.1980557 6.8019443 sample estimates: mean of the differences 3.5
  43. 57.

    57 > # Wilcoxonの順位和検定 > wilcox.test(seiseki[, 2], seiseki[, 3]) Wilcoxon

    rank sum test with continuity correction data: seiseki[, 2] and seiseki[, 3] W = 1369.5, p-value = 0.4118 alternative hypothesis: true location shift is not equal to 0
  44. 58.

    58 > # 散布図 > plot(seiseki[, 2], seiseki[, 3]) >

    # 点の形と色を指定 > plot(seiseki[, 2], seiseki[, 3], pch = 16, col = "black") > # x軸のラベル、y軸のラベル、メインタイトルを指定 > plot(seiseki[, 2], seiseki[, 3], pch = 16, col = "black", xlab = "Test A", ylab = "Test B", main = "Seiseki") > # 両軸の目盛りを0〜100に変更 > plot(seiseki[, 2], seiseki[, 3], pch = 16, col = "black", xlab = "Test A", ylab = "Test B", main = "Seiseki", xlim = c(0, 100), ylim = c(0, 100))
  45. 59.

    59 > # Pearsonの積率相関係数 > cor(seiseki[, 2], seiseki[, 3], method

    = "pearson") [1] 0.7616083 > # Spearmanの順位相関係数 > cor(seiseki[, 2], seiseki[, 3], method = "spearman") [1] 0.7275546 > > # 単回帰分析 > lm.res <- lm(seiseki[, 3] ~ seiseki[, 2]) > # 回帰分析の結果の確認(簡易版) > lm.res Call: lm(formula = seiseki[, 3] ~ seiseki[, 2]) Coefficients: (Intercept) seiseki[, 2] 11.2545 0.7687
  46. 60.

    60 > # 回帰分析の結果の確認(詳細版) > summary(lm.res) Call: lm(formula = seiseki[,

    3] ~ seiseki[, 2]) Residuals: Min 1Q Median 3Q Max -24.154 -5.782 1.087 8.201 27.765 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 11.25450 6.22351 1.808 0.0768 . seiseki[, 2] 0.76874 0.09441 8.142 1.34e-10 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 11.07 on 48 degrees of freedom Multiple R-squared: 0.58, Adjusted R-squared: 0.5713 F-statistic: 66.3 on 1 and 48 DF, p-value: 1.343e-10
  47. 61.

    61 > # 散布図に回帰直線を重ね描き > plot(seiseki[, 2], seiseki[, 3], pch

    = 16, col = "black", xlab = "Test A", ylab = "Test B", main = "Seiseki", xlim = c(0, 100), ylim = c(0, 100)) > abline(lm.res, col = "red")
  48. 62.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 62
  49. 63.

    成績データの層別分析 • よくあるパターン – 科目別(e.g., 英語 vs 数学、リーディング vs リスニング)

    – 学部・学科・クラス別 – 担当教員別 etc. 63 student class prof sex faculty score S001 A P03 M F01 86 S002 A P03 F F01 96 S003 A P03 M F01 52 S004 A P03 F F01 72 S005 A P03 F F01 74 … … … … … …
  50. 64.

    64 > # CSVファイルの読み込み(ヘッダーがある場合) > # seiseki_B.txtを選択 > seiseki.2 <-

    read.csv(file.choose(), header = TRUE) > # 読み込んだデータの最初の3行の確認 > head(seiseki.2, 3) student class prof sex faculty score 1 S001 A P03 M F01 86 2 S002 A P03 F F01 96 3 S003 A P03 M F01 52 > > # 行数と列数の確認 > dim(seiseki.2) [1] 790 6 > # クラス別の学生数 > table(seiseki.2[, 2]) A B C D E F G H I J K L M N O P Q R S 29 28 27 34 34 36 38 46 44 46 53 54 46 46 46 47 46 44 46 > # 担当教員別の学生数 > table(seiseki.2[, 3]) P01 P02 P03 P04 P05 P06 P07 P08 P09 89 80 165 112 80 71 46 101 46
  51. 65.

    65 > # 男女別の学生数 > table(seiseki.2[, 4]) F M 236

    554 > # 学部別の学生数 > table(seiseki.2[, 5]) F01 F02 F03 F04 F05 F06 F07 F09 F10 48 36 111 74 68 53 21 243 136 > # scoreの記述統計量 > summary(seiseki.2[, 6]) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 24.00 60.00 72.00 70.63 82.00 100.00 22 > > # NAを0に置換 > seiseki.2[, 6][is.na(seiseki.2[, 6])] <- 0 > # scoreの記述統計量(NAがない) > summary(seiseki.2[, 6]) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 60.00 71.00 68.66 82.00 100.00
  52. 66.

    66 > # NAを含むデータの扱い > # seiseki_B.csvを再読み込み > seiseki.3 <-

    read.csv(file.choose(), header = TRUE) > # scoreがNAの行を抽出 > subset(seiseki.3, is.na(seiseki.3[, 6])) student class prof sex faculty score 12 S012 A P03 M F01 NA 30 S030 B P04 F F01 NA 56 S056 B P04 M F02 NA (以下略) > # scoreがNAの学生数 > nrow(subset(seiseki.3, is.na(seiseki.3[, 6]))) [1] 22 > > # NAを含む行を削除 > seiseki.3 <- na.omit(seiseki.3) > # 行数と列数の確認(790から人数が減っている) > dim(seiseki.3) [1] 768 6 > # scoreの記述統計量(NAがない) > summary(seiseki.3[, 6]) Min. 1st Qu. Median Mean 3rd Qu. Max. 24.00 60.00 72.00 70.63 82.00 100.00
  53. 67.

    67 > # 層別の要約統計量 > # クラス別の要約統計量 > tapply(seiseki.2[, 6],

    seiseki.2[, 2], summary) $A Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 72.00 84.00 79.03 90.00 96.00 $B Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 68.00 80.00 71.93 90.50 98.00 (以下略) > > # 担当教員別の要約統計量 > tapply(seiseki.2[, 6], seiseki.2[, 3], summary) $P01 Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 48.00 60.00 59.17 72.00 94.00 $P02 Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 66.00 74.00 71.17 84.00 98.00 (以下略)
  54. 68.

    68 > # 層別の箱ひげ図 > # クラス別の箱ひげ図 > boxplot(seiseki.2[, 6]

    ~ seiseki.2[, 2], ylim = c(0, 100), col = "green") > # 箱ひげ図にノッチを入れる > boxplot(seiseki.2[, 6] ~ seiseki.2[, 2], ylim = c(0, 100), col = "green", notch = TRUE)
  55. 69.

    69 > # 担当教員別の箱ひげ図 > boxplot(seiseki.2[, 6] ~ seiseki.2[, 3],

    ylim = c(0, 100), col = "green") > # 箱ひげ図にノッチを入れる > boxplot(seiseki.2[, 6] ~ seiseki.2[, 3], ylim = c(0, 100), col = "green", notch = TRUE)
  56. 70.

    • 練習問題 4 – 1) 男女別の要約統計量を求めなさい – 2) 学部別の要約統計量を求めなさい –

    3) 男女別の箱ひげ図(ノッチあり)を描きなさい – 4) 学部別の箱ひげ図(ノッチあり)を描きなさい 70
  57. 71.

    71 > # 参考 > # 箱ひげ図の並び替え > # データを層別に分割

    > seiseki.splitted <- split(seiseki.2[, 6], seiseki.2[, 2]) > seiseki.splitted $A [1] 86 96 52 72 74 90 82 94 82 88 82 0 92 72 78 70 58 66 88 82 72 92 84 94 92 94 86 90 84 $B [1] 0 98 36 90 72 96 72 54 80 84 80 98 68 74 92 92 86 74 94 52 42 86 68 94 82 68 0 82 (以下略) > # 中央値の小さい順に箱ひげ図を並び替え > boxplot(seiseki.splitted[sort.list(sapply(seiseki.splitted, median))], col = "green", ylim = c(0, 100), xlab = "class", ylab = "score")
  58. 72.

    72

  59. 73.

    73 > # 参考 > # 追加パッケージのインストール(初回のみ) > # Rのバージョンによっては、インストールできない場合あり

    > install.packages("gplots", dependencies = TRUE) > # パッケージの読み込み > library(gplots) > # 平均値±標準偏差のプロット(クラス別) > plotmeans(seiseki.2[, 6] ~ seiseki.2[, 2], xlab = "class", ylab = "score")
  60. 74.

    74 > # 一元配置分散分析(等分散性を仮定) > oneway.test(seiseki.2[, 6] ~ seiseki.2[, 2],

    var = TRUE) One-way analysis of means data: seiseki.2[, 6] and seiseki.2[, 2] F = 5.5595, num df = 18, denom df = 771, p-value = 1.768e-12 > > # 多重比較(TukeyのHSD検定) > TukeyHSD(aov(seiseki.2[, 6] ~ seiseki.2[, 2])) Tukey multiple comparisons of means 95% family-wise confidence level Fit: aov(formula = seiseki.2[, 6] ~ seiseki.2[, 2]) $`seiseki.2[, 2]` diff lwr upr p adj B-A -7.1059113 -24.0909962 9.87917351 0.9942195 C-A 1.2618135 -15.8825529 18.40617994 1.0000000 D-A -16.2697769 -32.4744444 -0.06510937 0.0477745 (以下略)
  61. 75.

    75 > # 参考 > # Kruskal-Wallis検定 > kruskal.test(seiseki.2[, 6]

    ~ seiseki.2[, 2]) Kruskal-Wallis rank sum test data: seiseki.2[, 6] by seiseki.2[, 2] Kruskal-Wallis chi-squared = 123.32, df = 18, p-value < 2.2e-16 > > # 多重比較(Steel-Dwass検定) > # 群馬大学の青木繁伸先生のコードをダウンロード > source("http://aoki2.si.gunma-u.ac.jp/R/src/Steel-Dwass.R", encoding = "euc-jp") > # 関数実行時に、クラスを表す記号(e.g., A, B)を数値に強制変換 > Steel.Dwass(seiseki.2[, 6], as.numeric(seiseki.2[, 2])) t p 1:2 0.91178043 9.999928e-01 1:3 0.41086027 1.000000e+00 1:4 3.70928035 2.606002e-02 1:5 4.32860205 2.257694e-03 1:6 3.69395659 2.750429e-02 (以下略)
  62. 77.

    概要 1. [講義] 成績データ分析 2. [講義] Rによるデータ分析 3. [実習] Rの基本

    • インストール • 基本的なプログラミング 4. [実習] 成績データ分析(初級編) • 基本的な可視化 • 基本的な統計処理 5. [実習] 成績データ分析(中級編) • 層別の可視化 • 層別の統計処理 6. [デモ] 「モダンな」可視化 77
  63. 78.

    78 > # 参考 > # 追加パッケージのインストール(初回のみ) > # Rのバージョンによっては、インストールできない場合あり

    > install.packages("ggplot2", dependencies = TRUE) > # パッケージの読み込み > library(ggplot2) > # シンプルなヒストグラム > p <- ggplot(seiseki, aes(x = A)) > p + geom_histogram() 0 1 2 3 4 20 40 60 80 100 A count
  64. 79.

    79 > # 男女別(透明度50%) > p <- ggplot(seiseki.2, aes(x =

    score, fill = sex)) > p + geom_histogram(position = "identity", alpha = 0.5) > # 学部別(透明度30%) > p <- ggplot(seiseki.2, aes(x = score, fill = faculty)) > p + geom_histogram(position = "identity", alpha = 0.3) 0 20 40 60 0 25 50 75 100 score count sex F M 0 10 20 30 0 25 50 75 100 score count faculty F01 F02 F03 F04 F05 F06 F07 F09 F10
  65. 80.

    80 > # 層別のヒストグラム > # 男女別(並列) > p <-

    ggplot(seiseki.2, aes(x = score, fill = sex)) > p + geom_histogram(position = "dodge") > # 学部別(並列) > p <- ggplot(seiseki.2, aes(x = score, fill = faculty)) > p + geom_histogram(position = "identity", alpha = 0.3) 0 20 40 60 0 25 50 75 100 score count sex F M 0 10 20 30 0 25 50 75 100 score count faculty F01 F02 F03 F04 F05 F06 F07 F09 F10
  66. 81.

    81 > # 箱ひげ図 > # 男女別 > p <-

    ggplot(seiseki.2, aes(x = sex, y = score)) > p + geom_boxplot() > # 学部別 > p <- ggplot(seiseki.2, aes(x = faculty, y = score)) > p + geom_boxplot() 0 25 50 75 100 F M sex score 0 25 50 75 100 F01 F02 F03 F04 F05 F06 F07 F09 F10 faculty score
  67. 82.

    82 > # 男女別(色つき) > p <- ggplot(seiseki.2, aes(x =

    sex, y = score, colour = sex, fill = sex)) > p + geom_boxplot(alpha = 0.5) > # 学部別(色つき) > p <- ggplot(seiseki.2, aes(x = faculty, y = score, colour = faculty, fill = faculty)) > p + geom_boxplot(alpha = 0.5) 0 25 50 75 100 F M sex score sex F M 0 25 50 75 100 F01 F02 F03 F04 F05 F06 F07 F09 F10 faculty score faculty F01 F02 F03 F04 F05 F06 F07 F09 F10
  68. 83.

    83 > # 男女別(ノッチつき) > p <- ggplot(seiseki.2, aes(x =

    sex, y = score, colour = sex, fill = sex)) > p + geom_boxplot(alpha = 0.5, notch = TRUE) > # 学部別(ノッチつき) > p <- ggplot(seiseki.2, aes(x = faculty, y = score, colour = faculty, fill = faculty)) > p + geom_boxplot(alpha = 0.5, notch = TRUE) 0 25 50 75 100 F M sex score sex F M 0 25 50 75 100 F01 F02 F03 F04 F05 F06 F07 F09 F10 faculty score faculty F01 F02 F03 F04 F05 F06 F07 F09 F10
  69. 84.

    84 > # 散布図と回帰直線(信頼区間の描画あり) > p <- ggplot(seiseki, aes(x =

    A, y = B)) > p + geom_point() + stat_smooth(method = "lm") > # 散布図と回帰直線(信頼区間の描画なし) > p <- ggplot(seiseki, aes(x = A, y = B)) > p + geom_point() + stat_smooth(method = "lm", se = FALSE) 20 40 60 80 20 40 60 80 A B 20 40 60 80 20 40 60 80 A B
  70. 85.

    主な参考文献 • 小林 雄一郎 (2012). 「Rによる成績データ分析入門」 『外国語 教育メディア学会 (LET) 関西支部メソドロジー研究部会2011

    年度報告論集』 81-91. http://www.mizumot.com/method/2011-08_Kobayashi.pdf • 小林 雄一郎 (2017). 『Rによるやさしいテキストマイニング』 オ ーム社. 85
  71. 86.

    さらに学びたい人のために • Rの発展的な使い方 – Rサポーターズ (2017). 『パーフェクトR』 技術評論社. – 石田基広

    (2016). 『改訂3版 R言語逆引きハンドブック』 C&R研究所. – 松村優哉・湯谷啓明・紀ノ定保礼・前田和寛 (2018). 『Rユーザのため のRStudio[実践]入門ーtidyverseによるモダンな分析フローの世界』 技術評論社. • 言語テストに関わる統計処理 – 加藤健太郎・山田剛史・川端一光 (2014). 『Rによる項目反応理論』 オ ーム社. – 服部環 (2011). 『心理・教育のためのRによるデータ解析』 福村出版. – 山田剛史・杉澤武俊・村井潤一郎 (2008). 『Rによるやさしい統計学』 オーム社. – 山田剛史 (編) (2015). 『Rによる心理学研究法入門』 北大路書房. 86