Rで解析:「gtrendsR」パッケージを利用したgifアニメーションの作成例

Rの解析に役に立つ記事
スポンサーリンク

「gtrendsR」パッケージ、「tidyverse」パッケージ、「gganimate」パッケージを利用したアニメーションgifの作成例です。何かの参考になればと思います。

「gtrendsR」パッケージは下記を確認ください。

実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク

実行コマンド

詳細はコメント、各パッケージのヘルプを確認してください。

#gtrendsRパッケージがなければインストール
if(!require("gtrendsR", quietly = TRUE)){
  install.packages("gtrendsR");require("gtrendsR")
}
#tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}
#gganimateパッケージがなければインストール
if(!require("gganimate", quietly = TRUE)){
  install.packages("gganimate");require("gganimate")
}

#Rでお遊び:何かに使えるかも?各都道府県を四角で表示!
#https://www.karada-good.net/analyticsr/r-597/
#日本地図にinterest_by_regionを表示
JpanMiniMap <- tibble(
  #&#37117;&#36947;&#24220;&#30476;&#21517;
  Pref = c("&#21271;&#28023;&#36947;", "&#38738;&#26862;&#30476;", "&#23721;&#25163;&#30476;", "&#23470;&#22478;&#30476;", "&#31119;&#23798;&#30476;", "&#33576;&#22478;&#30476;", "&#21315;&#33865;&#30476;", "&#31179;&#30000;&#30476;", "&#23665;&#24418;&#30476;",
           "&#26032;&#28511;&#30476;", "&#26627;&#26408;&#30476;", "&#22524;&#29577;&#30476;", "&#26481;&#20140;&#37117;", "&#32676;&#39340;&#30476;", "&#23665;&#26792;&#30476;", "&#31070;&#22856;&#24029;&#30476;", "&#23500;&#23665;&#30476;",
           "&#38263;&#37326;&#30476;", "&#38745;&#23713;&#30476;", "&#30707;&#24029;&#30476;", "&#31119;&#20117;&#30476;", "&#23696;&#38428;&#30476;", "&#24859;&#30693;&#30476;", "&#28363;&#36032;&#30476;", "&#19977;&#37325;&#30476;",
           "&#20140;&#37117;&#24220;", "&#22856;&#33391;&#30476;", "&#21644;&#27468;&#23665;&#30476;", "&#20853;&#24235;&#30476;", "&#22823;&#38442;&#24220;", "&#40165;&#21462;&#30476;", "&#23713;&#23665;&#30476;", "&#23798;&#26681;&#30476;",
           "&#24195;&#23798;&#30476;", "&#39321;&#24029;&#30476;", "&#24499;&#23798;&#30476;", "&#24859;&#23195;&#30476;", "&#39640;&#30693;&#30476;", "&#23665;&#21475;&#30476;", "&#31119;&#23713;&#30476;", "&#22823;&#20998;&#30476;",
           "&#23470;&#23822;&#30476;", "&#20304;&#36032;&#30476;", "&#29066;&#26412;&#30476;", "&#40575;&#20816;&#23798;&#30476;", "&#38263;&#23822;&#30476;", "&#27798;&#32260;&#30476;"),
  EPref = c("Hokkaido", "Aomori", "Iwate", "Miyagi", "Fukushima", "Ibaraki", "Chiba", "Akita", "Yamagata",
            "Niigata", "Tochigi", "Saitama", "Tokyo", "Gunma", "Yamanashi", "Kanagawa", "Toyama",
            "Nagano", "Shizuoka", "Ishikawa", "Fukui", "Gifu", "Aichi", "Shiga", "Mie",
            "Kyoto", "Nara", "Wakayama", "Hyogo", "Osaka", "Tottori", "Okayama", "Shimane",
            "Hiroshima", "Kagawa", "Tokushima", "Ehime", "Kochi", "Yamaguchi", "Fukuoka", "Oita",
            "Miyazaki", "Saga", "Kumamoto", "Kagoshima", "Nagasaki", "Okinawa"),
  #&#21508;&#37117;&#36947;&#24220;&#30476;&#12398;&#20301;&#32622;
  x = c(15.9, 15.5, 16, 16, 15.7, 15.7, 16, 15, 15, 14.7, 14.7, 15,
        15, 13.7, 14, 14, 12.7, 13, 13, 11.7, 11.7, 12, 12, 11, 11,
        10, 10, 10, 9, 9, 8, 8, 7, 7, 7.5, 7.5, 6.5, 6.5, 6, 4.5, 4.5,
        4.5, 3.5, 3.5, 3.5, 2.5, 2),
  y = c(12.9, 10.5, 9.5, 8.5, 7.5, 6.5, 5.5, 9.5, 8.5, 7.5, 6.5, 5.5,
        4.5, 6.5, 5.5, 4.5, 6.5, 5.5, 4.5, 7.5, 6.5, 5.5, 4.5, 5.5,
        4.5, 6, 5, 4, 5.5, 4.5, 6, 5, 6, 5, 3.5, 2.5, 3.5, 2.5, 5.5, 5, 4,
        3, 5, 4, 3, 5, 2),
  #width&#12392;height&#12399;&#12479;&#12452;&#12523;&#12398;&#22823;&#12365;&#12373;
  width = c(2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1),
  height = c(2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             1, 1, 1, 1, 1, 1))

###&#12503;&#12525;&#12483;&#12488;&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;#####
#&#31354;&#12522;&#12473;&#12488;
TrendListData <- list()
#&#21462;&#24471;&#12487;&#12540;&#12479;&#26399;&#38291;
Time <- c("today 12-m", "today 3-m", "today 1-m")
#&#12487;&#12540;&#12479;&#12434;&#21462;&#24471;
for(i in seq(Time)){
  #gtrends&#12467;&#12510;&#12531;&#12489;
  TrendListData[[i]] <- gtrends(keyword = c("&#39740;&#28357;&#12398;&#20995;"), geo = c("JP"),
                              time = Time[i], gprop = "web", category = 0) %>%
    #gternds&#12467;&#12510;&#12531;&#12489;&#32080;&#26524;&#12398;&#12522;&#12473;&#12488;&#12363;&#12425;"interest_by_region"&#12434;&#25277;&#20986;
    .[["interest_by_region"]] %>%
    #&#20808;&#38957;&#12395;&#12487;&#12540;&#12479;&#26399;&#38291;&#12434;&#20184;&#19982;
    mutate(Date = Time[i], .before = location) %>%
    #location&#12398;" Prefecture"&#12434;&#21066;&#38500;
    mutate(location = str_replace_all(location, pattern = " Prefecture",
                                      replacement = "")) %>%
    #hits&#12398;NA&#12434;0&#12395;&#32622;&#25563;
    mutate(hits = replace_na(hits, 0)) %>%
    #&#24517;&#35201;&#12394;&#12487;&#12540;&#12479;&#12434;&#36984;&#25246;
    select(Date, location, hits)
}

#&#32080;&#26524;&#12434;&#32080;&#21512;&#12375;hits&#20197;&#22806;&#12434;factor&#21270;
TrendData <- tibble(bind_rows(TrendListData)) %>%
  #JpanMiniMap$EPref&#12398;&#22522;&#28310;&#12391;location&#12434;factor&#21270;
  mutate(EPref = factor(location, levels = JpanMiniMap$EPref),
         .keep = "unused", .before = hits) %>%
  #Time&#12398;&#22522;&#28310;&#12391;Date&#12434;factor&#21270;
  mutate(Date = factor(Date, levels = Time),
         .keep = "unused", .before = EPref) %>%
  #&#20006;&#12403;&#26367;&#12360;
  arrange(EPref)

#TrendData&#12434;JpanMiniMap&#12395;&#32080;&#21512;
TrendData %>%
  inner_join(JpanMiniMap, by = "EPref") -> PlotData
########

#gif&#12450;&#12491;&#12513;&#12540;&#12471;&#12519;&#12531;&#20316;&#25104;&#12398;&#12383;&#12417;&#12395;gganimate&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;transition_states&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#12358;
AnimePlot <- ggplot(PlotData,
                    aes(x = x, y = y,
                        width = width, height = height)) +
  geom_tile(aes(fill = hits),
            color = "grey", show.legend = TRUE) +
  geom_text(aes(label = Pref), size = 6) +
  labs(title ="&#26908;&#32034;&#12527;&#12540;&#12489;[&#39740;&#28357;&#12398;&#20995;]_Before_{closest_state}_interest_by_region") +
  coord_fixed(ratio = 1) +
  scale_fill_distiller(palette = "Spectral", name = "hits") +
  theme_void() +
  transition_states(Date,
                    transition_length = 3,
                    state_length = 1,
                    wrap = FALSE)

#&#20316;&#26989;&#12501;&#12457;&#12523;&#12480;&#12395;&#20445;&#23384;
options(gganimate.dev_args = list(width = 800, height = 600))
anim_save("Gtrend.gif", AnimePlot, nframes = 50)

出力例

“today 12-m”、”today 3-m”、”today 1-m”の順に画像が変化します。


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました