Rで学ぶ計量経済学と機械学習 1

Rの基礎

This version: 2026-09-23

Author

安藤道人(立教大学) 三田匡能 (株式会社 GA technologies)

1 本講義の目的

  • RやR Studioの起動について学ぶ。
  • Rを使った計算について学ぶ。
  • オブジェクト、ベクトル、関数、データフレームなどについて学ぶ。
  • データの読み込み方について学ぶ。
  • 因子(factor)について学ぶ。

2 Rの起動

2.1 RStudioのセットアップ

Posit Cloud(旧名:RStudio Cloud)というサービスを利用して、次の手順によりRの開発環境を準備する

  1. Posit Cloud( https://posit.cloud/ )に行き、右上の「Log In」をクリックする
  2. 「Log In with Google」から立教のアカウントを選び、ログインする
  3. 「New Project」から「New RStudio Project」をクリックして新しいプロジェクトを立ち上げる

※卒論など本格的にRを使う場合はPosit Cloudではなく大学のPCを利用するか、自身のPCにRとR Studioをインストールして使用することをおすすめする。

2.2 RStudioの基本操作

2.2.1 新規Rファイルの作成

Rスクリプト(R言語のコードを記述するテキストファイル)の新規作成を行うには、RStudio左上の「白い紙に(+)のマークがついているようなアイコン」をクリックし、「R Script」をクリックする

2.2.2 各部分の説明

RStudioの基本画面はこの4つの領域からなる。

  • 左上がRスクリプトの入力欄(コードを書く部分)
    • コードを書き、[Run]ボタンを押せば実行できる
  • 左下[Console]がRスクリプトの実行結果が出てくる画面
  • 右上[Environment]が読み込んだデータなどのオブジェクトが一覧で表示される画面
  • 右下[Files]が現在のワークスペースのファイルを表示している部分
    • 図を描けば[Plots]タブに表示され、Helpを呼び出せば[Help]タブに表示される

3 計算と代入

Rでは電卓やExcelで計算するのと同様に計算を行うことができる。

123 + 456
[1] 579

3.1 代入

分析対象のデータや計算結果の値などのデータを格納するもののことをオブジェクト(object)や変数(variable)と呼ぶ。

あるオブジェクトに何らかの値を代入するときは、=や<-という記号(演算子)を使う。 (なお、Rは<-による代入のほうが正統な記法である)

RStudio上では、<-はAltと-のキーを同時に押すことで簡単に入力できる(Macの場合はOption + -)。

x <- 1 + 1  # オブジェクト x に 1+1の演算結果を代入

3.2 オブジェクトの確認

オブジェクト単体でコードを実行すれば、オブジェクトの中身を表示することができる。

x # オブジェクト x の中身を表示
[1] 2

また、RStudioの[Environment]部を見ることでも確認することができる。

3.3 Rのデータ型

プログラミング言語では、データの型というものを意識する必要がある。

例えば、クォーテーション("や')で囲っているものは文字列(character)型となるため、"1" + 1のような演算はできない点に気をつける。

Rの基本的なデータ型は次の通り。

データ型 例
数値(numeric) 1、0.1
文字列(character) “A”、“あいうえお”
論理値(logical) TRUE、FALSE、T、F

4 ベクトル

ベクトル(vector)という、複数の値が一列にならぶようにして入れられた形式のオブジェクトがある。

Excelでいうとデータを1行あるいは1列取り出したようなものにあたる。

ベクトルを作りたいときは、c()にカンマで区切りながら値を入れていく。 cはcombine(結合)のcである。

# ベクトル
y <- c(1, 20, 100)
y
[1]   1  20 100

1~10の整数が入ったベクトルが欲しい時などは、1:10のように 始めの数と終わりの数で:を挟むように記述する。

# 1~10の整数
x <- 1:10
x
 [1]  1  2  3  4  5  6  7  8  9 10

4.1 文字列を扱う際の注意点

文字列のデータを扱うときはクォーテーション("や')で囲う。

z <- c("あ", "いう", "えおか") # これならエラーにならない
z
[1] "あ"     "いう"   "えおか"

クォーテーションで囲まない場合はオブジェクト扱いになる

z <- c(あ, いう, えおか) #これだとエラー(「あ」「いう」「えおか」というオブジェクトを定義していないため)

日本語のオブジェクトに値を代入することもできるが、日本語はエラーの元なのでできるだけ避けたほうがよい

# 「あ」「いう」「えおか」をそれぞれ定義
あ <- "A"
いう <- "IU"
えおか <- "EOKA"

# これならエラーにならない
z <- c(あ, いう, えおか)
z
[1] "A"    "IU"   "EOKA"

4.2 ベクトルとデータ型

1つのベクトルには1つのデータ型のデータしか入れることができない。

onetwothree <- c(1, "1", 2, "二", 3) #全部文字列(chr)になる
onetwothree
[1] "1"  "1"  "2"  "二" "3" 

4.3 ベクトルの要素の取得

LETTERSは大文字のアルファベットが入ったベクトルで、あらかじめ定義されている。

LETTERS
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"

ベクトルの要素を取り出すには、ベクトル[要素の番号] のように指定する。

LETTERS[1] # LETTERSの最初の要素
[1] "A"
LETTERS[1:3] # LETTERSの1~3番目の要素
[1] "A" "B" "C"
LETTERS[c(1, 12, 23)] # LETTERSの1,12,23番号の要素
[1] "A" "L" "W"

5 関数

何らかの処理を行う機能を持ったオブジェクトを関数(function)あるいはメソッド(method)という。

sum(1:100) # sum: 数値ベクトルの合計値を返す
[1] 5050
length(LETTERS) # length: ベクトルの長さ(要素数)を返す
[1] 26

5.1 ヘルプ

関数の使い方など、わからないことがある場合はヘルプを参照すると便利である。

ヘルプは

  1. 調べたい関数名をhelp()に入れて実行する
  2. 関数名の前に?をつけて実行する
  3. (RStudioの場合)関数名にカーソルを置いた状態でF1キーを押す

といった方法で呼び出すことができる。

?sum

6 データフレーム

データフレーム(data frame)とは、Excelのワークシートのようにデータを表形式で保持するためのオブジェクトのこと。

Rでは基本的にデータフレームを使ってデータ分析を行うことになる。

6.1 データフレームの作成

df1 <- data.frame(class = c("B","A","A"),
                  english = c(79, 91, 89),
                  math = c(75, 81, 92))
df1
  class english math
1     B      79   75
2     A      91   81
3     A      89   92

6.2 データフレームの要素の取得

df[行番号,列番号]のように座標を指定して要素を取り出すことができる。

df1[1, ] # 1行目を表示
  class english math
1     B      79   75
df1[ ,2] # 2列目を表示
[1] 79 91 89
df1[2] # 2列目をデータフレームとして表示
  english
1      79
2      91
3      89
df1[1:3, 1:3] # 1~3行の1~3列を表示
  class english math
1     B      79   75
2     A      91   81
3     A      89   92
df1[c(1,3), c(1,3)] # 1,3行の1,3列を表示
  class math
1     B   75
3     A   92

df["列名"]やdf$classのように列を指定することもできる

df1["class"]
  class
1     B
2     A
3     A

取り出したデータフレームの一部を別途代入し、新しいオブジェクト(数値、ベクトル、データフレーム)にすることもできる。

df <- df1[c("english","math")]
df
  english math
1      79   75
2      91   81
3      89   92

6.3 簡単な集計処理の例

6.3.1 mean()

ベクトルの場合はmean()で平均値を計算できる

mean(1:6)
[1] 3.5

6.3.2 colMeans()

colMeans()はデータフレームの各列に対して平均値の計算を行った結果を返す関数である。 (colSums()、rowSums()、rowMeans()なども存在する)

colMeans(df1[, -1]) # 1列目以外の各列(columns)に対する平均を表示
 english     math 
86.33333 82.66667 

7 外部データの読み込み

7.1 (参考)ワーキングディレクトリの設定

ワーキングディレクトリとは、「作業を行うディレクトリ」のこと。 「現在開いているディレクトリ」ということで”current directory”とも呼ばれる。

csvやxlsxのデータを読み込む場合はファイルが存在する場所を指定する必要があるため、意識する必要がある。

(RStudio Cloudではあまり意識しなくてもよいが、クラウドでなく手元のパソコンの中でRStudioを使う際には重要になる)

# 現在開いているディレクトリを調べる(get working directory)
getwd()

ワーキングディレクトリを設定するにはsetwd("作業したいディレクトリのパス")のように書く。

# set working directory
setwd(".")

(なお、"."はUNIX系OSでワーキングディレクトリを指すのでsetwd(".")は何も変化を起こさない)

7.2 csvデータの書き出し

データの書き出しにはwrite.csv()関数を使う。

#データをcsvファイルに書き出す
write.csv(df1, "df1.csv", row.names = FALSE)

なお、row.names = FALSEというオプションの引数(argument)は、行番号をcsvに含めずに保存することを指定するものである。(こうしないと行番号の列を含んだ状態でcsvが保存される)

7.3 csvデータの読み込み

データの読み込みにはread.csv()関数を使う。

#データをcsvファイルから読み込んでdf2という名前にする
df2 <- read.csv("df1.csv")

8 因子(factor)型とデータ型の変換

8.1 因子(factor)型

文字列と似たデータ型で因子(factor)型というものがある。

# 因子(ファクター)
classes <- as.factor(df2$class)
classes
[1] B A A
Levels: A B
str(classes) # str() = structure
 Factor w/ 2 levels "A","B": 2 1 1

str()というデータの内部構造を表示する関数を使うと、classesは因子型であり、値の水準(levels)が"A","B"の2つあり、内部的には2,1,1と数値で保持されていることがわかる。

8.2 データ型の変換

as.factor()と同様にas.character()を使えば文字列型に戻すことができる。

str(as.character(classes))
 chr [1:3] "B" "A" "A"

8.3 (参考) 文字列型の因子型への自動変換

バージョン4.0.0より前のRではデータフレーム作成時(data.frame())やcsvの読み込み時(read.csv())には、文字列型のデータは因子型に自動的に変換する処理がdata.frame()やread.csv()の関数ではデフォルト設定となっていたため、不意に因子型に遭遇することがあった。もし古いRを使っていて自動変換を防ぎたい場合は、stringsAsFactors = FALSEという引数を追加して関数を実行すればよい。

df3 <- data.frame(class = c("B","A","A"),
                  english = c(79, 91, 89),
                  math = c(75, 81, 92),
                  stringsAsFactors = FALSE)
str(df3)
'data.frame':   3 obs. of  3 variables:
 $ class  : chr  "B" "A" "A"
 $ english: num  79 91 89
 $ math   : num  75 81 92

9 (参考)その他のタイプのオブジェクト

Rでデータ分析を行うときは、基本的にベクトルとデータフレームを理解していればいい。

しかし、Rの世界も奥深いので、それらとも異なる形のデータと出会うこともある。本節ではそれらを紹介する。

9.1 リスト

リスト(list)はベクトルやデータフレームなど様々なオブジェクトをまとめることができる、非常に自由度が高いオブジェクトである。

リストの中にリストを内包するようなこともできる。

9.1.1 リストの作成

# リストの作成
list_ex <- list(vector = c("A", "B", "C"),
                df = df1,
                list = list(LETTERS, letters))
list_ex
$vector
[1] "A" "B" "C"

$df
  class english math
1     B      79   75
2     A      91   81
3     A      89   92

$list
$list[[1]]
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"

$list[[2]]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"

9.1.2 リストの要素へのアクセス

要素に名前がついていればlist$要素名で参照できる

# リストの中のdfという要素(データフレーム)の取り出し
list_ex$df
  class english math
1     B      79   75
2     A      91   81
3     A      89   92

要素に名前がついていない場合、要素の番号(list[[i]])を指定して参照する

# リストの中のlistという要素(リスト)の第一要素([[1]])の取り出し
list_ex$list[[1]]
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"

9.2 行列

行列(matrix)は、データフレームと非常に似ているものの、

  1. すべての要素のデータ型が統一されている
  2. 通常、要素は数値で構成される

という特徴を持つ。

9.2.1 行列の作成

行列は基本的にひとつのベクトルを用意して行数(nrow)や列数(ncol)を指定して作成する

# ベクトルから行列を作る場合
M <- matrix(data = c(1:6), nrow = 2, ncol = 3)
M
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

as.matrix()関数でデータフレームを行列にすることもできる。

# データフレームの行列への変換
D <- as.matrix(df1[,2:3])
D
     english math
[1,]      79   75
[2,]      91   81
[3,]      89   92

9.2.2 行列の演算

行列同士であれば%*%という演算子を用いて行列同士の積を計算したりなど、様々な演算が可能になる。

M %*% D
     english math
[1,]     797  778
[2,]    1056 1026

10 (参考)Rの入門向けサイト

10.1 日本語

10.2 英語

11 (おまけ)Pythonで同様の作業を行う場合

本講義の演習はRで行うが、参考として、ここまで学んだ内容に対応するPythonのコードを簡単に紹介する。

Pythonにはベクトルやデータフレームが標準では備わっていないため、通常はNumPy(数値計算・配列)とpandas(データフレーム)という2つの外部ライブラリを使う。

import numpy as np
import pandas as pd

11.1 計算と代入

計算や代入の書き方はRとほとんど同じ。ただし代入の記号は<-ではなく=を使う。

123 + 456
x = 1 + 1  # オブジェクト x に 1+1の演算結果を代入
x          # 中身を表示(スクリプト実行時はprint(x)が必要)

11.2 ベクトル(リスト・NumPy配列)

Rのベクトルに相当するのは、Pythonの標準のリスト(list)や、NumPyの配列(array)である。要素ごとの計算(ベクトル演算)をしたい場合はNumPyの配列を使うのが一般的。

# NumPy配列(Rのc(1, 20, 100)に相当)
y = np.array([1, 20, 100])
y
# 1~10の整数(Rの1:10に相当)
x = np.arange(1, 11)
x

Rと同様、1つの配列には基本的に1つのデータ型しか入らない(数値と文字列が混ざると全体が文字列型になる)。

要素の取り出しは[ ]を使うが、Pythonのインデックスは0始まりである点がRとの大きな違い(Rは1始まり)。

LETTERS = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
LETTERS[0]        # 最初の要素(Rの LETTERS[1] に相当)
LETTERS[0:3]      # 1~3番目の要素(Rの LETTERS[1:3] に相当)
[LETTERS[i] for i in [0, 11, 22]]  # 1,12,23番目の要素

11.3 関数

関数の呼び出し方自体はRとほぼ同じ。

sum(range(1, 101))  # 1~100の合計(Rのsum(1:100)に相当)
len(LETTERS)         # 要素数(Rのlength()に相当)

11.4 データフレーム(pandas)

Rのデータフレームに相当するのはpandasのDataFrameである。列を辞書(dict)形式で指定して作成する。

df1 = pd.DataFrame({
    "class": ["B", "A", "A"],
    "english": [79, 91, 89],
    "math": [75, 81, 92],
})
df1

要素の取得には.iloc[](位置による指定)や.loc[](ラベルによる指定)、列名の指定を使う。

df1.iloc[0]                  # 1行目を表示(Rの df1[1, ] に相当)
df1.iloc[:, 1]                # 2列目を表示(Rの df1[ ,2] に相当)
df1[["english", "math"]]      # 複数列をデータフレームとして表示

平均値の計算には.mean()メソッドを使う(RのcolMeans()に相当)。

df1[["english", "math"]].mean()

11.5 csvデータの読み書き

pandasではto_csv()・read_csv()を使う(Rのwrite.csv()・read.csv()に相当)。

df1.to_csv("df1.csv", index=False)   # 書き出し(index=FalseはRのrow.names=FALSEに相当)
df2 = pd.read_csv("df1.csv")          # 読み込み

11.6 因子(factor)型 → カテゴリ型

Rの因子(factor)型に相当するのは、pandasのcategory型である。

classes = df2["class"].astype("category")
classes
classes.cat.codes  # 内部的な数値コード(Rのas.integer()に相当)

11.7 (参考)辞書・NumPy配列(行列)

Rのリストに近いものとしてPythonには辞書(dict)がある。また、Rの行列に相当するのは2次元のNumPy配列である。

list_ex = {
    "vector": ["A", "B", "C"],
    "df": df1,
    "list": [LETTERS, [c.lower() for c in LETTERS]],
}
list_ex["df"]        # 辞書のdfという要素の取り出し(Rの list_ex$df に相当)
list_ex["list"][0]   # listという要素の第一要素(Rの list_ex$list[[1]] に相当)
M = np.array([[1, 3, 5], [2, 4, 6]])  # Rのmatrix(1:6, nrow=2, ncol=3)に相当
D = df1[["english", "math"]].to_numpy()    # データフレームをNumPy配列に変換
M @ D                                  # 行列の積(Rの %*% に相当)