バフェに学ぶhttps://chiquitos-chiquitos.comCash is kingWed, 25 Sep 2024 03:01:20 +0000jahourly1https://chiquitos-chiquitos.com/wp-content/uploads/2024/08/cropped-9e47c7aa53df1dd9820a07710bfd0782-32x32.webpバフェに学ぶhttps://chiquitos-chiquitos.com3232 R_ggiraph(複数グラフ連携)_20240925https://chiquitos-chiquitos.com/r_ggiraph-multigraph-federation-_20240925/https://chiquitos-chiquitos.com/r_ggiraph-multigraph-federation-_20240925/#respondWed, 25 Sep 2024 03:01:12 +0000https://chiquitos-chiquitos.com/?p=4280

2つのテーブルを結合(datにbox_statsをくっつける) dat %>%filter(year == selected_year) %>%full_join(box_stats) Rのデータ型 データ型 ... ]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

マウスオーバーしながら情報確認しつつ、複数のグラフで観察できるのは面白い。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

①時系列で確認、②直近の年の分布を確認

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

library(dplyr)
library(ggplot2)
library(patchwork)
install.packages("ggiraph")
library(ggiraph)
# Load the data
dat <- gapminder::gapminder %>% # gapminderとは、国ごとの人口、GDP、寿命などのデータを提供するパッケージ # year, continent, country, lifeExp, pop, gdpPercap # このデータは、1952年から2007年までの各国の人口、GDP、寿命などを提供している janitor::clean_names() %>% # janitor::clean_names() は、データフレームの列名を小文字に変換する mutate( # ID that is shared for boxplots (this one uses factors, i.e. numbers, as ID instead of continents) id = as.numeric(continent), # continentを数値に変換してidに代入している continent = forcats::fct_reorder(continent, life_exp) # forcats::fct_reorder() は、ファクターのレベルを再配置する # ここでは、continentをlife_expの値に基づいて再配置している # つまり、life_expの値が大きい順にcontinentを並べ替えている )
color_palette <- thematic::okabe_ito(5)
# thematic::okabe_ito() は、カラーパレットを返す関数
# ここでは、5色のカラーパレットを取得している
names(color_palette) <- unique(dat$continent)
# names() は、ベクトルの要素に名前を付ける関数
# ここでは、color_paletteにcontinentの名前を付けている
base_size <- 24 # Base font size
mean_life_exps <- dat %>% group_by(continent, year, id) %>% summarise(mean_life_exp = mean(life_exp)) %>% mutate(mean_text = glue::glue('In {year}, the mean life expectancy in\n{continent} was {scales::number(mean_life_exp, accuracy = 0.01)}')) # \n は改行を表す # {}には、変数を埋め込むことができる # scales::number() は、数値を指定した精度でフォーマットする関数 # accuracy = 0.01 は、小数点以下2桁まで表示することを意味する
line_chart <- mean_life_exps %>% ggplot(aes(x = year, y = mean_life_exp, col = continent, data_id = id)) + # data_id は、ggiraphで使用するためのデータID、つまり、ツールチップやクリックイベントを設定するためのID # ツールチップやクリックイベントとは、マウスをホバーしたときに表示される情報や、クリックしたときに表示される情報のこと geom_line_interactive(linewidth = 2.5) + # geom_line_interactive() は、ggiraphで対話的な線グラフを描画する関数 geom_point_interactive(size = 6, aes(tooltip = mean_text)) + # tooltip は、ツールチップに表示する情報を指定する theme_minimal(base_size = base_size) + # base_size は、フォントサイズを指定する labs( x = element_blank(), # x軸のラベルを非表示にする y = 'Life expectancy (in years)', # y軸のラベルを設定する title = 'Life expectancy over time' # グラフのタイトルを設定する ) + theme( text = element_text( # テキストの色を設定する color = 'grey20' ), legend.position = 'none', # 凡例を非表示にする panel.grid.minor = element_blank(), # グリッド線を非表示にする plot.title.position = 'plot' # タイトルを中央に配置する ) + scale_color_manual(values = color_palette) # カラーパレットを設定する
selected_year <- 2007
box_stats <- dat %>% filter(year == selected_year) %>% group_by(continent) %>% summarise( n = n(), # n() は、グループ内の行数を返す関数 iqr = IQR(life_exp) %>% round(2), # IQR() は、四分位範囲を計算する関数 # round(2) は、小数点以下2桁まで表示する range = paste(range(life_exp) %>% round(2), collapse = ' - '), # range() は、最小値と最大値を返す関数 # paste() は、文字列を連結する関数 # collapse = ' - ' は、連結するときに区切り文字として' - 'を使用することを意味する mean = mean(life_exp) %>% round(2) )
box_plot <- dat %>% filter(year == selected_year) %>% full_join(box_stats) %>% # full_join() は、2つのデータフレームを結合する関数 ggplot(aes(x = life_exp, y = continent, fill = continent, data_id = id)) + geom_boxplot_interactive( # geom_boxplot_interactive() は、ggiraphで対話的な箱ひげ図を描画する関数 aes( tooltip = glue::glue( ' {levels(dat$continent)[continent]}\n {n} Countries\n Mean life expectancy: {mean}\n Range: {range}\n IQR: {iqr} ' ), onclick = glue::glue('window.open("http://en.wikipedia.org/wiki/{levels(dat$continent)[continent]}")') # onclick は、クリックしたときに実行するJavaScriptコードを指定する # ここでは、クリックしたときに、Wikipediaのcontinentのページを開くようにしている # levels() は、ファクターのレベルを返す関数、これはcontinentのレベルを取得している ), position = position_nudge(y = 0.25), # 位置を微調整する width = 0.5 # 箱ひげ図の幅を設定する ) + geom_point_interactive( aes(col = continent), position = position_nudge(y = -0.2), size = 11, shape = '|', # ポイントの形を設定する alpha = 0.75 ) + scale_fill_manual(values = color_palette) + scale_color_manual(values = color_palette) + labs( x = 'Life expectancy (in years)', y = element_blank(), title = glue::glue('Distribution of Life Expectancy in {selected_year}') ) + theme_minimal(base_size = base_size) + theme( text = element_text( color = 'grey20' ), legend.position = 'none', panel.grid.minor = element_blank(), plot.title.position = 'plot' )
ggiraph( ggobj = box_plot + plot_spacer() + line_chart + plot_layout(widths = c(0.45, 0.1, 0.45)), # ggobj は、ggiraphで対話的なグラフを描画するためのggplotオブジェクト # plot_spacer() は、プロットの間にスペースを挿入する関数 # plot_layout() は、プロットのレイアウトを設定する関数 options = list( # オプションを設定する opts_hover_inv(css = "opacity:0.1;"), # ホバー時の透明度を設定する opts_tooltip(offx = 0, offy = 0, css = 'font-size: larger;') # ツールチップのオフセットとCSSを設定する ), hover_css = "", # ホバー時のCSSを設定する height_svg = 9, # SVGの高さを設定する width_svg = 16 # SVGの幅を設定する
)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: mpg

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

2つのテーブルを結合(datにbox_statsをくっつける)

dat %>%
filter(year == selected_year) %>%
full_join(box_stats)

メモ

  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

tblの種類

  • Wide format:クロス集計表(横持ちデータ)
  • Long format:縦持ちデータ

tblの中身

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature

tblの操作

  • One Hot Encoding とは、カテゴリ変数をバイナリ(0または1)で表現する方法。例えば、車の駆動方式 (drv) に “4”, “f”, “r” という3つのカテゴリがあったとします。カテゴリ変数の各値ごとに新しいカラムを作成し、その値が該当する場合は1、該当しない場合は0を入れます。カテゴリごとにバイナリの数値を割り当て、新しいカラムを作成することで、元のカテゴリデータが数値データとして扱えるようになります。これにより、機械学習モデルがデータを扱いやすくなるのが主な目的です。バイナリカラムの作成。例えば、ある行(観測値/row)に対して、classという列が分解され、それぞれ、compact、suv、midsizeの3つの列が、同じ行数に対して追加される。結果、元々suvで該当している行は1、該当しない列はゼロとなる。そのために事前に元々のテーブルには、すべての行に対して1が入るように設定の上、pivotでwide formatに展開する事が簡単。

tblの現状把握

# 変数の中身のユニークな値を確認する ----
unique(mpg$drv)
# 出現頻度を確認する
table(mpg$drv)
head(mpg$drv)
summary(mpg$drv)
# 全体確認 ----
skim(dat)
# チラ見 ----
glimpse(dat)

環境設定 & 環境の現状把握

  • 初期設定の3点セット:R, Rstudio, Rtools
  • RのバージョンとRtoolsのバージョンは合わせる必要性がある。Rstudioは最新版でも問題なし。例えば、corrmorantのpackageは、①Rの4.0.0(Rtoolも同バージョンをインストール)、及び、②ggplot2の3.3.0で、問題なくワークする事が実証されている。この場合、最新版のggplotのバージョンではパッケージがワークするかは不明。
# 現状把握
version()
library(pkgbuild)
has_rtools(debug = TRUE)
sessionInfo()

データソースのダウンロード

  • HTML形式のファイルが「file:///C:/Users/XXXXX/・・・」で保存されている場合、ローカルで保存されている状態。HTMLファイルをウェブサーバー(WordPressサイト)にアップロードする必要があり。
  • Githubのcredentialが期限切れになっている場合:
install.packages("oskeyring")
library(gitcreds) # gitcredsパッケージを読み込む
gitcreds_list() # 登録されている認証情報を確認
gitcreds_delete(url = "https://github.com") 
# 登録されている認証情報を削除
Sys.unsetenv("GITHUB_PAT") # GITHUB_PATを削除。空で帰る場合には問題解決。
# 公開リポジトリのインストールには認証は不要:
# corrmorantは公開リポジトリなので、認証なしでインストールできます。
# そのため、環境変数GITHUB_PATやシステムの資格情報ストアに認証情報が設定されていない状態が望ましいです。
# remotes::install_github("r-link/corrmorant", auth_token = NULL, force = TRUE)
# 特定のバージョンのggplot2をインストール
renv::install("ggplot2@3.3.6")

データ型

Rのデータ型

データ型説明
logical論理型。TRUEまたはFALSEの2つの値を取ります。TRUE, FALSE
integer整数型。正または負の整数値を保持します。1L, -10LLは整数の指定)
double数値型(実数型)。小数を含む任意の数値を表します。3.14, -100.5
complex複素数型。実部と虚部を持つ数値です。1 + 2i
character文字列型。文字列やテキストを保持します。"Hello", "R"
factorカテゴリ型。有限の異なるカテゴリ(レベル)を持つデータです。factor(c("Male", "Female"))
listリスト型。異なるデータ型を含む要素のコレクション。list(1, "a", TRUE)
data.frameデータフレーム型。異なる型を持つベクトルを列として保持する二次元表形式データ。data.frame(x = 1:3, y = c("a", "b", "c"))
matrix行列型。数値、文字列、論理値などを含む二次元配列です。matrix(1:9, nrow = 3)
array配列型。行列よりも多次元のデータを扱います。array(1:12, dim = c(2, 3, 2))
ts時系列データ型。等間隔で記録されたデータを表します。ts(c(1, 2, 3), start = c(2021, 1), frequency = 12)
Date日付型。日付データを表現します。as.Date("2024-09-25")
POSIXct, POSIXlt日時型。日付と時間のデータを保持し、異なるフォーマットで時刻を扱います。as.POSIXct("2024-09-25 10:30")
rawバイナリデータ型。バイト単位のデータを保持します。as.raw(c(0x01, 0x02))
NULLNULL型。未定義や無効な値を表します。NULL
NA欠損値。データが存在しないことを示します。NA

参考リンク

]]>
https://chiquitos-chiquitos.com/r_ggiraph-multigraph-federation-_20240925/feed/0
R_PC主成分分析_20240925https://chiquitos-chiquitos.com/r_maps-leaflet_20240925/https://chiquitos-chiquitos.com/r_maps-leaflet_20240925/#respondWed, 25 Sep 2024 02:09:23 +0000https://chiquitos-chiquitos.com/?p=4267

fit_pca %>% tidy() %>% view() の実行結果において、row、pc、value という3つの列が出てきた場合、それらの列は主成分分析(PCA)の結果を解釈するための情報を提供していま ... ]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

主成分分析がメインだけど、難しいので、違う回で解説。今回はあくまでOne Hot Encodingを追加する事を覚えよ。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

現状、

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(broom)
library(ggfortify)
library(plotly)
library(tidyverse)
# DATA ----
mpg
# DATA WRANGLING ----
# - dplyr is covered in DS4B 101-R Weeks 2 & 3
# * Extract Target (Y) ----
y_tbl <- mpg %>% select(manufacturer, model) %>% mutate(vehicle = str_c(manufacturer, "_", model)) %>% # str_c() で文字列を連結 rowid_to_column() # rowid_to_column() で行番号を追加
y_tbl
# * Encode Features (X) ----
x_tbl <- mpg %>% # Get features for consideration select(displ:class) %>% # Add Row ID to maintain order rowid_to_column() %>% # One Hot Encode: transmission mutate( trans_auto = str_detect(trans, "auto") %>% as.numeric(), trans_man = str_detect(trans, "man") %>% as.numeric() # str_detect() で文字列に特定の文字列が含まれているかを判定 # as.numeric() でTRUE/FALSEを1/0に変換 # auto or manualに分類。Binary列を各々で作成。= one hot encode ) %>% select(-trans) %>% # One Hot Encode: drv mutate(val_drv = 1) %>% # まず元々のデータテーブルにval_drv列を追加する。 # val_drv に1を代入。すべての行に1を代入することで、後でpivot_wider()でワイド形式に変換する際に、NAを0で埋めることができる。 pivot_wider( names_from = drv, # names_from でカラム名を指定 # 例えば、drv列には、"f" "4" "r"、という3通りの文字列を持つ。 # この文字列をそれぞれ列名として指定する。 # 行数は変更されていないため、増えた列数("f" "4" "r")に対して、該当する場合には1、そうでない場合には0になるように設定している。 values_from = val_drv, # values_from で値を指定 # ここでは、val_drv列の値(1)を指定している。 # これにより、各行のdrv列の値に対応する列に1が代入される。 values_fill = 0, # values_fill でNAを0で埋める names_prefix = "drv_" # names_prefix でカラム名の接頭辞を指定 ) %>% # pivot_wider() でワイド形式に変換 # names_from でカラム名を指定 # values_from で値を指定 # values_fill でNAを0で埋める # names_prefix でカラム名の接頭辞を指定 # One Hot Encode: class mutate(val_class = 1) %>% pivot_wider( names_from = class, values_from = val_class, values_fill = 0, names_prefix = "class_" ) %>% # One Hot Encode: fl mutate(val_fl = 1) %>% pivot_wider( names_from = fl, values_from = val_fl, values_fill = 0, names_prefix = "fl_" )
x_tbl %>% glimpse()
# PCA ----
# - Modeling the Principal Components
# - Modeling & Machine Learning is covered in DS4B 101-R Week 6
fit_pca <- prcomp( # prcomp() で主成分分析を実行 # 主成分分析は、多変量データの次元を削減するための手法。 # 主成分分析を行うことで、データの特徴を抽出し、データの構造を理解することができる。 # 主成分分析は、データの分散が最大となる方向を見つけ、その方向を主成分として抽出する。 # 分散が最大となる変数を見つけるという事ですか? はい、その通りです。 # その組み合わせは自動で全通りを調べてくれるという事ですか? はい、その通りです。 # なぜ分散が最大となる組合せを考えますか? それは、データの情報を最大限に保持するためです。 # データの情報を最大限に保持するとはどういう意味ですか? それは、データの特徴を最大限に抽出することです。 # 分散が大きい成分:データの主要な変動を表す。重要な情報が含まれているので保持する。 # 分散が小さい成分:データの変動が小さいため、その成分はデータの説明にはあまり寄与しない。したがって、無視しても良い。 # これにより、PCAは次元削減を行いながら、データの本質的なパターンを保持できるようになります。 formula = ~ . - rowid, # formula で主成分分析の対象となる列を指定 # ~ . - rowid でrowid列を除いたすべての列を対象とする。 data = x_tbl, # data でデータを指定 # ここでは、x_tbl を指定している。 scale. = TRUE # scale. でデータをスケーリングするかを指定 # TRUE でスケーリングを行う。 # スケーリングを行うことで、主成分分析の結果がより正確になる。 # スケーリングとは、データの平均を0、標準偏差を1に変換すること。
)
fit_pca %>% head()
fit_pca %>% tidy() %>% view()
# tidy() で主成分分析の結果を整形
# 主成分分析の結果は、主成分の寄与率、主成分の累積寄与率、主成分の固有値、主成分の固有ベクトルなどが含まれる。
# pcとは何ですか? 主成分のことです。
# rowは何を表していますか? 主成分の番号を表しています。
# 主成分の番号は小さいところから順に何を表していますか? 主成分の重要度を表しています。
# valueは何を表していますか? 主成分の値を表しています。
# 主成分の値はわかりますが、元々のどの変数がどの変数に対して、重要度の高い変数なのかが分かりません。
# どうしたらわかりますか? 主成分の固有ベクトルを見ることで、元々の変数がどの変数に対して、重要度の高い変数なのかが分かります。
# どうやって固有ベクトルを見ますか? tidy()関数で固有ベクトルを見ることができます。
# fit_pca %>% tidy() %>% view() で固有ベクトルを見ることができます。
# 固有ベクトルとはvalueの値の事ですか? はい、その通りです。
# rowとPCの番号の違いは何ですか? rowは主成分の番号を表しています。PCは主成分の番号を表しています。
# VISUALIZE PCA ----
# - Visualization with ggplot is covered in DSRB 101-R Week 4
g <- autoplot( # autoplot() で主成分分析の結果を可視化 object = fit_pca, # object で主成分分析の結果を指定 x = 1, # x でx軸に使用する主成分の番号を指定 y = 2, # y でy軸に使用する主成分の番号を指定 # Labels data = y_tbl, # data でデータを指定 # ここでは、y_tbl を指定している。 label = TRUE, # label でラベルを表示するかを指定 label.label = "vehicle", # label.label でラベルに表示する列を指定 label.size = 3, # label.size でラベルのサイズを指定 # LOADINGS loadings.label = TRUE, # loadings.label で固有ベクトルを表示するかを指定 loadings.label.size = 7, # loadings.label.size で固有ベクトルのサイズを指定 scale = 0 # scale でスケールを指定
) + labs(title = "Visualizing PCA in R")+ theme_minimal()
g
plotly::ggplotly(g)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: mpg

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

fit_pca %>% tidy() %>% view() の実行結果において、rowpcvalue という3つの列が出てきた場合、それらの列は主成分分析(PCA)の結果を解釈するための情報を提供しています。以下、それぞれの列が何を意味するか解説します。

1. row

  • この列は、元のデータの変数(カラム)名を表しています。
  • PCAの結果では、元のデータセットに含まれる各変数(説明変数)が主成分(PC: Principal Component)に対してどの程度寄与しているかを示す係数が計算されます。row 列は、その元の変数名に対応しています。

2. pc

  • pc 列は、主成分(Principal Component)を示しています。例えば、pc = 1 であれば第1主成分、pc = 2 であれば第2主成分を意味します。
  • 主成分は、元の多次元データをより少ない次元に圧縮した新しい軸(方向)で、PCAによってデータの最も重要な情報(分散の大きい方向)を表しています。

3. value

  • value 列は、row(元の変数)が各主成分(pc)に対してどの程度寄与しているかを示す係数、すなわち主成分負荷量(loading)です。
  • これらの係数は、元の変数と主成分との関連性を示します。例えば、ある変数が第1主成分(pc = 1)に対して大きな正の値を持っている場合、その変数は第1主成分に大きく影響しており、その方向にデータが大きく広がっていることを示しています。逆に、負の値であれば逆方向に広がっていることを示します。

例:

以下のようなデータフレームが出力されたと仮定します。

rowpcvalue
var110.65
var21-0.30
var120.12
var220.90
  • row = var1 は元の変数 var1 を示します。
  • pc = 1 は第1主成分、pc = 2 は第2主成分を表します。
  • value は、元の変数(var1var2)が各主成分に対してどの程度寄与しているかを表します。たとえば、var1 は第1主成分に対して0.65の寄与を持つため、第1主成分における var1 の影響は大きいと解釈されます。

まとめると:

  • row:元のデータセットに含まれている変数名(元の説明変数)。
  • pc:どの主成分(PC: Principal Component)に対しての寄与かを示す(第1主成分、第2主成分、…)。
  • value:その変数がどの主成分に対してどれだけ寄与しているか(主成分負荷量)を示す係数。この値を元に、変数がどの主成分に強く影響しているかがわかる。

この情報を基に、どの変数が主成分に強く関与しているかを分析し、主成分の意味や解釈を行います。

はい、シンプルな具体例を示します。ここでは、Rを使って簡単な主成分分析(PCA)の結果を具体的に説明します。

例:

3つの変数(var1, var2, var3)を持つ以下のデータセットを用意します。

# シンプルなデータセットを作成
data <- data.frame( var1 = c(2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1), var2 = c(2.4, 0.7, 2.9, 2.2, 3, 2.7, 1.6, 1.1, 1.6, 0.9), var3 = c(1.5, 0.2, 1.7, 1.9, 2.6, 1.8, 1.2, 0.8, 1.4, 1.1)
)
# 主成分分析の実行
fit_pca <- prcomp(data, scale = TRUE)
# PCAの結果をtidy()で整形して表示
library(broom)
tidy_pca <- tidy(fit_pca)
tidy_pca

このコードを実行すると、以下のような結果が得られます。

rowpcvalue
var110.577
var210.577
var310.577
var120.707
var22-0.707
var320
var130
var230
var331

解釈:

  1. 第1主成分(PC1):
  • var1, var2, var3 のすべてが0.577の値を持っています。これは、第1主成分は3つの変数すべてにほぼ同じ割合で寄与していることを意味します。この方向は、3つの変数がまとめて変動する軸と考えることができます。
  1. 第2主成分(PC2):
  • var1 は 0.707、var2 は -0.707、var3 は 0 となっています。これは、第2主成分は主に var1var2 の相反する動きを反映していることを示しています。var1 が増加するとき var2 は減少し、その逆も成立します。var3 はこの軸には寄与していない(値が0)ため、無関係です。
  1. 第3主成分(PC3):
  • var3 のみに1の値がついており、var1var2 は寄与していません。このことから、第3主成分は var3 のみに対応しており、他の2つの変数とは独立した軸で変動していることがわかります。

結論:

  • 第1主成分は、3つの変数の全体的な変動(共通した方向)を捉えており、3つの変数の情報が均等に含まれています。
  • 第2主成分は、var1var2 の反対方向の動きを捉えています。
  • 第3主成分は、var3 のみが関与しており、他の変数からは独立した情報を表しています。

このように、主成分分析は、データの変数間の関係を新しい軸に変換し、その軸ごとにどの変数がどれだけ寄与しているかを明確にする手法です。

では、先ほどの主成分分析のシンプルな例を不動産データに置き換えて説明します。今回は、仮想的な不動産データセットを使い、主成分分析を実行した結果を解釈します。

例:不動産のデータセット

次のような変数を持つデータを仮定します。

  • price:物件の価格
  • size:物件の広さ(平米)
  • age:物件の築年数

データセットの作成と主成分分析

# 不動産の仮想データセットを作成
real_estate_data <- data.frame( price = c(300000, 200000, 250000, 270000, 320000, 310000, 220000, 190000, 260000, 280000), size = c(60, 50, 55, 58, 70, 65, 53, 48, 57, 63), age = c(10, 20, 15, 12, 8, 9, 22, 25, 18, 13)
)
# 主成分分析の実行
fit_pca <- prcomp(real_estate_data, scale = TRUE)
# PCAの結果を整形して表示
library(broom)
tidy_pca <- tidy(fit_pca)
tidy_pca

このコードを実行すると、以下のような結果が得られたと仮定します。

rowpcvalue
price10.577
size10.577
age1-0.577
price2-0.707
size20
age20.707
price30.408
size3-0.816
age30.408

解釈:

第1主成分(PC1):

  • pricesize が正の値(0.577)を持ち、age が負の値(-0.577)を持っています。
  • これは、物件の価格(price)と広さ(size)は正の相関があり、築年数(age)とは逆の相関があることを示しています。つまり、広くて新しい物件ほど高額であるという一般的な傾向を表しています。
  • 不動産の解釈:新しくて広い物件ほど価格が高く、築年数が増えると価格が下がる傾向があります。この主成分は、物件の一般的な評価基準(価格、広さ、築年数の関係)を表していると解釈できます。

第2主成分(PC2):

  • price が -0.707、age が 0.707 の値を持ち、size は0です。
  • これは、価格(price)と築年数(age)が逆の方向に動いており、広さ(size)はこの主成分に影響を与えていないことを示します。築年数が古い物件は価格が低く、新しい物件は価格が高いという単純な関係に焦点を当てています。
  • 不動産の解釈:第2主成分は、物件の「築年数」と「価格」に関する情報を示しています。ここでは、物件の広さは無視され、築年数と価格の関係が強調されています。特に、築年数が増えると価格が下がる傾向を表現しています。

第3主成分(PC3):

  • size が -0.816 と非常に大きな負の値を持ち、priceage はそれぞれ 0.408 の正の値を持っています。
  • これは、広さ(size)が強く影響しており、広い物件は価格や築年数と独立していることを示します。つまり、広さが大きくなると、築年数や価格にかかわらず、異なる特性を持つことを表しています。
  • 不動産の解釈:第3主成分は、物件の広さに関する情報を強調しています。広さが物件の他の特徴とは独立した要因であり、価格や築年数とは異なる軸で考える必要があることを示唆しています。

まとめ:

  1. 第1主成分(PC1) は、物件の広さ、価格、築年数の全体的な傾向を示し、特に「広くて新しい物件は高額」という典型的な不動産の特徴を捉えています。
  2. 第2主成分(PC2) は、価格と築年数の関係に焦点を当てており、広さが影響しない条件での築年数による価格変動を捉えています。
  3. 第3主成分(PC3) は、物件の広さに特化した軸で、広さが価格や築年数とは別の独立した要因であることを示唆しています。

このように、主成分分析を使うことで、不動産のデータにおいて「広さ」「価格」「築年数」などがどのように相関しているのかを把握し、それぞれがどのように物件の特徴に影響を与えているかを理解できます。

メモ

  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

tblの種類

  • Wide format:クロス集計表(横持ちデータ)
  • Long format:縦持ちデータ

tblの中身

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature

tblの操作

  • One Hot Encoding とは、カテゴリ変数をバイナリ(0または1)で表現する方法。例えば、車の駆動方式 (drv) に “4”, “f”, “r” という3つのカテゴリがあったとします。カテゴリ変数の各値ごとに新しいカラムを作成し、その値が該当する場合は1、該当しない場合は0を入れます。カテゴリごとにバイナリの数値を割り当て、新しいカラムを作成することで、元のカテゴリデータが数値データとして扱えるようになります。これにより、機械学習モデルがデータを扱いやすくなるのが主な目的です。バイナリカラムの作成。例えば、ある行(観測値/row)に対して、classという列が分解され、それぞれ、compact、suv、midsizeの3つの列が、同じ行数に対して追加される。結果、元々suvで該当している行は1、該当しない列はゼロとなる。そのために事前に元々のテーブルには、すべての行に対して1が入るように設定の上、pivotでwide formatに展開する事が簡単。

tblの現状把握

# 変数の中身のユニークな値を確認する
unique(mpg$drv)
# 出現頻度を確認する
table(mpg$drv)
head(mpg$drv)
summary(mpg$drv)

環境設定 & 環境の現状把握

  • 初期設定の3点セット:R, Rstudio, Rtools
  • RのバージョンとRtoolsのバージョンは合わせる必要性がある。Rstudioは最新版でも問題なし。例えば、corrmorantのpackageは、①Rの4.0.0(Rtoolも同バージョンをインストール)、及び、②ggplot2の3.3.0で、問題なくワークする事が実証されている。この場合、最新版のggplotのバージョンではパッケージがワークするかは不明。
# 現状把握
version()
library(pkgbuild)
has_rtools(debug = TRUE)
sessionInfo()

データソースのダウンロード

  • HTML形式のファイルが「file:///C:/Users/XXXXX/・・・」で保存されている場合、ローカルで保存されている状態。HTMLファイルをウェブサーバー(WordPressサイト)にアップロードする必要があり。
  • Githubのcredentialが期限切れになっている場合:
install.packages("oskeyring")
library(gitcreds) # gitcredsパッケージを読み込む
gitcreds_list() # 登録されている認証情報を確認
gitcreds_delete(url = "https://github.com") 
# 登録されている認証情報を削除
Sys.unsetenv("GITHUB_PAT") # GITHUB_PATを削除。空で帰る場合には問題解決。
# 公開リポジトリのインストールには認証は不要:
# corrmorantは公開リポジトリなので、認証なしでインストールできます。
# そのため、環境変数GITHUB_PATやシステムの資格情報ストアに認証情報が設定されていない状態が望ましいです。
# remotes::install_github("r-link/corrmorant", auth_token = NULL, force = TRUE)
# 特定のバージョンのggplot2をインストール
renv::install("ggplot2@3.3.6")

参考リンク

]]>
https://chiquitos-chiquitos.com/r_maps-leaflet_20240925/feed/0
R_maps & leaflet_20240925https://chiquitos-chiquitos.com/r_plot_20240925/https://chiquitos-chiquitos.com/r_plot_20240925/#respondTue, 24 Sep 2024 04:17:22 +0000https://chiquitos-chiquitos.com/?p=4253

]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

mapsもあるものの恐らくleafletの方が無料のデータソースでinteracticeなデータで良いかも!

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

現状、

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(tidyverse)
library(maps)
library(mapproj)
# 1.0 MAP DATA -----
?map_data()
# 2.0 WORLD MAP ----
# - ggplot is covered in DS4B 101-R Week 4
world_tbl <- map_data("world") %>% # map_data() で地図データを取得 as_tibble() # as_tibble() でデータをtibble型に変換
world_tbl
# * World Base ----
world_base <- world_tbl %>% ggplot() + geom_map( aes(long, lat, map_id = region), # aes() でx軸、y軸、map_idを指定 map = world_tbl, # map_id で地図データを指定 color = "gray80", fill = "gray30", size = 0.3 ) # geom_map() で地図をプロット
world_base
# * Ortho Projection ----
world_base + coord_map("ortho", orientation = c(39, -98, 0)) # coord_map() で地図の投影法を指定、"ortho" は正射投影法を指定。 # orientation で地図の中心を指定している。
# 3.0 STATE MAPS ----
# - ggplot is covered in DS4B 101-R Week 4
usa_tbl <- map_data("state") %>% as_tibble() # state はアメリカ合衆国の州の地図データを取得
usa_tbl %>% ggplot(aes(long, lat, map_id = region)) + geom_map( map = usa_tbl, color = "gray80", fill = "gray30", size = 0.3 ) + coord_map("ortho", orientation = c(39, -98, 0))
# 4.0 REPUBLICAN VOTING BY US STATE ----
# - dplyr is covered in DS4B 101-R Weeks 2 & 3
# - ggplot2 is covered in DS4B 101-R Week 4
# * Wrangle & Join Data (dplyr) ----
republican_voting_tbl <- maps::votes.repub %>% # maps::votes.repub はアメリカ合衆国の州ごとの共和党の投票率データ as_tibble(rownames = "state") %>% # as_tibble() でデータをtibble型に変換 select(state, `1976`) %>% # select() で必要な列を抽出 (state, 1976年の共和党の投票率) rename(repub_prop = `1976`) %>% # rename() で列名を変更 mutate(repub_prop = repub_prop / 100) %>% # mutate() で共和党の投票率を割合に変換 mutate(state = str_to_lower(state)) # mutate() で州名を小文字に変換 # str_to_lower() で文字列を小文字に変換
usa_voting_tbl <- usa_tbl %>% left_join(republican_voting_tbl, by = c("region" = "state")) # left_join() で地図データと共和党の投票率データを結合
usa_voting_tbl
# * Make Map (ggplot2) ----
usa_voting_tbl %>% ggplot(aes(long, lat, group = subregion)) + geom_map( aes(map_id = region), map = usa_tbl, color = "gray80", fill = "gray30", size = 0.3 ) + coord_map("ortho", orientation = c(39, -98, 0)) + geom_polygon(aes(group = group, fill = repub_prop), color = "black") + # geom_polygon() で共和党の投票率をプロット # fill で色を指定 # color で線の色を指定 scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0.5, labels = scales::percent) + # scale_fill_gradient2() で色のグラデーションを指定 # low で最小値の色を指定 # mid で中間値の色を指定 # high で最大値の色を指定 theme_minimal() + labs( title = "Voting Republican in 1976", x = "", y = "", fill = "" ) + theme( plot.title = element_text(size = 26, face = "bold", color = "red3"), legend.position = "bottom" )
# 日本の地図をよみこむ
# 必要なパッケージをインストール
install.packages("leaflet")
install.packages("geojsonio")
install.packages("dplyr")
# パッケージを読み込み
library(leaflet)
library(geojsonio)
library(dplyr)
# 日本全体のGeoJSONデータのURL
japan_geojson_url <- "https://raw.githubusercontent.com/dataofjapan/land/master/japan.geojson"
# GeoJSONデータを読み込み
japan_geojson <- geojson_read(japan_geojson_url, what = "sp")
# 東京都のデータのみを抽出
tokyo_geojson <- japan_geojson[japan_geojson$name == "東京都", ]
# 地図に東京都をハイライト
leaflet() %>% setView(lng = 139.6917, lat = 35.6895, zoom = 10) %>% addTiles() %>% addPolygons(data = tokyo_geojson, color = "red", weight = 2, fillOpacity = 0.5)
# 必要なパッケージをインストール
install.packages("leaflet")
install.packages("sf")
install.packages("rnaturalearth")
install.packages("rnaturalearthdata")
# パッケージを読み込み
library(leaflet)
library(sf)
library(dplyr)
library(rnaturalearth)
library(rnaturalearthdata)
# 日本の都道府県データを取得
japan_sf <- ne_states(country = "Japan", returnclass = "sf")
# データの属性名を確認
names(japan_sf)
# 東京都のデータを抽出
tokyo_sf <- japan_sf %>% filter(name == "Tokyo")
# 地図に日本全体を描画
leaflet() %>% addTiles() %>% addPolygons(data = japan_sf, color = "gray", weight = 1, fillOpacity = 0.5) %>% # 東京都を赤色でハイライト addPolygons(data = tokyo_sf, color = "red", weight = 2, fillOpacity = 0.7) %>% # 東京都にズーム setView(lng = 139.6917, lat = 35.6895, zoom = 7)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: map_data(“world”)

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
map_data("world")

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

メモ

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

環境設定

  • 初期設定の3点セット:R, Rstudio, Rtools
  • RのバージョンとRtoolsのバージョンは合わせる必要性がある。Rstudioは最新版でも問題なし。例えば、corrmorantのpackageは、①Rの4.0.0(Rtoolも同バージョンをインストール)、及び、②ggplot2の3.3.0で、問題なくワークする事が実証されている。この場合、最新版のggplotのバージョンではパッケージがワークするかは不明。
# 現状把握
version()
library(pkgbuild)
has_rtools(debug = TRUE)
sessionInfo()

データソースのダウンロード

  • HTML形式のファイルが「file:///C:/Users/XXXXX/・・・」で保存されている場合、ローカルで保存されている状態。HTMLファイルをウェブサーバー(WordPressサイト)にアップロードする必要があり。
  • Githubのcredentialが期限切れになっている場合:
install.packages("oskeyring")
library(gitcreds) # gitcredsパッケージを読み込む
gitcreds_list() # 登録されている認証情報を確認
gitcreds_delete(url = "https://github.com") 
# 登録されている認証情報を削除
Sys.unsetenv("GITHUB_PAT") # GITHUB_PATを削除。空で帰る場合には問題解決。
# 公開リポジトリのインストールには認証は不要:
# corrmorantは公開リポジトリなので、認証なしでインストールできます。
# そのため、環境変数GITHUB_PATやシステムの資格情報ストアに認証情報が設定されていない状態が望ましいです。
# remotes::install_github("r-link/corrmorant", auth_token = NULL, force = TRUE)
# 特定のバージョンのggplot2をインストール
renv::install("ggplot2@3.3.6")

参考リンク

]]>
https://chiquitos-chiquitos.com/r_plot_20240925/feed/0
R_plot_time_series&plot_modeltime_forecast_20240924https://chiquitos-chiquitos.com/r_g_20240920/https://chiquitos-chiquitos.com/r_g_20240920/#respondMon, 23 Sep 2024 16:08:12 +0000https://chiquitos-chiquitos.com/?p=4228

]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

今回はArima Modelの詳しい解説はスキップ。interactiveなファイルはhtml形式で保存の上、wordpress上に展開可能である点を理解する事が目的。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

現状、①HTML形式でローカル保存、②WordpressのメディアサーバーにHTMLファイルを保存、③カスタムHTMLのifameにHTMLリンクを埋め込み。

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(modeltime)
library(tidymodels)
library(timetk)
library(tidyverse)
# DATA ----
# - Time Series Visualization - Covered in Module 02 of DS4B 203-R Time Series Course
walmart_sales_weekly # this data is coming from the modeltime package.
walmart_sales_weekly %>% group_by(id) %>% plot_time_series(Date, Weekly_Sales, .facet_ncol = 2) # plot_time_series() 関数は、時系列データをプロットします。 # .facet_ncol = 2 は、2列でプロットすることを指定しています(グラフ画面)。 # Date がx軸、Weekly_Sales がy軸になっている。 # id ごとにプロットされている。
# 1.0 NESTING 101 ----
# - Nesting & Iteration - Covered in Week 5 of DS4B 101-R R for Business Course
# Nesting
data_nested <- walmart_sales_weekly %>% select(id, Date, Weekly_Sales) %>% nest(nested_column = -id) # nest() 関数は、データをネスト化します。 # -id でid列を除いたデータをネスト化している。 # ネスト化とは具体的には、データフレームの列をリストに変換することです。 # ここでは、id列を除いたデータをリストに変換しています。 # 実際には、nested_column という列にリスト(Date, Weekly_Sales列)が格納されています。
data_nested$nested_column # nested_column にはリストが格納されている。 # リストの中身は、Date, Weekly_Sales列が格納されている。
# Unnesting
data_nested %>% unnest(nested_column) # unnest() 関数は、ネスト化されたデータを元に戻します。
# 2.0 MULTIPLE ARIMA FORECASTS ----
# - Modeltime (ARIMA) - Covered in Module 8 of DS4B 203-R Time Series Course
# - Nesting, Functions, & Iteration - Covered in Week 5 of DS4B 101-R R for Business Course
# * Making Multiple ARIMA Models ----
model_table <- data_nested %>% # Map Fitted Models mutate(fitted_model = map(nested_column, .f = function(df) { # map() 関数は、リストの各要素に対して関数を適用します。 # .f = function(df) で関数を指定しています。ここでは、df にリストの各要素が格納されています。このdfはデータフレームです。 # dfという文字列は任意の文字列を記載できますか? はい、任意の文字列を記載できます。ここではdfと名付けたという事ですね。 # 実際の無名関数の役割は、{}に挟まれている内容ですね? はい、{}に挟まれている内容が無名関数の内容です。 arima_reg(seasonal_period = 52) %>% # arima_reg() 関数は、ARIMAモデルを作成します。 # seasonal_period = 52 で季節性を指定しています。52週間の季節性を指定しています。 # つまり、週次データの季節性を指定しています。 # 週次データの季節性を指定することで、季節性を考慮したARIMAモデルを作成します。 # 週次データの季節性を考慮することで、より正確な予測が可能になります。 # なぜ52週ですか?年間のデータをとる為ですか? はい、年間のデータを取るためです。 # その場合、なぜ48週間ではないのですか? 52週間のデータを取ることで、年間のデータを取ることができます。 set_engine("auto_arima") %>% # set_engine() 関数は、モデルのエンジンを指定します。 # "auto_arima" で自動ARIMAモデルを指定しています。 # 自動ARIMAモデルは、ARIMAモデルのパラメータを自動的に決定します。 # つまり、ARIMAモデルのパラメータを手動で設定する必要がなくなります。 # 自動ARIMAモデルは、ARIMAモデルのパラメータを自動的に決定するため、モデルの作成が簡単になります。 # ARIMAとは何ですか? ARIMAは、自己回帰和分移動平均モデルです。英語では、AutoRegressive Integrated Moving Average Modelです。 # 特徴は、時系列データの自己相関と季節性を考慮したモデルです。 # 自己相関とは、時系列データの過去のデータとの相関関係を指します。 # 過去のデータで何をしますか? 過去のデータを使って、未来のデータを予測します。 fit(Weekly_Sales ~ Date, data = df) # fit() 関数は、モデルを学習します。 # Weekly_Sales ~ Date でWeekly_SalesをDateで回帰分析することを指定しています。 # data = df でデータフレームを指定しています。このdfはfunction()の引数で指定しているデータフレームです。 })) %>% # Map Forecasts mutate(nested_forecast = map2(fitted_model, nested_column, .f = function(arima_model, df) { # map2() 関数は、2つのリストの要素に対して関数を適用します。 # .f = function(arima_model, df) で関数を指定しています。ここでは、arima_model にARIMAモデル、df にリストの各要素が格納されています。このdfはデータフレームです。 modeltime_table( arima_model # modeltime_table() 関数は、モデルの予測を作成します。 # arima_model にARIMAモデルを指定しています。 ) %>% modeltime_forecast( h = 52, actual_data = df ) # modeltime_forecast() 関数は、モデルの予測を作成します。 # h = 52 で52週間の予測を指定しています。 # actual_data = df でデータフレームを指定しています。このdfはfunction()の引数で指定しているデータフレームです。 # つまり、52週間の予測を作成しています。未来のですか? はい、未来のデータです。 }))
model_table
# * Unnest ----
model_table %>% select(id, nested_forecast) %>% unnest(nested_forecast) %>% group_by(id) %>% plot_modeltime_forecast(.facet_ncol = 2)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: the modeltime package.

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
modeltime package

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

メモ

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

環境設定

  • HTML形式のファイルが「file:///C:/Users/XXXXX/・・・」で保存されている場合、ローカルで保存されている状態。HTMLファイルをウェブサーバー(WordPressサイト)にアップロードする必要があり。
  • RのバージョンとRtoolsのバージョンは合わせる必要性がある。Rstudioは最新版でも問題なし。
  • 初期設定の3点セット:R, Rstudio, Rtools

参考リンク

]]>
https://chiquitos-chiquitos.com/r_g_20240920/feed/0
R_group_split() & glance()_20240917https://chiquitos-chiquitos.com/r_group_split_20240910/https://chiquitos-chiquitos.com/r_group_split_20240910/#respondTue, 17 Sep 2024 03:31:33 +0000https://chiquitos-chiquitos.com/?p=4185

]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

論点が多いので、2点に絞る。①group_split()で各データフレームをリストの形式で保持し、各データフレームはそのままtibble型として保持できる。②glanceで統計量の変数(r.squared, adj.r.squared, p.value, nobs)を追加可能。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

gt()を利用してデータテーブルとして情報を纏める。

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(tidyquant)
library(tidyverse)
library(broom)
# devtools::install_github("rstudio/fontawesome")
library(gt)
library(fontawesome)
library(htmltools)
# DATA ----
mpg
# 1.0 GROUP SPLIT ----
# - Turns a grouped data frame into an list of data frames (iterable)
# - Iteration & functions - Covered in Week 5 of DS4B 101-R
# Group Split
mpg %>% mutate(manufacturer = as_factor(manufacturer)) %>%  # as_factor()でmanufacturer列をfactor型に変換 # factor型に変換することで、group_by()でグループ化した際に、グループごとにデータを分割しやすくなる。 group_by(manufacturer) %>% group_split() # group_split()でグループごとにデータを分割し、リスト形式で返す。 # この場合、manufacturer列でグループ化しているので、manufacturerごとにデータを分割している(各データはtibble型)。
# We can now iterate with map()
mpg %>% mutate(manufacturer = as_factor(manufacturer)) %>% group_by(manufacturer) %>% group_split() %>% map(.f = function(df) { # map()でリストの各要素に対して関数を適用 lm(hwy ~ cty, data = df) # ここでは、リストの各要素(データフレーム)に対してlm()関数を適用している。 # lm()関数は、線形回帰モデルを作成する関数。 # hwy ~ cty でhwyをctyで回帰分析することを指定している。 # data = df でデータフレームを指定している。 })
# 2.0 POWER OF BROOM ----
# - Tidy up our linear regression metrics with glance()
# - Modeling & Machine Learning - Covered in Week 6 of DS4B 101-R Course
hwy_vs_city_tbl <- mpg %>% mutate(manufacturer = as_factor(manufacturer)) %>% group_by(manufacturer) %>% group_split() %>% map_dfr(.f = function(df) { lm(hwy ~ cty, data = df) %>% glance() %>% # glance()で線形回帰モデルの統計量を取得 # 具体的には、r.squared, adj.r.squared, p.valueなどの統計量を取得している。 add_column(manufacturer = unique(df$manufacturer), .before = 1) # add_column()でデータフレームに列を追加 # manufacturer列を追加している。 # unique(df$manufacturer) でdfのmanufacturer列のユニークな値を取得している。 # .before = 1 でmanufacturer列を先頭に追加している。 })
# 3.0 SUPER AWESOME TABLE WITH GT PACKAGE ----
# Source: https://themockup.blog/posts/2020-10-31-embedding-custom-features-in-gt-tables/
rating_stars <- function(rating, max_rating = 5) { # Function to create star ratings # rating: rating value # max_rating: maximum rating rounded_rating <- floor(rating + 0.5) # always round up # floor()で小数点以下を切り捨て、+0.5して四捨五入している。 # これにより、ratingの値を四捨五入している。 # 例えば、ratingが3.4の場合、3.4 + 0.5 = 3.9 となり、floor()で3に切り捨てられる。 stars <- lapply(seq_len(max_rating), function(i) { # lapply()で1からmax_ratingまでの数値に対して関数を適用 # ここでは、1からmax_ratingまでの数値に対して、以下の処理を行っている。 # seq_len(max_rating) で1からmax_ratingまでの数値を生成している。 # 生成した数値に対して、以下の処理を行っている。 if (i <= rounded_rating) { fontawesome::fa("star", fill= "orange") } else { fontawesome::fa("star", fill= "grey") } }) # iがrating以下の場合は、星を黄色で表示し、それ以外は灰色で表示する。 # これにより、ratingの値に応じて星の表示を変えている。 label <- sprintf("%s out of %s", rating, max_rating) # sprintf()で文字列をフォーマット. フォーマットとは、文字列の中に変数を埋め込むこと。 # ratingとmax_ratingを表示するための文字列を作成している。 # 例えば、ratingが3.4、max_ratingが5の場合、"3.4 out of 5" となる。 div_out <- div(title = label, "aria-label" = label, role = "img", stars) # div()でdiv要素を作成. divとは、HTMLの要素の一つで、他の要素をグループ化するために使用される。 # title, aria-label, role, starsを指定してdiv要素を作成している。 # title: ツールチップに表示されるテキスト # aria-label: 要素の役割を説明するための属性 # role: 要素の役割を指定するための属性 # stars: 星の表示 as.character(div_out) %>% # as.character()でdiv_outを文字列に変換 gt::html() # gt::html()でHTML要素を作成
}
hwy_vs_city_tbl %>% select(manufacturer, nobs, r.squared, adj.r.squared, p.value) %>% mutate(manufacturer = str_to_title(manufacturer)) %>% # str_to_title()で文字列をタイトルケースに変換 mutate(rating = cut_number(r.squared, n = 5) %>% as.numeric()) %>% # cut_number()で数値を指定した数のグループに分割 # ここでは、r.squaredを5つのグループに分割している。 # as.numeric()で数値型に変換 # これにより、r.squaredの値を5つのグループに分割している。 # 例えば、r.squaredが0.2の場合、1に分類される。# 0.4の場合、2に分類される。 # 分割基準は、0.2, 0.4, 0.6, 0.8。どのように分割されるかは、cut_number()関数のnで指定している。5等分の場合は、n=5。 mutate(rating = map(rating, rating_stars)) %>% # map()でrating列にrating_stars()関数を適用 arrange(desc(r.squared)) %>% # arrange()でデータを並び替え # desc()で降順に並び替え gt() %>% # gt()でgtオブジェクトを作成. gtオブジェクトとは、表を作成するためのオブジェクト。 tab_header(title = gt::md("__Highway vs City Fuel Mileage__")) %>% # tab_header()で表のヘッダーを設定 tab_spanner( label = gt::html("<small>Relationship Strength (hwy ~ cty)</small>"), columns = vars(r.squared, adj.r.squared, p.value) ) %>% # tab_spanner()で列のグループ化を行う # Relationship Strength (hwy ~ cty) というラベルを設定して、r.squared, adj.r.squared, p.valueをグループ化している。 # vars()で列を指定 fmt_number(columns = vars(r.squared, adj.r.squared)) %>% # fmt_number()で数値をフォーマット fmt_number(columns = vars(p.value), decimals = 3) %>% # 小数点以下3桁まで表示 tab_style( style = cell_text(size = px(12)), locations = cells_body( columns = vars(r.squared, adj.r.squared, p.value)) ) %>% # tab_style()でスタイルを設定 # cell_text()でセルのテキストのスタイルを設定 cols_label( manufacturer = gt::md("__MFG__"), nobs = gt::md("__#__"), r.squared = gt::html(glue::glue("<strong>R-Squared ", fontawesome::fa("arrow-down", fill = "orange"), "</strong>")), adj.r.squared = gt::md("__R-Squared (Adj)__"), p.value = gt::md("__P-Value__"), rating = gt::md("__Rating__") ) # cols_label()で列のラベルを設定 # gt::md()でマークダウンを設定 # gt::html()でHTMLを設定 # glue::glue()で文字列を結合 # fontawesome::fa()でフォントアイコンを設定 # fill = "orange"でアイコンの色をオレンジに設定 # これにより、列のラベルを設定している。 # 例えば、manufacturer列のラベルを"MFG"として設定している。 # R-Squaredのラベルを設定している。 # その他の列のラベルを設定している。 # これにより、表の列のラベルを設定している。

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇(mpg)
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム(mpg)

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

メモ

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_group_split_20240910/feed/0
R_縦持ちデータは描画で利用_pivot_longer_20240908https://chiquitos-chiquitos.com/r_longer_longer_20240908-with-vertical-data-on-the-drawing/https://chiquitos-chiquitos.com/r_longer_longer_20240908-with-vertical-data-on-the-drawing/#respondSun, 08 Sep 2024 07:58:26 +0000https://chiquitos-chiquitos.com/?p=4175

]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

縦軸にブランド(製造)で、横軸に車種を持ってくる。中身はカウント数なので、どのブランドがどの車種をどの程度保有しているかわかる。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

目的に応じてカラムとして集計する変数を追加していく。大小比較なら単純に降順で棒グラフ比較が分かり易いものの、どの組合せをどのブランドがカバーしているのかについては、カテゴリー変数×カテゴリー変数で整理して、①ブランドをみる、②横軸にそって攻められていない部分を視る、という比較が可能。例えば、車種別(商材の特徴別)でどの特徴が売上や利益として伸びているのか確認の上、ブランド別で車種カバレッジの割合を可視化。

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(tidyquant)
library(tidyverse)
# DATA ----
mpg
# PIVOTING DATA ----
# 1.0 Pivot Wider ----
# - Reshaping to wide format
mpg_pivot_table_1 <- mpg %>% group_by(manufacturer) %>% count(class, name = "n") %>% # class列の数をカウント。name = "n" でカウント結果をn列に格納。 ungroup() %>% pivot_wider( # wider formatに変換。横持ちデータ。クロス集計表。 names_from = class, # class列の値を列に変換 values_from = n, # n列の値を取得 values_fill = 0 # NAを0で埋める )
# 2.0 Pivot Table ----
# - Making Summary "Pivot Tables"
mpg_pivot_table_2 <- mpg %>% pivot_table( # クロス集計表を作成 .columns = class, # class列を列に変換 .rows = manufacturer, # manufacturer列を行に変換 .values = ~ n(), # n()でカウント # ~ はformulaの意味. formulaとは、関数の引数に渡す関数のこと。 fill_na = 0 # NAを0で埋める )
# - Using lists to capture complex objects
mpg %>% pivot_table( .rows = class, .values = ~ list(lm(hwy ~ displ + cyl - 1)) # ~ list(lm(hwy ~ displ + cyl - 1)) でlm()関数を使って回帰分析を行い、その結果をリストで取得. # この場合、class列の値ごとに回帰分析を行い、その結果をリストで取得している。 # このように、複雑なオブジェクトを取得する場合は、list()を使う。 # hwy ~ displ + cyl - 1 は、hwyをdisplとcylで回帰分析することを指定している。 )
# 3.0 Pivot Longer ----
# - Long format best for visualizations
mpg_long_summary_table <- mpg_pivot_table_1 %>% pivot_longer( # long formatに変換。縦持ちデータ。 cols = compact:subcompact, # compact列からsubcompact列までを変換(class列の中身) names_to = "class", # class列に変換 values_to = "value" # value列に変換.クロス集計表の中身であったvalueはvalue列を新たにさ作成、その値を入れる。 )
mpg_long_summary_table %>% ggplot(aes(class, manufacturer, fill = value)) + # class列をx軸、manufacturer列をy軸、value列をfillで色分け geom_tile() + # タイルを描画 geom_label(aes(label = value), fill = "white") + # fill = "white" でラベルの背景色を白に指定 # aes(label = value) でラベルにvalue列の値を表示 # geom_label() でラベルを描画 scale_fill_viridis_c() + # scale_fill_viridis_c() で色をviridisに指定 # viridisはカラーパレットの一つ theme_minimal() + # theme_minimal() でテーマをminimalに指定 labs(title = "Class by Auto Manufacturer") # labs(title = "Class by Auto Manufacturer") でタイトルを指定

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇(mpg)
  • rmarkdown:render()読込:- (.rmdのファイルをtemlate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム(mpg)

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

メモ

  • 行 (row) :レコード、Observation
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_longer_longer_20240908-with-vertical-data-on-the-drawing/feed/0
R_data % group_by() % summarise(across(変数、集計方法)) % _20240908https://chiquitos-chiquitos.com/r_data-group_by-summarise-across-_20240908/https://chiquitos-chiquitos.com/r_data-group_by-summarise-across-_20240908/#respondSun, 08 Sep 2024 07:29:51 +0000https://chiquitos-chiquitos.com/?p=4166

特になし。]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

group_by() % summarise(across(c(変数1,変数2), .fns = list(“mean” = ~ mean(.x), “range lo” = ~ mean(.x) – 2*sd(.x), “range hi” = ~ mean(.x) + 2sd(.x)))) ← この形で覚えてしまう。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

今回はスキップ。目的に応じてカラムとして集計する変数を追加していく。

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# 1.0 BASIC USAGE ----
# * AVERAGE CITY FUEL CONSUMPTION BY VEHICLE CLASS ----
mpg %>% group_by(class) %>% summarise( across(cty, .fns = mean), # .fns = mean で平均値を計算 # .fns = とはfunctionの略 # across() で指定したカラムに対してfunctionを適用 .groups = "drop" # .groups = "drop" でgroup_by()の効果を無効化、つまり通常のテーブルに戻す。 # グループ化されたままにする場合(group_by()の効果を残す場合)、".groups = "keep""を指定。 # または、group_by()の代わりにgroup_by()の代わりにungroup()を使う。 # .group_by()を残してしまうと、その後の処理でエラーが発生することがある。 # group_by()の効果が残っていると、group_by()で指定したカラム以外のカラムを使うとエラーが発生する。 )
# * AVERAGE & STDEV CITY FUEL CONSUMPTION BY VEHICLE CLASS
mpg %>% group_by(class) %>% summarise( across(cty, .fns = list(mean = mean, stdev = sd)), .groups = "drop" # acrossはlist()で複数のfunctionを指定できる。(複数列の設定) # 列名はmeanとstdevになる。接頭辞のctyは自動で各列に付与される。 )
# * AVERAGE & STDEV CITY + HWY FUEL CONSUMPTION BY VEHICLE CLASS
mpg %>% group_by(class) %>% summarise( across(c(cty, hwy), .fns = list(mean = mean, stdev = sd)), .groups = "drop" # 複数変数も指定可能 )
# 2.0 ADVANCED ----
# * CUSTOMIZE NAMING SCHEME ----
mpg %>% group_by(class) %>% summarise( across( c(cty, hwy), .fns = list(mean = mean, stdev = sd), .names = "{.fn} {.col} Consumption" # .names = "{.fn} {.col} Consumption" で列名をカスタマイズ # Consumptionは固定 # .fn はfunction名、.col は列名 # .fnsはlist()で指定する。複数のfunctionを指定できる。 # この場合、列名は "mean cty Consumption" と "stdev cty Consumption" になる。 ), .groups = "drop" ) %>% rename_with(.fn = str_to_upper) # rename_with() で列名を大文字に変換 # str_to_upper() で大文字に変換 # rename_with(.fn = str_to_upper) で全ての列名を大文字に変換 # .fn はfunction名。functionとは、列名を変更するfunctionを指定する。
# * COMPLEX FUNCTIONS ----
mpg %>% group_by(class) %>% summarise( across( c(cty, hwy), .fns = list( "mean" = ~ mean(.x), # ~ はfunction(無名関数)の略. .x は列名。ここではc()で指定した列名。 "range lo" = ~ (mean(.x) - 2*sd(.x)), # 平均値から2標準偏差を引いた値(下限)。全データの95%がこの範囲に収まる。 "range hi" = ~ (mean(.x) + 2*sd(.x)) # 平均値から2標準偏差を足した値(上限)。全データの95%がこの範囲に収まる。 ), .names = "{.fn} {.col}" # 列名をカスタマイズ ), .groups = "drop" ) %>% rename_with(.fn = str_to_upper)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇(mpg)
  • rmarkdown:render()読込:- (.rmdのファイルをtemlate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム(mpg)

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

特になし。

メモ

  • 行 (row) :レコード、Observation
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_data-group_by-summarise-across-_20240908/feed/0
R_relocate()_列の並び替え_20240908https://chiquitos-chiquitos.com/r_relocate_20240908/https://chiquitos-chiquitos.com/r_relocate_20240908/#respondSun, 08 Sep 2024 06:34:42 +0000https://chiquitos-chiquitos.com/?p=4159

特になし。]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

relocateはカラムの順序を変更する

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

今回はスキップ

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# LIBRARIES ----
library(tidyverse)
# DATA ----
mpg
# mpgとはrのデータセットの一つ。車の燃費に関するデータセット。
?mpg
# SELECT VS RELOCATE ----
# - Select is like filter() for columns
mpg %>% select(model, manufacturer, class, year)
# - Relocate is like arrange() for columns
mpg %>% relocate(model, manufacturer, class, year)
?relocate
# 1.0 RELOCATE BY COLUMN NAME ----
# - Move single column by position
mpg %>% relocate(manufacturer, .after = class) # .after = class でclassの後ろにmanufacturerを移動
?last_col
mpg %>% relocate(manufacturer, .after = last_col()) # last_col() で最後の列の後ろに移動(最後のカラム名を指定しなくてよい) # つまり最後の列に持っていく指示
mpg %>% relocate(manufacturer, .after = last_col(offset = 1)) # last_col(offset = 1) で最後の列の前に移動。2の場合は2つ前に移動。
# 2.0 RELOCATE BY DATA TYPE ----
# - Move multiple columns by data type
mpg %>% relocate(where(is.numeric)) # 数値型のカラムを最初に移動
mpg %>% relocate(where(is.character)) # 文字型のカラムを最初に移動
mpg %>% relocate(where(is.character), .after = last_col()) # 文字型のカラムを最後に移動
# 3.0 RELOCATE WITH TIDYSELECT ----
?contains
mpg %>% relocate(starts_with("m"), .before = year) # mで始まるカラムをyearの前に移動

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇(mpg)
  • rmarkdown:render()読込:- (.rmdのファイルをtemlate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム(mpg)

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

特になし。

メモ

  • 行 (row) :レコード、Observation
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_relocate_20240908/feed/0
R_rmarkdown:render()_20240906https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906-2/https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906-2/#respondSun, 08 Sep 2024 05:17:57 +0000https://chiquitos-chiquitos.com/?p=4137

特になし。]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

rmarkdown:render()の読込まで(生データの作成は別の機会で)

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

PDFを指定してアウトプット

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# 1.0 LIBRARIES ----
library(rmarkdown)
# 2.0 AUTOMATE PDF REPORTING ----
# - Make sure you have tinytex installed with: tinytex::install_tinytex()
install.packages("tinytex")
library(tinytex)
# Technology Portfolio ----
portfolio_name <- "Technology Portfolio"
symbols <- c("AAPL", "GOOG", "NFLX", "NVDA")
output_file <- "technology_portfolio.pdf"
# Financial Portfolio ----
portfolio_name <- "Financial Portfolio"
symbols <- c("V", "MA", "PYPL")
output_file <- "financial_portfolio.pdf"
# Automation Code ----
rmarkdown::render( # render() 関数は、R Markdown ファイルをレンダリングします。 # render(input, output_format, output_file, output_dir, params) input = "007_pdf_reporting/template/stock_report_template.Rmd", # input: レンダリングするR Markdownファイルのパス # レンダリングとは、R MarkdownファイルをHTML、PDF、Wordなどのファイル形式に変換することです。 # 前提として、R Markdownファイルは、事前に作成する必要性がある。 output_format = "pdf_document", # output_format: レンダリングするファイル形式を指定します。 output_file = output_file, # output_file: レンダリングされたファイルの名前を指定します。 # ここでは変数output_fileに格納されたファイル名を指定しています。 output_dir = "007_pdf_reporting/output/", # output_dir: レンダリングされたファイルの保存先ディレクトリを指定します。 # params: レンダリング時に使用するパラメータを指定します。 # list 関数を使用して、portfolio_name、symbols、start、end、show_codeのパラメータを指定しています。 params = list( portfolio_name = portfolio_name, # portfolio_name: ポートフォリオ名を指定します。 symbols = symbols, # symbols: シンボルを指定します。 start = "2010-01-01", # start: 開始日を指定します。 end = "2019-12-31", # end: 終了日を指定します。 show_code = FALSE # show_code: コードを表示するかどうかを指定します。 )
)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: Yahoo finance

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemlate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム(.rmdファイルを作成する必要がある)

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
# Automation Code ----
rmarkdown::render( # render() 関数は、R Markdown ファイルをレンダリングします。 # render(input, output_format, output_file, output_dir, params) input = "007_pdf_reporting/template/stock_report_template.Rmd", # input: レンダリングするR Markdownファイルのパス # レンダリングとは、R MarkdownファイルをHTML、PDF、Wordなどのファイル形式に変換することです。 # 前提として、R Markdownファイルは、事前に作成する必要性がある。 output_format = "pdf_document", # output_format: レンダリングするファイル形式を指定します。 output_file = output_file, # output_file: レンダリングされたファイルの名前を指定します。 # ここでは変数output_fileに格納されたファイル名を指定しています。 output_dir = "007_pdf_reporting/output/", # output_dir: レンダリングされたファイルの保存先ディレクトリを指定します。 # params: レンダリング時に使用するパラメータを指定します。 # list 関数を使用して、portfolio_name、symbols、start、end、show_codeのパラメータを指定しています。 params = list( portfolio_name = portfolio_name, # portfolio_name: ポートフォリオ名を指定します。 symbols = symbols, # symbols: シンボルを指定します。 start = "2010-01-01", # start: 開始日を指定します。 end = "2019-12-31", # end: 終了日を指定します。 show_code = FALSE # show_code: コードを表示するかどうかを指定します。 )
)

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

特になし。

メモ

  • 行 (row) :レコード、Observation
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906-2/feed/0
R_pivot_table &gt()_20240906https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906/https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906/#respondFri, 06 Sep 2024 07:34:20 +0000https://chiquitos-chiquitos.com/?p=4126

pivotでクロス集計表を作成。行:.rows = YEAR(date)、列:ccolumns = ~ symbol。値は.values = ~ adjusted。冒頭は1列ではなく2列指定する事が可能。]]>

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

pivot_tb()の冒頭複数列とgt()テーブル

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

テーブル作成

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

# 1.0 LIBRARIES ----
library(tidyquant)
library(tidyverse)
library(gt)
# 2.0 GET DATA ----
stock_data_tbl <- c("AAPL", "GOOG", "NFLX", "NVDA") %>% tq_get(from = "2010-01-01", to = "2019-12-31") %>% select(symbol, date, adjusted)
# 3.0 PIVOT TABLE - Percent Change by Year ----
# * Basics ----
stock_data_tbl %>% pivot_table( .rows = c(~ symbol, ~ MONTH(date, label = TRUE)), # クロス集計表。行にシンボル、列に月を指定して、adjusted列の中央値を取得。 # label = TRUE は、月のラベルを取得することを指定しています。 .columns = ~ YEAR(date), .values = ~ MEDIAN(adjusted) ) %>% rename_at(.vars = 1:2, ~ c("Symbol", "Month"))
stock_data_tbl %>% pivot_table( .rows = c(~ YEAR(date), ~ MONTH(date, label = TRUE)), .columns = symbol, .values = ~ MEDIAN(adjusted) ) %>% rename_at(.vars = 1:2, ~ c("Year", "Month")) # rename_at() 関数は、列名を変更します。1列目と2列目をYearとMonthに変更。
stock_data_tbl %>% pivot_table( .columns = ~ MONTH(date, label = TRUE), # クロス集計表。列に月を指定して、adjusted列の中央値を取得。 .rows = c(~ YEAR(date), symbol), .values = ~ MEDIAN(adjusted) ) %>% rename(Year = 1)
# * Percent Change by Year ----
stock_performance_tbl <- stock_data_tbl %>% pivot_table( .rows = ~ YEAR(date), .columns = ~ symbol, .values = ~ PCT_CHANGE_FIRSTLAST(adjusted) # PCT_CHANGE_FIRSTLAST() 関数は、最初と最後の値の変化率を計算します。 ) %>% rename(YEAR = 1) # rename() 関数は、列名を変更します。1列目をYEARに変更。
# 4.0 PIVOT CHARTS ----
color_fill <- "#1ecbe1" #ハイライトの色を設定
pivot_table_gt <- stock_performance_tbl %>% gt() %>% # gt() 関数は、グラフィカルテーブルを作成します。グラフィカルテーブルとは、データを視覚的に表示するテーブルです。 tab_header("Stock Returns", subtitle = md("_Technology Portfolio_")) %>% # テーブルタイトル fmt_percent(columns = vars(AAPL, GOOG, NFLX, NVDA)) %>% # fmt_percent() 関数は、パーセントをフォーマットします。 tab_spanner( # tab_spanner() 関数は、列のグループ化を行います。(エクセルの列統合) label = "Performance", columns = vars(AAPL, GOOG, NFLX, NVDA) ) %>% tab_source_note( source_note = md("_Data Source:_ Stock data retreived from Yahoo! Finance via tidyquant.") ) %>% # tab_source_note() 関数は、ソースノートを追加します。注釈。 tab_style( style = list( cell_fill(color = color_fill), #セルの色を指定色でハイライト。 cell_text(weight = "bold", color = "white") # セルの数理をボールド、白抜き。 ), locations = cells_body( columns = vars(AAPL), # 適用先の変数列名。文字列を指定。 rows = AAPL >= 0) # 適用先の行。条件を指定。 ) %>% tab_style( style = list( cell_fill(color = color_fill), cell_text(weight = "bold", color = "white") ), locations = cells_body( columns = vars(GOOG), rows = GOOG >= 0) ) %>% tab_style( style = list( cell_fill(color = color_fill), cell_text(weight = "bold", color = "white") ), locations = cells_body( columns = vars(NFLX), rows = NFLX >= 0) ) %>% tab_style( style = list( cell_fill(color = color_fill), cell_text(weight = "bold", color = "white") ), locations = cells_body( columns = vars(NVDA), rows = NVDA >= 0) )
pivot_table_gt
# 5.0 SAVING THE CHART ----
# - Requires Phantom JS
install.packages("webshot")
# install.packages("PhantomJS") R version 4.4.1 (2024-06-14 ucrt)で利用不可
pivot_table_gt %>% gtsave(filename = "006_pivot_tables/stock_returns.png") # gtsave() 関数は、グラフィカルテーブルを保存します。

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: Yahoo finance

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。
stock_data_tbl <- c("AAPL", "GOOG", "NFLX", "NVDA") %>% tq_get(from = "2010-01-01", to = "2019-12-31") %>% select(symbol, date, adjusted)

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

pivotでクロス集計表を作成。行:.rows = YEAR(date)、列:ccolumns = ~ symbol。値は.values = ~ adjusted。冒頭は1列ではなく2列指定する事が可能。

メモ

  • 行 (row) :レコード、Observation
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。
  • 値:data point、Feature
  • Wide format:クロス集計表(横持ちデータ)、Long format:縦持ちデータ
  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。

参考リンク

]]>
https://chiquitos-chiquitos.com/r_pivot_table-gt_20240906/feed/0