初心者向けR Studioの使い方

Rを用いて学ぶ量的テキスト分析講習会

苅谷千尋

金沢大学

November 2, 2025

0. 実行環境と自己紹介

実行環境

  • R version 4.5.1 (2025-06-13),
    • nickname: Great Square Root 1 2
  • R Studio 2025.09.2+418
    • release name: ucumberleaf Sunflower
  • Platform aarch64, darwin20
  • Running under: macOS Tahoe 26.1

自己紹介

  • 氏名:苅谷千尋(かりやちひろ)
  • 所属:金沢大学 教育支援センター
    • 主担当業務:高大接続コア・センター業務
  • 専門:政治学 > 政治思想史(イギリス)
    • 18世紀イギリスの議会政治と議会ジャーナリズム
    • レトリックの受容史:キケロ;サルスティウス;タキトゥス
  • Webサイト

自己紹介:レトリックの受容史

プルタルコス

民衆が演説をどう受け止めるかに関心を持たない者は、すなわち寡頭制を支持する者、説得よりも暴力に頼ろうとする者である。

タキトゥス

今昔を比較して暇を潰す老人らは、つぎのことに気がついた。国家を統治した歴代の元首のうちで、他人の雄弁術を必要としたのは、ネロが最初であると。

自己紹介:レトリックの受容史 / 議会ジャーナリズム

サミュエル・ジョンソン(The Gentleman’s Magazine)

最後に演説された貴族議員〔Hurgo院Heryef卿〕はあまりに偉大な雄弁の達人です。その巧みさゆえに、人は、彼の言葉を聞くに当たって、喜びから自然に生まれるあらゆる注意力を向けることがありません。聴き手の心には、部分的な表現や巧みな推論に惑わされるのではないか、という恐れから不安が生じるものです。しかし、彼はこのようなあらゆる不安を生じさせないほどに恐ろしい、理路整然と論じられる人(reasoner)なのです。諸君、私が常に恐れているのは、この貴族議員の想像力が与える装飾(ornaments)のなかで、誤謬が真実であるかのように見えすぎてしまうことなのです。そしてまた、理性の光によって導かれる自分自身を想像しながらも、その詭弁(sophitry)が私の知性(understanding)を惑わすことなのです。諸君、そこで私は、彼の装飾を再検討し、それが真実の力によるものなのか、それとも雄弁によるものなのか、私は試してみようと思う。

自己紹介:レトリックの受容史 / 議会ジャーナリズム

エドマンド・バーク

ある古代の著述家(プルタルコスだと思う)は、「聴衆の心に刺を刺した唯一の雄弁家」と呼ばれるペリクレスの雄弁について、幾つか詩を引用している。ペリクレスと同様に、この声明の雄弁さは、真の人間性(humanity)の感性と矛盾せず、むしろ感性を強化するものであり、私の心には皮膚以上に深く刺さった刺が残っている。この刺は、殺人者が外科であらゆる手を尽くして取り除こうとしても取り除くことはできず、また、この刺が生み出した胸の高鳴りは、強奪や没収という皮膚を和らげる湿布薬をもってしても和らげることはできない。私はこの〔革命フランス〕共和国を愛すことができない

Ⅰ. この講習会で学べること / 学べないこと

この講習会で学べること / 学べないこと

学べること

  • Rの何がよいのか、Rで何ができるかの理解
  • Rの基本操作の習得(基本編;実践編)
  • Rの応用操作の見通し(発展編)

学べないこと

  • データの形を整える操作(前処理)の詳細
  • ggplotで作図した図の見た目(文字の大きさなど)を細かく変える方法
  • 専門性の高いパッケージ
  • 専門性の高い分析手法(回帰分析の発展的手法、パス解析、因子分析、多重指標モデルなど)

Ⅱ. Rの基礎概念

基礎:なぜRなのか / なぜQuartoなのか

1. コード(スクリプト)

  • 再現可能性
    • コードはすべての手順が残る
      • 真似しやすい / 生成AIと親和性が高い / ミスも再現できる / 共同作業・共同研究しやすい
    • Cf. マウス操作(GUI)中心:Microsoft Excel; SPSS; GraphPad Prism; KH Coder
  • 作業の効率化
    • 一度作ったコード(データ処理)を別のデータでも使い回せる
  • 安全性
    • 元データ(ファイル)を加工しない
    • Rが、メモリ上にデータを保持し、そのコピーを操作する

基礎:なぜRなのか / なぜQuartoなのか

2. R言語の特性

  • R:統計解析・データ分析に特化して開発された言語、構文
    • Cf. Python:機械学習・AI・Web系のライブラリに強みあり

3. 豊富な可視化ツール

4. オープンソースと親切なコミュニティ

基礎:なぜRなのか / なぜQuartoなのか

5. 簡易的な記述法(Quarto)

要素 Markdown構文
見出し # H1
## H2
H1 見出し
H2 見出し
太字 **bold text** bold text
イタリック *italicized text* italicized text
引用 > blockquote > blockquote
リンク [金沢大学](https://www.kanazawa-u.ac.jp) 金沢大学
画像 ![alt text](img/logo_金沢大学.jpg) alt text

色や文字の大きさは、別途、CSSファイルを用意して、変更する必要があります

基礎:なぜRなのか / なぜQuartoなのか

6. レポーティング機能と多様な出力形態(Quarto)

  • Rは単なる分析ツールではなく、結果をそのままレポートやスライドとしてまとめるレポーティング機能を備える
  • 出力形式は多様であり、YAML(ヤムル・後述)の設定を少し変えるだけ

7. 無料

基礎:Rの構造

graph BT
    A(["<strong>base R</strong>
Rの基本構文・関数
例: mean(), sum(), if"]) --> 
    B(["<strong>modern R</strong>
便利な文法・スタイル
例: |> パイプ, tibble, dplyr 文法,<br> ggplot2 文法"]) --> 
    C(["<strong>Packages</strong>
Rに追加するツール集
例: tidyverse, ggplot2,<br>readr, shiny"])


%% ノードのスタイル
style A text-align:center
style B text-align:center
style A text-align:center, fill:#FFD700,stroke:#333,stroke-width:1px,font-weight:bold;
style B text-align:center, fill:#87CEFA,stroke:#333,stroke-width:1px,font-weight:bold;
style C text-align:center, fill:#90EE90,stroke:#333,stroke-width:1px,font-weight:bold;

  • Packages
    • 目的別に追加するツール:家具や家電
  • modern R:tidyな(整然とした)R:
  • base R:統計学者が1990年代に開発(S言語を継承)
    • R言語そのもの:家の基礎部分

基礎:Rの手順

flowchart TB
    Start([YAML設定(ドキュメントの設定):<br> タイトル、出力形式、テーマなど]) --> B[データの読み込み・前処理:<br> dplyr / tidyr
    <br>(フィルタリング / 新列作成・計算<br>/ 縦持ち・横持ち変換 / 欠損値処理)]
    B --> C1[データの概要と可視化:<br> skim, gt_summary / ggplot2]
    B --> C2[統計分析・モデル構築:<br> lm, glm, 因果推論]
    C1 --> D[結果の評価・解釈:<br> broom, modelsummary, performance]
    C2 --> D
    D --> End([レポート作成(レンダー):<br> knitr / rmarkdown<br>(pdf; reveal.js; webpage; docx; pptx; pdf)])

    %% 色付け
    style Start fill:#a2d4f1,stroke:#333,stroke-width:2px
    style End fill:#f1d4a2,stroke:#333,stroke-width:2px
    style C1 fill:#d4f1a2,stroke:#333,stroke-width:1px
    style C2 fill:#f1a2d4,stroke:#333,stroke-width:1px
    

基礎:整然データと雑然データ

整然(tidy)データ

  1. 各変数は独立した列で表現される
  2. 観測した値は1行に記録される
  3. 観測データの集合はテーブルを表現する

Wickham et al. (2023), Data tidying

雑然(messy)データ

  • 左の定義に合わないデータ
    • 例:次のページのような横持ちデータ
  • 不要な空白行や結合セルからなる表

基礎:整然データと雑然データ

整然とした縦持ちデータ

地域 曜日 天気
東京 月曜 晴れ
東京 火曜 曇り
東京 水曜
大阪 月曜 曇り
大阪 火曜 晴れ
大阪 水曜 晴れ

「地域」「曜日」「天気」がそれぞれ1つの変数として1列にまとまっており、1行が1つの観測になっている(tidyのルールを満たす)

雑然とした横持ちデータ

地域 月曜 火曜 水曜
東京 晴れ 曇り
大阪 曇り 晴れ 晴れ

人間には見慣れた表(行と列の交差点(セル)に意味があることを直感的に認識できるから)だが、曜日が複数列に分かれているため「1列=1変数」というtidyのルールに合わない。値が晴れ、曇りなどの天気である以上、カラム名(変数)は天気であるべき。このようなデータフレームでは、集計、プロットすることが難しい

カラム名は列に含まれる値全体を説明するものであるべき(カテゴリカルな名詞)

基礎:整然データと雑然データ

  • コンピュータが理解できるデータ形式は、1行目がカラム名、2行目以降が値になっているものです
    • Rでは、この「カラム(列)」の中身をベクトル(値の並び)として扱います
  • Rなどのプログラム系の統計ソフトでは、操作や分析の対象を「カラム名」で指定します。この「カラム」は、統計学の文脈では「変数」と呼ばれます
    • 人間には判読できることがコンピュータにはできません
    • 例えば一つのデータに同じカラム名があると動かない、もしくは強制的にカラム名が変更(メモリ上。元ファイルはそのまま)されます

Ⅲ. R環境の整備

準備:R StudioとQuartoファイル

R Studio

  • Rを効率的に使うための統合開発環境(IDE)
    • 「コードを書く・実行する・結果を見る」ための道具
    • Cf. R 本体:「計算・統計処理」を行う(R Studioを起動すれば、内部でRが自動的に動く)
    • posit社のアプリ(今日のR開発を牽引)
    • Pythonとの共存を目指すPositron(Microsoft VS Codeに類似したインターフェイス)の開発が進行中

準備:R StudioとQuartoファイル

Quartoファイル

  • Quarto / 拡張子qmd
  • コード(R Chunk)と文章(Markdown)をひとつのファイルにまとめて書き、実行結果つきのレポートやスライドを自動で作成できる
    • YAMLのformatを書き換えるだけで多様な出力が可能
      • HTML, PDF, Reveal.js, docx, pptx など
    • R Markdown(拡張子Rmd)の拡張版
    • posit社が開発したファイル形式

準備:インストール

  • 13のステップに分けて説明します

1. R本体をインストール

  • ブラウザからRにアクセス
  • 手持ちのPCに適したファイルをダウンロードして、実行
    • Windows / macOS / Linux

2. R Studioをインストール

  • ブラウザからR Studioにアクセス
  • 手持ちのPCに適したファイルをダウンロード、実行
    • Windows / macOS / Ubuntu

準備:ファイルの作成

3. この講習会用のフォルダ作成(OSで操作)

ファイル名は念のため英数のみとし、また空白文字を使わないで下さい

4. プロジェクトの作成(R Studioで操作、以後同じ)

  • メニュー > File > New Project > Existing Directory > 3で作成した フォルダを指定 > Create Project

Rprojファイル

  • Rprojファイルは、RStudioプロジェクトを管理するための設定ファイルで、作業ディレクトリや環境設定、ファイルの表示状態などを保存する
  • プロジェクトを開くと、自動でそのフォルダが作業ディレクトリになり、パスの管理や依存関係の整理が簡単になる

準備:ファイルの作成

5. R Quartoファイルの作成

  • メニュー > File > Quarto Document > Create
    • Title: 任意
    • HTML / PDF / Word → HTMLにチェック
    • 「Editor: Use visual markdown editor」のチェックを外す(外れていることを確認する)
  • 名前をつけて保存

ファイル名は念のため英数のみとし、また空白文字を使わないで下さい

準備:うまくいかない場合

準備:R Studio(ペイン)の見方

  • 4画面構成
    • 主要な操作は左上のソースペインで行う

準備:R Studio(ソースペイン)の外観の変更

  • コードを書くうえで、視認性はとても重要です

6. 文字の配色の変更

  • メニュー > Tools > Global Options > Appearance > Editor Theme
    • 私(苅谷)はrstudio-themesからダウンロードしたrscodeio (anthonynorth) をaddで追加しています

7. 不可視文字を表示

  • メニュー > Tools > Global Options > Code > Display
    • Show whitespace charactersにチェック
    • Indentation guides:から適当なものを選択
      • themeによってはIndentation guidesが適用されない(rscodeioも適用対象外)

準備:R Studio(ソースペイン)の外観の変更

準備:R Studio(ソースペイン)の外観の変更

準備:R Studioの保存・復元設定

  • 意図しない古いデータが使われることを避ける必要があります

8. 「.RData」保存をオフにする

  • メニュー > Tools > Global Options > General > Workspace
    • Restore .RData into workspace at startup: チェックを外す
    • Save workspace to .RData on exit: Neverを選択

準備:R Studioの保存・復元設定

  • 「.RData」には、前回の作業中のすべてのオブジェクト(データフレーム・関数・変数など)が保存される(デフォルト設定)
    • 再起動時に「.RData」を読み込むと、前回の環境が再現する。一見便利そうだが、トラブルの元になる
      • 以前のオブジェクトがコードを実行しなくても再現するために、意図せず「古い値」が使われることがありうる
      • どこで作られたデータかわからなくなる
      • コードを一から実行しても、同じ結果にならない
    • 「.RData」は作業データすべてを保存するため、大規模データを扱うと数百MB〜数GBにもなることがある

準備:目次の追加(YAML)

9. YAMLを改変して、目次を表示させる

  • ソースペインの冒頭部分(YAML)を以下の様にする(タイトルは任意)

目次を付けると見出しレベルを意識しやすくなり、論理的に整ったレポートを作成できます

title: "任意"
format:
  html:
   toc: true
  • YAMLは構文が厳格で、エラーが起きやすいです
  • YAML領域では、特に半角と全角の違いに注意し、インデントや記号(: ハイフンなど)は全て半角で入力する
  • 「toc:」と「true」の間に半角空きあり
  • YAML領域は「—」で始まり「—」で終わります。「—」を消さないこと
  • YAMLを入力(またはコピー)できたら、「Outline」をクリック

準備:目次の追加(YAML)

  • Renderをクリック
    • YAMLで設定している出力形式に従って右下のペイン(Viewer/Presentation)にレポートが出力される(全てのR Chunkが実行される(後述))

準備:パッケージの追加(tidyverse)

  • modern Rは、tidyverse(整然としたデータ世界)という思想にもとづくパッケージ群からなる

  • base Rには組み込まれていないので、パッケージとして追加することが必要

  • tidyverseの中身

    • dplyr(データ操作); tidyr(データ整形); ggplot2(可視化); readr(データ読み込み); purrr(関数型操作); forcats(factor(カテゴリ変数)の処理); stringr(文字列処理); tibble(データフレーム拡張); rubridate(日付・時間処理)

以上9つのパッケージは、すべてtidyverseパッケージに含まれているので、個別にインストール、読み込む必要はありません

準備:パッケージの追加(tidyverse)

10. パッケージの追加

  • Consoleパネル(画面左下)にカーソルを合わせる
  • 以下のコードを入力(または「クリップボード」でコピー)して実行(Enter)
install.packages("tidyverse")

インストール後、自動でパッケージを使えるわけではありません。各Quartoファイル内において、使いたいパッケージをlibrary() 関数で読み込む必要があります(後述)

パッケージは、一度インストールすれば、同じPCではもう一度、インストールする必要はありません(パッケージはR内部から利用する設計になっており、初心者がファイルを探す、触る必要はありません)

準備:Setup Chunkの作成

R Chunk

  • R Chunkは、Quartoファイルの中でRのコードを書くためのブロック
  • 一つのR Chunkで、一つの作図、分析を行うのが基本

Setup Chunk

  • R Chunkの一種だが、文書全体の設定を行うために慣例的に使われる特別なコードブロック
    • パッケージ・読み込み / 前処理(縦持ちデータへの変換など)
  • Quartoは「ドキュメント内の最初にあるコードチャンク」を自動的にグローバルな設定チャンクとして実行する(ラベルは便宜的なもの)

Setup Chunkを整え、前処理に関わるコードをまとめておくと、後の分析がスムーズになります

準備:Setup Chunkの作成

11. Setup Chunkの作成

  • ソースペインで、YAMLの下に、Setup Chunkを作成
    • メニュー > Code > Insert Chunk > 以下のコードを入力(貼り付けでよい)
#| label: setup
#| echo: false
#| output: false
  • label: setup: このチャンクをセットアップチャンクと名付ける
  • echo: false: このチャンクのコードは表示しない
  • output: false:コードを実行しても、結果は出力に表示しない

コードブロックは「てんてんてん(バッククォート)」3つで始まり、同じく「てんてんてん」3つで終わるのが規則です。この中にRのコードを書きます。間違って消さないように!

準備:パッケージの読み込み

  • 先に作成したSetup Chunkで、modern Rの基本パッケージ群tidyverseを読み込む

12. パッケージの読み込み

ソースペインで、Setup Chunk内に以下のコードを書く

# パッケージの読み込み ---- #「○○ ----」と書いておくと、Outlineに表示されて見やすい(R Studioが区切り線として認識)
library(tidyverse) # modern Rの基本パッケージ
  • R Chunk内では #(ハッシュ)をコードの前につけると、その行は実行されずにメモとして残せます
  • # より右側の文字もRでは実行されません(コメントアウトと呼びます)
  • 特定のコード(行)が動かないなどの理由で、問題を特定したい場合にも便利です

可読性、判読性、視認性を上げ、スパゲティコードにならないようにすることが重要です

準備:日本語表示(ggplot2)

  • ggplot2(作図パッケージ)の諸関数は、初期設定のままでは、日本語を正しく表示できない場合があります
    • 特に、WindowsやmacOSでは、デフォルトのフォント設定に日本語フォントが含まれていないため、文字化けや「□」「?」のような記号に置き換えられることがあります
    • Linux環境では日本語フォントが標準でインストールされ、日本語がそのまま表示できることが多いです

準備:日本語表示(ggplot2: Mac)

13. 日本語表示に対応する

  • ggplot()の諸関数で日本語を出力するために、YAMLに以下のコードを書く(動作は後ほど確認します)
# 描画設定 -----
# フォントファミリとサイズ
ggplot2::theme_set(
  ggplot2::theme_get() +
    ggplot2::theme(text = ggplot2::element_text(family = "HiraginoSans-W3", size = 8))
)

## text/labelのフォントファミリとサイズ
ggplot2::update_geom_defaults(
  "text",
  list(family = "HiraginoSans-W3", size = 6)
)

ggplot2::update_geom_defaults(
  "label",
  list(family = "HiraginoSans-W3", size = 6)
)

準備:日本語表示(ggplot2: Windows)

13. 日本語表示に対応する

  • ggplot()の諸関数で日本語を出力するために、YAMLに以下のコードを書く(動作は後ほど確認します)
# 描画設定 -----
# フォントファミリとサイズ
ggplot2::theme_set(
  ggplot2::theme_get() +
    ggplot2::theme(text = ggplot2::element_text(family = "Meiryo", size = 8))
)

## text/labelのフォントファミリとサイズ
ggplot2::update_geom_defaults(
  "text",
  list(family = "Meiryo", size = 6)
)

ggplot2::update_geom_defaults(
  "label",
  list(family = "Meiryo", size = 6)
)

準備:Quartoファイル

Quartoファイルの構成パターン

flowchart TB
    A["YAML領域"]:::yaml
    B["R Setup Chunk(セットアップ領域)"]:::setup
    C["R Chunk領域"]:::chunk
    D["Markdown領域"]:::md

    A --> B
    B --> C
    B --> D

    classDef yaml fill:#FFF7D6,stroke:#E3B505,color:#333,font-weight:bold;
    classDef setup fill:#FFF0F5,stroke:#D96BA8,color:#333,font-weight:bold;
    classDef chunk fill:#E7F5FF,stroke:#4A90E2,color:#333,font-weight:bold;
    classDef md fill:#E8F6E0,stroke:#7CB518,color:#333,font-weight:bold;

ハッシュタグの解釈がR ChunkとMarkdownで異なる

  • R Chunk: コメントアウト
  • Markdown: 見出しレベル
  • YAML
    • ファイル全体の設定や出力形式の指定する領域
  • R Chunk
    • Rコードを実行して、分析や図表を作成する領域
  • Markdown
    • 見出しや本文、解説文などを記述する領域
    • コードで囲っていない部分は、すべてマークダウン領域となる

準備:Quartoファイル

Ⅳ. 《基本編》Rにふれてみよう:palmer penguins

基本:データセット

データセット:palmer penguins

  • palmer penguinsは、R本体に組み込まれている練習用のデータセット(R4.5以降)
    • これは、パッケージを追加したり、データを読み込む必要がないことを意味する
    • 従来のデータセット(irisなど)とは違い、カラム名、欠損値(na)などの点で、教育的配慮のあるデータセットとされる

以前は、palmerpenguinsという個別パッケージを読み込み、使用する必要がありました。パッケージで提供されるデータセットと、base Rのそれで、カラム名が一部、異なっています。インターネットで検索すると、パッケージのカラム名のコードが現状では多いので、気をつけて下さい

基本:データセット

  • パーマーランド(南極)の3つの島に住むペンギンたちのデータ(Allison Horstさん作成)

ペンギンの種類:

  • Adelie(アデリーペンギン)
  • Gentoo(ジェンツーペンギン)
  • Chinstrap(ヒゲペンギン)

島の名前:

  • Biscoe(ビスコー)
  • Dream(ドリーム)
  • Torgersen(トージャーセン)

基本:簡単な関数

データを確認する

  • 関数を使ってみよう。以下のコードを入力(自動補完機能を確認下さい)

view()関数

  • データを表にして見やすく開く関数。データ全体をチェックしたり、列名や値、また集計途中のデータをざっと確認するときに便利
penguins |> 
  view()

head()関数

  • データフレームやベクトルの先頭の数行(デフォルトは6行)だけを表示
penguins |> 
  head()

基本:データの型

データの型

基本:データフレームの型

データフレームの型

  • tibble(ティブル)はtidyverseで使われるデータフレームの新しい形式
    • base Rのデータフレームであるdata.frameを、より見やすく、扱いやすく改良したもの
    • dplyrやggplot2などの関数と相性がよい
    • tibbleは列にlistを入れられるので、グループごとのデータをまとめて操作する「ネスト処理」と相性がよい
    • 文字列を自動的にfactorにしない、出力が見やすい(先頭だけを整形して表示)間などの特徴もある

基本:実行と出力

実行(run)と出力(レンダー、render)

run:rの実行

  • 図や表の出力に関数する関数がある場合、Chunkの下に描画される
    • 個々のChunkを実行する場合は、Chunk右端の▶️をクリック
    • 全てのコードを実行する場合は、Run > Run All

render:出力(描画)

  • すべてのコードを実行し、YAMLのformatで設定した形式のファイルが出力される(出力先:Quartoファイルと同じフォルダ)
  • 出力はViewer画面でも確認できる(show new windowでブラウザで確認できる)
    • 自動的にブラウザが開く場合もある

基本:パイプ処理

パイプ処理

  • |> または %>%
  • modern Rの大きな特徴の一つ1
  • 処理を連続させるための記号(正確には、演算子という)
    • より正確には「前の結果を次の関数に渡して、処理を順番につなげるための記号」
データ |>
  処理A() |>
  処理B()
  • 料理で喩えると:「材料を選んで → 炒めて → 味付けする」

基本:パイプ処理

  • パイプ演算子は頻繁に使います。ショートカットを覚えましょう

パイプのショートカット

  • Win: Ctrl + Shift + M
  • Mac: Command + Shift + M
  • R Studioの設定(Tools > Grobal Options > Code > Editing > Use native pipe operator)で、|>%>% のどちらを挿入するかを選択できる
    • デフォルトは|>

基本:パイプ処理

パイプを使った書き方(modern R = tidyverse)

penguins |> # ペンギンというデータ(正確には「オブジェクト」と表現します)を使って
  group_by(species) |> # 種類ごとにグループを分けて
  summarize(mean_body_mass = mean(body_mass, na.rm = TRUE)) # 平均の体重を計算する(na.rm = TRUEは、欠損値を除外する指示)
  • オブジェクトをどう処理したいのかが書きやすい(読みやすい)

パイプを使わない書き方(base R)

summarize(
  group_by(penguins, species),
  mean_body_mass = mean(body_mass, na.rm = TRUE)
)
  • 関数が入れ子構造(ネスト)になり、どこからどこまでが特定の関数なのかわかりにくい
  • 処理の順番がわかりにくく、かっこの対応関係も見づらい

基本:パイプ処理

パイプあり(modern R = tidyverse)

penguins |>
  head()

パイプなし(base R)

head(penguins)
  • どちらも同じ処理
  • 処理を連続させないのであれば、右のコードでよい
  • base Rでは、関数のかっこの中に第1引数(後述)として、処理・操作したいデータを書くが、パイプを使うと、そのデータを関数の外(左側・コードの最初)に置くことができる
    • 可読性の高いコードになる

基本:パッケージのインストール

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

  • パッケージは各自の必要に応じてインストールすべきですが、時間の都合上、以下のスライドで使用するコードを一括でインストールしましょう。上からpatchworkまでのパッケージは、今日、標準的なものです

  • 任意のR Chunkで操作(このR Chunkはインストール後に削除して下さい)

# インストールするパッケージをまとめて指定
packages <- c(
  "readxl",     # Excelファイルの読み込み
  "conflicted", # 複数のパッケージで同じ関数名があるとき、使う方を選べるようにする
  "stringi",    # 文字列操作
  "glue",       # 文字列の埋め込み
  "gt",         # 表作成
  "gtsummary",  # クロス表
  "skimr",      # データ要約
  "scales",     # 軸やラベルのスケール調整
  "patchwork",  # 複数のggplotの出力結果を並べる
## 以下のパッケージは標準的ではないが、本日の講習会で使っているものです
  "crosstable", # クロス表
  "zipangu",    # 日本固有の表記(和暦、都道府県名、住所など)を処理
  "rvest",      # Webスクレイピング
  "httr2",      # HTTPリクエスト
  "xml2",       # XML解析
  "maps",       # アメリカの地図情報(地理データ)
  "socviz",     # 政治・社会・教育に関連するデータセットが中心(初学者の演習や可視化の教材として便利)
  "paletteer",  # カラーパレット
  "ngramr",     # Google Ngram Trends
  "sjPlot"      # 社会科学系の分析総合パッケージ
)

基本:パッケージのインストール

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

  • 以下のコードをコンソールに入力して実行
    • 先に入力したパッケージ群(「packages」と名付けました)を一括でインストールできます
# 一括インストール
install.packages(packages)

基本:パッケージのインストール

パッケージの一括インストール(読み込み)

  • パッケージはQuartoファイルごとに読み込みが必要です
  • 以下のコードをSetup Chunk(library(tidyverse))の下に入力して実行(Run)
# パッケージの読み込み
library(readxl)    # Excelファイルの読み込み
library(conflicted)# 名前空間の衝突を防ぐ
library(stringi)   # 文字列操作
library(glue)      # 文字列の埋め込み
library(gt)        # 表作成
library(skimr)     # データ要約
library(scales)    # 軸やラベルのスケール調整
library(patchwork) # 複数のggplotの出力結果を並べる
## 以下のパッケージは標準的ではないが、本日の講習会で使っているものです
library(crosstable)# クロス表
library(zipangu)   # 日本固有の表記(和暦、都道府県名、住所など)を処理
library(rvest)     # Webスクレイピング
library(httr2)     # HTTPリクエスト
library(xml2)      # XML解析
library(maps)      # アメリカの地図情報
library(socviz)    # 社会・政治・教育関連データセット
library(paletteer) # カラーパレット
library(ngramr)    # Google Ngram Trends
library(sjPlot)    # 社会科学系の分析総合パッケージ

# 優先する関数を指定 ----
conflicts_prefer(dplyr::filter) # filter関数はdplyrを優先

基本:ショートカット

ショートカット

  • R Chunkは頻繁に作成します。ショートカットを覚えましょう

R Chunkのショートカット

  • Win: Ctrl + Alt + I
  • Mac: Command + option + I
  • インデントを揃える癖をつけましょう

インデントの調整のショートカット

  • Win: Ctrl + I
  • Mac: Command + I

基本:データの型

データ / データフレームの型

  • すべてのオブジェクトは型(クラス)をもつ
    • R(tidyverse)がデータを読み、適切と思われる型を割り当てる
  • 重要な型
    • numeric(数字)
    • character(文字)
    • factor(ファクター(因子):レベルを設定できる)
    • logical(true / false)
    • data.frame(base Rのテーブル形式)
    • tibble(tidyverseのテーブル形式)

基本:データの型

データの型

同じ文字でもデータの型が違う可能性がある

  • numeric/character/factor
  • ggplot(作図)で特に問題になります
    • 例えば散布図はnumeric(数字)であることが基本なので、数字以外の型の場合、プロットできません
  • 型は、str()関数やskim()関数を使って調べると確実です
    • skim()関数については、次のページで説明します

基本:データの要約(確認)

  • skim()関数
    • 集計・分析に着手する前段階でのデータの確認に適している
  • R Chunkを作り、以下のコードを入力しよう
penguins |>
  skim() |> 
  gt() # 以上の集計結果を表にする
skim_variable skim_type n_missing factor.n_unique numeric.hist numeric.mean numeric.sd
species factor 0 3 NA NA NA
island factor 0 3 NA NA NA
sex factor 11 2 NA NA NA
bill_len numeric 2 NA ▃▇▇▆▁ 43.92193 5.4595837
bill_dep numeric 2 NA ▅▅▇▇▂ 17.15117 1.9747932
flipper_len numeric 2 NA ▂▇▃▅▂ 200.91520 14.0617137
year numeric 0 NA ▇▁▇▁▇ 2008.02907 0.8183559

スライドに収めるために、表示項目を絞っています

基本:データの要約

データを要約する

  • R Chunkを作り、以下のコードを入力しよう
penguins |> 
  group_by(species) |> # speciesで分類する 
  summarise( # データを要約する(集計の枠組み)
    mean = mean(bill_len, na.rm = TRUE), # 「bill_len」の列の平均を算出(summarise関数のもと具体的に何を計算するかを指定)
  ) |> 
  # ここにview関数を入れて、どのようにデータが変わったのか、見てみよう
  gt()
species mean
Adelie 38.79139
Chinstrap 48.83382
Gentoo 47.50488

Rは「保守的」に設計されています。na.rm = TRUEは「NAを取り除いて( remove)して計算する」という意味です。多くの集計関数(mean(), sum(), sd() など)は欠損値があるとエラーを返し、動作を止めます。これは意図しない、欠損を無視した計算を防ぐためです

gt()はスライドに表示するために書いています gt()はtidyveseに入っていないパッケージです。tidyverseと同じように、インストールと読み込み(library)が必要です。標準的なパッケージですので、インストールを推奨します

基本:引数 > tidyverse関数の引数の考え方

引数の位置 意味 備考
第1引数 処理対象のデータ df パイプ(|>%>%)で前の結果が自動的に渡される
第2引数以降 データの処理内容・命令 x > 10, species == "Adelie", mean_x = mean(x) 「どの行を選ぶか」「どんな列を作るか」「どう集計するか」などを指定
命名引数(オプション) 関数の動作を細かく調整 na.rm = TRUE, .groups = "drop" 処理の詳細設定や出力形式の指定などに使われる

基本:引数 > 関数ごとの例

関数 第1引数(データ) 第2引数以降の内容 説明
select(df, x, y) df x, y 必要な列を選ぶ
filter(df, species == "Adelie") df species == "Adelie" 条件に一致する行(例:「Adelie」種のみ)を選ぶ
mutate(df, z = x + y) df z = x + y 新しい列を追加または上書き
arrange(df, desc(y)) df desc(y) 並べ替えの基準を指定

基本:生成AI

生成AI活用の勧め

  • 以降のコードは初学者にはやや難しく、また時間的に丁寧に解説できません(関数はシンプルな英語なので直感的には理解できるとは思います)
  • コードをそのまま貼り付け、解説を求めましょう

出力例(ChatGPT)

- ① filter(!if_any(everything(), is.na))
  - 意味:欠損値(NA)が含まれている行をすべて取り除きます。
  - everything() は「すべての列」を意味します。
  - if_any(..., is.na)は「どの列か1つでもNAがあるか?」を判定します。! は「〜でない」という否定なので、「NAがない行だけ残す」ことになります。
  - 👉 欠損のない完全なデータだけを残す処理。
  • dplyrも生成AIを導入しました(右上のAsk AI)。日本語にも対応しています
  • Gemini CLI *R Studio内部でも生成AIを活用できるようです(試していません)

基本:Rのヘルプ機能

  • Rはすべての関数にヘルプが付いている
    • コンソールペイン(画面左下)でRのヘルプを呼び出せる
    • ? + 知りたい関数(例:?head)
    • 右下のペインに説明が出る
  • head()について調べてみよう(他の関数でもオッケー)
項目 内容の例
Title Returns the first or last parts…
Description head() はベクトルやデータフレームの「最初の数行」を返す
Usage head(x, n = 6)
Arguments(引数) x = 対象オブジェクト、n = 取り出す行数
Examples 実際に使えるコード例が掲載されている(Run examplesは実際に動作する)

基本:作図

図を作る:ggplotに渡す前にデータを整形する

  • group_by / summariseで集計した結果を、ggplotで図として出力する

ggplotはレイヤーを重ねて図を作ります。演算子がパイプと違って「+」なのは、要素の追加をイメージしているからです

penguins |> 
  group_by(species) |> 
  # summarise()関数: 元データを要約して新しい表を作る関数
  ## 第2引数で列を定義
  ### 計算結果(ここではmean()関数の結果)に列名mean_body_mass(任意)を付けて出力
  summarise(mean_body_mass = mean(body_mass, na.rm = TRUE)) |>  
  ggplot(aes(x = species, y = mean_body_mass, fill = species)) + # fill = speciesは棒や面を塗りつぶす色をspeciesに応じて変える、の意
  geom_col() +   # geom_colはデータに渡されたyをそのまま棒の高さに使う
  labs(          # 変数名から任意のラベル名に変える
    x = "種類",
    y = "体重 (g)"
  )

基本:作図 > ggplotの日本語問題

ggplotの日本語問題

  • x軸とy軸のラベルに日本語を用いています
  • 種類や体重が□で表示されたら教えて下さい(すぐには対応できないと思いますが)

基本:作図

図を作る:ggplotに渡した後にデータを計算する

penguins |>
  ggplot(aes(x = species, y = body_mass, fill = species)) +  # ggplotでグラフ作成、x軸に種類、y軸に体重、棒の色を種類ごとに分ける
  stat_summary(fun = mean, geom = "bar") +                  # 各種類の体重の平均を計算して棒グラフにする(ggplot2パッケージ内の関数)
  labs(
    x = "種類",                                             # x軸のラベルを「種類」に変更
    y = "体重 (g)"                                         # y軸のラベルを「体重 (g)」に変更
  )

基本:計算

相関係数の算出

  • bill_len: くちばしの長さ
    • 魚をつかまえたり、巣材をくわえたりすることに関わる
  • bill_dep: くちばしの奥行き
    • くちばしの太さや力強さの目安になる
penguins |>
  filter(!if_any(everything(), is.na)) |>
  group_by(species) |>
  summarise(
    cor_bill = round(cor(bill_len, bill_dep), 3)
  ) |> gt()
species cor_bill
Adelie 0.386
Chinstrap 0.654
Gentoo 0.654

基本:作図 > 散布図

散布図の作成

penguins |>
  filter(!if_any(everything(), is.na)) |>  
  ggplot(aes(x = bill_len, y = bill_dep, colour = species)) +
  geom_point()

基本:作図 > 棒グラフ(ファセット)

見比べる

  • species(種)とisland(島)に関係はあるの?
  • facet()関数:図を変数の値ごとに分割して、複数の小さなグラフにする
    • 1つの大きなデータの面を切り分けて、それぞれの側面を並べて見る
penguins |> 
  group_by(species, island) |> # グルーピングにisland(住んでいる島)を追加
  summarise(mean_body_mass = mean(body_mass, na.rm = TRUE)) |> 
  ggplot(aes(x = species, y = mean_body_mass, fill = species)) +
  geom_col() +
  labs(
    x = "種類",
    y = "体重 (g)"
  ) +
  facet_wrap(~island) # 指定の変数(カラム名、ここではisland)によって小さなグラフを作って並べる

基本:クロス集計 > gtsummary

クロス集計

  • gtsummaryパッケージを追加(インストール後、Setup Chunkで読み込み)
penguins |> 
  select(species, island) |> 
  tbl_cross(
    row = species, # rowに行変数
    col = island, # colに列変数を指定
    percent = "row" # 行ごとの割合を表示
  )

island

Total

Biscoe

Dream

Torgersen

species



    Adelie 44 (29%) 56 (37%) 52 (34%) 152 (100%)
    Chinstrap 0 (0%) 68 (100%) 0 (0%) 68 (100%)
    Gentoo 124 (100%) 0 (0%) 0 (0%) 124 (100%)
Total 168 (49%) 124 (36%) 52 (15%) 344 (100%)
  • 件数と割合を自動計算して表にしてくれる
  • 見やすく整形され、発表資料にも向く

基本:クロス集計 > gtsummary

クロス集計

  • add_p()を加えるだけでカイ二乗検定(またはFisher検定)を自動で実行してくれる
penguins |>
  select(species, island) |>
  tbl_cross(
    row = species,
    col = island,
    percent = "row"
  ) |>
  add_p()

island

Total

p-value

1

Biscoe

Dream

Torgersen

species



<0.001
    Adelie 44 (29%) 56 (37%) 52 (34%) 152 (100%)
    Chinstrap 0 (0%) 68 (100%) 0 (0%) 68 (100%)
    Gentoo 124 (100%) 0 (0%) 0 (0%) 124 (100%)
Total 168 (49%) 124 (36%) 52 (15%) 344 (100%)
1

Pearson’s Chi-squared test

基本:クロス集計 > crosstable

クロス集計

  • crosstableパッケージの場合

多くの人がパッケージを開発しているため、同様の機能をもつ複数のパッケージがあります

penguins |>
  select(species, island) |> 
  filter(!if_any(everything(), is.na)) |>
  crosstable(by = species,
             cols = island,
             total = "row",
             funs = list(prop = ~prop.table(.))) |> 
  gt()
.id label variable Adelie Chinstrap Gentoo Total
island island Biscoe 44 (26.19%) 0 (0%) 124 (73.81%) 168 (48.84%)
island island Dream 56 (45.16%) 68 (54.84%) 0 (0%) 124 (36.05%)
island island Torgersen 52 (100.00%) 0 (0%) 0 (0%) 52 (15.12%)

基本:代入

代入

  • 代入 = 値や計算結果を変数や列に「入れる」こと(正確には、変数名に値や計算結果を結びつける)
  • Rでは通常 x <- 1 のように左向き矢印を使う
    • 1 -> x(コード末尾に代入)と書いても同じ意味、処理だが、一般的ではない

代入の目的とパターン

  • 目的:計算や変形したオブジェクトを、別の処理や可視化で使う
  • パターン:
    1. 新しいオブジェクトにする(オブジェクトを作る)
    2. オブジェクトを上書きする

基本:代入 > 新しいオブジェクト

新しいオブジェクトを作る

penguins_kg <- # オブジェクト名は任意(以下のtipsを参照)
  penguins |> 
  mutate(body_mass_kg = body_mass / 1000)  # g → kg に変換して新しい列に代入
  • オブジェクト名は英字で始め、小文字と_(アンダースコア)を使い、(自分なりに)意味のある名前、規則性のある名前を付しましょう
    • 私(苅谷)の場合:データフレームはdfとする 例:df_penguins
  • 数字で始めることはできません(最初の文字以外では使えます)
  • 記号や空白は避けましょう。日本語文字(2バイト文字)も避けましょう(技術的には可能だが推奨されない)
  • 詳しくはTidyverse style guideを参照

基本:代入 > オブジェクトの上書き

オブジェクトを上書きする

penguins <-
  penguins |> # 同じオブジェクト名を指定
  filter(!is.na(body_mass))  # NA を除いたデータに上書き

元のpenguinsは NAを含む元のデータではなくなります

基本:ショートカット

代入演算子(<-)のショートカット

  • チャンク内で
    • Win: Alt + 「-」キー
    • Mac: Option + 「-」キー

特定のチャンクが動かない

  • 原因がすぐにわからないエラーが出ても安心です(よくあることです)
  • そのチャンクだけ実行をスキップできるので、レポート全体のレンダーに影響しません(冒頭に「#| eval: false」と書く)

基本:画像の書き出し

  • ggsave()関数
    • あらかじめ、qmdファイルと同じ階層に出力先フォルダを作る(例:img)
    • ggsave()関数はパイプ処理できないため、オブジェクトに代入
p <- # ggsaveはパイプ処理できません。一旦、pというオブジェクトに代入(pでなくてもいいです)
  penguins |>
  filter(!if_any(everything(), is.na)) |>  
  ggplot(aes(x = bill_len, y = bill_dep, colour = species)) +
  geom_point()

ggsave("img/geom_point_penguins.png", plot = p, width = 8, height = 6)
# 出力先と出力ファイル名、出力するオブジェクトを指定(plot = p)。サイズは任意

基本:データファイルの書き出し

  • write_csv()関数
    • あらかじめ、qmdファイルと同じ階層に出力先フォルダを作る(例:data)
    • write_csv()関数はパイプ処理できないため、オブジェクトに代入
t <- penguins |>
  filter(!if_any(everything(), is.na)) |>
  group_by(species) |>
  summarise(
    cor_bill = round(cor(bill_len, bill_dep), 3)
  )

# CSVとして書き出す
write_csv(t, "data/penguins_summary.csv") # 出力するオブジェクトと、出力先を指定

Excelファイルを出力したい場合は、writexlやopenxlsxなどの専用パッケージを使います(tidyverseには含まれていません)

# xlsxとして書き出す
write_xlsx(t, "data/penguins_summary.csv") # 出力するオブジェクトと、出力先を指定

基本:練習問題

penguinsのデータセットを用いて、Biscoe(ビスコー)島に住むペンギンの特徴を分析して下さい。

  1. 任意の観測データを用いて、種別ごとの平均値を算出して下さい。算出したデータを新しいオブジェクトに入れて下さい(オブジェクト名は、わかりやすい名前を任意でつけて下さい)

  2. (時間が余った人だけ)上記で作成したオブジェクトをggplotに渡して、任意の図を作成して下さい

Ⅴ. 《実践編》Rを動かしてみよう:社会科学のデータ

実践:URLからデータ取得(OECD景気先行指数)

  • OECDデータセット:Composite Leading Indicators (CLI)
  • urlを指定して、データを取得(ファイルはダウンロードしない)
url <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.STES,DSD_STES@DF_CLI/.M.LI...AA...H?startPeriod=2023-02&dimensionAtObservation=AllDimensions&format=csvfilewithlabels"

df_oecd_cli <- read_csv(url) # 指定したURLからデータを読み込む

# URLにアクセスできない場合(短時間にアクセスを繰り返すと接続拒否されることがあります。その場合は、エラーが出てデータを取得できません。以下のコメントアウトを外して(ハッシュタグを削除)、csvファイルからデータを読み取って下さい)
# df_oecd_cli <-
#  read_csv("data/df_oecd_cli.csv")

de_oecd_cli_selected <- 
  df_oecd_cli |> 
  select(REF_AREA, TIME_PERIOD, OBS_VALUE) |> # 必要な列を取り出す
  mutate(TIME_PERIOD = ym(TIME_PERIOD))  # 年月を日付型に変換

countries <- c("JPN", "USA", "DEU", "FRA", "KOR") #主要国だけ選ぶ(主要国のオブジェクトを作る)

de_oecd_cli_selected |>
  filter(REF_AREA %in% countries) |> # REF_AREA が countries に含まれる行だけを抽出
  ggplot(aes(x = TIME_PERIOD, y = OBS_VALUE, color = REF_AREA)) +
  geom_line()

実践:URLからデータ取得(OECD景気先行指数)

見た目を整える

de_oecd_cli_selected |>
  filter(REF_AREA %in% countries) |> 
  ggplot(aes(x = TIME_PERIOD, y = OBS_VALUE, color = REF_AREA)) +
  geom_line() +
  scale_x_date(
    breaks = scales::breaks_width("3 months"),  # x軸の間隔調整
    labels = scales::label_date_short()         # 年と月を行を変えて表記
  ) +
  scale_y_continuous(
    breaks = scales::breaks_extended(8),        # 目盛りの個数を指定
    labels = scales::label_number(accuracy = 1) # 数値表示(小数なし)
  ) +
  labs(                                         # ラベル名と凡例名の変更
    x = "Year",
    y =  "Composite Leading Indicator (CLI)",,
    color = "Country"
  ) +
  scale_color_paletteer_d("awtools::mpalette") + # 配色変更
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) # x軸のラベルの傾き調整(この事例は適切なユースケースではない)

実践:ファイルの読み込み(訪日外客数の推移)

  • 日本の観光統計データ > 「年別 訪日外客数の推移」から「データをダウンロード」
  • エディタに貼り付けて保存
    • 保存形式はcsvとする
    • 新たにdataというフォルダを作って、そこに保存
    • ファイル名は任意(英数字がよい)

e-statの難しさ

  • 日本政府統計の総合窓口e-statに格納されている多くのデータは、「表」形式(messyデータ)でまとめられており、R言語を含むプログラム言語では扱いづらい

実践:ファイルの読み込み(訪日外客数の推移)

フォルダとファイルの構成(確認)

├── firststep.Rproj
├── firststep.qmd
├── img
│   └── geom_point_penguins.png
└─── data
    ├── speech_ishiba.rds
    ├── penguins_summary.csv
    └── inbound_travelers.csv
    └── sample.pdf
  • Quartファイルとimg/dataフォルダの相対的な位置関係を確認

実践:ファイルの読み込み(訪日外客数の推移)

  • データの読み込み:read_csv()関数

read.csv関数が補完入力されるかもしれません。read.csv関数はbase Rの関数で、今日では標準ではありません(.ドットと_アンダースコアの違い)

df_inbound <-
  read_csv("data/inbound_travelers.csv") # ファイル名は各自がつけたものとする

df_inbound |> 
  ggplot(aes(x = Year, y = `Visitor Arrivals`)) + # カラム名に空白や記号が含まれている場合は、バッククォート(`)で囲む(日本語キーボード:Shift + @ / 英語キーボード:数字の1の左)
  geom_line() +
  scale_x_continuous(
    breaks = seq(1964, 2025, by = 5)  # 5年刻み
  ) +
  labs(x = "年",
       y = "訪日外国人客数") +
  scale_y_continuous(
    labels = label_number(big.mark = ",", accuracy = 1)
  ) # 指数表記を通常表記に(指数表記をあらためるためには、scalesパッケージを追加する必要があります)

実践:データの読み込み

データの読み込み

文字コード

  • Windows標準やExcel標準(日本)のCP932形式(Shift_JIS)で作成されたファイルを読み込むには、文字コードを指定する必要あります
    • 文字化けの原因のほとんどは文字コードに起因する
  • 現在の世界標準の文字コードはユニコード(UTF-8)
    • 特別の指定なく読み込める
  • エディタで文字コードを変更するのではなく、読み込みの段階で文字コードを変更する(locale = locale(encoding = “cp932”)癖をつけましょう
    • 元ファイルは触らないのが原則
read_csv("filename.csv"
         , locale = locale(encoding = "cp932"))

実践:データの読み込み

エクセルファイルを読み込む

  • readxl()関数を使用
    • tidyverseパッケージに入っていないので、追加インストールが必要

基本形

df <-
  read_excel("filename.xlsx")

シートを指定して読み込む

df <-
  read_excel("filename.xlsx", sheet = "2024年データ")

列名を含めない(1行目をデータとして扱う)

df <-
  read_excel("filename.xlsx", col_names = FALSE)

実践:データの読み込み

CSVエディタの勧め

  • CSVファイルは、単純なテキスト形式のデータです
  • Microsoft Excel で開くと、CP932形式(Shift_JIS)となります。日付や数値の形式が自動で変わってしまうことがあります
  • データを正確に扱いたい場合は、専用のCSVエディタやテキストエディタの使用をお勧めします
  • Modern CSV
    • Windows / macOS / Windows Portable / Linux
    • 基本的な操作は無償版でも十分可能

実践:データの結合(OECD加盟国の人口100万人あたりの議員数)

データの結合

  • 別種のデータを結合したい場合
    • 列方向の結合:left_join() * 今回はleft_joinを試します
    • 行方向の結合:bind_rows()
  1. Google Driveからファイルをダウンロード(出所12
  2. dataフォルダに保存
  3. 次のページのコードを写して、実行

left_join() は、共通のカラム名(キー)をもとに2つのデータを結合する関数です。それぞれのファイルでカラム名が異なる場合は、renameする必要があります。次のコードでは、select()関数やrename()関数で、カラム名をrenameしています)

実践:データの結合(OECD加盟国の人口100万人あたりの議員数)

## 前処理(Setup Chunk)に書くべき

df_parline <- 
  read_csv("data/parliaments.csv", skip = 15) # 冒頭から15行目まではメタデータ(ヘッダーコメント )なので読み込まない

df_population <- # ファイルが大きい(220.3MB)ため、重い処理かもしれない
  read_excel("data/population.xlsx", sheet = 1, skip = 16) |> # excelファイルはシートを指定できる
  filter(Type == "Country/Area") |> 
  filter(Year == max(Year, na.rm = TRUE)) |> 
  rename(country = `Region, subregion, country or area *`) # rename()でカラム名を変更

oecd_ISOcode <- c(
  "AU", "AT", "BE", "CA", "CL", "CO", "CR", "CZ", "DK", "EE", "FI", "FR",
  "DE", "GR", "HU", "IS", "IE", "IL", "IT", "JP", "KR", "LV", "LT", "LU",
  "MX", "NL", "NZ", "NO", "PL", "PT", "SK", "SI", "ES", "SE", "CH", "TR",
  "GB", "US"
)

oecd_countries <- c(
  "Australia", "Austria", "Belgium", "Canada", "Chile", "Colombia",
  "Czech Republic", "Denmark", "Estonia", "Finland", "France", "Germany",
  "Greece", "Hungary", "Iceland", "Ireland", "Israel", "Italy", "Japan",
  "Korea", "Latvia", "Lithuania", "Luxembourg", "Mexico", "Netherlands",
  "New Zealand", "Norway", "Poland", "Portugal", "Slovak Republic", "Slovenia",
  "Spain", "Sweden", "Switzerland", "Turkey", "United Kingdom", "United States of America", "Republic of Korea"
)

df_parline_oecd <- 
df_parline |> 
    filter(`ISO Code` %in% oecd_ISOcode) # %in% は複数の値をフィルタリングする際に使用〔特定の値の場合は==〕

df_parline_oecd <- 
  df_parline_oecd |> 
  # selectは文字通り列を選択する関数だが、選択する列名の前に「任意の名前 = カラム名」と書くことで、選択と列名の変更を同時に行うことができて便利
  select(country = Country, statutory_number = `Statutory number of members`)

df_population_oecd <- 
  df_population |> 
      filter(country %in% oecd_countries)

df_population_oecd <- 
  df_population_oecd |> 
  mutate(across(`0`:`100+`, as.numeric)) |> # 年齢に関する列がすべて文字列として認識されているため、across()で指定した列(0〜100+)をまとめて as.numeric() に変換する
  mutate(TotalPopulation = rowSums(across(`0`:`100+`), na.rm = TRUE)) |> # 年齢ごとの列(0歳〜100歳以上)の値をすべて足し合わせ、その合計を新しい列「TotalPopulation」に追加(欠損地は除外)
  select(country, TotalPopulation) |> 
  mutate(TotalPopulation = round(TotalPopulation)) # TotalPopulation列の値を四捨五入して、整数に。結果は同じ列名TotalPopulation に上書き

df_pop_par <-
  df_population_oecd |> # df_population_oecdをベースに、df_parline_oecdを結合
  left_join(df_parline_oecd, by = "country") # countryをキーに

## 個別チャンク

df_pop_par |> 
  mutate(
    statutory_number = as.numeric(statutory_number),
    member_per_million = statutory_number / (TotalPopulation / 1000),
    member_per_million = round(member_per_million, 2)
  ) |> 
  arrange(desc(member_per_million)) |> 
  mutate(country = factor(country, levels = country)) |> # 上記の順序で並べる(未指定だとアルファベット順に)
  ggplot(aes(x = fct_reorder(country, member_per_million), 
             y = member_per_million)) + # fct_reorder() で棒グラフの順序をデータに合わせて並べ替え(未指定だと、逆順になる。ggplotの仕様)
  geom_col(fill = "#a0564d") + 
  geom_text(                                     # 値を図に加える
    aes(label = glue("{member_per_million}人")), # 値に「人」を足す
    hjust = -0.1,
    size = 3.0
  ) +
  expand_limits(y = 180) + # Icelandの値がはみ出るため、x軸を180に
  scale_y_continuous(
    breaks = seq(0, 300, 30),
    expand = c(0, 0)
  ) +
  coord_flip() + # x軸とy軸を入れ替える
  labs(
    x = "",
    y = "人口100万人あたりの下院議員定数",
  ) +
  theme(
    axis.text.y = element_text(hjust = 0) # y軸のラベル名を左揃え(デフォルトは中央揃え)
  )  

実践:縦持ち・横持ち(金沢広域急病センター利用者数)

データを読み込む

  1. Google Driveからファイルをダウンロード(出所1
  2. dataフォルダに保存
  • 以下のコードは、全てのR Chunkで使うことを想定するものなので、本来はSetup Chunkに書くことが望ましい
df_hospital <- 
  read_csv("data/kanazawaemergencycenter_users.csv") |> 
  mutate(
    曜日 = factor(曜日, levels = c("月", "火", "水", "木", "金", "土", "日")) # 曜日順に並べるための処理
  )

実践:縦持ち・横持ち(金沢広域急病センター利用者数)

データの確認:横持ちデータ

df_hospital |> head(3)
# A tibble: 3 × 6
  日付      曜日  土日祝 小児科  内科    計
  <chr>     <fct>  <dbl>  <dbl> <dbl> <dbl>
1 2018/4/9  月         0      8     6    14
2 2018/4/10 火         0     13     6    19
3 2018/4/11 水         0     17     4    21
  • 小児科/内科が別の列になっていることを確認
  • 「専門」というカラムがあり、そこに「小児科/内科」という値が入っていると便利なのにな・・・
    • pivot_longer()関数で、「専門」というカラムを作る

実践:縦持ち・横持ち(金沢広域急病センター利用者数)

データの変換:横持ちデータから縦持ちデータへ

  • pivot_longer()関数
df_hospital_long <- 
  df_hospital |> 
  pivot_longer(
    cols = c("小児科", "内科"), # もとのカラム名(新たに縦にまとめたい列)
    names_to = "専門", # 新しく作りたいカラム名1:もとのカラム名(小児科・内科)が入る列
    values_to = "利用者数" # 新しく作りたいカラム名2:もとの値(人数)が入る列
  ) |> 
  mutate(
    専門 = factor(専門, levels = c("内科", "小児科")) # 水準(順序付き)にする
  ) |> 
  select(日付, 曜日, 土日祝, 専門, 利用者数) |> 
  mutate(日付 = as.POSIXct(日付), # 日付をデータの型が「date」になるように変形
         日付 = as.Date(日付))

実践:縦持ち・横持ち(金沢広域急病センター利用者数)

縦持ちデータ(カラム「専門」)の活用

df_hospital_long |>  
    group_by(曜日, 専門) |> 
    summarise(
      利用者数_曜日 = sum(利用者数)
    ) |> 
    ggplot(aes(x = 曜日, y = 利用者数_曜日, fill = 専門)) +
    geom_bar(stat = "identity")

実践:比べられる図(比例代表得票数)

  1. Google Driveからファイルをダウンロード(出所1
  2. dataフォルダに保存
  • 以下のコードは、全てのR Chunkで使うことを想定するものなので、本来はSetup Chunkに書くことが望ましい
Code
df_pr_parties_2021 <- read_csv("data/hr2021_pr_parties.csv") |> 
  mutate(, .before = block,
         year = 2021
  ) 

df_pr_parties_2024 <- read_csv("data/hr2024_pr_parties.csv") |> 
  mutate(, .before = block,
         year = 2024
  )
  
df_pr_parties <- 
  bind_rows(df_pr_parties_2021, df_pr_parties_2024) |> # 上記の二つのオブジェクトを結合します
  mutate(
    block = factor(block, levels = c("北海道", "東北", "北関東", "南関東", "東京", "北陸信越", "東海", "近畿", "中国", "四国", "九州")) # factorにして、レベル(順序)を指定します
  )

主要政党 <- c("自由民主党", "立憲民主党", "公明党", "国民民主党", "日本維新の会", "日本共産党", "社会民主党", "れいわ新選組", "参政党")

実践:比べられる図(比例代表得票数)

衆議院議員選挙 比例代表得票数:2021 vs. 2024

df_pr_parties |> 
  group_by(year, party) |> 
  summarise(
    votes = sum(votes)
  ) |> 
  ungroup() |> 
  filter(party %in% 主要政党) |>
  mutate(
    party = factor(party, levels = c("自由民主党", "立憲民主党", "公明党", "国民民主党", "日本維新の会", "日本共産党", "社会民主党", "れいわ新選組", "参政党"))
  ) |> 
  ggplot(aes(x = party, y = votes, fill = as.factor(year))) + # yearをfactorにします(標準では数字です)
  geom_col(position = "dodge") + # 棒グラフを横並びにする
  scale_y_continuous(labels = zipangu::label_kansuji()) + # y軸のラベルをわかりやすくします(zipanguパッケージ要)
  labs(x = "", y = "得票数", fill = "年") 

実践:比べられる図(比例代表得票数)

衆議院議員選挙 比例代表得票率:2021 vs. 2024

df_pr_parties |> 
  group_by(year, party) |> 
  summarise(votes = sum(votes), .groups = "drop") |> 
  filter(party %in% 主要政党) |> 
  mutate(
    party = factor(party, levels = c(
      "自由民主党", "立憲民主党", "公明党", "国民民主党", 
      "日本維新の会", "日本共産党", "社会民主党", "れいわ新選組", "参政党"
    )),
    prop = votes / sum(votes)  # 各年で割合を計算
  ) |> 
  ggplot(aes(x = as.factor(year), y = votes, fill = party)) +
  geom_col(position = "fill") +
  geom_text(aes(label = scales::percent(prop, accuracy = 1)),
            position = position_fill(vjust = 0.5), size = 3) + # 割合を中央に表示
  scale_y_continuous(labels = scales::percent_format(),
                     expand = expansion(mult = c(0.01, 0.01))) + # 左右のマージンを詰める
  scale_fill_paletteer_d("miscpalettes::brightPastel") + # 配色を変える
  labs(x = "年", y = "得票の割合", fill = "政党") +
  theme(legend.position = "bottom") + # 凡例を下に移動
  coord_flip() # 横向きに変える

実践:練習問題

  • OECD加盟国の人口100万人あたりの議員数で用いた二つのデータを使って(population.xlsx; parliaments.csv)、以下の図を作って下さい。作図にあたっては、一旦、オブジェクトを作成して、それをggplotに渡して下さい
  1. G7各国のみにデータを絞る
  2. 65歳以上のデータを抽出する
  3. 棒グラフを作図する
  4. 全人口の図と比較する
  5. (時間が余った人のみ)18歳未満のデータで同じことをしてみましょう

既存のコードを有効に活用しよう / (処理が複雑になっています)変数名、オブジェクト名をわかりやすく付けよう

Ⅵ. 《発展編》Rを使いこなそう:スクレーピング・map()関数ほか

発展:PDFからテキストを抽出する

  • 別途、pdftoolsをインストールして下さい
  • 以下のコードでは、pdftools パッケージで PDF からテキストを読み取り、stringr パッケージの関数を使って特定の文字(例:改行コード)を置換しています。stringr は tidyverse に含まれるパッケージです
library(pdftools)

# PDFファイルを読み込む
text <- pdf_text("data/sample.pdf")

# \n を空文字に置換
text_clean <- text |>
  str_replace_all("[\n]+", " ") |>    # 改行を空白に
  str_replace_all("[ ]{2,}", " ")     # 連続空白を1つに

text_clean |> print()
1 # Lorem 2 3 > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 

発展:スクレーピング(「総理の演説・記者会見など」)

拡張子rds

  • Rで作ったデータ(データフレームなど)をそのままの形で保存できる専用のファイル形式
  • 利点:高速に読み書きできる / すべて正確に保持される(列の型(文字・数値・日付など)や因子レベルなどをそのまま保持する)

スクレーピングパッケージ

  • httr2(ページを取得する); xml2(ページの中身を読む);rvest(必要なデータを取り出す)

発展:スクレーピング(「総理の演説・記者会見など」)

Code
# 「関数定義」「URL収集」「本文抽出」「整形・保存」ごとにchunkを分ける方がいいが、ここでは一つのチャンクで書く

# --- indexページから記事URLを抽出 ---
get_article_urls <- function(page_url) {
  req <- request(page_url) |> req_perform()
  html <- resp_body_html(req)
  
  hrefs <- html |> html_elements("a") |> html_attr("href")
  relative_urls <- hrefs[str_detect(hrefs, "^/jp/(102_ishiba|103)/statement/\\d{4}/\\d{4}.*\\.html$")]
  
  paste0("https://www.kantei.go.jp", unique(na.omit(relative_urls)))
}

# ベースURLから全indexページを収集
collect_all_article_urls <- function(base_urls) {
  all_index_pages <- map(base_urls, function(base) {
    resp <- request(base) |> req_perform()
    html <- resp_body_html(resp)
    archive_links <- html |> html_elements("a") |> html_attr("href")
    archive_links <- archive_links[str_detect(archive_links, "statement/index_\\d{4}\\.html$")]
    archive_links <- paste0("https://www.kantei.go.jp", archive_links)
    c(base, archive_links)
  }) |> unlist() |> unique()
  
  # 各indexページから記事URLとデータを取得
  article_urls <- map(all_index_pages, get_article_urls) |> unlist() |> unique()
  message("取得した記事数: ", length(article_urls))
  article_urls
}

base_urls <- c(
  "https://www.kantei.go.jp/jp/102_ishiba/statement/index.html",
  "https://www.kantei.go.jp/jp/103/statement/index.html"
)

article_urls <- collect_all_article_urls(base_urls)

extract_article_info <- function(url) {
  message("Processing: ", url)
  
  # 安全に tryCatch で失敗回避
  tryCatch({
    req <- request(url) |> req_perform()
    html <- resp_body_html(req)
    
    # title
    title_node <- html |> html_element("h1")
    title <- if (!is.null(title_node)) html_text2(title_node) else NA

    # date
    date_node <- html |> html_element("span.date")
    date <- if (!is.null(date_node)) html_text2(date_node) |> str_remove("^更新日:") else NA

    # paragraph
    p_nodes <- html |> html_elements("p") |> html_text2()
    p_nodes <- p_nodes[!str_detect(p_nodes, "JavaScript|動画が再生できない|動画ファイルはこちら")]
    paragraph <- paste(p_nodes, collapse = "") |> str_squish()

    # url
    url_node <- html |> html_element("meta[property='og:url']")
    actual_url <- if (!is.null(url_node)) html_attr(url_node, "content") else url

    list(title = title, date = date, paragraph = paragraph, url = actual_url)
    
  }, error = function(e) {
    message("Error at: ", url, " -> ", e$message)
    list(title = NA, date = NA, paragraph = NA, url = url)
  })
}

articles_info <- map(article_urls, extract_article_info) |> # extract_article_info()関数が個々の article_url にアクセスして 記事の本文や日付などを取得
  compact() # リストからNULLの要素を取り除く

# 整形
df_articles <- 
  bind_rows(articles_info) |>
  mutate(date = convert_jdate(date)) |> # zipangu パッケージの関数。和暦の日付(例:令和○年○月○日)をDate型に変換
  arrange(date) # date列で並び替え

# 保存
saveRDS(df_articles, "speech_ishiba.rds")

発展:スクレーピング(「総理の演説・記者会見など」)

  • head()でデータを確認
Code
df_ishiba <- read_rds("data/speech_ishiba.rds")

df_ishiba|> head(2)
# A tibble: 2 × 4
  title                              date       paragraph                  url  
  <chr>                              <date>     <chr>                      <chr>
1 石破内閣総理大臣記者会見           2024-10-01 【石破総理冒頭発言】 第102代内閣総理大臣に指名… http…
2 G7首脳電話会議出席についての会見 2024-10-02 先ほど緊迫する中東情勢を受けまして、私にとりまして… http…
  • gt()で本文を確認(スペースの都合)
Code
df_ishiba|> 
  filter(
    title == "石破内閣総理大臣記者会見",
    date == as.Date("2024-10-09")
  ) |> 
  mutate(paragraph = substr(paragraph, 1, 50)) |>
  select(paragraph) |> gt()
paragraph
【石破総理冒頭発言】 お待たせいたしました。 本日、衆議院を解散いたしました。国民の皆様の御納得、そ
Code
df_ishiba|> 
  filter(
    title == "石破内閣総理大臣記者会見",
    date == as.Date("2025-10-10")
  ) |> 
  mutate(paragraph = substr(paragraph, 1, 50)) |>
  select(paragraph) |> gt()
paragraph
(内閣総理大臣所感) 戦後80年に寄せて(941KB)【石破総理冒頭発言】 本日、「戦後80年に寄せ

発展:map()関数(penguin)

map()関数の利点

  • グループごとに自動で処理できる
    • 手作業でspeciesごとに分けてコードを書く必要がない
    • 例:ペンギンの種類ごとに、くちばしの長さ(bill_len)と深さ(bill_dep)の関係を回帰分析で調べる
Code
penguins |> 
  group_by(species) |> 
  nest() |>                  # グループごとにデータフレームをリスト化して1列にまとめる
  mutate(
    bill_lm_result = map(    # map() でリストの各要素(データフレーム)に同じ処理を適用
      data,                  # 対象は nest() で作った 'data' 列
      function(df) {
        lm_result <- lm(bill_len ~ bill_dep, data = df)  # bill_len を目的変数、bill_dep を説明変数に回帰
        return(lm_result)                              # lm の結果を返す
      }
    ),
    coefficients = map(      # map() で各回帰結果から係数を取り出す
      bill_lm_result, 
      pluck, 
      "coefficients"
    )
  ) |> 
  unnest_wider(coefficients, names_sep = "_") |>   # coefficients 列を列ごとに展開(intercept や傾きが列になる)
  print()
# A tibble: 3 × 5
# Groups:   species [3]
  species   data     bill_lm_result coefficients_(Interc…¹ coefficients_bill_dep
  <fct>     <list>   <list>                          <dbl>                 <dbl>
1 Adelie    <tibble> <lm>                             23.1                 0.857
2 Gentoo    <tibble> <lm>                             17.2                 2.02 
3 Chinstrap <tibble> <lm>                             13.4                 1.92 
# ℹ abbreviated name: ¹​`coefficients_(Intercept)`

発展:map()関数(penguin)

map()を使わない場合

Code
# データを種別ごとに分ける
adelie <- penguins |> filter(species == "Adelie")
# chinstrap <- penguins |> filter(species == "Chinstrap")
# gentoo <- penguins |> filter(species == "Gentoo")

# 種別ごとに回帰分析を個別に書く
adelie_lm <- lm(bill_len ~ bill_dep, data = adelie)
# chinstrap_lm <- lm(bill_len ~ bill_dep, data = chinstrap)
# gentoo_lm <- lm(bill_len ~ bill_dep, data = gentoo)

# 結果を確認
print(adelie_lm)

Call:
lm(formula = bill_len ~ bill_dep, data = adelie)

Coefficients:
(Intercept)     bill_dep  
     23.068        0.857  
Code
# print(chinstrap_lm)
# print(gentoo_lm)

回帰分析をtidyverseスタイルで行うなら、parsnipパッケージが便利です。tidymodelsパッケージに含まれています。モデル結果を表形式に整理するにはbroomパッケージも使います

発展:map()関数(選挙)

  • map() :同じ処理を、たくさんのデータに順番に適用する」関数
    • 「たくさんのファイル」や「いくつかのグループ(島・年・地域など)」に対して、同じ処理(たとえば平均を出す・グラフを描く)を自動で繰り返す
  • 比例区の得票数を地域ブロックごとに集計、描画したい
Code
# 1. データを整形して新しいオブジェクトに保存
df_plot <- df_pr_parties |>
  group_by(year, party, block) |>
  summarise(votes = sum(votes), .groups = "drop") |>
  filter(party %in% 主要政党) |>
  mutate(party = factor(party, levels = 主要政党))

# 2. block ごとに分割(factor → character に変換)
df_list <- split(df_plot, as.character(df_plot$block))

# 3. ggplot を作成
plots <- map(df_list, ~ ggplot(.x, aes(x = party, y = votes, fill = as.factor(year))) +
                       geom_col(position = "dodge") +
                       labs(title = unique(.x$block), x = "", y = "得票数") +
                       theme(axis.text.x = element_text(angle = 45, hjust = 1)))

# 4. プロットを表示
walk(plots, print)

発展:地図情報(アメリカの選挙結果)

前処理

  • Setup Chunkに書く
us_states <- map_data("state")

# アメリカ主要政党のカラーコード
party_colors <- c("#2E74C0", "#CB454A")

us_state_elec <- 
  election |> # データセットsocvizに含まれています
  mutate(region = tolower(state)) |> 
  left_join(us_states, by = "region") # データの結合

発展:地図情報(アメリカの選挙結果)

2016年アメリカ大統領選挙結果1

  • ggthemesパッケージを使用
library(ggthemes)

us_state_elec |> 
  ggplot(aes(x = long, y = lat, group = group, fill = party)) +
  geom_polygon(color = "gray90", size = 0.1) + # ggplot2内の関数
  coord_map(projection = "albers", lat0 = 39, lat1 = 45) +
  scale_fill_manual(values = party_colors) +
  labs(title = "アメリカ大統領選挙結果 2016", fill = NULL) +
  theme_map(base_family = "HiraKakuProN-W3") # 地図を描くときに余分な軸・枠・背景などを消して、地図表示に適したシンプルなテーマを適用する関数(注記・Windwowsユーザーはフォント変えて下さい)

発展:地図情報(アメリカの人口密度)

アメリカの人口密度1

county_full <-
  county_map |> 
  left_join(county_data, by = "id")

county_full |>  
  ggplot(aes(x = long, y = lat,
         fill = pop_dens,
         group = group)) +
  geom_polygon(color = "gray90", size = 0.05) +
  coord_equal() +
  scale_fill_brewer(palette = "Blues",
                    labels = c("0-10", "10-50", "50-100", "100-500", "500-1,000", "1,000-5,000", ">5,000")) +
  labs(fill = "Population per\nsquare mile") +
  theme_map() +
  guides(fill = guide_legend(nrow = 1)) +
  theme(legend.position = "bottom")

発展:重回帰分析(penguins)

  • sjPlotパッケージを使用
library(sjPlot)

# データ例
penguins_clean <- 
  penguins |> 
  filter(!is.na(bill_len), !is.na(bill_dep), !is.na(flipper_len))

# 重回帰
lm_model <- lm(bill_len ~ bill_dep + flipper_len, data = penguins_clean)

# 表示
tab_model(lm_model)
  bill len
Predictors Estimates CI p
(Intercept) -28.15 -38.99 – -17.30 <0.001
bill dep 0.62 0.35 – 0.89 <0.001
flipper len 0.31 0.27 – 0.34 <0.001
Observations 342
R2 / R2 adjusted 0.464 / 0.461

Ⅶ. さらに学ぶために

さらに学ぶ:基本書

  • Wickham, Hadley and Çetinkaya-Rundel, Mine and Grolemund, Garrett. ‘R for Data Science (2e)’(LINK
  • キーラン・ヒーリー(2021)『データ分析のためのデータ可視化入門』(瓜生真也・ 江口哲史・三村喬生 訳)、講談社(LINK
  • 松村優哉・湯谷啓明・紀ノ定保礼・前田和寛(2021)『改訂2版 RユーザのためのRStudio「実践」入門:tidyverseによるモダンな分析フローの世界』、技術評論社(LINK
  • 松村優哉・瓜生真也・吉村広志(2023)『Rユーザのためのtidymodels「実践」入門:モダンな統計・機械学習モデリングの世界』、技術評論社(LINK
  • Kosuke Imai and Nora Webb Williams, “Quantitative Social Science: An Introduction in tidyverse”(LINK、旧版(非tidyverse)は翻訳あり(LINK))

さらに学ぶ:基本書

  • 轟亮・杉野勇・平沢和司編『入門・社会調査法〔第4版〕:2ステップで基礎から学ぶ』(LINK

さらに学ぶ:専門的なパッケージ

社会科学全般

  • sjPlot
    • 回帰分析結果の可視化、アンケートデータの表作成

さらに学ぶ:専門的なパッケージ

政治学

  • legislatoR
    • 世界各国の議員に関する標準化データベース
  • ggparliament
    • 議席構成や投票結果の可視化
  • congress
    • アメリカ連邦議会(Congress.gov API)が提供しているデータをプログラム的に取得できるインターフェースへのインターフェイス
  • ggredist
    • アメリカの政治地図作成のためのggplot2拡張機能

さらに学ぶ:専門的なパッケージ

経済学

さらに学ぶ:専門的なパッケージ

心理学

  • psych
    • 心理尺度の分析、因子分析、信頼性分析
  • psychTools
    • psychの補助ツール

さらに学ぶ:専門的なパッケージ

生物学

  • gggenes
    • 遺伝子・オペロン構造の可視化

医学・疫学

  • survival
    • 生存解析、カプラン・マイヤー曲線の描画
  • tern
    • 臨床試験報告表
  • jpinfect
    • 日本での感染性疾患データの取得と処理のためのツール

さらに学ぶ:専門的なパッケージ

量的テキスト分析

  • quanteda
    • 自然言語処理(テキスト分析)全般に対応する総合ツール。大量の文章データを扱いやすい形に整理(コーパス作成、トークン化、特徴量行列化など)することで、高速かつ効率的な計算が可能。文書全体の統計や複雑な分析に向く
  • tidytext
    • 「tidy(整然とした)」データフレーム形式でテキストを扱うことに特化。文章 → 単語のリスト(tidy形式)に変換して、dplyrやggplot2などtidyverseと組み合わせて分析可能。少量のデータや可視化・集計が中心の場合に便利

さらに学ぶ:専門的なパッケージ

量的テキスト分析

  • gibasa
    • 日本語を含むCJK(Chinese, Japanese, Korean)文字列の形態素解析 を目的とするパッケージ。日本語に強い形態素解析器MeCabをRから使えるようにラップしたRcppライブラリとして提供される。解析結果はtidytextや quantedaに渡して、統計解析や特徴量抽出に利用することが可能

さらに学ぶ:専門的なパッケージ

分析ツール

  • ANOVA(分析分散法):pwranova
    • ANOVAデザインにおける検出力解析を行うためのパッケージ。任意の因子数に対して、主効果および交互作用効果を完全サポート
  • ネットワーク分析:igraph
    • ネットワーク・関係データの解析・可視化
  • 時系列分析:forecast
    • 経済・環境データの予測・解析
  • 因果推論:causaltbl
    • 処置(treatment)と結果(outcome)の関係をモデル化し、そのモデルの予測値(適合値)をデータフレームの列として保存

さらに学ぶ:専門的なパッケージ

その他

  • Rパッケージ活用事例集
    • 多くのパッケージをわかりやすく紹介されています。「主に日本アクチュアリー会の会員向けに、業務に役立つRパッケージの機能を紹介すること」を目的としているサイトですが、有益です

さらに学ぶ:データ > e-stat

e-statの処理

さらに学ぶ:データ > 政治

政治に関わる諸データ

さらに学ぶ:教材(チュートリアル)

学部生向け授業教材

初学者向け教材

さらに学ぶ:アカデミックなTips

さらに学ぶ:Quartoテンプレート

  • Christopher T. Kenny, Quarto Extensions
    • APSRやOxford University Press Articleなど、各種ジャーナルのテンプレートが用意されています

さらに学ぶ:問い合わせ

メールアドレス

  • 1度の講習会で理解できることには限界があります
    • 特にサンプルコードでは動いても、自分が参照したいデータではうまくいかないことはよくあります
  • わからないことがあればお気軽にお問い合わせ下さい(歓迎いたします)

実演したコード

  • 本日、実演したコードはGoogle Driveからダウンロードできるようにしておきます

さらに学ぶ:スライド資料

スライド資料

  • キーボードの「E」でpdf出力できます
    • Goggle Chrome推奨

参考文献

参考文献

Wickham, H., Çetinkaya-Rundel, M., Grolemund, G., 2023. R for data science. O’Reilly Media.
ヒーリー,キーラン, 2021. データ分析のためのデータ可視化入門, 瓜生真也・江口哲史・三村喬生 訳. 講談社.