RとRStudio入門

オンデマンド

https://joelnitta.github.io/cross-major-project-is2/

再現性とは?

  • 他の人(将来の自分を含めて)があなたの解析を
    再度行って、同じ結果を得ることができること

  • データサイエンスにおいて、とても重要。再現性がなければ、「サイエンス」にならない!

再現可能にするには・・

  • コードが必要
    • 自分が何をやったのか、記録が残る
    • 将来、同じ解析ができる
  • コードとして残らない方法はよろしくない(エクセル、SPSSなど)

本授業では、Rを使う

  • 無料
  • データ解析の機能が豊富
  • 多様なニーズに応えるパッケージ
  • コミュニティー

RとRStudioについて

  • Rとは「R Project for Statistical Computing」という組織が提供しているオープンソースプログラミング言語

RとRStudioについて

  • Rのコードを書く・実行する最適なソフト(無料)
  • RStudioなしでもRは一応使えるけど、不便
  • この授業ではRStudioを介してRを使う。

Rのインストール

https://cloud.r-project.org/から自分のOSに合ったファイルをダウンロードして、インストール

RStudioのインストール

https://posit.co/download/rstudio-desktop/から自分のOSに合ったファイルをダウンロードして、インストール

困ったら・・

ご連絡下さい(

RStudioの使い方

  • 主に四つのパネルがある
    • Source(コードを書く)
    • Environment(今のRのセッションに入っているオブジェクトが表示される)
    • R Console(Rに直接コマンドをする)
    • Files and Plots(ファイルと図)

Rを計算機として使う

  • RStudioのコンソール(左下のパネル)にカーソルを置いて、簡単な計算をしてみましょう:
2 * 20
[1] 40

おめでとうございます!Rプログラミングができました!

オブジェクト(変数)について

  • 次に、Rの中のデータを変数(Rでは、「オブジェクト Object」と呼ぶ)として保存しよう:
age <- 2 * 20

オブジェクト(変数)について

これだけでは何も返ってこない。

変数の内容を確認するには、コンソールにその変数の名前を打てば良い:

age
[1] 40

関数とは

何かの値(インプット)を受けて、処理して、計算結果(アウトプット)を返すもの

関数とは

関数の書き方:

  • 関数名(引数)

例えば

round(3.1415, digits = 1)
[1] 3.1

関数とは

関数の使い方を確認したい時は?関数名と打って、ヘルプファイルを参照すれば良い

?round

パッケージとは

  • Rパッケージとは、Rが出来ることを大幅に増やす「追加」のソフト(関数のまとまり)
    • 現在、2万近くのパッケージがある!

パッケージのインストール

Rパッケージのインストールを行うには、install.packages()を使う:

install.packages("ggplot2")

一回インストールしたら、次回からはしなくて良いので、これはコードとして保存しない

パッケージのロード

  • パッケージをインストールしたら、使える状態するにはロードすることが必要
    • インストールは一回でいい
    • ロードは毎回必要

library()関数でロードする:

library(ggplot2)

tidyverse

  • tidyverseはデータサイエンス用パッケージの集まりのパッケージ
    • ggplot2(可視化)
    • dplyr(データの整理)
    • stringr(文字データを扱う)
    • など

これからよく使うので、インストールしましょう。一気に出来るから、楽。

install.packages("tidyverse")

install.packages()library()の違い

  • install.packages()は一回だけで良い(パソコンにパッケージをダウンロードする)

  • library()はRを使う毎にしないといけない(パッケージを今回のRのセッションで使えるようにする)

プロジェクトについて

  • スクリプトとデータを整理する必要がある

  • RStudioの「Project」機能によって、スクリプトとデータ(など)の整理ができる

新しいプロジェクトを作る

  • File ➡︎ New Project ➡︎ New Directory ➡︎ New Project をクリック
    • プロジェクト名場所を入力(今回はgreen-roofにしましょう)
    • 分かりやすい場所がおすすめ(デスクトップにしましょう)
  • 今回は”Create a git repository”をクリックしないけど、本当はgitも使った方がいい(またあとで説明します)

新しいプロジェクトを作る

  • プロジェクト名の入力が終わると、RStudioが再度立ち上がる

  • ファイルパネル(右下)をよく見てください。今はRがどこに「います」か?

新しいプロジェクトを作る

  • 右下の「ファイル」パネルを使って、dataというフォルダーを作りましょう
    • あとで、このフォルダーにこれから解析するデータを置く

.Rprojファイルについて

  • 新しいプロジェクトには、green-roof.Rprojファイルが入っている

  • .Rprojファイルの中身はは基本的に触らない

    • 中身はRStudioの設定(RStudioに任せましょう)
    • 再度プロジェクトを開く時に使う(ダブルクリック)

スクリプトについて

  • 今までは直接Rにコマンドを出していたけど、毎回そうするのは効率が良くない。

  • 作業を繰り返す場合や再現する場合はスクリプト(テキストファイル)が必要。

  • Rスクリプトの拡張は.R.r

スクリプトの作成と保存

  • 作成
    • File ➡︎ New File ➡︎ R Scriptをクリック
  • 保存
    • File ➡︎ Save As...をクリックかファイルのアイコンをクリック。
  • スクリプトの名前はなるべくローマ字を使うように(あとあと公開する時のため)

スクリプトからコードを使う

以下のコードをスクリプトに書いて、script.Rとしてデスクトップに保存しましょう(コードの詳細はまた後で学ぶ)。

library(tidyverse)

ggplot(diamonds, aes(x = carat, y = price)) + 
  geom_hex()

スクリプトからコードを使う

  • カーソルが現在位置している行をコンソールに送る:Ctrl(あるいは) + Enter

  • 今開いているスクリプトの行を全てコンソールに送る:Ctrl(あるいは) + Shift+ Enter

RStudioによる警告

スクリプトに間違いが入っている場合、RStudioはそれを教えてくれる(バツマークと赤い線):

プロジェクトにスクリプトを置きましょう

以下のコードを書いて、スクリプトをdiamonds.Rとしてgreen-roofプロジェクトに保存して、実行しましょう:

library(tidyverse)

ggplot(diamonds, aes(x = carat, y = price)) + 
  geom_hex()

ggsave("diamonds.png")

このスクリプトは何をするのでしょうか?

コードによる再現性

  • diamonds.Rdiamonds.pngというグラフを作る。
  • diamonds.pngを消しましょう。
  • 解析結果が消えてしまった!どうしよう!?

コードによる再現性

  • ご心配なく!
    • 再度diamonds.Rを実行してください(Ctrl(あるいは) + Shift+ Enter
  • 全く同じグラフが再度できた!つまり、再現しました。
  • コードとデータがあれば、解析結果はいつでも再現できる
  • 絶対に必要なのは、コードデータ。結果は「使い捨て」と考えて良い。

データの読み込み

  • まずは練習としてからグーグドライブからstudents.csvをダウンロードして、data/に置きましょう。

  • .csvcomma separated valuesの略です

    • エクセルで扱うようなデータ形式(エクセルでも開くことができる)
    • .xslxとの違いは、.csvはそのままどのテキストエディターでも開ける(エクセルがいらない)

データの読み込み

  • read_csv()関数で読み込む

まずは、読み込んでから直接に中身を見てみましょう:

read_csv("data/students.csv")
# A tibble: 6 × 5
  `Student ID` `Full Name`      favourite.food     mealPlan            AGE  
         <dbl> <chr>            <chr>              <chr>               <chr>
1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
2            2 Barclay Lynn     French fries       Lunch only          5    
3            3 Jayendra Lyne    N/A                Breakfast and lunch 7    
4            4 Leon Rossini     Anchovies          Lunch only          <NA> 
5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
6            6 Güvenç Attila    Ice cream          Lunch only          6    

読み込んだデータの保存

  • でも、これだけではRの環境にそのデータが入っていません

  • 変数(オブジェクト)として保存する必要がある:

students <- read_csv("data/students.csv")
  • このようにRに読み込んだデータをデータフレーム(“dataframe”)、あるいは「tibble」と呼ぶ
    • 2次元データ。エクセルのデータシートみたいな物。

読み込んだデータの中身の確認(1)

  • 変数として保存する時は中身が見えない(オブジェクトに渡された)

  • 中身を見たい時は変数名を直接コンソールに入力すればいい

students
# A tibble: 6 × 5
  `Student ID` `Full Name`      favourite.food     mealPlan            AGE  
         <dbl> <chr>            <chr>              <chr>               <chr>
1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
2            2 Barclay Lynn     French fries       Lunch only          5    
3            3 Jayendra Lyne    N/A                Breakfast and lunch 7    
4            4 Leon Rossini     Anchovies          Lunch only          <NA> 
5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
6            6 Güvenç Attila    Ice cream          Lunch only          6    

コンソールの使い方(使うとき)

  • このような時に使う:データの中身を確認したい、ヘルプファイルを開きたい、など。

  • つまり、データ解析に必要ではない(関係のない)コマンド。

読み込んだデータの中身の確認(2)

  • もう一つのデータの確認の仕方がある:「Environment」パネルでそのオブジェクトをクリック

  • すると、エクセルのようなレイアウトになる

    • エクセルと大きな違い:直接にデータをいじることができない!
  • エクセルはデータ入力に使う。Rはデータ解析に使う

データの種類(型)について

  • studentsをコンソール(左下のパネル)でもう一回打ってみてください

  • データの上に<dbl>とか<chr>とかと出ているけど、これは何でしょうか?

  • A: データの種類です

データの種類(型)について

  • dbl: 数字(“double”の略。なぜ”double”でしょう・・)
  • chr: 文字(“character”の略。この方がしっくり来るね)

このほかに、

  • lgl:ロジカル(TRUEFALSEか、そのどっちか)
  • int:整数(“integer”の略)

がある

ベクトルについて

  • ベクトル(vector)とは、同じ型を持つ一連のデータの集まり(一次元の配列)

  • ベクトルに含まれている一つ一つのデータを要素(element)という

  • 例えば、letters

    • "a"lettersの1個目の要素

ベクトルの作り方

  • ベクトルを関数はc()
    • “combine”(「くっつける」)の略
c(1, 2, 3)
[1] 1 2 3

ベクトルの作り方

  • 文字列(文字でできているベクトル)を作るときは、引用符をつけないといけない
c("a", "b", "c")
[1] "a" "b" "c"

ベクトルの型の確認

  • typeof()関数でベクトルの型を確認することができる
typeof(letters)
[1] "character"

チャレンジ

  • 以下のコードでベクトルを作ると、そのベクトルの型は何でしょうか?
c(1, 2, "c")

ベクトル変換

  • 先も言いましたが、あるベクトルの要素は全て同じ型を持たないといけない

  • なので、入力が複数の型を含む場合、Rはそれを同じ型に合わせる

x <- c(1, 2, "c")
typeof(x)
[1] "character"
  • 先のベクトルは文字に変換された

ベクトル型とデータフレーム

  • データフレームの列は、本当はベクトルになっている

  • なので、データフレームの列はそれぞれ、型が決まっている

    • これはエクセルと大きな違い

まとめ

  • スクリプト(.Rファイル)に解析に必要なコードを書く

  • スクリプトとデータがあれば、解析結果を再現できる

  • プロジェクトを使うと、解析の管理が大幅にやりやすくなる

  • データフレームはベクトルからなっている

  • ベクトルは一つの型しか持てない

データの可視化

https://joelnitta.github.io/cross-major-project-is2/

生データ

  • グーグルドライブから「2025とりまとめ」データを屋上はらっぱ植生調査 - 2025 とりまとめ.csvとしてダウンロードして、data/に置いて下さい(生データ)

  • 「生データ」とは収集された元のデータであり、読み込み専用で扱う。

    • データの整合性を保持し、誤改変を防ぐためである。
  • コード以外のツールで編集すると、変更履歴が残らず、データの再現性や透明性が損なわれる。

tidyなデータ

  • 各列が変数を表している
  • 各行が観察を表している
  • 各セルが一つの値を表している

tidyなデータ

  • 前回に読み込んだstudents.csvはtidyなデータ:
# A tibble: 6 × 5
  `Student ID` `Full Name`      favourite.food     mealPlan            AGE  
         <dbl> <chr>            <chr>              <chr>               <chr>
1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
2            2 Barclay Lynn     French fries       Lunch only          5    
3            3 Jayendra Lyne    N/A                Breakfast and lunch 7    
4            4 Leon Rossini     Anchovies          Lunch only          <NA> 
5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
6            6 Güvenç Attila    Ice cream          Lunch only          6    

データの読み込み

  • 必要なパッケージをロードする

  • このコードをroof-survey.Rとして保存

roof-survey.R
library(tidyverse)
library(ggthemes) # プロットの色合いの設定に使う

データの読み込み

read_csv("data/屋上はらっぱ植生調査 - 2025 とりまとめ.csv")
# A tibble: 76 × 6
   A区画           `大野、中野`     ...3     ...4  ...5  ...6  
   <chr>           <chr>            <chr>    <chr> <chr> <chr> 
 1 2025/4/17       <NA>             <NA>     <NA>  <NA>  <NA>  
 2 区画(A-1など) 和名             ラテン名 被度  群度  個体数
 3 <NA>            <NA>             <NA>     <NA>  <NA>  <NA>  
 4 A-1             ノビル           <NA>     1     1     1     
 5 A-1             ヘラオオバコ     <NA>     1     2     4     
 6 A-1             マルバヤハズソウ <NA>     2     4     100   
 7 <NA>            <NA>             <NA>     <NA>  <NA>  <NA>  
 8 A-2             ノビル           <NA>     2     2     2     
 9 A-2             マルバヤハズソウ <NA>     2     3     100   
10 A-2             ノゲシ           <NA>     1     1     1     
# ℹ 66 more rows

うまく行かない(全然tidyじゃない)

データクレンジング

  • 生データをtidy(解析可能)なデータに整える必要があるけど、今は説明する時間がないので、私が用意したスクリプト(.Rファイル)を使う。

  • data_cleaning_2025.Rダウンロードして、このプロジェクトに保存してください。

  • data_cleaning_2025.Rを開いて、実行すると、data/okujo_2025.csvが出力される

  • data/okujo_2025.csvを読み込む

roof-survey.R
library(tidyverse)
library(ggthemes) # プロットの色合いの設定に使う

okujo <- read_csv("data/okujo_2025.csv")

これでデータの解析(可視化)ができる状態になった。

ggplot2について

  • Rには備え付けの関数、plot()があるが、今回はtidyverseggplot2パッケージを使う

  • gg = “Grammar of Graphics”(画像の文法)

    • 「文法」が分かれば、(ほとんど)
      どんな図でも作れる

参考情報

ggplot2について

図の構造にはいくつか決まった要素がある

  • geometry: 図はどのようなにする?

  • aesthetics: データをどのように図に表す

Geometry

Pie chart

drawing

Bar graph

drawing

Aesthetics

drawing

目的:このグラフを作る

ggplot()でグラフの基盤を作る

ggplot(data = okujo)

mapping()で座標を指定する

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover
  )
)

mapping()で座標を指定する

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover
  )
)

geom_()でデータの形を指定する

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover
  )
) +
  geom_boxplot()

geom_()でデータの形を指定する

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover
  )
) +
  geom_boxplot()

チャレンジ

name_enを横軸、coverを縦軸にして、箱ひげ図を作成して下さい

colorで色を潰す

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot()

colorで色を潰す

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot()

平均だけを見せるのでいい?

  • グラフを作る際、平均だけを見せても大丈夫でしょうか?議論して下さい。

平均だけでは足りない

生データを付け加える

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot() +
  geom_point()

生データを付け加える

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot() +
  geom_point()

点が重なってしまう問題

  • 英語で「overplotting」という

  • 解決策:グループ内で適当にばらける

    • geom_jitter()
    • jitter = 「揺らぐ」、「ばらつく」

点が重なってしまう問題をgeom_jitter()で解決

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot() +
  geom_jitter()

点が重なってしまう問題をgeom_jitter()で解決

ggplot(
  data = okujo,
  mapping = aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot() +
  geom_jitter()

よりもコンパクトな書き方

data =mapping =を書かなくて良い

ggplot(
  okujo,
  aes(
    x = plot,
    y = cover,
    color = plot
  )
) +
  geom_boxplot() +
  geom_jitter()

labs()でラベルをきれいにする

ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  )

labs()でラベルをきれいにする

ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  )

scale_で色を調整する

  • 色覚異常の方に配慮したデザインを心がけよう
ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  ) +
  scale_color_colorblind()

scale_で色を調整する

  • 色覚異常の方に配慮したデザインを心がけよう
ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  ) +
  scale_color_colorblind()

凡例を隠す

  • プロットは文字と位置で分かるから、色の説明はいらない

  • theme()でグラフ全体の見た目(スタイル)を調整する

theme()で凡例を隠す

ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  ) +
  scale_color_colorblind() +
  theme(legend.position = "none")

theme()で凡例を隠す

ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "Plant cover in roof-top green spaces",
    y = "Cover",
    x = "Plot",
    color = "Plot"
  ) +
  scale_color_colorblind() +
  theme(legend.position = "none")

できました!

おまけ①:base_familyで文字化けを防ぐ

ggplot(
  okujo,
  aes(x = plot, y = cover, color = plot)
) +
  geom_boxplot() +
  geom_jitter() +
  labs(
    title = "屋上緑地における植物の被度",
    y = "被度",
    x = "プロット",
    color = "プロット"
  ) +
  scale_color_colorblind() +
  theme_gray(base_family = "HiraKakuPro-W3") +
  theme(legend.position = "none")

おまけ②:ggsave()でグラフを保存する

ggsave("okujo.png")