2 分析環境の構築

Author
Affiliation

佐久間 智広

神戸大学大学院経営学研究科

Published

2024/04/15

Modified

2024/06/24

0.1 前回やったこと

  • 授業の概要
  • 社会調査とは?
  • 社会調査の流れ
  • 分析ツールRとR Studio
    • インストール

0.2 RとRStudio (復習)

0.2.1 R

Rは,統計分析に強みを持つコンピュータ言語です(統計ソフトと呼ぶこともあるけど,厳密な違いはよくわかりません)。

0.2.2 Rstudio

Posit社の提供する統合開発環境(IDE)。Rを便利に使うための装備品

開いて操作するのはRstudio

1 分析のための準備

1.1 プロジェクト

1.1.1 プロジェクトの作成

  • RStudioはそのままでも使い始められますが,データの保存場所を指定したり,スクリプトの保存場所を指定したりといった「各自のパソコン環境に応じた」コードを打つ必要が出てきます。
  • プロジェクトは,データやコード,そこから作った図表や文書などを一つのまとまりとして管理する機能です。
    • これを設定しておくことで,例えばこの授業に関連する各種ファイルが一つに纏まります
  • さらに重要なこととして,プロジェクト内でデータの処理が完結するので,みんな同じコードで動かすことができます

1. New Project

1. New Project

2. New Directory

2. New Directory

3.Quarto Project

3.Quarto Project

4. 名前と保存場所を決める

4. 名前と保存場所を決める

1.1.2 dataフォルダの作成

プロジェクト内に先にこれから使うデータの保存先を作っておきます。

  1. 画面の右下「Files」タブの「New Folder」ボタンを押す
  2. dataという名前のフォルダを作る


1.1.3 プロジェクトを開く

  • Rは多分最後に開いたプロジェクトを自動で開いてくれます。
  • エラーやフリーズなどで固まったらそうならないこともあるかも。
  • この授業のプロジェクトが開いているかどうかは,画面の右上端の方を見ればわかる
  • プロジェクト開いてなかったら画面右上端のプロジェクトメニューから開く

1.2 スクリプトファイル

Rなどの統計ソフトを使う利点の一つは,再現性

  • 例えばエクセルでは,どんな順番にどんな処理をしたのかは記録されません。

  • Rなどのプログラミングソフトを使うと,操作した内容と順番をコードの形で記録しておけます。

  • コードを記録したファイルを「スクリプトファイル」と言います。

スクリプトファイルは,画面左上にある緑の「+」アイコンを押して,「R Script」を選択することで新規作成できます。

「第2回」という名前をつけて保存してみてください。

  • 画面右上の💾マーク,もしくは
  • Control + s (Macなら⌘ + s)

R Scriptを選択

R Scriptを選択

4分割の左上に白紙が出てくる

4分割の左上に白紙が出てくる

2 R(Rstudio)の操作


  • 右側上が,読み込んだデータなどが表示される場所
  • 右下が,データやファイルが表示されるところ
    • パッケージや作成した図表も右下に出てくる
  • 左下がR本体
    • 分析結果等が表示される
  • (これから開く)左上が,プログラムを打つところ
Tip

初期状態の説明です。配置は自由に変えられます。ただし,授業の説明上少なくともこの授業の間は配置を変えないでほしい。


スクリプトファイルを作成すると(初期状態では)画面の左上に白紙のファイルが出てきます。ここにコマンドを打ち込んでいきます。

例えば以下のコマンドを打って実行すると,画面の左下にあるRの画面に実行結果が出ます。

Code
1 + 1
[1] 2


実行の仕方は,実行したい行を選択→Ctrl + Enter (Macでは⌘ + Enter)


左下の画面(console)に直接 1+1 と打ち込んでも同じ結果が出ますが,後で記録に残らないので,コードはスクリプト画面に書く,左下は結果の表示だけ,と使い分けた方が良いです。

2.1 授業内課題1

Rスクリプトに以下の内容を打ち込んでください。スクリプト右上のRunボタンを押すか,Control + Enter (Macの場合は⌘+Enter)で実行してください。

Code
1 + 3
2 * 4
1
足し算
2
掛け算
[1] 4
[1] 8

3 Rプログラミングの基礎

このパートは森知晴先生(立命館大学総合心理学部)のサイト (卒業論文のためのR入門) 及び今井耕介先生(Harvard University / 東京大学)の著書 (社会科学のためのデータ分析入門)等を参考にしています。

3.1 計算

簡単な計算は,以下の通り

Code
1 + 1 
[1] 2
Code
2 * 6 #掛け算は*
[1] 12
Code
2^4 #累乗は^
[1] 16

3.2 オブジェクト

Rでは情報を自分で名前をつけたオブジェクトとして保存できます。Rstudioでは,保存されたオブジェクトは右上のEnvironmentと言うところに表示されます。

Code
x <- 3
y <- 5
z <- x * y

<-」(不等号<とマイナス- )の左はオブジェクト,右はその中身を表します。なので,「xという名前のオブジェクトに3を入れる」という指示をしています。これを実行すると画面右上にxというオブジェクトが表示されるはずです。xの中身を確認するには,そのオブジェクトの名前(今回の場合z)を打つと良いです。

Code
z
[1] 15

一度オブジェクトを作っておけば,それを使った計算も可能です。

  • 例えば,先ほど保存したzを使って,
Code
z + 3 
[1] 18
Code
y^2
[1] 25

文字列でもオブジェクトになります(その場合” “で囲みます)

Code
univ <- "Ritsumeikan"
univ
[1] "Ritsumeikan"

これは数字じゃないので計算はできません

Code
univ + 3 
Error in univ + 3: non-numeric argument to binary operator

3.3 ベクトル・行列

3.3.1 ベクトル

複数の数値の並び(ベクトル)をオブジェクトとすることもできます。

Code
vec <- c(1, 2, 3, 4, 5)
vec
[1] 1 2 3 4 5

ベクトルごと足し算とか掛け算とかもできます

Code
vec+2
vec*2
1
各数字に2足す
2
各数字に2かける
[1] 3 4 5 6 7
[1]  2  4  6  8 10

3.3.2 Matrix

縦×横の行列も作れます。matrixという名前です。

Code
mat <- matrix(c(435, 165, 265, 135), ncol = 2, byrow = TRUE)
mat
1
ncol=2は列の数, byrow=TRUEは,横に並べるということ。
     [,1] [,2]
[1,]  435  165
[2,]  265  135

例えばbyrow=FALSE にすると縦に並ぶ

Code
mat2 <- matrix(c(435, 165, 265, 135), ncol = 2, byrow = FALSE)
mat2
     [,1] [,2]
[1,]  435  265
[2,]  165  135

縦横の名前をつけると

Code
rownames(mat) <- c("行1", "行2")
colnames(mat)<- c("列1", "列2")
mat
1
rownamesはrow(行)の名前,colnamesはcolumn(列)の名前
    列1 列2
行1 435 165
行2 265 135

中に入っているものが全て数字なら,計算が可能です。

Code
mat2 <- mat + 3
1
全ての要素に3を足した新しいmatrixをmat2と名付けて保存

3.4 関数

Rを使う上で最も重要なのが関数です。足し算引き算とかよりも高度な命令は関数を使って行います。先ほど作ったベクトル(vec)を使って

Code
mean(vec)
min(vec)
max(vec)
1
平均を計算する関数
2
最小値を計算する関数
3
最大値を計算する関数
[1] 3
[1] 1
[1] 5


上にあるように,Rのコマンドは基本的には,やること(実行する対象)という構造になっている。

  • mean(vec)は,

    • やることが平均(mean)

    • 対象がvec

3.5 データフレーム

オブジェクトの中で重要な形式として,データフレームがあります。これは,縦方向に観測値を、横方向に変数を並べたデータを言います。

Code
age <- c(18, 21, 22, 23, 34)
gender <- c("female", "male", "male", "female", "female")
dframe <- data.frame(age, gender)
dframe
1
年齢のベクトル
2
性別のベクトル
3
二つのベクトルをdframeという名前のデータフレームに

エクセル等のデータを読み込んで分析する場合は,このデータフレーム形式です。

データフレームの中の特定の列を指定する場合は,「データフレーム名$列名

Code
dframe$gender
[1] "female" "male"   "male"   "female" "female"

データフレーム内の一部を取り出して関数を使って計算できます

Code
mean(dframe$age)
min(dframe$age)
median(dframe$age)
1
平均はmean
2
最小値(最大値)はmin(max)
3
中央値はmedian
[1] 23.6
[1] 18
[1] 22

3.6 授業内課題2

  1. 20点,35点,40点,70点,95点という5人の成績を示したテストの点数 を表すベクトルを作成してください。名前はtest_scoreとしてください
  2. 平均点を求めてください
    • (ヒント) mean()関数のに先に作成した点数のベクトルを代入
  1. 学生の人数をNとする新たな変数を作成してください
    • (ヒント) length()関数はベクトルの次元を返します。
Code
test_score <- c(20, 35, 40, 70, 95) 
mean(test_score)
N <- length(test_score)
1
test_scoreという名前で,ベクトルc(20, 35, 40, 70, 95)を保存 ( オブジェクト参照 )
2
1で作成したベクトルの平均を取る (関数)
3
Nという名前で,1で作成したベクトルの長さ(次元)を計算したものを保存(1と2の組み合わせ)
[1] 52

3.7 引数

引数 (arguments)とは

関数に受け渡す値を指し,例えば三つの引数を取る関数 example_function(A, B, C)に関して,Aを第一引数,Bを第二引数,Cを第三引数と呼ぶ。関数ごとに引数の数や指定の仕方は異なる。

関数の中には(というかほとんどが)複数の引数を持ちます。

Code
r <- seq(from = 0.1, to = 0.2, by = 0.01) 
  • seq()は連続した数を作る関数。
  • 一つ目の引数 from = 0.1から,二つ目の引数to = 0.2まで,三つ目の引数by = 0.1ごとに数字を並べる

ちなみにRの関数は引数の定位置を持っていて,その順番に従った場合,fromやtoといった指示は省略可能です。なので以下も全く同じ結果になります。

Code
r <- seq(0.1, 0.2, 0.01)

定位置以外の順番でやる場合は,指示が必要です。以下も同じです。

Code
r <- seq(to = 0.2, by = 0.01, from = 0.1) 

3.8 プログラムのスペースと改行

3.8.1 スペース

Rは半角スペースを無視します。なので,以下は全部同じです

Code
x <- c(1, 2, 3) + 3^2
x<-c(1,2,3)+3^2

でも,可読性のため,<-の前後や2項演算子(+とかーとか),あとコンマの後などには半角スペースを入れることが一般的です。

日本人がプログラムを打つときに失敗しがちなのが,全角スペースを入れてしまうことです。全角スペースはひらがなや漢字など同じ文字として認識されるので,全角スペースを入れるとエラーになります。半角スペース二つと全角スペースは,ぱっと見見分けがつかないので注意!


3.8.2 改行

Rではかっこ()やコンマ(,)の後など,コードの切れ目で改行しても動作します。特に()何重にもなる場合,改行したほうが見やすいかもしれません。例えば,上でやった行列の作成コマンド

Code
mat <- matrix(c(435, 165, 265, 135), ncol = 2, byrow = TRUE)

は,以下のように書いても全く同じように動作します。

Code
mat <- matrix(
  c(435, 165, 265, 135), 
  ncol = 2, 
  byrow = TRUE
  )

あまり改行しすぎるのもかえって読みにくいかもしれません。自分が見やすいように程よく改行してください。

Code
mat <- 
  matrix(
  c(
    435,
    165,
    265,
    135
    ), 
  ncol=2, 
  byrow=TRUE)

4 パッケージ


より高度なことをしたり,同じことをより簡単にしたりするために追加の機能を足すことができます。

この追加の機能をパッケージと言います。

RがスマートフォンのOSのようなもので,パッケージはアプリのようなもの。

Rはスマホ

Rはスマホ

パッケージはアプリ

パッケージはアプリ

4.1 パッケージのインストールと利用

4.1.1 インストール

Rのプログラムを格段にわかりやすくするパッケージであるtidyverseを使う準備をしてみます。パッケージは,最初に使う時にはインストールする必要があります(これは1回だけ。App Storeでアプリをとるような感じ)。

Code
install.packages("tidyverse")

4.1.2 利用

パッケージを使う時には,分析ファイルを実行する最初の段階で以下のコマンドを使います(スマートフォンにすでに入っているアプリを開くイメージ)。

Code
library(tidyverse)

後で使うので,以下のパッケージも読み込んでおきます(みなさんは先にインストールしてください)。

Code
library(magrittr)
library(googledrive)

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

pacmanパッケージのpacman:::p_load()というコマンドを使うと

  • 授業で使うパッケージがインストールされていたらそのパッケージを読み込み(つまりlibrary()コマンドを実行して)
  • インストールされていなかったら,インストールした後に読み込み(install.packages()library()

をしてくれます。新しいパッケージを使うたびにインストールしてもらう手間が省けるので,授業ではlibrary()ではなくpacman:::p_load()を使います。

そのための準備として,左下のconsoleに以下のコマンドを打ち込んでください

Code
install.packages('pacman')

pacmanがない時

  1. 既に入ってるパッケージを使う場合は問題ない
Code
library(tidyverse)
  1. 入ってないパッケージを使おうとすると,一回エラーが出る
Code
library(なんか)
Error in library(なんか): there is no package called 'なんか'

そこで

Code
install.packages('なんか')
library(なんか)

pacmanがある時

既にパッケージが入ってるか入ってないかに関わらず(入ってなかったら自動でインストールしてくれる),しかも複数のパッケージを同時に呼び出せる

Code
pacman:::p_load(tidyverse,なんか)

4.3

5 データの読み込み


前回はデータを下記のように手打ちしました。

Code
age <- c(18, 21, 22, 23, 34) #年齢のベクトル
gender <- c("female", "male", "male", "female", "female")#性別のベクトル
dframe <- data.frame(age, gender)

しかし,アンケートデータや,企業の会計データ等をこのように手打ちするのは現実的ではありません。エクセル等で集計されたデータを読み込むのが一般的です。

  • 例えばgoogle formsでアンケートを作成したら,googleスプレットシート(googleのエクセルみたいなもの)に自動的に集計されます。

以下では,エクセルファイルを読み込む方法についてまとめています。

5.1 準備

  1. 授業ウェブサイトの上のバーからDataに進み,第2回の「tests」データをダウンロード
  2. さっき作ったプロジェクトフォルダ内のさっき作ったdataフォルダに入れてください

5.2 前提

エクセルで列が変数,行が観測となるようにデータを作られていることを想定します。まず,これを表計算ソフト上でcsv形式でプロジェクト内のdataフォルダに保存します1


dataフォルダに入れたファイルを読み込むには,csv形式なら,read_csv("ファイル名") もしくはread.csv("ファイル名")を使います2。ここでは,tests.csvと言う名前のデータを,testsと言う名前で読み込んでいます。

Code
tests <- read.csv("data/tests.csv")

読み込んだデータを見てみます。最初のいくつかだけが表示されるhead(データ名)コマンドが便利です。

Code
head(tests)

データをグループで共有するときなどに便利です。

  1. Dropbox上のファイルを共有,リンクを取得
  2. リンクの最後 dl=0dl=1に変えて,read_csv (もしくは read.csv)コマンドで読み込めます
Code
z2 <- read_csv("https://www.dropbox.com/s/6x344sfra54mcco/tests.csv?dl=1")

データをグループで共有するときなどに便利です。

  1. google driveに保存したデータを共有(リンクを知っている人全員)に設定

  2. リンクurl(https://drive.google.com/file/d/*********/view?usp=sharing)の********の部分がidなので,その部分をメモしておく。

  3. 下記の通り,idを定義して,下記の通りのコードを実行すると,目当てのファイルを取り込める。

    Code
    id = "1x7426qSraIRdcbgW3a0F8vMF181Q_DHF"
    
    z = read_csv(sprintf("https://docs.google.com/uc?id=%s&export=download", id))

6 データの処理

分析に入る前に必要そうな処理を紹介します。

6.1 新しい変数の作成

現在のデータにはない,4教科の合計点が欲しい。新しい変数はmutate()で作る。ただし,mutateだけだと,変数を作ってどこにも保存してくれないので,保存場所を指定する必要があります。今回は元のデータに付け足す形で作ります。

Code
tests <- tests %>% 
  mutate(all = math + japanese + history + physics)

tests に testsの中のデータを使って作った新しい変数を入れる。

Code
tests

7 参考情報

7.1 サイト紹介

Rのコマンドやパッケージは無数にあります。いつも使うもの以外は覚えてられません。

でも大丈夫。ネット上にはさまざまなコマンドの紹介やエラーへの対処法が落ちています。

卒業論文のためのR入門

  • 森知晴先生(立命館大学総合心理学部)のサイト
  • インストール方法から学部卒論程度の分析までの使い方を詳しく説明してくれています。
  • 困ったらまずここ

私たちのRR for Political Science

  • 宋財泫先生(関西大学)と矢内勇生先生(高知工科大学)のサイト。
  • 森先生のやつより細かかったり詳しかったりする。

ここに載っていない場合は,「やりたいこと + R」でググると手っ取り早い

7.2 エラーについて

プログラミングをやってて一番むかつき,嫌いになる要因はエラーメッセージ

  • いわゆるバグがある状態

できることは

  1. エラーメッセージをちゃんと読むこと
  2. エラーメッセージをそのままググること

エラーが出てたら99.99%自分が悪い(パソコンは悪くない)」ということを自覚すること

7.3 参考:Base RとTidyverse

Rには分析に必要なさまざまな機能が装備されています。

しかし,

  • 同じことをもっとわかりやすく書ける機能
  • 新しい分析手法の開発に合わせた新しい関数

などは,パッケージとして提供されます。その中でもRの操作性全般にわたる改善を行うパッケージがtidyverseです。

  • その名の通りtidyという理念のもとで作られたuniverse的な何か

tidyverseを使ったコードはいわゆる「モダンな」コードと呼ばれたりします

実際その便利さは,BaseRを知ってないと実感できないですが,この授業では特に断りなくtidyverseの方法を中心に構成しています。

Caution

ネットで検索すると,同じ処理でもbaseRを使った方法とtidyverseを使った方法が紹介されることがあります。どっちを使っても,また2つの方法が混ざってても基本的に問題はありません。

7.4 パイプ演算子

  • Tidyverseの一番わかりやすい特徴は,パイプ演算子を使ったプログラム記述です

tidyversemagrittrパッケージのパイプ演算子を使うことで,同じコマンドをより読みやすくできます。これからは断りなくこれらのパッケージの機能を使います。

7.4.1 例1

読み込んだデータtestの算数(math)の平均点を求めたい。普通にやると4.4 関数にあるように,データフレーム名$列名で指定するので

Code
mean(tests$math)


パイプ演算子%$%を使うと同じコマンドが以下のようになる

Code
tests %$%
  mean(math)

これだとあまり何がいいのかわかりませんが,複数の変数を指定したいときなど,いちいちデータフレーム名を指定しなくて良いので便利です。


7.4.2 例2

以下は(1)testデータを使って,(2)数学の点数と他の点数の関係を分析(lm)した上で,(3)その結果を表示する(summary)もの。

Code
summary(lm(math ~ japanese + physics ,data = tests))

日本語の順番と,コマンドの構造が反対 (結果を表示する→分析内容→データ)


全く同じことをパイプ演算子を使うと,(1) testsデータで, (2)分析をして, (3)結果の要約を表示する,という思考の順番で書けます。

Code
tests %$%
  lm(math ~ japanese + physics) %>% 
  summary()

命令が複雑になる程効果が実感できます。

ちなみに%$%は,使うデータを指定するのに使います。%>%はコマンドの結果を次のコマンドに渡すのに使います。


ただ,最近Base Rの中でも同じような機能が実装されました(%>%の代わりに|>)。これらは全部同じこと

Code
summary(lm(math ~ japanese + physics ,data = tests))

tests %$%
  lm(math ~ japanese + physics) %>% 
  summary()


lm(math ~ japanese + physics, data = tests) %>% 
  summary()


lm(math ~ japanese + physics, data = tests) |>
  summary()

Footnotes

  1. エクセル形式で保存されたファイルも読み込めますが,余計な情報が入っていないcsvファイルの方がトラブルが少ない?↩︎

  2. read_csv()tidyverseパッケージのコマンドです。こっちの方が色々都合が良いですが,ファイルがとても大きいとかでなかったらどっちを使ってもあまり変わりありません。↩︎