Slide 1

Slide 1 text

初心者ワークショップ 小杉考司(専修大学人間科学部) 初心者ワークショップ SappoRo.R #12 2025.02.16 1

Slide 2

Slide 2 text

Rのはじめかた 1. SPSSやSASなどの統計ソフトをアンイン ストールします。 2. CRAN (しーらん)と検索します。 The Comprehensive R Archive Network とい うサイトが出てくるはずです。 3. 自分のOS/CPUに合ったページから,最新 版をダウンロードします。現在はR4.4.2に なります。 4. 指示に従ってインストール!「次へ」を連 打するだけでいいです。簡単ね! 初心者ワークショップ SappoRo.R #12 2025.02.16 2

Slide 3

Slide 3 text

RStudioも使いましょう 1. RStudio で検索します。 RStudio Desktop あるいはPosit社が出てきます。 2. Install RStudio からRStudio Desktopを ダウンロードしてインストールしましょ う。  RStudioはServer版もあるよ! 初心者ワークショップ SappoRo.R #12 2025.02.16 3

Slide 4

Slide 4 text

RStudioはPosit社へ 前のバージョンから,起動するとPosit社のアピールをしてくるよ! 初心者ワークショップ SappoRo.R #12 2025.02.16 4

Slide 5

Slide 5 text

RStudioの起動画面 大きく4分割して使います。 起動して最初にやるのが「環境 設定」です。 メニューバーから,Tools > Global Optionsと進みます。 初心者ワークショップ SappoRo.R #12 2025.02.16 5

Slide 6

Slide 6 text

オススメ設定(クセ強め) General > Basic のWrokspace, Save Workspace to .RData on exit: をnever に General > Graphics > Graphics Deviceの Backend をAGGに Appearance の Editor Font をBizin GothicかHackGenに Appearance の Editor Font size を16に 初心者ワークショップ SappoRo.R #12 2025.02.16 6

Slide 7

Slide 7 text

オススメ設定(クセ強め) Pane Layoutを SourceとCosoleを横並びに かなりワイドな画面をお使いの方は, Add Column で3列にしてsource pane を一列増やそう 設定が終わったら Apply(適用) ボタンをお して,OK で閉じる 初心者ワークショップ SappoRo.R #12 2025.02.16 7

Slide 8

Slide 8 text

RStudioの4つの窓 Source ペインはエディタ領域 で,RスクリプトやRmd/Qmdフ ァイル,Stanファイルなどコー ドを書く場所。 Console ペインはRエンジン。 直接Rコードを書いてもいいし, Source から一行ずつ,あるい は Source 全体を流し込んで計 算を実行する。 初心者ワークショップ SappoRo.R #12 2025.02.16 8

Slide 9

Slide 9 text

RStudioの4つの窓 Environment はメモリに入って いる変数・オブジェクトを表示 Files はワーキングディレクト リの表示,簡単な操作 Package はパッケージ管理(後 述) Plots , Viewer は出力表示 初心者ワークショップ SappoRo.R #12 2025.02.16 9

Slide 10

Slide 10 text

つかってみよう 初心者ワークショップ SappoRo.R #12 2025.02.16 10

Slide 11

Slide 11 text

はじめの0歩 Rでプロジェクトを作る プロジェクト=フォルダに紐づいた作業環境を作ろう File > New ProjectからNew Directory/Existing Directory/Version Controlを選ぶ New Directory; 新しいフォルダで作業開始 Existing Directory; 既存のフォルダをプロジェクトと紐付け Version Control; Githubレポジトリとプロジェクトを紐付け プロジェクトにしておくと,作業フォルダの設定も自動でなされるから,ファイルの 読み込みなどでパスの指定が楽になります。 初心者ワークショップ SappoRo.R #12 2025.02.16 11

Slide 12

Slide 12 text

はじめの1歩 Rはインタプリタ言語=一問一答 Consoleに > が出ていたら聞く準備ができています。 Consoleに + が出ていたら前の入力が終わってません。 直接Consoleに書き込むのではなく,スクリプトに書きましょう。 File > New File > R Script と進むと無名のスクリプトファイルが開きます 初心者ワークショップ SappoRo.R #12 2025.02.16 12

Slide 13

Slide 13 text

はじめの1.2歩 スクリプトファイルが開いたら,まず次のように書きます。 rm(list = ls()) pacman::p_load(tidyverse,cmdstanr) 一行目で環境をリセットしています。 二行目でパッケージを読み込んでいます。 パッケージはファイルの冒頭で読み込んでおくのが好きです。 いつも決まった書き出しにするのであれば,スニペット登録しておくと便利 Tools > Global Options > Code > Editing > Snippets > Edit Snippets... 初心者ワークショップ SappoRo.R #12 2025.02.16 13

Slide 14

Slide 14 text

パッケージ パッケージは関数のセット。元のRに追加するだけで機能が増える増える! パッケージはCRANを通じて公開され,ペインの Packages タブで管理できます。 tidyverse はパッケージのパッケージ。便利な tidy 宇宙へようこそ pacman はパッケージマネージャーパッケージ。 p_load 関数で読み込み。もし環 境に入ってないパッケージがあれば自動的にダウンロードもしてくれます。 関数名が重複する場合,後から読み込まれたものが関数名を上書きします。 Pacakge::function の形で書く( :: を挟む)といいですね 初心者ワークショップ SappoRo.R #12 2025.02.16 14

Slide 15

Slide 15 text

数値計算 スクリプトに四則演算を書いて,Cmd+Enterでコンソールに送ります。 複数行選択/Runボタン/Sourceボタンをつかってもよい 1 + 2 [1] 3 3 - 4 [1] -1 5 * 6 [1] 30 7 / 3 [1] 2.333333 初心者ワークショップ SappoRo.R #12 2025.02.16 15

Slide 16

Slide 16 text

ベクトル,行列,リスト,データフレーム 複数の数字のセット,ベクトルは c() でくくる 2次元に並ぶ数字のセット,行列は matrix() でつくる 3次元以上の数字のセット,配列は array() で, dim オプションを 数字,文字,論理値(T/F)などが混在するもののセット,リストは list() で リストの中でも矩形に整っているデータフレームは, data.frame() で 分析するときはデータフレームがよく使われます データフレームの上位互換, tibble も便利です 初心者ワークショップ SappoRo.R #12 2025.02.16 16

Slide 17

Slide 17 text

ベクトル(Vector) > # 数値ベクトル > x <- c(1, 2, 3, 4, 5) > print(x) [1] 1 2 3 4 5 > # 文字列ベクトル > y <- c("りんご", "みかん", "バナナ") > print(y) [1] "りんご" "みかん" "バナナ" > # 論理値ベクトル > z <- c(TRUE, FALSE, TRUE) > print(z) [1] TRUE FALSE TRUE 初心者ワークショップ SappoRo.R #12 2025.02.16 17

Slide 18

Slide 18 text

行列(Matrix) > # 1から9までの数字で3×3行列を作成 > m1 <- matrix(1:9, nrow = 3, ncol = 3) > print(m1) [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > # 行名と列名を付ける > m2 <- matrix(1:9, nrow = 3, ncol = 3, + dimnames = list(c("A", "B", "C"), + c("X", "Y", "Z"))) > print(m2) X Y Z A 1 4 7 B 2 5 8 C 3 6 9 初心者ワークショップ SappoRo.R #12 2025.02.16 18

Slide 19

Slide 19 text

配列(Array) # 2×3×2の3次元配列を作成 > arr <- array(1:12, dim = c(2, 3, 2)) > print(arr) , , 1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 , , 2 [,1] [,2] [,3] [1,] 7 9 11 [2,] 8 10 12 初心者ワークショップ SappoRo.R #12 2025.02.16 19

Slide 20

Slide 20 text

リスト(List) > # 様々な型のデータを含むリストを作成 > my_list <- list( + numbers = c(1, 2, 3), + text = "Hello", + logical = TRUE, + matrix = matrix(1:4, 2, 2) + ) > print(my_list) $numbers [1] 1 2 3 $text [1] "Hello" $logical [1] TRUE $matrix [,1] [,2] [1,] 1 3 [2,] 2 4 初心者ワークショップ SappoRo.R #12 2025.02.16 20

Slide 21

Slide 21 text

リストの要素へのアクセス > my_list$numbers [1] 1 2 3 > my_list$numbers[3] [1] 3 > my_list$matrix[,2] [1] 3 4 > my_list$matrix [,1] [,2] [1,] 1 3 [2,] 2 4 初心者ワークショップ SappoRo.R #12 2025.02.16 21

Slide 22

Slide 22 text

データフレーム(Data Frame) > # データフレームの作成 > df <- data.frame( + name = c("田中", "鈴木", "佐藤"), + age = c(25, 30, 28), + gender = c("M", "F", "M"), + height = c(170, 160, 175) + ) > > print(df) name age gender height 1 田中 25 M 170 2 鈴木 30 F 160 3 佐藤 28 M 175 # データフレームの要素へのアクセス > df$age [1] 25 30 28 初心者ワークショップ SappoRo.R #12 2025.02.16 22

Slide 23

Slide 23 text

Tibble # tibbleの作成 > tbl <- tibble( + name = c("田中", "鈴木", "佐藤"), + age = c(25, 30, 28), + gender = c("M", "F", "M"), + height = c(170, 160, 175) + ) > > print(tbl) # A tibble: 3 × 4 name age gender height 1 田中 25 M 170 2 鈴木 30 F 160 3 佐藤 28 M 175 初心者ワークショップ SappoRo.R #12 2025.02.16 23

Slide 24

Slide 24 text

Tibble tidyverse パッケージを読み込むと tibble パッケージも読み込まれています。 tibbleの特徴 型情報の表示 行数と列数の表示 データの一部のみ表示(大きなデータセット時に便利) 初心者ワークショップ SappoRo.R #12 2025.02.16 24

Slide 25

Slide 25 text

データ構造の比較 特徴 ベクトル 行列 配列 リスト df Tibble 次元 1次元 2次元 n次元 階層構造 2次元 2次元 型の統 一 必要 必要 必要 不要 列ごと 列ごと データ 型 単一 単一 単一 複数可 複数可 複数可 主な用 途 単純な数 列 数値計 算 多次元デー タ 複雑なデー タ データ分 析 データ分 析 初心者ワークショップ SappoRo.R #12 2025.02.16 25

Slide 26

Slide 26 text

データフレームを使った加工with tidyverse 初心者ワークショップ SappoRo.R #12 2025.02.16 26

Slide 27

Slide 27 text

サンプルデータの準備 以下のデータセットを使って実習を進めます: # サンプルデータの作成 employees <- tibble( id = 1:10, name = c("田中一郎", "鈴木花子", "佐藤太郎", "山田優子", "中村次郎", "高橋美咲", "伊藤健一", "渡辺春子", "小林和子", "加藤博士"), gender = c("M", "F", "M", "F", "M", "F", "M", "F", "F", "M"), age = c(25, 30, 45, 28, 33, 29, 41, 36, 27, 38), height = c(170, 160, 175, 158, 172, 162, 168, 165, 159, 173), weight = c(65, 50, 80, 48, 70, 52, 63, 53, 49, 75), pre_salary = c(300000, 280000, 400000, 320000, 350000, 310000, 380000, 330000, 290000, 360000), salary = c(320000, 300000, 420000, 350000, 380000, 340000, 400000, 360000, 310000, 390000), department = c("営業", "人事", "技術", "営業", "技術", "人事", "技術", "営業", "人事", "技術") ) 初心者ワークショップ SappoRo.R #12 2025.02.16 27

Slide 28

Slide 28 text

データの確認 > employees # A tibble: 10 × 9 id name gender age height weight pre_salary salary department 1 1 田中一郎 M 25 170 65 300000 320000 営業 2 2 鈴木花子 F 30 160 50 280000 300000 人事 3 3 佐藤太郎 M 45 175 80 400000 420000 技術 4 4 山田優子 F 28 158 48 320000 350000 営業 5 5 中村次郎 M 33 172 70 350000 380000 技術 6 6 高橋美咲 F 29 162 52 310000 340000 人事 7 7 伊藤健一 M 41 168 63 380000 400000 技術 8 8 渡辺春子 F 36 165 53 330000 360000 営業 9 9 小林和子 F 27 159 49 290000 310000 人事 10 10 加藤博士 M 38 173 75 360000 390000 技術 初心者ワークショップ SappoRo.R #12 2025.02.16 28

Slide 29

Slide 29 text

パイプ演算子 %>% パイプ演算子は、データの処理を順番に繋げる 左から右へ、データが流れていくイメージ コードが読みやすく、理解しやすくなる 基本的な使い方 # パイプ演算子を使わない場合 result <- sum(sqrt(abs(log(c(1:10))))) # パイプ演算子を使う場合 result <- c(1:10) %>% log() %>% abs() %>% sqrt() %>% sum() 初心者ワークショップ SappoRo.R #12 2025.02.16 29

Slide 30

Slide 30 text

データフレームでの活用例 # パイプ演算子を使わない場合 result <- select( filter( mutate(employees, bmi = weight/(height/100)^2), age >= 20 ), name, age, bmi ) print(result) # パイプ演算子を使う場合 result <- employees %>% mutate(bmi = weight/(height/100)^2) %>% filter(age >= 20) %>% select(name, age, bmi) %>% print 初心者ワークショップ SappoRo.R #12 2025.02.16 30

Slide 31

Slide 31 text

パイプ演算子を使ったデータ加工 select / filter select():列(変数)の選択 # 基本的な使い方 employees %>% select(name, age, department) # 条件による選択 employees %>% select(starts_with("pre")) # pre_salaryが選択される employees %>% select(contains("salary")) # pre_salaryとsalaryが選択される employees %>% select(ends_with("ry")) # pre_salaryとsalaryが選択される 初心者ワークショップ SappoRo.R #12 2025.02.16 31

Slide 32

Slide 32 text

filter():行(観測)の絞り込み # 基本的な使い方 employees %>% filter(age >= 30) # 複数条件 employees %>% filter(gender == "F", salary >= 350000) employees %>% filter(department == "技術" & salary > 380000) 出力例 > employees %>% filter(department == "技術" & salary > 380000) # A tibble: 3 × 9 id name gender age height weight pre_salary salary department 1 3 佐藤太郎 M 45 175 80 400000 420000 技術 2 7 伊藤健一 M 41 168 63 380000 400000 技術 3 10 加藤博士 M 38 173 75 360000 390000 技術 初心者ワークショップ SappoRo.R #12 2025.02.16 32

Slide 33

Slide 33 text

mutate 新しい列の作成・既存の列の変更 # 基本的な使い方 employees %>% mutate( bmi = weight / (height/100)^2, age_group = case_when( age < 30 ~ "若手", age < 40 ~ "中堅", TRUE ~ "ベテラン" ), salary_increase = salary - pre_salary, increase_rate = (salary - pre_salary) / pre_salary * 100 ) 初心者ワークショップ SappoRo.R #12 2025.02.16 33

Slide 34

Slide 34 text

出力 # A tibble: 10 × 13 id name gender age height weight pre_salary salary department bmi age_group 1 1 田中一郎 M 25 170 65 300000 320000 営業 22.5 若手 2 2 鈴木花子 F 30 160 50 280000 300000 人事 19.5 中堅 3 3 佐藤太郎 M 45 175 80 400000 420000 技術 26.1 ベテラン 4 4 山田優子 F 28 158 48 320000 350000 営業 19.2 若手 5 5 中村次郎 M 33 172 70 350000 380000 技術 23.7 中堅 6 6 高橋美咲 F 29 162 52 310000 340000 人事 19.8 若手 7 7 伊藤健一 M 41 168 63 380000 400000 技術 22.3 ベテラン 8 8 渡辺春子 F 36 165 53 330000 360000 営業 19.5 中堅 9 9 小林和子 F 27 159 49 290000 310000 人事 19.4 若手 10 10 加藤博士 M 38 173 75 360000 390000 技術 25.1 中堅 # ℹ 2 more variables: salary_increase , increase_rate 初心者ワークショップ SappoRo.R #12 2025.02.16 34

Slide 35

Slide 35 text

pivot_longer / pivot_wider pivot_longer:縦持ちデータへの変換 # 給与データを長形式(縦持ち)に変換 salary_long <- employees %>% select(id, name, pre_salary, salary) %>% pivot_longer( cols = c(pre_salary, salary), names_to = "salary_type", values_to = "amount" ) 初心者ワークショップ SappoRo.R #12 2025.02.16 35

Slide 36

Slide 36 text

出力: > salary_long # A tibble: 20 × 4 id name salary_type amount 1 1 田中一郎 pre_salary 300000 2 1 田中一郎 salary 320000 3 2 鈴木花子 pre_salary 280000 4 2 鈴木花子 salary 300000 5 3 佐藤太郎 pre_salary 400000 初心者ワークショップ SappoRo.R #12 2025.02.16 36

Slide 37

Slide 37 text

pivot_wider:横持ちデータへの変換 # 部署ごとの性別人数を広形式(横持ち)に変換 gender_count <- employees %>% group_by(department, gender) %>% summarise(count = n(), .groups = "drop") %>% print %>% # 途中経過表示 pivot_wider( names_from = gender, values_from = count, names_prefix = "gender_" ) # 最終結果表示 gender_count 初心者ワークショップ SappoRo.R #12 2025.02.16 37

Slide 38

Slide 38 text

途中経過 # A tibble: 4 × 3 department gender count 1 人事 F 3 2 営業 F 2 3 営業 M 1 4 技術 M 4 最終結果 # A tibble: 3 × 3 department gender_F gender_M 1 人事 3 NA 2 営業 2 1 3 技術 NA 4 初心者ワークショップ SappoRo.R #12 2025.02.16 38

Slide 39

Slide 39 text

right/left/full join データフレームの結合 # left_join:左側のデータをベースに結合 df1 %>% left_join(df2, by = "id") # right_join:右側のデータをベースに結合 df1 %>% right_join(df2, by = "id") # full_join:すべてのデータを結合 df1 %>% full_join(df2, by = "id") 初心者ワークショップ SappoRo.R #12 2025.02.16 39

Slide 40

Slide 40 text

チートシートを活用しよう Help> Cheat Sheets 初心者ワークショップ SappoRo.R #12 2025.02.16 40

Slide 41

Slide 41 text

描画 with ggplot 基本的な使い方 df %>% ggplot(aes(x = X軸,y = y軸)) + geom_XXXX() 1. データフレームをパイプで ggplot に渡す 2. aes()でキャンパス全体の設計 3. キャンパスに geom_XXXX で描画要素を置く 4. theme や labs で微調整 初心者ワークショップ SappoRo.R #12 2025.02.16 41

Slide 42

Slide 42 text

よく使うグラフの例 散布図 # 散布図(身長と体重の関係) employees %>% ggplot(aes(x = height, y = weight))+ geom_point() 初心者ワークショップ SappoRo.R #12 2025.02.16 42

Slide 43

Slide 43 text

散布図 employees %>% # gender変数ごとに色を変える ggplot(aes(x = height, y = weight, color = gender))+ geom_point() + # テーマをミニマルに theme_minimal() + # ラベルも書いてみる labs(title = "身長と体重の関係", x = "身長(cm)", y = "体重(kg)") 初心者ワークショップ SappoRo.R #12 2025.02.16 43

Slide 44

Slide 44 text

棒グラフ # 棒グラフ(部署ごとの平均給与) employees %>% group_by(department) %>% summarise(avg_salary = mean(salary)) %>% print %>% ggplot() + geom_bar(aes(x = department, y = avg_salary), stat = "identity") + theme_classic() + labs(title = "部署別平均給与", x = "部署", y = "平均給与") グラフ用にデータを加工して渡す department avg_salary 1 人事 316667. 2 営業 343333. 3 技術 397500 初心者ワークショップ SappoRo.R #12 2025.02.16 44

Slide 45

Slide 45 text

箱ひげ図 # 箱ひげ図(部署ごとの年齢分布) employees %>% ggplot(aes(x = department, y = age)) + geom_boxplot() + theme_classic() + labs(title = "部署別年齢分布", x = "部署", y = "年齢") 初心者ワークショップ SappoRo.R #12 2025.02.16 45

Slide 46

Slide 46 text

Advanced Topics 初心者ワークショップ SappoRo.R #12 2025.02.16 46

Slide 47

Slide 47 text

あなたのパッケージはどこから? CRAN (The Comprehensive R Archive Network) 公式のパッケージリポジトリ 品質管理された信頼性の高いパッケージ RStudioのPackagesタブから検索,ダウンロード もちろんコードで書いてもいい install.packages("tidyverse") 初心者ワークショップ SappoRo.R #12 2025.02.16 47

Slide 48

Slide 48 text

あなたのパッケージはどこから? GitHub 開発版や最新版のパッケージを入手可能 devtoolsパッケージを使用 最近はもうGitHubだけでいいや,というパッケージも(CRAN登録面倒だし) # devtoolsのインストール install.packages("devtools") # GitHubからのインストール devtools::install_github("tidyverse/ggplot2") devtools::install_github("username/repository") 初心者ワークショップ SappoRo.R #12 2025.02.16 48

Slide 49

Slide 49 text

RStudioとGithubの連携もいいよ Git/Githubとは Gitはバージョン管理システム。変更があったら差分をこまめにcommit! GitHubはインターネット上の保存場所(レポジトリ)とGitを合わせたシステム。 commitした変更点をレポジトリにPush! commitされた変更点をレポジトリからPull! 文系でも文書作成に利用できる便利なシステムです。卒論・修論の管理もこれで やってます。 初心者ワークショップ SappoRo.R #12 2025.02.16 49

Slide 50

Slide 50 text

RStudioとGithubの連携 初期設定 Gitのインストール RStudioでGitの設定 # Gitの設定 usethis::use_git_config( user.name = "あなたのGitHubユーザー名", user.email = "あなたのメールアドレス" ) 初心者ワークショップ SappoRo.R #12 2025.02.16 50

Slide 51

Slide 51 text

RStudioとGithubの連携 プロジェクトでのGit/GitHub利用 新規プロジェクト作成時 New Project → Version Control → Git リポジトリURLを入力 これで既存プロジェクトをGit管理下に 初心者ワークショップ SappoRo.R #12 2025.02.16 51

Slide 52

Slide 52 text

Quarto/Rmarkdown:文芸的プログラミング Rmarkdownとは Markdown書式というプレーンな文書作成文法 + チャンクと呼ばれるRコードの結 合 文書を作成(レンダリング)するときは,Rの計算を実行してその結果を文書内に反 映させる→コピペ汚染がなく,RStudioで執筆と分析が統合される。 Quartoとは 次世代のR Markdown マルチ言語対応(R, Python, Julia等) 初心者ワークショップ SappoRo.R #12 2025.02.16 52

Slide 53

Slide 53 text

Quarto/Rmarkdown:文芸的プログラミング 基本的な使い方 1. File → New FileでQuarto Document / R Markdownを選択 2. TitleやAuthorを入力,出力書式(HTML,PDF,Word)などを選ぶ画面が出ます 3. サンプル文書・コードが書いてあるファイルが生成されます これをRneder/Knitすることでファイルが出力される。簡単! 初心者ワークショップ SappoRo.R #12 2025.02.16 53

Slide 54

Slide 54 text

Quarto/Rmarkdown:文芸的プログラミング Posit社はQuartoを押していきたいみたい。Quartoはプレゼンテーションも作りや すい! Quarto用エディタとしてPositronというのもきてます。まだベータ版だけど,R環 境/Python環境が切り替えられるのもイイ。 今回のスライドもQuartoで作ってます,と言いたいところですが,Markdownから スライドを作るMarpを使ってみました。 初心者ワークショップ SappoRo.R #12 2025.02.16 54

Slide 55

Slide 55 text

PositronをつかったリモートSSH機能 VS Code/Positronが持っているリモートSSH機能も面白い。 特徴 リモートサーバ上の環境に繋げながら作業できる ローカルのエディタと同じ操作感! 大規模データの処理,計算環境の共有がやりやすい ゼミでも一台WSを持っていれば,環境問題で時間を潰す必要なし! もちろん管理コスト・技能も必要ですが・・・ 初心者ワークショップ SappoRo.R #12 2025.02.16 55

Slide 56

Slide 56 text

ShinyによるインタラクティブなWeb App library(shiny) とするだけで, server.R と ui.R の2つのファイルで構成され るアプリが作れる 生成AIと一緒に作ると,半日もしないうちに素敵なアプリが作れる俺。おーれー♪ できたアプリは shinyapps.io というサーバにアップすることができる。もちろん 自前のShiny Serverを立ててもよい。 主な活用例 データ可視化のダッシュボード インタラクティブな教材 GUIで使える統計パッケージの提供 初心者ワークショップ SappoRo.R #12 2025.02.16 56

Slide 57

Slide 57 text

Enjoy! 初心者ワークショップ SappoRo.R #12 2025.02.16 57