####次のURLにアクセスすると、R言語のランタイムが設定されているColaboratoryが開きます。
- 「編集」 -> 「ノートブックの設定」を開くと、「ランタイムのタイプ」欄が「R」になっています。
- また、「ハードウェア アクセラレータ」欄で「GPU」を選択することができます。
###( 参考にしたwebページ )
たびたび、Google ColaboratoryでのPythonの使用法を紹介してきましたが、Rも使えるようになったようです。
通常のGoogle ColaboratoryからはRを使えません、、、たぶん。
正式な対応かどうか不明ですが、次のリンクを開くとRを実行できます。
#使ってみた。
qiitaにcopy&pasteするにあたり、以下の手順を踏みました。
1. ColaboratoryからGUI操作で、「ファイル」 -> 「.ipynbをダウンロード」を実行
2. ローカルPCのTerminalで、% jupyter notebookを実行して、Jupyter Notebookをブラウザで起動
3. ローカルのブラウザで開かれたJupyter Notebookで、「1」でダウンロードしたipynbファイルを選択して、開く
4. Jupyter Notebookで、「ファイル」 -> 「名前を付けてダウンロード」 -> 「Markdown(.md)」を選択して実行
5. ローカルPCに、zipファイルができる。(画像ファイルと、markdown書式のテキストファイルが格納されている)
6. Qiitaに、markdowsをcopy&pasteし、画像ファイルをアップロードする。
この記事で動かしたRのコードを、上記のGoogle Colaboratory上で実行してみました。
安井 翔太(著)『効果検証入門』(技術評論社)を読んでいて、Rのパイプ関数(%>%)が使い勝手が良さそうだったので、写経して使ってみた。
実行したコードは、安井 翔太(著)『効果検証入門』(技術評論社)に掲載されているものです。
library(tidyverse)
── [1mAttaching packages[22m ─────────────────────────────────────── tidyverse 1.3.0 ──
[32m✔[39m [34mggplot2[39m 3.3.2 [32m✔[39m [34mpurrr [39m 0.3.4
[32m✔[39m [34mtibble [39m 3.0.4 [32m✔[39m [34mdplyr [39m 1.0.2
[32m✔[39m [34mtidyr [39m 1.1.2 [32m✔[39m [34mstringr[39m 1.4.0
[32m✔[39m [34mreadr [39m 1.4.0 [32m✔[39m [34mforcats[39m 0.5.0
── [1mConflicts[22m ────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[39m [34mdplyr[39m::[32mfilter()[39m masks [34mstats[39m::filter()
[31m✖[39m [34mdplyr[39m::[32mlag()[39m masks [34mstats[39m::lag()
iris$Sepal.Length
<style>
.list-inline {list-style: none; margin:0; padding: 0}
.list-inline>li {display: inline-block}
.list-inline>li:not(:last-child)::after {content: "\00b7"; padding: 0 .5ex}
</style>
<ol class=list-inline><li>5.1</li><li>4.9</li><li>4.7</li><li>4.6</li><li>5</li><li>5.4</li><li>4.6</li><li>5</li><li>4.4</li><li>4.9</li><li>5.4</li><li>4.8</li><li>4.8</li><li>4.3</li><li>5.8</li><li>5.7</li><li>5.4</li><li>5.1</li><li>5.7</li><li>5.1</li><li>5.4</li><li>5.1</li><li>4.6</li><li>5.1</li><li>4.8</li><li>5</li><li>5</li><li>5.2</li><li>5.2</li><li>4.7</li><li>4.8</li><li>5.4</li><li>5.2</li><li>5.5</li><li>4.9</li><li>5</li><li>5.5</li><li>4.9</li><li>4.4</li><li>5.1</li><li>5</li><li>4.5</li><li>4.4</li><li>5</li><li>5.1</li><li>4.8</li><li>5.1</li><li>4.6</li><li>5.3</li><li>5</li><li>7</li><li>6.4</li><li>6.9</li><li>5.5</li><li>6.5</li><li>5.7</li><li>6.3</li><li>4.9</li><li>6.6</li><li>5.2</li><li>5</li><li>5.9</li><li>6</li><li>6.1</li><li>5.6</li><li>6.7</li><li>5.6</li><li>5.8</li><li>6.2</li><li>5.6</li><li>5.9</li><li>6.1</li><li>6.3</li><li>6.1</li><li>6.4</li><li>6.6</li><li>6.8</li><li>6.7</li><li>6</li><li>5.7</li><li>5.5</li><li>5.5</li><li>5.8</li><li>6</li><li>5.4</li><li>6</li><li>6.7</li><li>6.3</li><li>5.6</li><li>5.5</li><li>5.5</li><li>6.1</li><li>5.8</li><li>5</li><li>5.6</li><li>5.7</li><li>5.7</li><li>6.2</li><li>5.1</li><li>5.7</li><li>6.3</li><li>5.8</li><li>7.1</li><li>6.3</li><li>6.5</li><li>7.6</li><li>4.9</li><li>7.3</li><li>6.7</li><li>7.2</li><li>6.5</li><li>6.4</li><li>6.8</li><li>5.7</li><li>5.8</li><li>6.4</li><li>6.5</li><li>7.7</li><li>7.7</li><li>6</li><li>6.9</li><li>5.6</li><li>7.7</li><li>6.3</li><li>6.7</li><li>7.2</li><li>6.2</li><li>6.1</li><li>6.4</li><li>7.2</li><li>7.4</li><li>7.9</li><li>6.4</li><li>6.3</li><li>6.1</li><li>7.7</li><li>6.3</li><li>6.4</li><li>6</li><li>6.9</li><li>6.7</li><li>6.9</li><li>5.8</li><li>6.8</li><li>6.7</li><li>6.7</li><li>6.3</li><li>6.5</li><li>6.2</li><li>5.9</li></ol>
head(diamonds)
carat | cut | color | clarity | depth | table | price | x | y | z |
---|---|---|---|---|---|---|---|---|---|
<dbl> | <ord> | <ord> | <ord> | <dbl> | <dbl> | <int> | <dbl> | <dbl> | <dbl> |
0.23 | Ideal | E | SI2 | 61.5 | 55 | 326 | 3.95 | 3.98 | 2.43 |
0.21 | Premium | E | SI1 | 59.8 | 61 | 326 | 3.89 | 3.84 | 2.31 |
0.23 | Good | E | VS1 | 56.9 | 65 | 327 | 4.05 | 4.07 | 2.31 |
0.29 | Premium | I | VS2 | 62.4 | 58 | 334 | 4.20 | 4.23 | 2.63 |
0.31 | Good | J | SI2 | 63.3 | 58 | 335 | 4.34 | 4.35 | 2.75 |
0.24 | Very Good | J | VVS2 | 62.8 | 57 | 336 | 3.94 | 3.96 | 2.48 |
qplot(carat, price, data = diamonds, colour = clarity)
qplot(carat, data = diamonds, geom = "density", colour = cut)
csv_url = "http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv"
library("tidyverse")
── [1mAttaching packages[22m ─────────────────────────────────────── tidyverse 1.3.0 ──
[32m✔[39m [34mggplot2[39m 3.3.2 [32m✔[39m [34mpurrr [39m 0.3.4
[32m✔[39m [34mtibble [39m 3.0.4 [32m✔[39m [34mdplyr [39m 1.0.2
[32m✔[39m [34mtidyr [39m 1.1.2 [32m✔[39m [34mstringr[39m 1.4.0
[32m✔[39m [34mreadr [39m 1.4.0 [32m✔[39m [34mforcats[39m 0.5.0
── [1mConflicts[22m ────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[39m [34mdplyr[39m::[32mfilter()[39m masks [34mstats[39m::filter()
[31m✖[39m [34mdplyr[39m::[32mlag()[39m masks [34mstats[39m::lag()
email_data <- read_csv(csv_url)
[36m──[39m [1m[1mColumn specification[1m[22m [36m────────────────────────────────────────────────────────[39m
cols(
recency = [32mcol_double()[39m,
history_segment = [31mcol_character()[39m,
history = [32mcol_double()[39m,
mens = [32mcol_double()[39m,
womens = [32mcol_double()[39m,
zip_code = [31mcol_character()[39m,
newbie = [32mcol_double()[39m,
channel = [31mcol_character()[39m,
segment = [31mcol_character()[39m,
visit = [32mcol_double()[39m,
conversion = [32mcol_double()[39m,
spend = [32mcol_double()[39m
)
summary(email_data)
recency history_segment history mens
Min. : 1.000 Length:64000 Min. : 29.99 Min. :0.000
1st Qu.: 2.000 Class :character 1st Qu.: 64.66 1st Qu.:0.000
Median : 6.000 Mode :character Median : 158.11 Median :1.000
Mean : 5.764 Mean : 242.09 Mean :0.551
3rd Qu.: 9.000 3rd Qu.: 325.66 3rd Qu.:1.000
Max. :12.000 Max. :3345.93 Max. :1.000
womens zip_code newbie channel
Min. :0.0000 Length:64000 Min. :0.0000 Length:64000
1st Qu.:0.0000 Class :character 1st Qu.:0.0000 Class :character
Median :1.0000 Mode :character Median :1.0000 Mode :character
Mean :0.5497 Mean :0.5022
3rd Qu.:1.0000 3rd Qu.:1.0000
Max. :1.0000 Max. :1.0000
segment visit conversion spend
Length:64000 Min. :0.0000 Min. :0.000000 Min. : 0.000
Class :character 1st Qu.:0.0000 1st Qu.:0.000000 1st Qu.: 0.000
Mode :character Median :0.0000 Median :0.000000 Median : 0.000
Mean :0.1468 Mean :0.009031 Mean : 1.051
3rd Qu.:0.0000 3rd Qu.:0.000000 3rd Qu.: 0.000
Max. :1.0000 Max. :1.000000 Max. :499.000
male_df <- email_data %>% filter(segment != "Womens E-Mail")
male_df <- email_data %>% filter(segment != "Womens E-Mail") %>% mutate(treatment = if_else(segment == "Mens E-Mail", 1, 0))
head(male_df)
recency | history_segment | history | mens | womens | zip_code | newbie | channel | segment | visit | conversion | spend | treatment |
---|---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <dbl> | <dbl> | <chr> | <dbl> | <chr> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> |
6 | 3) $200 - $350 | 329.08 | 1 | 1 | Rural | 1 | Web | No E-Mail | 0 | 0 | 0 | 0 |
9 | 5) $500 - $750 | 675.83 | 1 | 0 | Rural | 1 | Web | Mens E-Mail | 0 | 0 | 0 | 1 |
9 | 5) $500 - $750 | 675.07 | 1 | 1 | Rural | 1 | Phone | Mens E-Mail | 0 | 0 | 0 | 1 |
2 | 2) $100 - $200 | 101.64 | 0 | 1 | Urban | 0 | Web | Mens E-Mail | 1 | 0 | 0 | 1 |
4 | 3) $200 - $350 | 241.42 | 0 | 1 | Rural | 1 | Multichannel | No E-Mail | 0 | 0 | 0 | 0 |
3 | 1) $0 - $100 | 58.13 | 1 | 0 | Urban | 1 | Web | No E-Mail | 1 | 0 | 0 | 0 |
summary_by_segment <- male_df %>% group_by(treatment) %>% summarise(conversion_rate = mean(conversion), spend_mean = mean(spend), count = n())
`summarise()` ungrouping output (override with `.groups` argument)
summary_by_segment
treatment | conversion_rate | spend_mean | count |
---|---|---|---|
<dbl> | <dbl> | <dbl> | <int> |
0 | 0.005726087 | 0.6527894 | 21306 |
1 | 0.012531093 | 1.4226165 | 21307 |
library(broom)
formulae_vec <- c(spend ~ treatment + recency + channel,
spend ~ treatment + recency + channel + history,
history ~ treatment + recency + channel)
print(formulae_vec)
[[1]]
spend ~ treatment + recency + channel
[[2]]
spend ~ treatment + recency + channel + history
[[3]]
history ~ treatment + recency + channel
names(formulae_vec) <- paste("reg", LETTERS[1:3], sep="_")
print(formulae_vec)
$reg_A
spend ~ treatment + recency + channel
$reg_B
spend ~ treatment + recency + channel + history
$reg_C
history ~ treatment + recency + channel
formulae_vec
$reg_A
spend ~ treatment + recency + channel
$reg_B
spend ~ treatment + recency + channel + history
$reg_C
history ~ treatment + recency + channel
models <- formulae_vec %>% enframe(name = "model_index", value="formula")
models
model_index | formula |
---|---|
<chr> | <list> |
reg_A | spend ~ treatment + recency + channel |
reg_B | spend ~ treatment + recency + channel + history |
reg_C | history ~ treatment + recency + channel |
models$formula
[[1]]
spend ~ treatment + recency + channel
[[2]]
spend ~ treatment + recency + channel + history
[[3]]
history ~ treatment + recency + channel
df_models <- models %>%
mutate(model = map(.x = formula, .f = lm, data = male_df)) %>%
mutate(lm_result = map(.x = model, .f = tidy))
print(df_models)
[90m# A tibble: 3 x 4[39m
model_index formula model lm_result
[3m[90m<chr>[39m[23m [3m[90m<list>[39m[23m [3m[90m<list>[39m[23m [3m[90m<list>[39m[23m
[90m1[39m reg_A [90m<formula>[39m [90m<lm>[39m [90m<tibble [5 × 5]>[39m
[90m2[39m reg_B [90m<formula>[39m [90m<lm>[39m [90m<tibble [6 × 5]>[39m
[90m3[39m reg_C [90m<formula>[39m [90m<lm>[39m [90m<tibble [5 × 5]>[39m
print(df_models$model)
[[1]]
Call:
.f(formula = .x[[i]], data = ..1)
Coefficients:
(Intercept) treatment recency channelPhone channelWeb
1.16712 0.77085 -0.06975 -0.21560 -0.04294
[[2]]
Call:
.f(formula = .x[[i]], data = ..1)
Coefficients:
(Intercept) treatment recency channelPhone channelWeb
0.481547 0.767705 -0.052525 0.136065 0.306813
history
0.001157
[[3]]
Call:
.f(formula = .x[[i]], data = ..1)
Coefficients:
(Intercept) treatment recency channelPhone channelWeb
592.524 2.716 -14.889 -303.935 -302.285
print(df_models$lm_result)
[[1]]
[90m# A tibble: 5 x 5[39m
term estimate std.error statistic p.value
[3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
[90m1[39m (Intercept) 1.17 0.242 4.83 0.000[4m0[24m[4m0[24m[4m1[24m38
[90m2[39m treatment 0.771 0.145 5.31 0.000[4m0[24m[4m0[24m[4m0[24m112
[90m3[39m recency -[31m0[39m[31m.[39m[31m0[39m[31m69[4m8[24m[39m 0.020[4m8[24m -[31m3[39m[31m.[39m[31m35[39m 0.000[4m8[24m[4m1[24m[4m2[24m
[90m4[39m channelPhone -[31m0[39m[31m.[39m[31m216[39m 0.237 -[31m0[39m[31m.[39m[31m911[39m 0.362
[90m5[39m channelWeb -[31m0[39m[31m.[39m[31m0[39m[31m42[4m9[24m[39m 0.236 -[31m0[39m[31m.[39m[31m182[39m 0.856
[[2]]
[90m# A tibble: 6 x 5[39m
term estimate std.error statistic p.value
[3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
[90m1[39m (Intercept) 0.482 0.306 1.57 0.116
[90m2[39m treatment 0.768 0.145 5.29 0.000[4m0[24m[4m0[24m[4m0[24m125
[90m3[39m recency -[31m0[39m[31m.[39m[31m0[39m[31m52[4m5[24m[39m 0.021[4m4[24m -[31m2[39m[31m.[39m[31m46[39m 0.013[4m9[24m
[90m4[39m channelPhone 0.136 0.256 0.533 0.594
[90m5[39m channelWeb 0.307 0.255 1.20 0.229
[90m6[39m history 0.001[4m1[24m[4m6[24m 0.000[4m3[24m[4m1[24m[4m8[24m 3.64 0.000[4m2[24m[4m7[24m[4m2[24m
[[3]]
[90m# A tibble: 5 x 5[39m
term estimate std.error statistic p.value
[3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
[90m1[39m (Intercept) 593. 3.69 161. 0
[90m2[39m treatment 2.72 2.21 1.23 0.220
[90m3[39m recency -[31m14[39m[31m.[39m[31m9[39m 0.318 -[31m46[39m[31m.[39m[31m9[39m 0
[90m4[39m channelPhone -[31m304[39m[31m.[39m 3.61 -[31m84[39m[31m.[39m[31m3[39m 0
[90m5[39m channelWeb -[31m302[39m[31m.[39m 3.60 -[31m83[39m[31m.[39m[31m9[39m 0
df_results <- df_models %>%
mutate(formula = as.character(formula)) %>%
select(formula, model_index, lm_result) %>%
unnest(cols = c(lm_result))
df_results
formula | model_index | term | estimate | std.error | statistic | p.value |
---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> |
spend ~ treatment + recency + channel | reg_A | (Intercept) | 1.167116e+00 | 0.2417364677 | 4.8280525 | 1.383521e-06 |
spend ~ treatment + recency + channel | reg_A | treatment | 7.708477e-01 | 0.1452333602 | 5.3076491 | 1.116026e-07 |
spend ~ treatment + recency + channel | reg_A | recency | -6.975255e-02 | 0.0208290189 | -3.3488159 | 8.122801e-04 |
spend ~ treatment + recency + channel | reg_A | channelPhone | -2.155973e-01 | 0.2365937168 | -0.9112556 | 3.621659e-01 |
spend ~ treatment + recency + channel | reg_A | channelWeb | -4.294017e-02 | 0.2362749089 | -0.1817382 | 8.557891e-01 |
spend ~ treatment + recency + channel + history | reg_B | (Intercept) | 4.815474e-01 | 0.3063759245 | 1.5717535 | 1.160152e-01 |
spend ~ treatment + recency + channel + history | reg_B | treatment | 7.677050e-01 | 0.1452150356 | 5.2866768 | 1.251709e-07 |
spend ~ treatment + recency + channel + history | reg_B | recency | -5.252544e-02 | 0.0213566166 | -2.4594459 | 1.391911e-02 |
spend ~ treatment + recency + channel + history | reg_B | channelPhone | 1.360652e-01 | 0.2555133772 | 0.5325171 | 5.943707e-01 |
spend ~ treatment + recency + channel + history | reg_B | channelWeb | 3.068129e-01 | 0.2550203247 | 1.2030921 | 2.289474e-01 |
spend ~ treatment + recency + channel + history | reg_B | history | 1.157031e-03 | 0.0003177463 | 3.6413672 | 2.715151e-04 |
history ~ treatment + recency + channel | reg_C | (Intercept) | 5.925244e+02 | 3.6851373464 | 160.7875918 | 0.000000e+00 |
history ~ treatment + recency + channel | reg_C | treatment | 2.716224e+00 | 2.2140014062 | 1.2268392 | 2.198898e-01 |
history ~ treatment + recency + channel | reg_C | recency | -1.488907e+01 | 0.3175267515 | -46.8907458 | 0.000000e+00 |
history ~ treatment + recency + channel | reg_C | channelPhone | -3.039354e+02 | 3.6067389830 | -84.2687451 | 0.000000e+00 |
history ~ treatment + recency + channel | reg_C | channelWeb | -3.022850e+02 | 3.6018789341 | -83.9242660 | 0.000000e+00 |
df_results %>% filter(model_index == "reg_A")
formula | model_index | term | estimate | std.error | statistic | p.value |
---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> |
spend ~ treatment + recency + channel | reg_A | (Intercept) | 1.16711637 | 0.24173647 | 4.8280525 | 1.383521e-06 |
spend ~ treatment + recency + channel | reg_A | treatment | 0.77084771 | 0.14523336 | 5.3076491 | 1.116026e-07 |
spend ~ treatment + recency + channel | reg_A | recency | -0.06975255 | 0.02082902 | -3.3488159 | 8.122801e-04 |
spend ~ treatment + recency + channel | reg_A | channelPhone | -0.21559735 | 0.23659372 | -0.9112556 | 3.621659e-01 |
spend ~ treatment + recency + channel | reg_A | channelWeb | -0.04294017 | 0.23627491 | -0.1817382 | 8.557891e-01 |
df_results %>% filter(model_index == "reg_B")
formula | model_index | term | estimate | std.error | statistic | p.value |
---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> |
spend ~ treatment + recency + channel + history | reg_B | (Intercept) | 0.481547430 | 0.3063759245 | 1.5717535 | 1.160152e-01 |
spend ~ treatment + recency + channel + history | reg_B | treatment | 0.767704959 | 0.1452150356 | 5.2866768 | 1.251709e-07 |
spend ~ treatment + recency + channel + history | reg_B | recency | -0.052525442 | 0.0213566166 | -2.4594459 | 1.391911e-02 |
spend ~ treatment + recency + channel + history | reg_B | channelPhone | 0.136065239 | 0.2555133772 | 0.5325171 | 5.943707e-01 |
spend ~ treatment + recency + channel + history | reg_B | channelWeb | 0.306812940 | 0.2550203247 | 1.2030921 | 2.289474e-01 |
spend ~ treatment + recency + channel + history | reg_B | history | 0.001157031 | 0.0003177463 | 3.6413672 | 2.715151e-04 |
#その他の方法
多少面倒ですが、以下の方法もあるようです。
Python を使う場合はこのまますぐにプログラムを書き始めることができるのですが、R を使うようにするにはちょっとした作業(ノートブックの書き換え)がまず必要です。
画面左上のメニューの中から「ファイル」を選び、「.ipynbをダウンロード」を選びます。
(現在画面に表示中のノートブックのファイルが保存されます)ノートブックのファイルが保存されるので、これをメモ帳などのテキストエディタで開きます。
そして、“kernelspec” にある name と display_name を以下のように書き換えます。
"kernelspec": { "name": "ir", "display_name": "R" }
書き換えができたら、このファイルをアップロードします。
画面左上のメニューの中から「ファイル」を選び、「ノートブックをアップロード」を選びます。
そして、書き換えを行ったノートブックファイルを選んでアップロードします。アップロードをすると、画面が更新されて、再び最初のノートブックの画面が表示されます。
画面左上のメニューの中から「ランタイム」を選び、「ランタイムのタイプを変更」を選びます。
これで R を使う準備ができました。