RとQuartoではじめるデータサイエンス

#8 プレゼンテーションとループ処理

苅谷千尋

金沢大学

June 3, 2026

0. 本日の目標

本日の目標

  1. プレゼンテーションを頑張る
  2. 他の受講生のよい点を発見する(できれば真似する)
  3. 授業を振り返り、自分ができるようになったことを確認する
  4. (時間に余裕がある人は)ループ処理に挑戦する

Ⅰ. 前回の振り返り

授業の感想

今まで作っていたものを別のグラフに置き換える際に対して大規模な変更をせずに、そのチャンクだけ多少変えるだけで良いという点に改めてRの使いやすさを実感しました。すぐに地図のグラフに置き換えれたので本当に便利です。(寺西さん)

Rを用いたデータ分析からレポート作成までの一連の流れを学び、データを意味のある情報へと変換する面白さを実感した。今後はここで得たスキルをさらに磨き、身近な問題の解決や説得力のある提案など、社会における実践的なデータ活用に挑戦していきたい。(山本さん)

授業の感想

グラフ作成などをするときに、使えるグラフがいろいろな種類があるため便利だと感じたため。いろいろな種類がある分、いまだにRを使うのは難しいと感じている。(吉田さん)

補足

  • R(4.6.0)とR Studio(2026.05.0+218)の新しいバージョンが公開されています
  • R本体をアップデートすると、これまで追加したパッケージを入れ直すよう求められる場合があります
  • 素直に、アップデートして下さい。ただし、アップデートする場合は、時間に余裕があるときに行いましょう

Ⅱ. プレゼンテーション

プレゼンテーション

3つのポイント

1. 分析の目的を伝える

  • 何を知りたくて分析したのかを説明する

2. グラフの読み取り

  • グラフの内容を説明するだけでなく、「何がわかったのか」を中心に伝える

3. 結論につなげる

  • 図ごとの説明で終わらず、目的を意識した上で、全体として何が明らかになったのかを説明する

Ⅲ. グループディスカッション

グループディスカッション

テーマ1. 他のプレゼンテーションから学んだこと

  • 印象に残ったプレゼンテーションはどれでしたか?
  • どのような点がわかりやすかったですか?
  • 自分も真似したいと思った工夫はありましたか?

グループディスカッション

テーマ2. この授業でできるようになったこと

  • この授業を通して、新しくできるようになったことは何ですか?
  • データ分析やグラフ作成に対する理解はどのように変わりましたか?
  • 次に挑戦してみたい分析や可視化はありますか?

Ⅳ. ループ処理

ループ処理

  • 知らないことは調べられません
  • 必要になったときに思い出してほしい、というくらいの思いで紹介します

ループ処理

map()関数

  • purrr(「パー」と発音)パッケージに含まれる
    • purrrはtidyverseに含まれているので、追加インストール不要
  • ベクトルやリストの要素を順に取り出し、同じ処理を行う

主な使い方

  • 指定した列名ごとに同じ処理を繰り返す
    • 例:body_mass, bill_len, flipper_len
  • グループごとにデータを分けて同じ処理を繰り返す
    • 例:スポーツ種目ごとにグラフを作成
    • split()nest() を利用

ループ処理

vars()関数

  • 指定した列名ごとに同じ処理を繰り返す

nest()関数

  • グループごとのデータを表として管理する
  • 計算結果やグラフを列として追加できる

split()関数

  • データをグループごとに分けて同じ処理を繰り返す
  • データフレームをグループごとに分割する
  • 分割したデータに対して同じ処理を実行する
  • グラフの一括作成やファイルの連続出力に向く

ループ処理

walk()関数

  • map()と同様に繰り返し処理を行うための関数
  • 計算結果を利用するよりも、処理の実行を目的とする
  • グラフの表示やファイル出力でよく使う

ループ処理

利点

  • コードが短くなり、ミスを減らせる
  • 多くの変数やグループを効率よく分析できる
  • 特定の結果だけでなく、データ全体を網羅的に探索できる
    • 自分の興味のあるデータだけを恣意的に選ぶことを防ぐ

ループ処理

指定した列名ごとに同じ処理を繰り返す:vars()

# 可視化したい変数をまとめて指定(この3つを順番に処理する)
vars <- c("body_mass", "bill_len", "flipper_len") 

# map():同じ処理を変数ごとに繰り返す(マップ=マッピング=写しとる)
map(vars, \(v) { #map()関数を使って同一処理を指示
  penguins |>  # タイトルを除くコードは先と同じ
    drop_na() |> 
    group_by(species, sex) |>
    summarise(avg = mean(.data[[v]])) |> # 指定した変数 v の平均を計算。data[[v]]:文字列で指定した列名を使う書き方(ここが少し特殊)
    ggplot(aes(x = species, y = avg)) +
    geom_col() +
    facet_wrap(~ sex) +
    labs(title = paste("Average of", v)) # varsからタイトルを持ってくる
})
[[1]]


[[2]]


[[3]]

ループ処理

データをグループごとに分けて繰り返す:nest()

result <- # 以下の結果をresultというオブジェクトに入れる
  penguins |>
  drop_na() |>
  group_by(species) |>
  nest() |> # データフレームの中に、さらにデータフレームを入れる = species(3種類)に分かれたデータフレームになる
  mutate(
    plot = map(data, ~
                 ggplot(.x, aes(bill_len, flipper_len)) +
                 geom_point())
  )

result$plot |> walk(print) # 実行(ここではprint)を指示

ループ処理

データをグループごとに分けて繰り返す:split()

df_long_cat_d_all |>
  filter(category_major == "スポーツ") |>
  split(~ category_middle) |> # データをスポーツ種目ごとに分ける
  walk( # 分けたデータを1つずつ取り出して処理する
    \(df) {
      p <- # オブジェクトpに代入
        df |>
        filter(性別 == "男") |>
        drop_na() |>
        mutate(value = as.numeric(value)) |>
        group_by(地域ブロック) |>
        summarise(
          value_sum = sum(value),
          .groups = "drop"
        ) |>
        mutate(
          地域ブロック = fct_rev(地域ブロック)
        ) |>
        ggplot(
          aes(
            x = 地域ブロック,
            y = value_sum
          )
        ) +
        geom_col() +
        labs(
          title = unique(df$category_middle),
          x = NULL,
          y = NULL
        ) +
        coord_flip()

      print(p) #オブジェクトpをプロット

    }
  )

Ⅴ. レポート課題の相談

Ⅵ. 宿題

宿題

授業の感想

  • 回答先:Google Forms
  • 締め切り:6月7日(日)23時59分

学期末授業アンケート

  • 回答先:Google Forms
  • 締め切り:6月7日(日)23時59分

レポート課題(再提出したい人のみ)

  • ファイル:ZIPファイル
    • ファイル名:どこかに氏名を特定できる文字を入れて下さい
    • 例:kariya.zip
  • 提出先:dropbox
  • 締め切り:6月7日(日)23時59分(延長しています

宿題

その他

  • 6月7日(日)23:59まで各種提出物の遅延提出を認めます
  • 6月8日(月)に成績を付けるので、それ以降は一切、受け付けません

成績の開示

  • 6月11日(木)7:00からQ1の成績が開示されます