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

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


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(抽出~整形)
- Source: https://fueleconomy.gov/
- SQL読込: –
- CSV読込: –
- API読込 : 〇(mpg)
- rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

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


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

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:チルダ) も無名関数。
参考リンク
- Script事例:https://www.business-science.io/
- Rデータの種類:https://ebreha.com/__trashed/


