<jupyter_start><jupyter_text>Table of Contentsライブラリの読み込み正規分布に従わないデータの変換対数変換 (log10() 関数)べき乗変換 / Yeo-Johnson変換 (bestNormalize::yeojohnson() 関数)4.3.3　recipesパッケージによるYeo-Johnson変換  Jupyter NotebookでRプログラムを書いてBinderHubでホストする  ライブラリの読み込み<jupyter_code>library(tidyverse)<jupyter_output>─ [1mAttaching packages[22m ──────────────────── tidyverse 1.2.1 ─
[32m✔[39m [34mggplot2[39m 3.2.1     [32m✔[39m [34mpurrr  [39m 0.3.2
[32m✔[39m [34mtibble [39m 2.1.3     [32m✔[39m [34mdplyr  [39m 0.8.3
[32m✔[39m [34mtidyr  [39m 0.8.3     [32m✔[39m [34mstringr[39m 1.4.0
[32m✔[39m [34mreadr  [39m 1.3.1     [32m✔[39m [34mforcats[39m 0.4.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()<jupyter_text>正規分布に従わないデータの変換データ分析のさまざまな手法において、分析対象のデータは正規分布である、という仮定が置かれています。そのため、正規分布に従わない分布のデータをそのまま予測などに使うよりも、正規分布に近い形状に変換したほうが、モデルの当てはまりがよくなることがあります。データの分布を正規分布に近づける方法として、前節の標準化がありますが、標準化を行っても分布の形状が正規分布に見えないような場合、対数変換を行うとよい結果が得られることがあります。対数変換は、データの対数 (log) を取る処理です。  対数変換 (`log10()` 関数)Rでは、自然対数を用いる `log()` 関数や常用対数を用いる `log10()` 関数などがあります。一般に、エンジニアリングの領域では計算しやすい常用対数を使います。<jupyter_code># 対数正規分布に従うデータを生成する関数
# https://rpubs.com/hoxo_m/57647
rlnorm2 <- function(n, mean=1, sd=1) {
  sdlog <- sqrt(log((sd/mean)^2 + 1))
  meanlog <- log(mean) - (sdlog^2) / 2
  rlnorm(n, meanlog = meanlog, sdlog = sdlog)
}

data_a <- rlnorm2(500, mean = 5, sd = 3)
data_b <- rlnorm2(500, mean = 10, sd = 7)

# データの結合
df <- data.frame(value = c(data_a, data_b))
df$type <- c(rep("a", 500), rep("b", 500))

# データのプロット
ggplot(df, aes(x = value, fill = type)) + geom_histogram() + labs(title = "元データ")

# 対数変換
df <- df %>% mutate(log_value = log10(value))
head(df)

# データのプロット
ggplot(df, aes(x = log_value, fill = type)) + geom_histogram() + labs(title = "対数変換の結果")<jupyter_output>`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.<jupyter_text>べき乗変換 / Yeo-Johnson変換 (bestNormalize::`yeojohnson()` 関数)正規分布に従わないデータを変換し、正規分布に近づける他の手法として、べき乗変換やYeo-Johnson変換があります。べき乗変換は、データ $x$ を $x^{\lambda}$ に変換する処理です。データが正規分布に最も近づく $\lambda$ を推定するための手法としてYeo-Johnson変換が使われます。べき乗変換における有名な手法としてBox-Cox変換がありますが、Box-Cox変換は負の数を扱えません。Yeo-Johnson変換は、負の数も扱えます。Rではべき乗変換の機能を提供するパッケージ・関数が多数ありますが、ここではbestNormalizeパッケージの `yeojohnson()` 関数を使います。<jupyter_code># パッケージの読み込み
library(bestNormalize)

# 対数正規分布に従うデータを生成する関数
# https://rpubs.com/hoxo_m/57647
rlnorm2 <- function(n, mean=1, sd=1) {
  sdlog <- sqrt(log((sd/mean)^2 + 1))
  meanlog <- log(mean) - (sdlog^2) / 2
  rlnorm(n, meanlog = meanlog, sdlog = sdlog)
}

data_a <- rlnorm2(500, mean = 5, sd = 3)
data_b <- rlnorm2(500, mean = 10, sd = 7)

# データの結合
df <- data.frame(value = c(data_a, data_b))
df$type <- c(rep("a", 500), rep("b", 500))

# データのプロット
ggplot(df, aes(x = value, fill = type)) + geom_histogram() + labs(title = "元データ")

# Yeo-Johnson変換
df <- df %>% mutate(yj_value = yeojohnson(value)$x.t)
head(df)

# データのプロット
ggplot(df, aes(x = yj_value, fill = type)) + geom_histogram() + labs(title = "Yeo-Johnson変換の結果")<jupyter_output>`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.<jupyter_text>4.3.3　recipesパッケージによるYeo-Johnson変換recipesパッケージには `step_YeoJohnson()` 関数があります。<jupyter_code># パッケージの読み込み
library(recipes)

# 対数正規分布に従うデータを生成する関数
# https://rpubs.com/hoxo_m/57647
rlnorm2 <- function(n, mean=1, sd=1) {
  sdlog <- sqrt(log((sd/mean)^2 + 1))
  meanlog <- log(mean) - (sdlog^2) / 2
  rlnorm(n, meanlog = meanlog, sdlog = sdlog)
}

data_a <- rlnorm2(500, mean = 5, sd = 3)
data_b <- rlnorm2(500, mean = 10, sd = 7)

# データの結合
df <- data.frame(value = c(data_a, data_b))
df$type <- c(rep("a", 500), rep("b", 500))

# Yeo-Johnson変換の適用
df_yj <- df %>% recipe(~ .) %>% step_YeoJohnson(value) %>% prep(training = df) %>% bake(new_data = df)

df_yj
df_yj %>% summarise(平均=mean(value), 標準偏差=sd(value))

p <- ggplot(df, aes(x=value)) + geom_histogram() + labs(title = "正規化・標準化前")
p

p <- ggplot(df_yj, aes(x=value)) + geom_histogram() + labs(title = "Yeo-Johnson変換")
p<jupyter_output>Attaching package: ‘recipes’

The following object is masked from ‘package:stringr’:

    fixed

The following object is masked from ‘package:stats’:

    step
{'fraction_non_alphanumeric': 0.18691369606003752, 'fraction_numerical': 0.05651969981238274, 'mean_word_length': 6.026359143327842, 'pattern_counts': {'":': 0, '<': 39, '<?xml version=': 0, '>': 20, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '288615', 'license': 'MIT', 'n_tokens_mistral': 2706, 'n_tokens_neox': 2430, 'n_words': 311, 'path': 'Jupyter_with_R/Jupyter_with_R_example.ipynb', 'repo_name': 'ltl-manabi/R', 'size': '4264'}