牧野研以外の実習・研究でも使える知識・技術。
(研究じゃない場面でも役に立つはず。)
つまり、
生のままでは複雑過ぎ、情報多すぎ、何もわからない。
print(ggplot2::diamonds)
      carat       cut color clarity depth table price    x    y    z
    1  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
    2  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
    3  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
    4  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
   --                                                               
53937  0.72      Good     D     SI1  63.1    55  2757 5.69 5.75 3.61
53938  0.70 Very Good     D     SI1  62.8    60  2757 5.66 5.68 3.56
53939  0.86   Premium     H     SI2  61.0    58  2757 6.15 6.12 3.74
53940  0.75     Ideal     D     SI2  62.2    55  2757 5.83 5.87 3.64
ダイヤモンド53,940個について10項目の値を持つデータセット
各列の平均とか標準偏差とか:
  stat carat depth table    price
1 mean  0.80 61.75 57.46  3932.80
2   sd  0.47  1.43  2.23  3989.44
3  max  5.01 79.00 95.00 18823.00
4  min  0.20 43.00 43.00   326.00
大きさ carat と価格 price の相関係数はかなり高い:
      carat depth table price
carat  1.00                  
depth  0.03  1.00            
table  0.18 -0.30  1.00      
price  0.92 -0.01  0.13  1.00
生のままよりは把握しやすいかも。
しかし要注意……
 
 
情報をうまく絞って整理 → 直感的にわかる

carat が大きいほど price も高いらしい。
その度合いは clarity によって異なるらしい。
データをうまくまとめ、それに基づいて推論するための手法。
「グラフを眺めてなんとなく分かる」以上の分析にはモデルが必要
対象システムを単純化・理想化して扱いやすくしたもの



データ生成をうまく真似できそうな仮定の数式表現。
データ生成をうまく真似できそうな仮定の数式表現。
e.g., 大きいほど高く売れる: $\text{price} = A \times \text{carat} + B + \epsilon$

ダイヤモンドの価格はこういう数式でおよそ表せる、という理解
→ モデルをさらに改良していき、理解の精度を上げられるかも
対象システムを単純化・理想化して扱いやすくしたもの
→ 自然ではありえない状況にしてでも、見たい関係を見る
→ 「Xを変えればYが変わる」という還元的な理解の1ステップ
ドライの理論研究者を指して「モデル屋」と呼びがちだが、
広い意味では生物学者みんな「モデル屋」。
 
先人たちの積み重ねに基づいて、新しい発見をする
Reproducible Research (再現可能な研究) が巨人を大きくする。
動物園の混合展示で、各種動物はどのように分布・行動しているか、
それらを決める要因は何か。膨大な観察データに基づく超大作卒論。
 
週に1回、各個体の位置と行動を種ごとのファイルに記録。
タブは個体、A列B列はXY座標でそれ以降の列は行動、各行はある時刻。
 
 
ちゃんと合ってるのかな… ファイルもタブもたくさん…
 
 
ちゃんと合ってるのかな… ファイルもタブもたくさん…
 
 
 
 
泣きながら何十枚も…。無料期間が終わって今は使えない…。
 
 
 
 
 
先の例に負けず生データはどっさり。でも頑張るのは機械。
 
 
 
 

 
 
 
 
 
 
統計解析と作図の機能が充実したプログラミング言語・環境
✅ Rはデータ解析に便利なプログラミング言語・環境
⬜ R環境のセットアップ
⬜ Rとの対話
⬜ 「プロジェクト」と「スクリプト」を作る
⬜ 基本的な型と演算
⬜ Rパッケージ
⬜ 疑問・エラーの解決方法
| Action | ||
|---|---|---|
| Switch apps | commandtab | alttab | 
| Quit apps | commandq | altF4 | 
| Spotlight | commandspace | |
| Cut, Copy, Paste | commandx, -c, -v | ctrlx, -c, -v | 
| Select all | commanda | ctrla | 
| Undo | commandz | ctrlz | 
| Find | commandf | ctrlf | 
| Save | commands | ctrls | 
 
次のコードをコピーして、左下のConsoleにペースト return
student_id = "C3SB0000"   # 自分のIDに書き換えてください
source("https://example.com/sice/report.R")
Hello, C3SB0000.
のような返事が返ってきていればOK。
なんらかのエラーが出た人は申し出てください。
余裕があれば update.packages() を実行して更新。
Workspace (Environment) = 一時オブジェクトの集まり
 
“Restore …” のチェックを外して、 “Save …” のNeverを選択
 
File → New Project… → New Directory → New Project →
→ Directory name: r-training-2025
→ as subdirectory of: ~/project or C:/Users/yourname/project

📁 ディレクトリ = フォルダ。 ~/ = ホームディレクトリ
File → New File → R script
 
File → New File → R script
 
Select text with shift←↓↑→
Execute them with ctrlreturn
 
hello.R🔰 いろんな四則演算を試して hello.R に保存してみよう。
e.g., 1 + 2 + 3, 3 * 7 * 2, 4 / 2, 4 / 3, etc.
スクリプト、データ、結果を分けて整理する例:
r-training-2025/           # プロジェクトの最上階
├── r-training-2025.Rproj  # これダブルクリックでRStudioを起動
├── hello.R
├── transform.R            # データ整理・変形のスクリプト
├── visualize.R            # 作図のスクリプト
├── data/                  # 元データを置くところ
│   ├── iris.tsv
│   └── diamonds.xlsx
└── output/                # 結果の出力先
    ├── iris-petal.png
    └── iris-summary.tsv
プロジェクト最上階を作業ディレクトリとし、
ファイル読み書きの基準にする。(後で詳しく)
ほんの一例です。好きな構造に決めてください。
getwd()*.Rproj ダブルクリックでRStudioを開けば、いい位置で作業再開。 
 
とにかく手を動かして体感しよう!
head(iris)
Error や Warning があったらよく読んで対処する。疑問・困りごとがある場合は気軽に割り込んでください。
ChatGPTなどAIの利用については後日説明します。
端的に言うと「使っても構わないけど、本実習では使わないほうが得策」
x = 2        # Create x
x            # What's in x?
[1] 2
y = 5        # Create y
y            # What's in y?
[1] 5
Rでは代入演算子として矢印 <- も使えるけど私は = 推奨。
# 記号より右はRに無視される。コメントを書くのに便利。
x + y
[1] 7
🔰 x と y の引き算、掛け算、割り算をやってみよう
+ とか * のような演算子(operator)を変数の間に置く。
10 + 3    # addition
10 - 3    # subtraction
10 * 3    # multiplication
10 / 3    # division
10 %/% 3  # integer division
10 %% 3   # modulus 剰余
10 ** 3   # exponent 10^3
🔰 コピペして結果を確認してみよう。
変数を受け取って、何か仕事して、返す命令セット
x = seq(1, 3)  # 1と3を渡すとvectorが返ってくる
x
[1] 1 2 3
sum(x)         # vectorを渡すと足し算が返ってくる
[1] 6
square = function(something) {  # 自分の関数を定義
  something ** 2
}
square(x)                       # 使ってみる
[1] 1 4 9
🔰 自分の関数を何か作ってみよう。
e.g., 2倍にする関数 twice
x = 42       # Create x
x            # What's in x?
[1] 42
y = "24601"  # Create y
y            # What's in y?
[1] "24601"
この x と y を足そうとするとエラーになる。なぜ?
x + y        # Error! Why?
Error in x + y: non-numeric argument to binary operator
class(x)
[1] "numeric"
is.numeric(x)
[1] TRUE
is.character(x)
[1] FALSE
as.character(x)
[1] "42"
🔰 さっき作った y にも同じ関数を適用してみよう。
vector: 基本型。一次元の配列。
logical: 論理値 (TRUE or FALSE)numeric: 数値 (整数 42L or 実数 3.1416)character: 文字列 ("a string")factor: 因子 (文字列っぽいけど微妙に違う)array: 多次元配列。vector同様、全要素が同じ型。
matrix: 行列 = 二次元の配列。list: 異なる型でも詰め込める太っ腹ベクトル。data.frame: 同じ長さのベクトルを並べた長方形のテーブル。重要。 tibble とか tbl_df と呼ばれる亜種もあるけどほぼ同じ。1個の値でもベクトル扱い。
同じ長さ(または長さ1)の相手との計算が得意。
x = c(1, 2, 9)  # 長さ3の数値ベクトル
x + x           # 同じ長さ同士の計算
[1]  2  4 18
y = 10          # 長さ1の数値ベクトル
x + y           # 長さ3 + 長さ1 = 長さ3 (それぞれ足し算)
[1] 11 12 19
x < 5           # 5より小さいか
[1]  TRUE  TRUE FALSE
🔰 この x, y を使っていろいろな演算を試してみよう
[] を使う。番号は1から始まる。
letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
letters[3]
[1] "c"
letters[seq(4, 6)]       # 4 5 6
[1] "d" "e" "f"
letters[seq(1, 26) < 4]  # TRUE TRUE TRUE FALSE FALSE ...
[1] "a" "b" "c"
各要素に適用するもの:
x = c(1, 2, 9)
y = sqrt(x)     # square root
y
[1] 1.000000 1.414214 3.000000
全要素を集約した値を返すもの:
z = sum(x)
z
[1] 12
🔰 log(), exp(), length(), max(), mean()
にvectorを渡してみよう。
1本のvectorを折り曲げて長方形にしたもの。
中身は全て同じ型。機械学習とか画像処理とかで使う。
v = seq(1, 8)              # c(1, 2, 3, 4, 5, 6, 7, 8)
x = matrix(v, nrow = 2)    # 2行に畳む。列ごとに詰める
x
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
y = matrix(v, nrow = 2, byrow = TRUE)  # 行ごとに詰める
y
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
🔰 結果を確認してみよう: x + y, dim(x), nrow(x), ncol(x).
同じ長さの列vectorを複数束ねた長方形の表。
e.g., 長さ150の数値ベクトル4本と因子ベクトル1本:
print(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1          5.1         3.5          1.4         0.2    setosa
  2          4.9         3.0          1.4         0.2    setosa
  3          4.7         3.2          1.3         0.2    setosa
  4          4.6         3.1          1.5         0.2    setosa
 --                                                            
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
iris はアヤメ属3種150個体に関する測定データ。
Rに最初から入ってて、例としてよく使われる。
概要を掴む:
head(iris, 6)   # 先頭だけ見てみる。末尾は tail()
nrow(iris)      # 行数: Number of ROWs
ncol(iris)      # 列数: Number of COLumns
names(iris)     # 列名
summary(iris)   # 要約
View(iris)      # RStudioで閲覧
str(iris)       # 構造が分かる形で表示
tibble [150 × 5] (S3: tbl_df/tbl/data.frame)
 $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
ほかのデータもいろいろ見てみよう。
e.g., mtcars, quakes, data()
部分的なdata.frameを取得する:
iris[2, ]                  # 2行目
iris[2:5, ]                # 2行目から5行目まで
iris[, 3:4]                # 3-4列目
iris[2:5, 3:4]             # 2-5行目, 3-4列目
1列をvectorとして取得する:
iris[[3]]                  # 3列目
iris$Petal.Length          # Petal.Length列
iris[["Petal.Length"]]     # Petal.Length列
iris[["Petal.Length"]][2]  # Petal.Length列の2番目
結果がdata.frameになるかvectorになるか曖昧で危険、非推奨:
iris[, 3]                  # 3列目
iris[, "Petal.Length"]     # Petal.Length列
iris[2, "Petal.Length"]    # 2行目Petal.Length列
同じ長さの 列(column) vector を結合して作る:
x = c(1, 2, 3)
y = c("A", "B", "C")
mydata = data.frame(x, y)
print(mydata)
  x y
1 1 A
2 2 B
3 3 C
🔰 次のようなdata.frameを作って theDF と名付けよう:
 i s
24 x
25 y
26 z
ヒント: c() 無しでクリアすることも可能。
Rには read.csv() とか write.csv() が標準装備されてるけど非推奨:
write.csv(iris, "iris.csv")
"","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species"
"1",5.1,3.5,1.4,0.2,"setosa"
"2",4.9,3,1.4,0.2,"setosa"
"3",4.7,3.2,1.3,0.2,"setosa"
 
なんか左端の列とか “引用符” が勝手に作られ、不便で危険。
readr というパッケージを使えばそういう悩みから解放される。
readr::write_csv(iris, "iris.csv")
Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
便利な関数やデータセットなどをひとまとめにしたもの。
install.packages("readr")  # 一度やればOK
library(readr)             # 読み込みはRを起動するたびに必要
update.packages()          # たまには更新しよう
 
# install.packages("tidyverse") # 済んでるはず
library(conflicted) # 安全のおまじない
library(tidyverse)  # 一挙に読み込み
── Attaching core tidyverse packages ──── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
一貫したデザインでデータ解析の様々な工程をカバー
 
No such file or directorystr(iris), attributes(iris)?sum, help.start()✅ Rはデータ解析に便利なプログラミング言語・環境
✅ プロジェクトを使ってファイルを管理
✅ スクリプトを書いてからコンソールで実行
✅ 変数には型がある: 数値、文字列、データフレームなど
✅ 便利なパッケージを使っていく
✅ 疑問・エラーの解決方法
個々の方法は覚えなくても大丈夫!
忘れては調べ、を何度も繰り返しながら染み込ませていこう。
 
| 時間 | 4/08 Tue | 4/09 Wed | 4/10 Thu | 4/14 Mon | 4/15 Tue | 
|---|---|---|---|---|---|
| 13:00 | 導入 | 構造処理1 | 内容処理 | 統計モデル1 | 発表会 | 
| 14:40 | 可視化 | 構造処理2 | 入力・解釈 | 統計モデル2 | 発表会 | 
| 16:20 | 練習問題 | 練習問題 | 練習問題 | 練習問題 | 予備 |