Rをもうちょっと知る@大湾ゼミ(学部)夏合宿

北川梨津

早稲田大学大学院経済学研究科

2020年9月8日

今日のトピック

目標:Rの便利なツールを概観する.

お知らせ

データサイエンス研究会(Twitter:@desaikenkyukaiオンライン講演会のお知らせ.

タイトル:データサイエンス分野での学生起業

講師:井本望夢 氏
滋賀大学データサイエンス学部在学.
データ分析のスタートアップ企業,合同会社「mitei」を起業.

日時:9月24日(木)16:00 ~ 18:00

(https://www.nikkei.com/article/DGXMZO63350260S0A900C2LKA000/)

Rの歴史

参照

History and Overview of R, R Programming for Data Science

RとRStudio

参照

Interview with J.J. Alaire

新型コロナ対策で有名になった西浦博教授

こんな指摘も

Rと他のソフトウェア

Rユーザは稼ぐ…???笑

日経 xTECH独自調査:日本経済新聞

日経 xTECH独自調査:日本経済新聞

なお、上記は最低15人が利用している言語の平均年収である。この人数制限を設けなければ、平均年収が最も高いプログラミング言語は「R」だった。その額は907.1万円に達する。2位は「アセンブリ言語」(875.0万円)、3位は「FORTRAN」(716.7万円)だった。 RやFORTRANは統計解析や科学技術計算によく利用される。メジャーな言語とは言えないが、データ分析や数値解析のスペシャリストは、高い報酬を得ていることがうかがえる。

日経電子版

Statswars

Kieran Healyのブログより.

絶えない論争 1

絶えない論争 2

コードの比較

回帰分析.

R

df1 <- read.csv("hogehoge.csv")
result <- lm(Y ~ X1 + X2, data = df1)
summary(result)

Python

import pandas as pd
import statsmodels.api as sm
df1 = pd.read_csv("hogehoge.csv")
df1['intercept'] = 1
reg1 = sm.OLS(endog=df1['Y'], exog=df1[['intercept', 'X1', 'X2']], missing='drop')
results = reg1.fit()
print(results.summary())

Stata

import delimited "/Users/.../hogehoge.csv" 
reg Y X1 X2, robust

主観的な比較

言語 前処理 計量分析 機械学習 汎用性 費用 教材の豊富さ
R
Python
Stata × ×

Rのコミュニティ

Rはコミュニティが充実している.

Minimal Reproducible Example

エラーになってどうしたらいいかわからない場合に,プラットフォームで質問するときは,Minimal Reproducible Exampleを提示するのがマナー(minimal working exampleとも呼ぶ).

Minimal reproducible exampleとは:

ようにした自己完結なコードの例のこと.Minimal reproducible exampleと提示しないと,そもそも誰も答えてくれないことが多いし,自分自身も時間の無駄になることが多い.

悪い例

I tried to do regression with lm() function, but I got an error. What’s wrong? What should I do?

Can you provide a self-contained, minimal working example?

良い例

I tried to do regression with lm() function, but I got an error, which says Error in eval(predvars, data, env) : object 'speed' not found. I used the preset dataset, cars. And here’s the codes:

mydata <- cars
model <- lm(dist ~ speed)

You need to specify which data frame you’re using for lm() with its argument data. So, it should be something like:

mydata <- cars
model <- lm(dist ~ speed, data = mydata)

Rの良いところ

おすすめ

R Markdown

R Markdownはデータサイエンスのためのauthoring frameworkを提供する. 1つのR Markdownファイルで,

R Markdownは,プログラミングコードとナラティブ(文章による説明)の両方が同じドキュメントにあり,結果がソースコードから自動的に生成されるため,再現性(reproducibility)を確保できる設計になっている.

R Markdownでつくれるファイルの種類

ドキュメント

スライド

PDFについて

R Markdownの便利な仲間たち

便利な拡張パッケージ.

Shiny application

ShinyはRからインタラクティブなwebアプリケーションを作成できるパッケージ.

インタラクティブなグラフ

Plotlyというパッケージで簡単にインタラクティブなグラフを作成できる.

library(plotly)

mydata <- read.csv("Vfirm_sample.csv")
mydata$gender <- ifelse(mydata$sex == 1, "女性", "男性")
mydata$lwage <- log(mydata$total_pay)

fig <- mydata %>%
  plot_ly(
    x = ~tenure,
    y = ~lwage,
    color = ~gender,
    text = ~gender,
    hoverinfo = "text",
    opacity=0.5,
    frame = ~year,
    type = 'scatter',
    mode = 'markers'
  )

fig
mydata$job_type <- factor(mydata$job_type)

fig2 <- mydata %>%
  plot_ly(
    x = ~tenure,
    y = ~lwage,
    color = ~job_type,
    text = ~job_type,
    hoverinfo = "text",
    opacity=0.5, 
    frame = ~year,
    type = 'scatter',
    mode = 'markers'
  )

fig2

まとめ

Rではいろいろなことができる.そして,教材も充実している.

その他

Programming efficiency

“[I] work hard to be lazy.”
— Yuihui Xie

効率性

\(Q\)を単位努力量として,\(W\)を仕事量とすると,効率性\(\eta\)は次のように定義される.

\[ \eta = \frac{W}{Q}. \]

1. Algorithmic efficiency

2. Programmer pruductivity

参照

Efficient R programming

不自然なエラーが続くとき

おまけ

Rでは音楽もつくれます.

library("dplyr")
library("audio")
notes <- c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10)
pitch <- "D D E D G F# D D E D A G D D D5 B G F# E C5 C5 B G A G"
duration <- c(rep(c(0.75, 0.25, 1, 1, 1, 2), 2),
              0.75, 0.25, 1, 1, 1, 1, 1, 0.75, 0.25, 1, 1, 1, 2)
bday <- data_frame(pitch = strsplit(pitch, " ")[[1]],
                   duration = duration)

bday <-
  bday %>%
  mutate(octave = substring(pitch, nchar(pitch)) %>%
           {suppressWarnings(as.numeric(.))} %>%
           ifelse(is.na(.), 4, .),
         note = notes[substr(pitch, 1, 1)],
         note = note + grepl("#", pitch) -
           grepl("b", pitch) + octave * 12 +
           12 * (note < 3),
         freq = 2 ^ ((note - 60) / 12) * 440)

tempo <- 120
sample_rate <- 44100

make_sine <- function(freq, duration) {
  wave <- sin(seq(0, duration / tempo * 60, 1 / sample_rate) *
                freq * 2 * pi)
  fade <- seq(0, 1, 50 / sample_rate)
  wave * c(fade, rep(1, length(wave) - 2 * length(fade)), rev(fade))
}

bday_wave <-
  mapply(make_sine, bday$freq, bday$duration) %>%
  do.call("c", .)

play(bday_wave)

(https://stackoverflow.com/questions/31782580/how-can-i-play-birthday-music-using-r)