第2講 練習問題

統計データ解析

Published

October 10, 2025

準備

データの操作と視覚化のために tidyverse パッケージを読み込む.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.1     ✔ stringr   1.5.2
✔ ggplot2   4.0.0     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Quartoファイルの中で使われているパッケージがインストールされていない場合は, エディタ上部にインストールを促す警告が出るので,その指示に従ってインストールすればよい. 手動でインストールする場合は以下のいずれかを実行する.

  • Package タブからインストール
  • コンソール上で次のコマンドを実行 install.packages("パッケージ名")

tidyverse は第1講のサンプルで使っているので通常はインストールされているが, R言語のバージョンがアップグレードされた場合などに対応が必要となる.

library(tidyverse) を実行すると読み込まれたパッケージが表示される. 同名の関数が存在する場合には Conflicts として衝突する関数名が表示される. 衝突する場合はパッケージ名を明示的に付ける必要がある. 例えば filter() には以下の2つがある.

  • dplyer::filter() データフレームの抽出のための関数
  • stats::filter() 時系列処理のための線形フィルタ関数

名前の衝突による不具合を避けたい場合は conflicted パッケージの利用を推奨する.

library(conflicted)

データフレームの作成

参考

データフレームは 同じ長さのベクトル(関数 base::c() で作成)を関数 tibble::tibble() に渡して作成する.

#' (... <- ...) は代入した結果を表示
(foo <- tibble(one = c(1,2,3),two = c("AB","CD","EF"))) 
(bar <- tibble(three = c("x","y","z"),four = c(0.9,0.5,-0.3)))

データフレームを結合するには関数 dplyr::bind_cols() を用いる.

(baz <- bind_cols(foo,bar))

問題

次の表に対応するデータフレームを作成しなさい.

name math phys chem bio
Alice 90 25 65 70
Bob 80 50 100 50
Carol 70 75 70 30
Dave 60 100 40 80
Eve 50 80 75 100

ファイルの読み書き

参考

ファイルの書き出しには関数 readr::write_csv() を用いる.

write_csv(x, file = "ファイル名") # データフレームxをファイルに書き出す

ファイルの読み込みには関数 readr::read_csv() を用いる.

y <- read_csv(file = "ファイル名") # 変数yにCSVファイルの内容を読み込む

問題

以下の問いに答えなさい.

  1. 前の演習で作成したデータフレームを適当なファイルに書き出しなさい.
  2. 書き出したファイルから別の変数に読み込みなさい.
  3. pcr_case_daily.csv (厚労省からダウンロードしたファイル)を変数 pcr_data に読み込みなさい.

データフレームの操作

参考

行の選択には関数 dplyer::filter() を, 列の選択には関数 dplyer::select() を用いる.

#' 前に作成したデータフレーム z を用いた例
(foo <- filter(z, three >= 7))      # 列 three の値が7以上の行を選択
(bar <- select(foo, c(one, three))) # 列 one,three を選択
#' パイプを用いると以下のように簡潔に書ける
z |> filter(three >= 7) |> select(one, three)

問題

pcr_case_daily.csv から以下の条件を満たすデータを取り出しなさい.

  1. 医療機関 (mi) での検査件数が2000を越えたときの国立感染症研究所 (niid) と医療機関 (mi) のデータ.
  2. 大学等 (univ) と医療機関 (mi) でともに検査件数が2000を越えたデータ.
  3. 2020年3月の各機関(sub,total は集計なので除く)の検査件数データ.

データフレームの集約

参考

列の集計には関数 dplyr::summarise() を用いる.

#' 練習問題のデータフレームを用いた例
grade_data |>
    summarise(math_mean = mean(math), nums = n()) # 数学の平均を求める
#' 複数の列にまたがる操作には関数 dplyr::across() を利用
grade_data |>
    summarise(across(!name, mean))                # 名前の列以外の平均を求める

集計に必要な関数が用意されていない場合は, 無名関数として定義して利用すれば良い.

問題

pcr_case_daily.csv について以下の集計を行いなさい.

  1. 各機関でのPCR検査件数の最大値.
  2. 2021年の各機関でのPCR検査件数の月ごとの最大値.

ヘルプを用いて datasets::mtcars の内容を調べた上で以下の集計を行いなさい.

  1. 気筒数 (cyl) ごとに排気量 (disp) の最大値,最小値.
  2. 気筒数 (cyl) とギア数 (gear) ごとの燃費 (mpg) の平均値.

基本的なグラフの描画

参考

グラフの描画には 関数 ggplot2::ggplot() で描画に用いるデータフレームを指定し, 描きたいグラフの種類に応じて関数 ggplot2::geom_XXX() を加える.

pcr_data |> # パイプ演算子でデータフレームを関数 ggplot2::ggplot() に渡す
  ggplot(aes(x = date)) + # date をx軸に指定
  geom_line(aes(y = ai), colour = "blue") + # 行政検査を青
  geom_line(aes(y = mi), colour = "red") +  # 医療機関を赤
  labs(y = "number of tests") # y軸のラベルを変更

散布図行列を描くには関数 GGally::ggpairs() を用いると良い.

library(GGally)
pcr_data |>
    select(!c(date,sub,total)) |> # 日付と集計値を除いて必要なデータフレームに整形
    ggpairs() # 標準の散布図行列

問題

pcr_case_daily.csv を用いて以下の描画を行いなさい.

  1. 検疫所 (b),地方衛生研究所.保健所 (c),民間検査会社 (d) における検査件数の推移.
  2. 民間検査会社 (d),大学等 (e),医療機関 (f) での検査件数の関係 (散布図).

擬似乱数

問題

ヘルプを用いて以下の関数を調べよ.

  1. 関数 base::sample()
  2. 関数 stats::rbinom()
  3. 関数 stats::runif()
  4. 関数 stats::rnorm()
  5. 関数 base::set.seed()

以下の試行を実装してみよ.

  1. サイコロを10回振る.
  2. 4枚のコインを投げたときの表の枚数.

双六ゲーム

問題

以下の簡単な双六ゲームを考える.

  • ゴールまでのます目は100とする.
  • さいころを振り出た目の数だけ進む.
  • ゴールに辿り着くまで繰り返す.

さいころを振る回数の分布がどうなるか実験を行いなさい.