Tokyo.R #70 で発表しました

Tokyo.R #70 「ベイズ・統計モデリング回」(ちゃんと名前ついてた訳ではないけど)にて

初心者セッション2を担当しました。

うまく喋れた気が全くしないので、まだまだ要精進です。

 

atnd.org

 

資料はこちらになります。

https://www.slideshare.net/secret/bKnQdsOodauEUu

 

Rコードを資料に記載できなかったので、

こちらに記載しておきます。

※実データの部分は、諸般の事情で抜いてます。

あえてset.seed()は設定していないので、

何回も乱数生成→プロットを繰り返して、

「乱数生成って本当に乱数生成してんだな」ってところを感じていただければ。(何を言ってるんだ)

 

# パッケージのインストール
library(tidyverse)
library(extraDistr) 
library(metRology) 


# 標準正規分布 ----------
# 乱数生成
X <- rnorm(5000, mean = 0, sd = 1) 

# データフレーム化
df <- data.frame(X = X)

# プロット
ggplot(df_unif, aes(x = X, y = ..density..)) + 
  geom_histogram(bins = 50, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# 一様分布 ----------
# 乱数生成
X_unif <- runif(5000, min = 0, max = 1)
# データフレーム化
df_unif <- data.frame(X = X_unif)

# データの可視化
# プロット
ggplot(df_unif) + 
  geom_histogram(aes(x = X), bins = 50, alpha = 0.8) + 
  theme_bw() + 
  guides(fill = "none")


# ベルヌーイ分布 ----------
# 乱数生成
X_bern <- extraDistr::rbern(5000, prob = 0.5)

# データフレーム化
df_bern <- data.frame(X = X_bern)

# プロット
ggplot(df_bern) + 
  geom_histogram(aes(x = X), alpha = 0.8) + 
  theme_bw() + 
  guides(fill = "none")


# 二項分布 ----------
# 乱数生成
X_binom <- rbinom(5000, size = 100, prob = 0.5)

# データフレーム化
df_binom <- data.frame(X = X_binom)

# プロット
ggplot(df_binom) + 
  geom_histogram(aes(x = X), alpha = 0.8) + 
  theme_bw() + 
  guides(fill = "none")


# 正規分布 ----------
# 乱数生成
X_norm <- rnorm(5000,  
                mean = 8471,       # 実データの平均
                sd = 3765.519)    # 実データの標準偏差

# データフレーム化
df_norm <- data.frame(X = X_norm)

# プロット
ggplot(df_norm, aes(x = X, y = ..density..)) + 
  geom_histogram(bins = 30, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# Studentのt分布 ----------
# 乱数生成
X_t <- metRology::rt.scaled(5000, df = 5, 
                           mean = 8471,        # 実データの平均
                           sd = 3765.519)      # 実データの標準偏差

# データフレーム化
df_t <- data.frame(X = X_t)

# プロット
ggplot(df_t, aes(x = X, y = ..density..)) + 
  geom_histogram(bins = 30, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# コーシー分布 ----------
# 乱数生成
X_cauchy <- rcauchy(123, 
                location = 8471,     # 位置パラメータ(実データの平均)
                scale = 3)                # 尺度パラメータ(適当)

# データフレーム化
df_cauchy <- data.frame(X = X_cauchy)

# プロット
dens <- density(df_cauchy$X) 
ggplot(df_cauchy, aes(x = X)) + 
  geom_histogram(aes(y=..density..), bins = 30, alpha = 0.8) + 
  geom_density(colour = "#D02090") + 
  theme_bw() + 
  xlim(range(dens$x)) +
  guides(fill = "none")


# 対数正規分布 ----------
# 実データの平均・標準偏差に合わせて乱数を生成する
sdlog <- sqrt(log((3765.519/8471)^2 + 1))
meanlog <- log(8471) - (sdlog^2) / 2
X_rlnorm <- rlnorm(5000, meanlog = meanlog, sdlog = sdlog)

# データフレーム化
df_rlnorm <- data.frame(X = X_rlnorm)

# プロット
ggplot(df_rlnorm, aes(x = X, y = ..density..)) + 
  geom_histogram(bins = 30, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# ポアソン分布 ----------
# 乱数生成
X_pois <- rpois(5000, 
                lambda = 3.725)      # 実データの平均値

# データフレーム化
df_pois <- data.frame(X = X_pois)

ggplot(df_pois, aes(x = X)) +  
  geom_histogram(bins = 30, alpha = 0.8) + 
  theme_bw() + 
  xlim(0, 30) + 
  guides(fill = "none")


# ゼロ過剰ポアソン分布 ----------
# 乱数生成
# ベルヌーイ分布で、0の多い0/1の乱数を作成
# rbinom()でsize=1を指定してもできます
# 170/1000は、実データの比率
X_bern <- rbinom(n = 5000, size = 1, prob = 170/1000) 
# ポアソン分布に従う乱数生成
X_zero_pois <- c(rpois(2000, lambda = 3.725), X_bern[X_bern == 0])

# データフレーム化
df_zero_pois <- data.frame(X = X_zero_pois)

# プロット
ggplot(df_zero_pois, aes(x = X)) + 
  geom_histogram(bins = 10, alpha = 0.8) + 
  theme_bw() + 
  guides(fill = "none")


# 指数分布 ----------
# 乱数生成
X_exp <- rexp(5000, rate = 170/1000)

# データフレーム化
df_exp <- data.frame(X = X_exp)

# プロット
ggplot(df_exp, aes(x = X, y = ..density..)) +  
  geom_histogram(bins = 20, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# ガンマ分布 -----------
# 乱数生成
shape = 3       # 3回実施する
rate = 30 / 7   # 1週間に1回 / 1ヶ月に3回
X_gamma <- rgamma(5000, shape = shape, rate = rate)

# データフレーム化
df_gamma <- data.frame(X = X_gamma)

# プロット
ggplot(df_gamma, aes(x = X, y = ..density..)) +  
  geom_histogram(bins = 20, alpha = 0.8) + 
  stat_density(position='identity', geom='line', 
               colour = "#D02090") +
  theme_bw() + 
  guides(fill = "none")


# ある番組の視聴人数のシミュレーション ----------
N <- 7           # 1週間(7日)
X <- 1:N        # 1周期のタイムポイントの数
Intercept <- 50  # 一番最初の値          (※適当)
gamma <- 0.7    # 指数関数の係数(0-1の値)         (※適当)
r <- 10                # リフトする係数         (※適当)

# 1周期目
mu_1 = c(Intercept * gamma ^ X)
# 2周期目
mu_2 = c(mu_1[N] * r * gamma ^ X) # 1周期目の最後の値を2倍して、それが切片
# 3周期目
mu_3 = c(mu_2[N] * r * gamma ^ X)
# 4周期目
mu_4 = c(mu_3[N] * r * gamma ^ X)
# 4周期分をがっちゃんこ
mu <- c(mu_1, mu_2, mu_3, mu_4)

# 指数関数で"Xが上がるほど切片が減衰する"のデータをYに
Y <- rnorm(4 * N, mean = mu, sd = 0.5)

# プロット
X_label <- 1:28 # 1:7を4回くりかえしたので、X軸として1:28をうつ

goboten_udon <- data.frame(X = X_label, Y = mu) %>%
  ggplot(mapping = aes(x = X, y = Y, colour = Y)) +
  theme_bw() +
  geom_point(size = 2.5) +
  geom_line(mapping = aes(y = mu), size = 1.5, alpha = 0.5) +
  scale_colour_gradient(low = "#00868B", high = "#4169E1") +
  guides(colour = "none")

plot(goboten_udon)

 

ベイズ・統計モデリング回」は、個人的にやりたかった回なのですが、

実際にやってみると、参加者の皆様が楽しみにしてくださったみたいで、

企画してよかったなぁ、と思いました。

いつもと違う内容にも関わらず、レベル高く発表してくださった

@kilometer00さん、@y__mattuさんには、感謝しかありません。。

本当にありがとうございます。

受付や懇親会準備等で色々手を動かしてくださった運営メンバーの皆様にも

本当に感謝です。

あと三銃士はすごかった。。神やった。。

お忙しい中、素晴らしい発表をしてくださり、本当にありがとうございました。