「小説家になろう」のデータを分析してみる その3 2020年の日間ランキングを時系列グラフで眺めてみる
はじめましての人ははじめまして、そうでないひとはこんばんなろー📲
なろう系VTuberのリイエルです。
前回の記事では、なろうのデータの分析ツールとして「R言語」の紹介をしました。
今回は一歩踏み込んで、日間ランキングの推移について追いかけてみることにしましょう。
前回はこういうグラフを用意しました。
ranking %>%
filter(type == "d") %>% # 日間ランキングで
filter(rank == 1) %>% # ランキング1位の
mutate(mean = roll_mean(pt, n = 28, fill = NA)) %>% # 28日間(約一ヶ月)の移動平均を出す
ggplot() + # そのデータをもとにグラフ作成
geom_line(aes(date, pt, color="ポイント")) + # ポイントの折れ線を出す
geom_line(aes(date, mean, color="28日間移動平均")) + # 移動平均の折れ線を出す
geom_smooth(aes(date, pt, color="ポイント")) + # ポイント推移の近似曲線を描く
ggsave(filename = "point_2020.png", width=16, height=9, dpi=80) # ファイルに出力する
前回は何の説明もなく、移動平均というものを用いました。
(この記事は、統計学の基礎について語る記事ではなく、統計データをどう分析するかを考察するのが目的なので移動平均についての説明はWikipediaとかに頼るとして省きます。今後も統計用語を使うときにはWikipediaのリンクをなるだけ貼りますので、各自勉強していただけると幸いです。)
なぜ移動平均を利用するのかというと、この手のランキングなどのデータだと曜日の影響が出てしまいがちだからです。
どうしても休日近くのランキングデータは点数が高くなりがちになります。
では、実際に曜日の影響があるのかデータで見てみましょう。
ranking %>%
filter(type == "d") %>% # 日間ランキングで
filter(rank == 1) %>% # ランキング1位の
mutate(weekday = wday(date, label=T)) %>% # 曜日を計算して
ggplot() + # そのデータをもとにグラフ作成
aes(weekday, pt) + # 曜日を横軸、ポイントを縦軸に
geom_boxplot() + # 箱ひげ図を描写
geom_point(color="steelblue") + # あとptを青色で描写
stat_summary(fun = "mean", color = "violetred") + # 平均値を赤色で出します
ggsave(filename = "point_weekday.png", width=16, height=9, dpi=80) # ファイルに出力する
曜日の影響があることが確認できました…と言いたかったのですが、思ったほど曜日の影響がなかったことがわかりました。
ただ、週末前後はポイントが高く火・木はポイントが低くなりやすいという傾向自体はあるのでこのまま進めていきたいと思います。
(曜日影響が有り得そうなデータを移動平均している例としてはPCR検査の新規陽性者数があげられます。曜日影響がある可能が高いとして7日間移動平均線で公開されています)
曜日影響以外の要因として28日間で移動平均を取っている理由はだいたいの傾向を出すためです。このようなランキングは突然大きなスパイクをすることが多いので、それを移動平均にすることによってなだらかにすることができます。ですので移動平均と傾向線だけでグラフを作るとこうなります。
元のグラフよりは大体の傾向がつかめるんじゃないでしょうか?ですのでこれからは傾向線の代わりとして28日間移動平均を使うことがあることをご了承ください。
さて、このグラフで一つ気づくことがあると思います。
2020年の5月に向けてなだらかにグラフが進んでいってから、5月になって大きくスパイクしています。
5月に何があったかを思い出してみましょう。そう、ゴールデンウィークと緊急事態宣言です。
毎年、GW前後では大きくランキングが動くことを観測していますが、今年に限ってはかなり異常な傾向となっています。
ちなみに評価システムの変更がありましたが、こちらの実装日は3月3日でした。このグラフを見る限りは、トップ層に大きな影響を与えるものではなかったのではないかという認識です。
2020年だけのデータを見ていてもわからないと思うので他の年のデータも重ねてみましょう。
ranking_all %>%
filter(type == "d") %>% # 日間ランキングで
filter(rank == 1) %>% # ランキング1位の
mutate(year = year(date), yday = yday(date) - 1 + as.Date ("1990-01-01")) %>% # 年を計算して、何年の何日なのかを分離
filter(year < 2021, year > 2015) %>% # 2016~2020年
group_by(year) %>% # 年でグループ化して
arrange(yday) %>% # 日付で念の為並び替え
mutate(mean = roll_mean(pt, n = 28, fill = NA)) %>% # 移動平均を取って
ggplot() +
geom_line(aes(yday, mean, color=str_c(year,"年"))) + # 年ごとに線を引きます
scale_x_date(date_breaks = "1 month", date_labels = "%b月") +
ggsave(filename = "point_2020.png", width=16, height=9, dpi=80)
例年と比べて明らかに異常なポイント数に鳴っていることがわかるでしょうか?
季節要因などもあるとは思いますが、それを超えて一気にユーザー層が広がったのではないかと思わせるものになっていると思います。
あと、以前にこういうツイートをお見かけしたので。トップ10入りするためのポイント数についての調査もしてみました。
ranking_all %>%
filter(type == "d") %>%
filter(rank == 1 | rank == 10 | rank == 50 | rank == 100 | rank == 300) %>%
arrange(date) %>%
group_by(rank) %>%
mutate(mean28 = roll_mean(pt, n = 28, fill = NA)) %>%
ggplot() +
geom_line(aes(date, mean28, color=str_c(rank, "位(28日間移動平均)"))) +
geom_smooth(aes(date, pt, color=str_c(rank, "位"))) +
ggsave(filename = "point_all.png", width=16, height=9, dpi=80)
2016年に一つ大きな波があって以降はそんなに大きな変動もなかったのですが、先程も分析した大きな波が来てから全体として上昇傾向となっています。
10位の平均ポイントがここ数年で3倍になっていることがわかります。50位や100位、300位のポイントも地味に増えてきています。宣伝をする上で、より多くのファンを獲得する必要があることが数値からも示されています。
というわけで、まずは、日間ランキングの時系列による分析をお送りしました。次回はジャンル別の分析をしてみたいと思います。よろしくおねがいします。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?