京橋のバイオインフォマティシャンの日常

データ分析、コマンドライン、プログラミングについての技術資料・自己アップデート・悩み事などをまとめています。最近、ディープラーニング関連のR言語の資料をまとめるべく注力してます。

htmlwidgets for R のShowcaseにあるパッケージがCodePenでブログ表示できるかを調べた件

f:id:skume:20220119223900p:plain

はじめに

htmlwidgets for R パッケージは、Rでインタラクティブな図が作成できる王道的なパッケージであり、 それを使った色々な依存パッケージが開発されています。

www.htmlwidgets.org

今回、htmlwidgetsのshowcaseにある12パッケージをHatena Blog内の図表として表示するにあたって、(1)Html 出力の可否 、(2)CodePen対応できるか?、さらには(3)ブログ表示できるか?を調べてみました。

CodePenとは、ユーザーが作成したHTML、CSS、JavaScriptのコードスニペットのテスト、 および披露をするオンラインツールの1つです。

とりあえず、結果

パッケージ html output CodePen はてなブログ表示
Leaflet 473KB
Dygraphs 574KB
Plotly 3.5MB X X
rbokeh 955KB X X
Highcharter 995KB X X
visNetwork 1.1MB X X
networkD3 263KB
d3heatmap 229KB
DataTables 207KB
threejs 977KB X X
rglwidget X X X
DiagrammeR 2.5MB X X
MetricsGraphics 368KB

表示結果

Leaflet

Rスクリプト

if(!require("leaflet")){install.packages("leaflet")}; library(leaflet)
if(!require("magrittr")){install.packages("magrittr")}; library(magrittr)

m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R") 
m

CodePenでの出力結果

See the Pen leaflet by skume (@kumes) on CodePen.

Dygraphs

Rスクリプト

if(!require("dygraphs")){install.packages("dygraphs")}; library(dygraphs)
if(!require("magrittr")){install.packages("magrittr")}; library(magrittr)

dygraph(nhtemp, main = "New Haven Temperatures") %>% 
  dyRangeSelector(dateWindow = c("1920-01-01", "1960-01-01"))

CodePenでの出力結果

See the Pen dygraph by skume (@kumes) on CodePen.

networkD3

Rスクリプト

if(!require("networkD3")){install.packages("networkD3")};
library(networkD3)
if(!require("magrittr")){install.packages("magrittr")}; library(magrittr)

data(MisLinks, MisNodes)
forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             Group = "group", opacity = 0.4)

CodePenでの出力結果(Run Pen クリック必要)

See the Pen networkD3 by skume (@kumes) on CodePen.

d3heatmap

Rスクリプト

if(!require("d3heatmap")){install.packages("d3heatmap")}; library(d3heatmap)

d3heatmap(mtcars, scale="column", colors="Blues")

CodePenでの出力結果

See the Pen d3heatmap by skume (@kumes) on CodePen.

DataTables

Rスクリプト

if(!require("DT")){install.packages("DT")}; library(DT)

datatable(iris, options = list(pageLength = 5))

CodePenでの出力結果

See the Pen datatable by skume (@kumes) on CodePen.

MetricsGraphics

Rスクリプト

if(!require("metricsgraphics")){install.packages("metricsgraphics")}; library(metricsgraphics)
if(!require("magrittr")){install.packages("magrittr")}; library(magrittr)

mjs_plot(mtcars, x=wt, y=mpg) %>%
  mjs_point(color_accessor=carb, size_accessor=carb) %>%
  mjs_labs(x="Weight of Car", y="Miles per Gallon")

CodePenでの出力結果

See the Pen metricsgraphics by skume (@kumes) on CodePen.

まとめ

CodePenの1MB制限で、Plotly、rbokeh、Highcharter、visNetwork、threejs、DiagrammeRがCodePenで保存できない。

うすうす気付いてたけど、Plotlyのhtml出力はやや重過ぎるので、Webコード共有には不向き。

visNetworkの結果は貼付できないけど、networkD3の結果は貼付できるという不思議な結果になった。。

CodePenでの保存ができると、だいたいブログでも表示できるっぽい。

MacOSXターミナルでのbz2形式の圧縮・解凍についてまとめてみた件

f:id:skume:20220119223039p:plain

.bz2について

bzip2では、 圧縮効率を良くするために、ブロックソート法などを用いています。 gzipやzipといったデータ圧縮に比べて、より高い圧縮率を示します。 また、bz2単独では、アーカイブ機能はありません。

Macでは、bzip2コマンドでbzip2圧縮、 bunzip2コマンドでbzip2解凍ができます。

それでは、Macのターミナルを起動して、実行してみます。

bzip2コマンドによるbzip2圧縮

bzip2コマンドは、 1つのファイルあるいはファイルパスに対して実行します。

bzip2 -z [File]

オプション

  • -z: 圧縮を行う(デフォルトなので省略化)

また、フォルダの圧縮はできない

bzip2圧縮を行い、任意のファイル名で保存する場合

bzip2 -z [File] > xxxx.bz2

bunzip2コマンドによるbzip2解凍

「XXXX.bz2」を解凍する場合

bunzip2 XXXX.bz2  

#OR

bzip2 -d XXXX.bz2 > [File]

オプション

  • -d: 伸張を行う

また、元ファイルを残して、解凍する場合には、 -kオプションを付けます。

bunzip2 -k XXXX.bz2  

.tar.bz2について

bz2圧縮ではアーカイブ機能がないので、 tarを組み合わせてアーカイブ化します。

.tar.bz2とは、tarでアーカイブ化して、 bzip2圧縮することを意味します。

tarコマンドによるtar.bz2圧縮

「XXXX.tar.bz2」として、tar.bz2圧縮アーカイブ化する場合

tar -jcvf XXXX.tar.bz2 [File1] [File2] [File3]

#OR

tar -acvf XXXX.tar.bz2 [File1] [File2] [File3]

オプション

  • j: bzip2の意味

  • cvf: tarアーカイブ化

  • [File1] [File2] [File3]: 圧縮したいファイル(フォルダも可)

  • a: 拡張子による圧縮方式の自動判定

また、オプションの「-」は、tarの場合、省略できます。

tarコマンドで、フォルダごとの圧縮ができる

tarコマンドによるtar.bz2解凍

「XXXX.tar.bz2」をbz2解凍して、tarアーカイブを戻す場合

tar -jxvf xxxx.tar.bz2

#OR

tar -axvf xxxx.tar.bz2

オプション

  • j: bzip2の意味

  • xvf: tarアーカイブの解凍

  • a: 拡張子による解凍方式の自動判定

また、オプションの「-」は、tarの場合、省略できます。

R/Keras/TensorFlowでやる『ディープラーニング(Deep Learning)』のすゝめ【その2】教師なしニューラルネットワーク Autoencoder with 2D CNNの実装、そして色ムラ・ノイズ除去(Denoising)をやってみた件

f:id:skume:20220119221936p:plain

はじめに

「R/Keras/TensorFlowでやるディープラーニングのすゝめ」の連載2回目です(2022年1月19日アップデート版)。

【1】では、ベクトルデータに対する Autoencoderを取り上げましたが、 今回は、 2D Convolutional Neural Network (CNN: 畳み込みニューラルネットワーク) を使ったAutoencoderの実装について概説します。

skume.net

下記で登場する、CNNMaxプーリングUpサンプリング活性化関数 などについては、すでに多くの分かりやすい説明記事がありますので、そちらを参照のこと。

qiita.com

deepage.net

qiita.com

https://kansiho.hatenablog.com/entry/2018/05/07/%E5%9B%B3%E3%81%A7%E8%AA%AD%E3%82%80%E3%80%8C%E5%AE%9F%E8%A3%85%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%80%8D%E3%81%9D%E3%81%AE%EF%BC%91kansiho.hatenablog.com

https://www.researchgate.net/publication/332057917_Transfer_learning_between_crop_types_for_semantic_segmentation_of_crops_versus_weeds_in_precision_agriculturewww.researchgate.net

今回の内容

R/Kerasのセットアップ

RStudioを起動して、Kerasパッケージをロードします。そして、Pythonを選択します。

library(keras)
#"/usr/local/bin/python"を選択する
reticulate::use_python("/usr/local/bin/python", required =T)

R/Kerasのセットアップの詳細については、前回の記事とかを参照のこと。

skume.hatenablog.com

www.slideshare.net

MNISTデータの準備

今回も、手書きアラビア文字であるMNISTデータセットを使用します。

MNISTデータセットをロードして、リスト型からアレイ型に変換します。

同データセットのトレーニングデータは6万枚の画像りますがが、 それを全て使用すると、残念ながら、CPU計算ではなかなか収束しない・・・

そこで、トレーニングデータの内で、1000枚の画像をランダムで ピックアップして、新たにデータセットを作ります。

また、2D CNNレイヤーを使用する場合、 inputデータは、4次元アレイ型(= 4次元テンソル)に変換しておくのがポイントです。

#MNISTのダウンロード
Data <- dataset_mnist()
str(Data)

#アレイ型に変換
xtrain <- Data$train$x
ytrain <- Data$train$y

#256階調 => 0〜1 に変換する
xtrain <- xtrain/255

#1000枚の画像をランダム・ピックアップ
Sam <- sample(1:dim(xtrain)[1], 1000, replace = F)
xtrain <- xtrain[Sam,,]
ytrain <- ytrain[Sam]

#4次元アレイ型に変換
x_train <- array_reshape(xtrain, dim=c(dim(xtrain)[1], 28, 28, 1))

dim(x_train)
#[1] 1000   28   28    1

このとき、4次元アレイ(= 4次元テンソル)は、 1次元目を画像番号、2と3次元目を2D画像データ、 4次元目をチャネル数( グレイスケールの場合、1 、RGBの場合、3 )で与えます。

Autoencoder with 2D CNN のモデル構築

2D CNNを使用する場合、実際の入力データは、4次元アレイの1次元目を除いた、2〜4次元目の3次元アレイとなります。 このアレイは、1と2次元目を2D画像データ、3次元目をチャネル数で与えます。 そのため、layer_inputshapeは、c(28, 28, 1) と3要素ベクトル(ピクセル数とチャネル数の組み合わせ)で記述します。

ちょっとした関数の説明

layer_conv_2d関数で、2次元畳み込み層(例えば、画像上の空間畳み込み)を与える。

layer_conv_2dfiltersは、出力空間の次元(すなわち、畳み込みの出力フィルタの数)を整数値で与える。

layer_conv_2dkernel_size(sizeで与える)は、2次元畳み込みウィンドウの幅と高さを、整数値で与える。

layer_conv_2dpaddingでは、"valid" か "same" を指定する。"same"の場合、同じアレイを返す。

layer_max_pooling_2d関数は、空間データの最大プーリング処理を行う層を与える。

layer_max_pooling_2dpool_sizeは、ダウンスケールする係数 (垂直, 水平)を整数値で与える。例えば、c(2, 2) を指定すると、垂直・水平の空間次元で入力が半分になる。

layer_upsampling_2d関数は、2D入力用のアップサンプリング層を与える。

layer_upsampling_2dsizeでは、行と列のアップサンプリング係数を整数値で与える。

これらのKeras内の関数を使って、autoencoderモデルを構築してみる。

#インプット層の設定
input <- layer_input(shape = c(28, 28, 1))
kernel_size <- c(3,3)
filters <- 32

#アウトプット層の設定
output = input %>%
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_max_pooling_2d(pool_size=c(2,2), padding="same") %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_max_pooling_2d(pool_size=c(4,4), padding="same") %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_upsampling_2d(size=c(4,4))  %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="valid")  %>% 
  layer_upsampling_2d(size=c(2,2))  %>% 
  layer_conv_2d(filters=1, kernel_size=kernel_size, activation="sigmoid", padding="same")
  
Autoencoder2DCNN <- keras_model(input, output)
summary(Autoencoder2DCNN)

#Model: "model"
#_____________________________________________________
#Layer (type)           Output Shape          Param # 
#=====================================================
#input_1 (InputLayer)   [(None, 28, 28, 1)]   0       
#_____________________________________________________
#conv2d (Conv2D)        (None, 28, 28, 32)    320     
#_____________________________________________________
#max_pooling2d (MaxPool (None, 14, 14, 32)    0       
#_____________________________________________________
#conv2d_1 (Conv2D)      (None, 14, 14, 32)    9248    
#_____________________________________________________
#max_pooling2d_1 (MaxPo (None, 4, 4, 32)      0       
#_____________________________________________________
#conv2d_2 (Conv2D)      (None, 4, 4, 32)      9248    
#_____________________________________________________
#up_sampling2d (UpSampl (None, 16, 16, 32)    0       
#_____________________________________________________
#conv2d_3 (Conv2D)      (None, 14, 14, 32)    9248    
#_____________________________________________________
#up_sampling2d_1 (UpSam (None, 28, 28, 32)    0       
#_____________________________________________________
#conv2d_4 (Conv2D)      (None, 28, 28, 1)     289     
#=====================================================
#Total params: 28,353
#Trainable params: 28,353
#Non-trainable params: 0
#_____________________________________________________

このとき、input_1 (InputLayer) [(None, 28, 28, 1)]conv2d_4 (Conv2D) (None, 28, 28, 1)のサイズを一致させる必要があります。

このモデルでは、28x28 => 14x14 => 4x4 => 16x16 => 14x14 => 28x28 とピクセルサイズがダウンスケール・アップスケールしています。

このとき、4x4以下までピクセル数を下げると、精度が悪くなる。また、16x16 => 14x14は、layer_conv_2dpaddingvalidとすることでピクセル数を微調整しています。

あと、MNISTデータは、28x28ピクセルであるが、モデル構築の観点からは、使用する2D画像のピクセル数は、2N x 2N ピクセル(例えば、25 = 32、27 = 128)が望ましいです。

DLモデルの出力

source("https://gist.githubusercontent.com/kumeS/41fed511efb45bd55d468d4968b0f157/raw/0f64b83700ac578d0c39abd420da5373d4317083/DL_plot_modi_v1.1.R")

Autoencoder2DCNN %>% plot_model_modi(width=1, height=1.25)

plot_model_modiの出力結果)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/1_model.html

TensorFlowでもやってみると

tf <- reticulate::import(module = "tensorflow")
py_plot_model <- tf$keras$utils$plot_model
py_plot_model(Autoencoder2DCNN, to_file='Autoencoder2DCNN_tf.png', 
              show_shapes=T, show_layer_names=T, 
              expand_nested=T, dpi=100)

py_plot_modelの出力結果)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/1_Autoencoder2DCNN_tf.png

モデルが確認できれば、compile & fit を実行する。

# compile
Autoencoder2DCNN %>% 
  compile(optimizer="rmsprop", loss="mean_squared_error")

# Fit
Autoencoder2DCNN %>% 
  fit(x_train, x_train, epochs=200, batch_size=32, 
      shuffle = T, verbose=1)

(トレーニングの結果)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/2_Autoencoder.html

結果の評価

次に、このモデルによるTrainデータセットの変換結果を実際の画像と比較してみます。

まずは、アレイ型を4次元から3次元に変換します。

library(EBImage)
pred_imgs <- Autoencoder2DCNN %>% predict(x_train)
pred_imgsR <- array_reshape(pred_imgs, dim=c(dim(pred_imgs)[1], 28, 28))
dim(pred_imgsR)

par(mfrow=c(3,2))
for (i in 1:6) {
  m <- sample(1:dim(xtrain)[1], 1, replace = F)
  display(combine(t(xtrain[m,,]), t(pred_imgsR[m,,])), 
          method="raster", nx=2, all=TRUE, spacing = 0.01, margin = 2)
}

左側が入力画像(オリジナル画像)、右側が予測出力画像の結果を示します。

https://kumes.github.io/Blog/ConvolutionalAutoencoder/3_Pred.png

さらに、Autoencoderの圧縮特徴量層を取り出して、t分布型確率的近傍埋め込み法 (t-SNE; T-distributed Stochastic Neighbor Embedding) で次元圧縮を行い、2D 表示をしてみます。

#圧縮特徴量層までの変換モデルを取り出して、予測する
summary(Autoencoder2DCNN)
intermediate_layer <- keras_model(inputs = Autoencoder2DCNN$input,
                                  outputs = get_layer(Autoencoder2DCNN, "conv2d_2")$output)
summary(intermediate_layer)
intermediate_output <- predict(intermediate_layer, x_train)

#圧縮特徴量層をベクトルに変換
str(intermediate_output)
intermediate_output_re <- array_reshape(intermediate_output, dim=c(dim(intermediate_output)[1], dim(intermediate_output)[2]*dim(intermediate_output)[3]*dim(intermediate_output)[4]))
xy <- data.frame(ytrain, intermediate_output_re)

#t-SNEによる圧縮特徴量ベクトルの次元圧縮
#install.packages("Rtsne")
library(Rtsne)
xy.tSNE <- Rtsne(as.matrix(xy[,-1]), check_duplicates = FALSE, verbose=TRUE, 
                 dims = 2, perplexity = 25, theta = 0.5, max_iter = 5000)
plot(xy.tSNE$Y, cex=0.5, pch=19, col=rainbow(10)[xy[,1]+1],
     xlab="t-SNE PC1", ylab="t-SNE PC2")

#結果表示
par(mfrow=c(1,1), mai=c(0.75,0.75,0.2,0.2), mgp = c(2,1,0))
xy1 <- data.frame(ytrain, xy.tSNE$Y)
plot(xy1[,2:3], cex=0.5, pch=19, col="white",
     xlab="t-SNE PC1", ylab="t-SNE PC2")
a <- range(xy1[,2][is.finite(xy1[,2])])
b <- range(xy1[,3][is.finite(xy1[,3])])
a1 <- diff(a)*0.0125
b1 <- diff(b)*0.0125

for(n in 1:nrow(xy1)){
  #n <-1
  v <- col2rgb(rainbow(10)[xy1[n,1] + 1]) / 255
  img = channel(xtrain[n,,], 'rgb')
  img[,,1] <- img[,,1]*v[1]
  img[,,2] <- img[,,2]*v[2]
  img[,,3] <- img[,,3]*v[3]
  ff <- t(as.raster(img))
  ff[ff == "#000000"] <- "#00000000"
  rasterImage(ff, xy1[n,2]-a1, xy1[n,3]-b1, 
              xy1[n,2]+a1, xy1[n,3]+b1)
}

https://kumes.github.io/Blog/ConvolutionalAutoencoder/4_tSNE.png

CNNモデルの方*1が、良い感じに分離境界がでています。

色ムラに対するDenoising Autoencoder

このセクションでは、Autoencoderを用いた、色ムラのノイズ除去を行ってみます。

ゴマシオノイズを消す事例は多くあったので、色ムラ戻す事例をやってみます。

まずは、続けてやるとよくないので、RStudioを初期化してみます。

.rs.restartR()
library(keras)
reticulate::use_python("/usr/local/bin/python", required =T)

色ムラがある手書き文字の生成

ランダムな方向に線形の色ムラを施して、4次元アレイ型に変換します。

str(xtrain)
xtrain_noise <- xtrain
abc <- sample(1:4, 1000, replace=T)

for(n in 1:dim(xtrain_noise)[1]){
  m <- abc[n]
  ab <- matrix(1, 28, 28)*seq(from = 0, to = 1, by = 1/27)
  if(m == 1){
    xtrain_noise[n,,] <- xtrain[n,,]*ab
  }
  if(m == 2){
    xtrain_noise[n,,] <- xtrain[n,,]*t(ab)
  }
  if(m == 3){
    xtrain_noise[n,,] <- xtrain[n,,]*ab[28:1,]
  }
  if(m == 4){
    xtrain_noise[n,,] <- xtrain[n,,]*t(ab[28:1,])
  }
}

#4次元アレイ型に変換
x_train <- array_reshape(xtrain, dim=c(dim(xtrain)[1], 28, 28, 1))
x_train_noise <- array_reshape(xtrain_noise, dim=c(dim(xtrain_noise)[1], 28, 28, 1))

そして、色ムラ有無の2D画像を並べて確認してみます。

library(EBImage)

par(mfrow=c(3,2))
for (i in 1:6) {
  m <- sample(1:dim(x_train)[1], 1, replace = F)
  EBImage::display(combine(t(x_train_noise[m,,,]), t(x_train[m,,,])), 
          method="raster", nx=2, all=TRUE, spacing = 0.01, margin = 2)
}

https://kumes.github.io/Blog/ConvolutionalAutoencoder/5_Denoise.png

左側が色ムラ画像(入力画像)、右側がオリジナル画像(出力画像)を示します。

Autoencoder for denoising モデルの構築

上記モデルとほぼ同じで、filtersは64に変更して構築しました。

input <- layer_input(shape = c(28, 28, 1))
filters <- 64
kernel_size <- c(3,3)

output = input %>%
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_max_pooling_2d(pool_size=c(2,2), padding="same") %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_max_pooling_2d(pool_size=c(2,2), padding="same") %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_upsampling_2d(size=c(2,2))  %>% 
  layer_conv_2d(filters=filters, kernel_size=kernel_size, activation="relu", padding="same") %>% 
  layer_upsampling_2d(size=c(2,2))  %>% 
  layer_conv_2d(filters=1, kernel_size=kernel_size, activation="sigmoid", padding="same")

AutoencoderDenoising <- keras_model(input, output)
summary(AutoencoderDenoising)

モデル表示を行ってみると

source("https://gist.githubusercontent.com/kumeS/41fed511efb45bd55d468d4968b0f157/raw/0f64b83700ac578d0c39abd420da5373d4317083/DL_plot_modi_v1.1.R")
AutoencoderDenoising %>% plot_model_modi(width=1, height=1.25)

plot_model_modiの出力結果)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/6_AutoencoderDenoising_model.html

tf <- reticulate::import(module = "tensorflow")
py_plot_model <- tf$keras$utils$plot_model
py_plot_model(AutoencoderDenoising, to_file='AutoencoderDenoising_tf.png', 
              show_shapes=T, show_layer_names=T, 
              expand_nested=T, dpi=100)

py_plot_modelの出力結果)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/6_AutoencoderDenoising_model_tf.png

Compileでは、最適化アルゴリズムをadam、損失関数をbinary_crossentropyにした*2

# compile
AutoencoderDenoising %>% 
  compile(optimizer="adam", loss="binary_crossentropy")

# Fit
AutoencoderDenoising %>% 
  fit(x_train_noise, x_train, epochs=200, batch_size=32, 
      shuffle = T, verbose=1)

https://kumes.github.io/Blog/ConvolutionalAutoencoder/7_DenoiseRes.html

このモデルによる色補正の結果を見てみます。

library(EBImage)
pred_imgs <- AutoencoderDenoising %>% predict(x_train_noise)
pred_imgsR <- array_reshape(pred_imgs, dim=c(dim(pred_imgs)[1], 28, 28))
dim(pred_imgsR)

par(mfrow=c(3,2))
for (i in 1:6) {
  m <- sample(1:dim(xtrain_noise)[1], 1, replace = F)
  EBImage::display(combine(t(xtrain_noise[m,,]), t(pred_imgsR[m,,]), t(xtrain[m,,])), 
          method="raster", nx=3, all=TRUE, spacing = 0.01, margin = 2)
}

https://kumes.github.io/Blog/ConvolutionalAutoencoder/8_Denoise_results.png

左側が色ムラ画像(入力画像)、真ん中がAutoencoderによるノイズ除去変換後(予測画像)、右側がオリジナル画像(出力画像)です。

トレーニング画像内の内挿であるが、ほぼ色ムラが除去されています。

まとめ

Autoencoderでノイズ除去ができることが分かりました。

また、元画像を入力にして、ノイズ画像を出力にすると、ノイズ付加するAutoencoderモデルとなります。

ただ、実際には、タスクとなるちょうど良いノイズがはいった対応画像を手に入れるのがやや大変そうに思いました。

R/Kerasを用いたDeep Learningの推薦図書

参考文献

www.datatechnotes.com

Autoencoders with Keras, TensorFlow, and Deep Learning - PyImageSearch

elix-tech.github.io

*1:t-SNEが良いのかもだけど

*2:損失関数が、mean_squared_error ではうまく収束しなかった

Homebrew を使って、Python 3.9 をインストールしたときの設定諸々 〜インストール先が「/opt/homebrew/bin」になってるよ!!〜

f:id:skume:20220117234114p:plain

はじめに(2022年1月アップデート版)

Homebrewで、Python3をインストールする際の諸設定をまとめてみました。

この記事では、Anacondaを使わずに、 Homebrewでインストールして、ターミナル上から、Python3をPyhonコマンド、pip3をpipコマンドとして使うことを目指しています。

Python系のIDEは重たくて使いたくないという人や、非Anaconda派に向けて書いています。

実際、私は、PythonもRStudio上でコード書いたりして実行している派ですけども。

Homebrew でPython3をインストールする。

実行環境

Macの実行環境は、Mac10.15です。

macOS Catalina (10.15.4)
MacBook Pro (12-inch, 2019, Four Thunderbolt 3 ports)

Homebrewのインストールについては過去の記事を参照のこと。

skume.net

1. Homebrew で、Python3 をインストールする

まずは、Pythonのバージョンを検索してみます。

brew search python | grep "python@"
#python@3.10
#python@3.7
#python@3.8
#python@3.9

検索したところ(2022年1月17日現在)、python 3.7、3.8、3.9、3.10がラインナップとして、インストールできるようです。

それでは、バージョンを指定せずに、pythonをインストールしてみます。

brew install python

#・・・
#==> python@3.9
#Python has been installed as
#  /opt/homebrew/bin/python3
#
#Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
#`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
#  /opt/homebrew/opt/python@3.9/libexec/bin
#
#You can install Python packages with
#  pip3 install <package>
#They will install into the site-package directory
#  /opt/homebrew/lib/python3.9/site-packages
#
#tkinter is no longer included with this formula, but it is available separately:
#  brew install python-tk@3.9
#
#See: https://docs.brew.sh/Homebrew-and-Python

Python 3.9が無事にインストールできました。

どうもHomebrewの仕様が変わって、、、/opt/homebrew/binのパスに、 インストールしたコマンドラインが入れられるみたいですね。

これで完結すると楽なんだけど・・・つぎに、Pythonパスを設定していきます。

2. Pythonパスを確認する

#パスの確認
which python
#/usr/bin/python

#バージョン確認
python -V
#Python 2.7.16

#パスの確認
which python3
#/opt/homebrew/bin/python3

#バージョン確認
python3 -V
#Python 3.9.10

このように、Pythonでは、/usr/binが参照されて、 python3では、/opt/homebrew/binが参照されるというおかしなことになっています。 以前は、、Python3が、brewでインストールされたときには、 /usr/local/bin/Python3となっていましたが、どうも仕様が変わったぽいです。

余談ですが、そろそろ、MacのPython2はパソコン内の亡霊となりつつありますね。

念の為、/usr/local/binにある、pythonとpipの名前が付いてるものを表示させてみます。

ls /usr/local/bin | grep "python"

ls /usr/local/bin | grep "pip"

/usr/local/binにはインストールされなくなるので、 上記のコマンドでは何も表示されなくなります。

3. 次にやること・・・パスの優先度の変更

変更するファイルは、/etc/paths なので、それを変更することになります。

以下のコマンドで、修正を開始します。

vimコマンドをsudo実行して、パスワードを入力します。

sudo vim /etc/paths

ファイルが表示されたら、

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

となっているところを

/opt/homebrew/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

というように、/opt/homebrew/binが一番上にくるように変更します。

これによって、上から順に、 優先度が高くなって、ファイルが先に読まれることになります。

また、vimの詳しい使い方は、別サイトを参照のこと。

qiita.com

qiita.com

4. /opt/homebrew/binのエイリアス名を変える

python3、python3-config、pip3のエイリアス名を変えるために、 以下の3行のmvコマンドを実行します。 これで、ファイル名の変更をおこないます。

#エイリアス名の変更
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python
mv /opt/homebrew/bin/python3-config /opt/homebrew/bin/python-config 
mv /opt/homebrew/bin/pip3 /opt/homebrew/bin/pip

ここで、一度、ターミナルを終了して、再度立ち上げます。

そうすると、pythonのパスが変わっているはずです。 パスを確認していきましょう。

#パス確認
which python
#/opt/homebrew/bin/python

#バージョン確認
python -V
#Python 3.9.10

次に、/opt/homebrew/binの関連ファイルを確認してみます

ls /opt/homebrew/bin | grep "python"
#python
#python-config
#python3.9
#python3.9-config

ls /opt/homebrew/bin | grep "pip"
#pip
#pip3.9

お疲れ様でした。 これで諸設定は、OKです。

まとめ

PCを買い替えるたび、毎回やるので、ここにTipsを作ってみました。

今更ながら、Pythonのパスが、馴染みの/usr/local/binから、 /opt/homebrew/binという新たなファイルパスに変わっていて、 ちょっと驚きました。

参考資料

skume.net

R言語/Webスクレイピングで、Wikipediaページのテーブル情報からNASDAQ-100の銘柄リストを取得して、2021年中の株価推移を見てみた件

f:id:skume:20220116224839p:plain

はじめに

R言語を利用して、 Wikipediaページから銘柄コード情報を「Webスクレイピング」で取得して、 さらに各銘柄の株価情報を「quantmod パッケージ」を使って収集する。

今回の記事では、2021年年初から12月末までのNASDAQ-100銘柄(2022年1月3日現在)のパフォーマンスを計算して、その結果をGIFアニメーションにしてみた。

f:id:skume:20220103205010g:plain
2021年のNASDAQ-100パフォーマンス。緑パネルはプラスパフォ、赤パネルはマイナスパフォを意味してます。

2021年は、LCID (ルーシッド・グループ)、FTNT (フォーティネット)、NVDA (エヌビディア)、MRNA (モデルナ)あたりがキラリと光りましたね。

NASDAQ-100のWikipediaページ、Rでの下準備

Wikipediaの英語ページから、銘柄コードを取得する。

Wikipediaでは、各指数の銘柄リストをテーブル形式にして、まとめてくれている。

NASDAQ-100

f:id:skume:20220103205419p:plain:w500
NASDAQ-100

en.wikipedia.org

まずは、R/RStudioを起動する。 下準備として、URLを変数に格納しておく。

NASDAQ100_url <- "https://en.wikipedia.org/wiki/NASDAQ-100"

#ブラウザで確認
#browseURL(NASDAQ100_url)

使用するパッケージの事前準備

まずは、rvestquantmodmagrittrパッケージあたりをインストールして準備する。

#インストール
install.packages(c("rvest", "quantmod", "magrittr", "tidyr"))

#ロード
library(rvest)
library(quantmod)
library(magrittr)
library(tidyr)

Wikipediaページからの銘柄リストの取得

Wikipediaは自由編集なので仕方ないのだが、 それぞれのページで、何番目のテーブルに銘柄コードが記載されているかが変わる。 また、テーブルの形や列名も違うので、それぞれに合わせて、 必要な箇所を取得することになる。

以下に、NASDAQ-100(ナスダック100指数)のティッカー収集の実行コードを示す。

NASDAQ-100

#ナスダック-100指数
NASDAQ100 <- NASDAQ100_url %>%
  read_html() %>%
  html_nodes("table") %>%
  .[[4]] %>%
  html_table() %>%
  data.frame()

#取得結果の表示
head(NASDAQ100)
#                 Company Ticker            GICS.Sector                  GICS.Sub.Industry
#1    Activision Blizzard   ATVI Communication Services     Interactive Home Entertainment
#2                  Adobe   ADBE Information Technology               Application Software
#3 Advanced Micro Devices    AMD Information Technology                     Semiconductors
#4                 Airbnb   ABNB Consumer Discretionary Internet & Direct Marketing Retail
#5       Align Technology   ALGN            Health Care               Health Care Supplies
#6     Alphabet (Class A)  GOOGL Communication Services       Interactive Media & Services

#Tickerの表示
NASDAQ100$Ticker
# [1] "ATVI"  "ADBE"  "AMD"   "ABNB"  "ALGN"  "GOOGL" "GOOG"  "AMZN" 
# [9] "AEP"   "AMGN"  "ADI"   "ANSS"  "AAPL"  "AMAT"  "ASML"  "TEAM" 
#[17] "ADSK"  "ADP"   "BIDU"  "BIIB"  "BKNG"  "AVGO"  "CDNS"  "CHTR" 
#[25] "CTAS"  "CSCO"  "CTSH"  "CMCSA" "CPRT"  "COST"  "CRWD"  "CSX"  
#[33] "DDOG"  "DXCM"  "DOCU"  "DLTR"  "EBAY"  "EA"    "EXC"   "FAST" 
#[41] "FISV"  "FTNT"  "GILD"  "HON"   "IDXX"  "ILMN"  "INTC"  "INTU" 
#[49] "ISRG"  "JD"    "KDP"   "KLAC"  "KHC"   "LRCX"  "LCID"  "LULU" 
#[57] "MAR"   "MRVL"  "MTCH"  "MELI"  "FB"    "MCHP"  "MU"    "MSFT" 
#[65] "MRNA"  "MDLZ"  "MNST"  "NTES"  "NFLX"  "NVDA"  "NXPI"  "ORLY" 
#[73] "OKTA"  "PCAR"  "PANW"  "PAYX"  "PYPL"  "PTON"  "PEP"   "PDD"  
#[81] "QCOM"  "REGN"  "ROST"  "SGEN"  "SIRI"  "SWKS"  "SPLK"  "SBUX" 
#[89] "SNPS"  "TMUS"  "TSLA"  "TXN"   "VRSN"  "VRSK"  "VRTX"  "WBA"  
#[97] "WDAY"  "XEL"   "XLNX"  "ZM"    "ZS"  

NASDAQ-100銘柄の年間パフォーマンスをアニメーションにする

NASDAQ-100銘柄の2021年中の株価を取得して、 アニメーションにしてみる。

それでは、さっそく、実行コードを書いてみる。

はじめに、quantmod::getSymbols関数を使って、 2021年中のNASDAQ-100銘柄の値動きをすべて取得してみる。

#NASDAQ100の銘柄コード
nasdaq100.tic <- NASDAQ100$Ticker
nasdaq100.tic
#  [1] "ATVI"  "ADBE"  "AMD"   "ABNB"  "ALGN"  "GOOGL" "GOOG"  "AMZN" 
#  [9] "AEP"   "AMGN"  "ADI"   "ANSS"  "AAPL"  "AMAT"  "ASML"  "TEAM" 
# [17] "ADSK"  "ADP"   "BIDU"  "BIIB"  "BKNG"  "AVGO"  "CDNS"  "CHTR" 
# [25] "CTAS"  "CSCO"  "CTSH"  "CMCSA" "CPRT"  "COST"  "CRWD"  "CSX"  
# [33] "DDOG"  "DXCM"  "DOCU"  "DLTR"  "EBAY"  "EA"    "EXC"   "FAST" 
# [41] "FISV"  "FTNT"  "GILD"  "HON"   "IDXX"  "ILMN"  "INTC"  "INTU" 
# [49] "ISRG"  "JD"    "KDP"   "KLAC"  "KHC"   "LRCX"  "LCID"  "LULU" 
# [57] "MAR"   "MRVL"  "MTCH"  "MELI"  "FB"    "MCHP"  "MU"    "MSFT" 
# [65] "MRNA"  "MDLZ"  "MNST"  "NTES"  "NFLX"  "NVDA"  "NXPI"  "ORLY" 
# [73] "OKTA"  "PCAR"  "PANW"  "PAYX"  "PYPL"  "PTON"  "PEP"   "PDD"  
# [81] "QCOM"  "REGN"  "ROST"  "SGEN"  "SIRI"  "SWKS"  "SPLK"  "SBUX" 
# [89] "SNPS"  "TMUS"  "TSLA"  "TXN"   "VRSN"  "VRSK"  "VRTX"  "WBA"  
# [97] "WDAY"  "XEL"   "XLNX"  "ZM"    "ZS"   

#2021年中の株価取得
Date <- c("2021-01-01", "2021-12-31")
list <- as.character(unlist(nasdaq100.tic))
quantmod::getSymbols(list, src = "yahoo", verbose = T, from = Date[1], to=Date[2])

#空のデータフレームの作成
stock <- data.frame(matrix(NA, 
                           nrow=dim(get(nasdaq100.tic[1]))[1],
                           ncol=length(list)))
#列名を付与する
colnames(stock) <- list

#表示
head(stock)
#  ATVI ADBE AMD ABNB ALGN GOOGL GOOG AMZN AEP AMGN ADI ANSS AAPL AMAT
#1   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA
#2   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA
#3   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA
#4   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA
#5   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA
#6   NA   NA  NA   NA   NA    NA   NA   NA  NA   NA  NA   NA   NA   NA

#データの代入
#文字列(ex.  "assign('a', ATVI[,4])" )を作成して、
#eval(parse(text = "..."))で、その文字列を命令文として実行する
for(n in seq_len(length(list))){
try(eval(parse(text = paste("assign('a', ", list[n], "[,4])", sep=""))))
stock[,n] <- a
}

#行名を日付にする
rownames(stock) <- rownames(data.frame(a))

#データ取得完了
head(stock)
#            ATVI   ADBE   AMD   ABNB   ALGN   GOOGL    GOOG    AMZN
#2021-01-04 89.90 485.34 92.30 139.15 526.46 1726.13 1728.24 3186.63
#2021-01-05 90.69 485.69 92.77 148.30 543.65 1740.05 1740.92 3218.51
#2021-01-06 88.00 466.31 90.33 142.77 540.39 1722.88 1735.29 3138.38
#2021-01-07 89.67 477.74 95.16 151.27 558.36 1774.34 1787.25 3162.16
#2021-01-08 91.30 485.10 94.58 149.77 570.53 1797.83 1807.21 3182.70
#2021-01-11 90.91 474.24 97.25 148.13 557.04 1756.29 1766.72 3114.21

次に、年初時(2021年1月4日)の株価を 「100」 に 補正して、アニメーション用にデータを加工する。

#年初時の株価を「100」に補正
stock.c <- stock
for(n in 1:ncol(stock)){
stock.c[,n] <- round(as.numeric(stock[,n])/as.numeric(stock[1,n])*100, 3)
}

#途中表示
head(stock.c)
#              ATVI    ADBE     AMD    ABNB    ALGN   GOOGL    GOOG
#2021-01-04 100.000 100.000 100.000 100.000 100.000 100.000 100.000
#2021-01-05 100.879 100.072 100.509 106.576 103.265 100.806 100.734
#2021-01-06  97.887  96.079  97.866 102.602 102.646  99.812 100.408
#2021-01-07  99.744  98.434 103.099 108.710 106.059 102.793 103.414
#2021-01-08 101.557  99.951 102.470 107.632 108.371 104.154 104.569
#2021-01-11 101.123  97.713 105.363 106.453 105.809 101.747 102.227

#データの行列を入れ替える
stock.t <- t(stock.c)

#途中表示
head(stock.t)
#      2021-01-04 2021-01-05 2021-01-06 2021-01-07 2021-01-08
#ATVI         100    100.879     97.887     99.744    101.557
#ADBE         100    100.072     96.079     98.434     99.951
#AMD          100    100.509     97.866    103.099    102.470

#セクター列を追加する
stock01 <- data.frame(tic=rownames(stock.t), Sector=NASDAQ100$"GICS.Sector", stock.t)
rownames(stock01) <- 1:nrow(stock01)

#途中表示
head(stock01)
#   tic                 Sector X2021.01.04 X2021.01.05 X2021.01.06
#1 ATVI Communication Services         100     100.879      97.887
#2 ADBE Information Technology         100     100.072      96.079
#3  AMD Information Technology         100     100.509      97.866
#  X2021.01.07 X2021.01.08 X2021.01.11 X2021.01.12 X2021.01.13
#1      99.744     101.557     101.123      99.277      99.855
#2      98.434      99.951      97.713      97.179      97.262
#3     103.099     102.470     105.363     103.315      99.437

#少しデータを間引く
stock02 <- stock01[,c(1:2, seq(3, ncol(stock01), by=5))]

#データの並びを変える
stock03 <- tidyr::gather(stock02, key="date", value="close", -c(tic, Sector)) 
stock03$date <- sub("X", "", stock03$date)
stock03$date <- gsub("\\.", "/", stock03$date)
stock03$date <- paste0(stock03$date, "-16-00-00")

#途中経過を表示
head(stock03)
#    tic                 Sector                date close
#1  ATVI Communication Services 2021/01/04-16-00-00   100
#2  ADBE Information Technology 2021/01/04-16-00-00   100
#3   AMD Information Technology 2021/01/04-16-00-00   100
#4  ABNB Consumer Discretionary 2021/01/04-16-00-00   100
#5  ALGN            Health Care 2021/01/04-16-00-00   100
#6 GOOGL Communication Services 2021/01/04-16-00-00   100

ここで、必要なパッケージの準備を行う。

#インストール
install.packages(c("ggplot2", "treemapify", "gganimate", "gapminder", "gifski"))

#ロード
library(ggplot2)
library(treemapify)
library(gganimate)
library(gapminder)
library(gifski)

次に、stock03のデータを使って、アニメーションを作成してみる。

#日時列に変える
stock03$date  <- as.Date(stock03$date)

#途中経過を表示
head(stock03)
#    tic                 Sector       date close
#1  ATVI Communication Services 2021-01-04   100
#2  ADBE Information Technology 2021-01-04   100
#3   AMD Information Technology 2021-01-04   100
#4  ABNB Consumer Discretionary 2021-01-04   100
#5  ALGN            Health Care 2021-01-04   100
#6 GOOGL Communication Services 2021-01-04   100

#株価の変動幅から、カラーを決める
stock03$dclose <- stock03$close - 100
stock03$dclose2 <- NA
colfunc <- grDevices::colorRampPalette(c("brown3", "white", "darkgreen"))

#色で区分け
a <- colfunc(17)
b1 <- seq(range(stock03$dclose)[1]-10, 0, length.out=9)
b2 <- seq(0, range(stock03$dclose)[2]+10, length.out=9)
b3 <- c(b1, b2[-1])
for(n in length(b3):1){stock03$dclose2[stock03$dclose < b3[n]] <- a[n]  }

#途中経過を表示
head(stock03)
#    tic                 Sector       date close dclose dclose2
#1  ATVI Communication Services 2021-01-04   100      0 #DFEBDF
#2  ADBE Information Technology 2021-01-04   100      0 #DFEBDF
#3   AMD Information Technology 2021-01-04   100      0 #DFEBDF
#4  ABNB Consumer Discretionary 2021-01-04   100      0 #DFEBDF
#5  ALGN            Health Care 2021-01-04   100      0 #DFEBDF
#6 GOOGL Communication Services 2021-01-04   100      0 #DFEBDF

1年間のパフォーマンス

#年変動の結果表示
stock2021 <- stock03[stock03$date == "2021-12-30", c(1:3,5)]
stock2021[order(stock2021$dclose, decreasing = T),]

       tic                 Sector       date  dclose
5105  LCID Consumer Discretionary 2021-12-30 285.956
5092  FTNT Information Technology 2021-12-30 147.170
5120  NVDA Information Technology 2021-12-30 125.615
5115  MRNA            Health Care 2021-12-30 125.186
5083  DDOG Information Technology 2021-12-30  96.131
5108  MRVL Information Technology 2021-12-30  88.815
5064  AMAT Information Technology 2021-12-30  81.858
5098  INTU Information Technology 2021-12-30  73.086
5056 GOOGL Communication Services 2021-12-30  69.397
5057  GOOG Communication Services 2021-12-30  68.961
5066  TEAM Information Technology 2021-12-30  66.419
5151    ZS Information Technology 2021-12-30  65.531
5102  KLAC Information Technology 2021-12-30  64.053
5065  ASML Information Technology 2021-12-30  60.044
5125  PANW Information Technology 2021-12-30  59.649
5053   AMD Information Technology 2021-12-30  57.259
5072  AVGO Information Technology 2021-12-30  56.408
5114  MSFT Information Technology 2021-12-30  55.873
5122  ORLY Consumer Discretionary 2021-12-30  54.585
5084  DXCM            Health Care 2021-12-30  51.314
5126  PAYX Information Technology 2021-12-30  51.007
5104  LRCX Information Technology 2021-12-30  50.272
5149  XLNX Information Technology 2021-12-30  50.172
5080  COST       Consumer Staples 2021-12-30  48.339
5141  TSLA Consumer Discretionary 2021-12-30  46.668
5139  SNPS Information Technology 2021-12-30  45.587
5068   ADP Information Technology 2021-12-30  45.336
5076  CSCO Information Technology 2021-12-30  44.722
5121  NXPI Information Technology 2021-12-30  41.076
5089   EXC              Utilities 2021-12-30  39.300
5073  CDNS Information Technology 2021-12-30  38.664
5063  AAPL Information Technology 2021-12-30  37.702
5099  ISRG            Health Care 2021-12-30  36.238
5095  IDXX            Health Care 2021-12-30  34.478
5090  FAST            Industrials 2021-12-30  33.914
5132  REGN            Health Care 2021-12-30  33.063
5107   MAR Consumer Discretionary 2021-12-30  32.131
5086  DLTR Consumer Discretionary 2021-12-30  32.102
5087  EBAY Consumer Discretionary 2021-12-30  29.670
5111    FB Communication Services 2021-12-30  28.043
5075  CTAS            Industrials 2021-12-30  27.925
5082   CSX            Industrials 2021-12-30  27.242
5112  MCHP Information Technology 2021-12-30  26.957
5113    MU Information Technology 2021-12-30  26.793
5055  ALGN            Health Care 2021-12-30  25.787
5146   WBA       Consumer Staples 2021-12-30  25.580
5079  CPRT            Industrials 2021-12-30  25.222
5131  QCOM Information Technology 2021-12-30  23.051
5093  GILD            Health Care 2021-12-30  22.043
5054  ABNB Consumer Discretionary 2021-12-30  21.294
5147  WDAY Information Technology 2021-12-30  21.229
5061   ADI Information Technology 2021-12-30  19.696
5129   PEP       Consumer Staples 2021-12-30  19.685
5143  VRSN Information Technology 2021-12-30  19.070
5052  ADBE Information Technology 2021-12-30  17.553
5119  NFLX Communication Services 2021-12-30  17.066
5142   TXN Information Technology 2021-12-30  16.761
5101   KDP       Consumer Staples 2021-12-30  16.113
5116  MDLZ       Consumer Staples 2021-12-30  13.519
5062  ANSS Information Technology 2021-12-30  13.423
5138  SBUX Consumer Discretionary 2021-12-30  12.745
5144  VRSK            Industrials 2021-12-30  12.426
5077  CTSH Information Technology 2021-12-30  11.987
5106  LULU Consumer Discretionary 2021-12-30  11.866
5071  BKNG Consumer Discretionary 2021-12-30  10.713
5059   AEP              Utilities 2021-12-30   8.769
5118  NTES Communication Services 2021-12-30   7.246
5058  AMZN Consumer Discretionary 2021-12-30   5.845
5117  MNST       Consumer Staples 2021-12-30   5.287
5096  ILMN            Health Care 2021-12-30   4.481
5081  CRWD Information Technology 2021-12-30   4.220
5103   KHC       Consumer Staples 2021-12-30   4.178
5097  INTC Information Technology 2021-12-30   4.168
5135  SIRI Communication Services 2021-12-30   4.052
5148   XEL              Utilities 2021-12-30   3.914
5136  SWKS Information Technology 2021-12-30   3.370
5124  PCAR            Industrials 2021-12-30   3.187
5074  CHTR Communication Services 2021-12-30   1.576
5078 CMCSA Communication Services 2021-12-30   0.158
5060  AMGN            Health Care 2021-12-30  -0.084
5094   HON            Industrials 2021-12-30  -0.404
5070  BIIB            Health Care 2021-12-30  -1.214
5133  ROST Consumer Discretionary 2021-12-30  -2.392
5145  VRTX            Health Care 2021-12-30  -3.042
5088    EA Communication Services 2021-12-30  -3.620
5067  ADSK Information Technology 2021-12-30  -5.097
5091  FISV Information Technology 2021-12-30  -6.612
5134  SGEN            Health Care 2021-12-30  -6.673
5123  OKTA Information Technology 2021-12-30 -10.221
5109  MTCH Communication Services 2021-12-30 -11.153
5140  TMUS Communication Services 2021-12-30 -12.021
5127  PYPL Information Technology 2021-12-30 -17.265
5110  MELI Consumer Discretionary 2021-12-30 -17.289
5100    JD Consumer Discretionary 2021-12-30 -18.452
5051  ATVI Communication Services 2021-12-30 -24.928
5137  SPLK Information Technology 2021-12-30 -30.222
5085  DOCU Information Technology 2021-12-30 -30.237
5069  BIDU Communication Services 2021-12-30 -30.530
5150    ZM Information Technology 2021-12-30 -47.075
5130   PDD Consumer Discretionary 2021-12-30 -64.354
5128  PTON Consumer Discretionary 2021-12-30 -74.520

ツリーマップのアニメーションを作成する

#ツリーマップの作成
p <- ggplot(stock03, aes(label=tic, area = close, 
            fill = dclose2, subgroup = Sector )) +
  geom_treemap( layout = "squarified", colour="white", start="topleft") +
  scale_fill_identity() +
  geom_treemap_subgroup_border(layout = "squarified", colour = "white", size = 5, start="topleft") +
  geom_treemap_subgroup_text(layout = "squarified", place = "top",
                             grow = T, alpha = 1, colour = "#FAFAFA",
                             min.size = 0, start = "topleft") +
  geom_treemap_text(layout = "squarified", place = "centre", grow = TRUE, 
                    colour = "grey50", min.size = 8, reflow = T, start = "topleft") +
  transition_time(date) +
  labs(title = "NASDAQ-100, Date: {frame_time}") +
  ease_aes('linear')

#アニメーションとして出力(2-3分くらいかかる)
animate(p, duration = 50, width = 500, height = 500, renderer = gifski_renderer("NASDAQ100_animation.gif"))

f:id:skume:20220103205010g:plain
2021年のNASDAQ-100パフォーマンス。

まとめ

2021年の振り返りに、NASDAQ-100の全銘柄コードの取得から、 株価変動のアニメーション作成までのRコードと実行結果を紹介した。

2021年も、指数を自己流ポートフォリオで、 オーバーパフォームするのはとってもとっても難しかった(泣)。

Webスクレイピングについての関連図書

Webスクレイピングの関連図書を列挙しておきます。

表紙カバーの拡大

過去の関連記事

skume.net