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

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R言語とWebスクレイピングとアニメーショングラフ】仮想通貨や株価変動をバー・チャート・レースで観察してみた件【その1 日経225・Nikkei225 編】

はじめに

グラフをアニメーションにすることで、静的なグラフでは得られなった、気づきを与えてくれます。

さらには、ある時系列の動的な変化を眺めることで、データのダイナミクスをより正確に感じれます。

同ブログは、「アニメーショングラフ」推しです。

YouTubeを見てて、以前から近いものを作りたいと思ってて、 この記事では、「バー・チャート・レース」を取り上げてみます。

第一弾として、アニメーショングラフにするデータは、日経平均(日経225)の時系列データ(日足)を使います。

さぁ、アニメーショングラフを設定していきましょう。

実行環境

macOS Big Sur (バージョン11.5.2)
MacBook Air (M1, 2020)
チップ Apple M1
メモリ 16GB

Rパッケージの準備

関連のRパッケージを準備します。結構あります。 ここをスキップして、以下のスクリプトを読み込むのでもOKです。

#パッケージ・インストール
pack <- c("rvest", "quantmod", "magrittr", "purrr", "tidyr", "ggplot2", "treemapify", "gganimate", "gapminder", "gifski")
install.packages(pack[!(pack %in% unique(rownames(installed.packages())))])

#ロード
for(n in 1:length(pack)){ eval(parse(text = paste0("library(", pack[n], ")"))); rm("n") }

以下のgetNikkei225.Rスクリプトを読み込んでも、Rパッケージがインストールできます。

同時に、今回使用する、getNikkei225_list、Nikkei225_ChartData、Nikkei225_ChartData_mod、Nikkei225_animationといった関数群を読み込みます。

#関連関数群の読み込み
source("https://gist.githubusercontent.com/kumeS/c9883239311546c5ab1753676fa86514/raw/4c7a3a6c2520afdf7dc0e56c1fc5a161ce74ee20/getNikkei225.R")

ではでは、早速、実行してみましょう。

日経225銘柄のデータ取得

日経平均株価 - ウィキペディア

まず、getNikkei225_list関数では、ウェブスクレイピングを介して、ウィキペディアの該当ページから日経225の銘柄リストを取得します。時々、ページが更新されて、表の構成が変わるので、厄介です・・・

そして、次に、Nikkei225_ChartData関数でデータを取得します。

#Wikipediaページから日経225銘柄リストを取得する
Nikkei225List <- getNikkei225_list()

#表示
head(Nikkei225List)
#  Ticker                        Company Sector
#1   2002           日清製粉グループ本社   食品
#2   2269           明治ホールディングス   食品
#3   2282                       日本ハム   食品
#4   2501       サッポロホールディングス   食品
#5   2502 アサヒグループホールディングス   食品
#6   2503         キリンホールディングス   食品

#銘柄のセクター数
table(Nikkei225List$Sector)

#日経225のデータ取得: 実行時間 5分くらい
ChartData <- Nikkei225_ChartData(Dat=Nikkei225List, term=c("2022-01-01", "2022-12-31"))

#いったん、RDS保存
saveRDS(ChartData, "Nikkei225_ChartData.Rds")
#ChartData0 <- readRDS("Nikkei225_ChartData.Rds")

#または、Nikkei225_ChartData.Rdsをダウンロードできるようにもしています。
#system("which svn")
#system("svn export  https://github.com/kumeS/Blog/trunk/R_BarChart/Nikkei225_ChartData.Rds")

#表示
head(ChartData0)
#                         Company Ticker Sector       date close dclose dclose2 ranking
#1           日清製粉グループ本社   2002   食品 2022-01-04   100      0 #F0F5F0       1
#2           明治ホールディングス   2269   食品 2022-01-04   100      0 #F0F5F0       2
#3                       日本ハム   2282   食品 2022-01-04   100      0 #F0F5F0       3
#4       サッポロホールディングス   2501   食品 2022-01-04   100      0 #F0F5F0       4
#5 アサヒグループホールディングス   2502   食品 2022-01-04   100      0 #F0F5F0       5
#6         キリンホールディングス   2503   食品 2022-01-04   100      0 #F0F5F0       6

このステップで、日経225のうちで、224銘柄のリストとデータが取得できました。

日経225銘柄でのバー・チャート・レース

日経225 上位20銘柄でのバー・チャート・レース作成

次に、日経225の上昇20銘柄に絞って、バー・チャート・レースを作成します。

Nikkei225_ChartData_mod関数の引数「top = 20」で、日経225の上昇20銘柄のデータフレームにします。 次に、Nikkei225_animation関数を実行して、チャート設定をします。また、日本語設定も別途します。

#データ補正: 上位20銘柄を取得する
ChartData1 <- Nikkei225_ChartData_mod(ChartData0, top = 20)

#表示
head(ChartData1)
#                  Company Ticker             Sector              CompanyTicker
#8353 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#8577 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#8801 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#9025 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#9249 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#9473 DOWAホールディングス   5714 非鉄金属・金属製品 DOWAホールディングス(5714)
#                                CompanySector       date close dclose dclose2 ranking
#8353 DOWAホールディングス(非鉄金属・金属製品) 2022-03-01 111.7   11.7 #F0F5F0      17
#8577 DOWAホールディングス(非鉄金属・金属製品) 2022-03-02 118.9   18.9 #D2E3D2      10
#8801 DOWAホールディングス(非鉄金属・金属製品) 2022-03-03 125.3   25.3 #D2E3D2       8
#9025 DOWAホールディングス(非鉄金属・金属製品) 2022-03-04 122.0   22.0 #D2E3D2       8
#9249 DOWAホールディングス(非鉄金属・金属製品) 2022-03-07 122.0   22.0 #D2E3D2      11
#9473 DOWAホールディングス(非鉄金属・金属製品) 2022-03-08 112.7   12.7 #F0F5F0      12

#日本語設定(???)
#ggplot2::update_geom_defaults("text", list(family = "HiraKakuPro-W3"))
#ggplot2::update_geom_defaults("label", list(family = "HiraKakuPro-W3"))

##実行
p1 <- Nikkei225_animation(ChartData1, Label="Nikkei225 Top 20 銘柄")

#gif出力: 実行時間 30秒くらい
animate(p1, fps = 2, duration = 125, width = 600, height = 600,
        renderer = gifski_renderer("Nikkei225_BarChartRace_animation_p1.gif"))

日経225 上位20銘柄でのバー・チャート・レース

日経225 下位20銘柄でのバー・チャート・レース作成

次に、日経225の下位20銘柄に絞って、バー・チャート・レースを作成します。

ここで、Nikkei225_ChartData_mod関数の引数「top = -20」でマイナス設定にすると 日経225の下位20銘柄のデータフレームを得ます。

#データ補正: 下位20銘柄を取得する
ChartData2 <- Nikkei225_ChartData_mod(ChartData0, top = -20)

#日本語設定(???)
#ggplot2::update_geom_defaults("text", list(family = "HiraKakuPro-W3"))
#ggplot2::update_geom_defaults("label", list(family = "HiraKakuPro-W3"))

##実行: marの`unit(c(top, right, bottom, left), "cm")`のc(top, right, bottom, left)に対応
p2 <- Nikkei225_animation(ChartData2, Label="Nikkei225 Lowest 20 銘柄",
                          mar=c(0.5, 1.5, 0.5, 0.75), Size1=4, Size2=5)

#gif出力: 実行時間 30秒くらい
animate(p2, fps = 2, duration = 125, width = 600, height = 600,
        renderer = gifski_renderer("Nikkei225_BarChartRace_animation_p2.gif"))

日経225 下位20銘柄でのバー・チャート・レース

まとめ

今回、日経225銘柄の2022年11月まで値動きのバー・チャート・レースを作成しました。 よく眺めてみると、日本株も結構上昇している銘柄が多い印象ですね。。

実際のチャート設定としては、レースへの参加者数、つまりはグループ数が多いと、レースのアニメーションはシンプルにした方がいいかも知れないと思うところです。

また、設定を間違い、レンダリングにかなり時間が取られ、今回は日経225のみでタイムオーバーでした。

参考資料

blog.hoxo-m.com

ill-identified.hatenablog.com

stackoverflow.com

www.anarchive-beta.com

towardsdatascience.com

www.r-bloggers.com

ggplot2.tidyverse.org

flourish.studio

stackoverflow.com

Rコード: getNikkei225.R

gist.github.com