「全力回避フラグちゃん!」チャンネルの動画の再生回数/高評価数の異常値を可視化するとどうなるか？【可視化】【異常値検出】

# はじめに

全力回避フラグちゃん! の動画の再生回数と公開日時を使用して，異常な値が存在するか時系列分析してみました．

## 注意事項
2021/11/12 18:30時点で取得した情報を利用しています．
たまたま読んでいて本で，msticpy が使われていたので，それを使用して遊んでいます．

# 用いたデータセット/手法

YouTube Data API のVideos リソースを使用し，2021/11/12 18:30時点において，全力回避フラグちゃん! のチャンネルにアップロードされている全404 本の動画から取得できる動画の再生回数と動画の公開日時を使用しています．

# プログラムの作成

公開日付と動画の再生回数を含む全体のデータセットから，必要なカラムのみ取り出し，msticpy を用いて時系列における異常値を可視化しています．また，月次の周期性があると仮定しています．

```python:msticpyによる可視化
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from msticpy.analysis.timeseries import timeseries_anomalies_stl
from msticpy.nbtools.timeseries import display_timeseries_anomolies
from bokeh.io import export_png
from IPython.display import Image

file = '2021-11-12_flag_videos_datasets.csv'

df = pd.read_csv(file, parse_dates=["date"], infer_datetime_format=True)

#公開日時と再生回数だけを抽出
df_date_viewcount = df[['date','viewCount']].set_index('date')

output = timeseries_anomalies_stl(df_date_viewcount, seasonal=31)

#結果を可視化
timeseries_anomalies_plot = display_timeseries_anomolies(
    data=output,y='viewCount',time_column='date')
```

#可視化の結果

時系列による異常値の可視化の結果は，以下の通りです．
縦軸が動画の再生回数，横軸が日付となっており，青色の丸がその日付に公開された動画です．
また，anomalies と記されているのが異常値でり，今回3つの動画が，異常な再生回数を持っていることがわかります．

![flag_anamaly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/3be64458-616f-8d87-1511-2cec5cdce03a.png)

異常な再生回数を持っている動画の動画公開日を出力してみます．

```python:異常値のオブジェクトの出力
print(df['title'][19])
print(df['title'][51])
print(df['title'][88])
```

```terminal:異常値のオブジェクトの出力結果
 	date 	              viewCount 	residual 	trend 	seasonal 	weights 	baseline 	score 	anomalies
19 	2019-12-10 11:00:05 	3425446 	2160287 	962859 	302299 	          1 	1265158 	4.174742 	1
51 	2020-02-12 09:00:14 	3844534 	2684371 	1045520 	114641 	      1 	1160162 	5.188290 	1
88 	2020-04-26 09:00:30 	4430497 	3011449 	1172166 	246880 	      1 	1419047 	5.820840 	1
```

date となっているのが，該当の動画の公開日であり，viewCount が再生回数です．
動画の公開日，もしくは再生回数からどの動画が異常な再生回数をだしているか，わかるでしょうか．

該当の動画のタイトルを出力してみます．

```python:異常値を持つ動画のタイトルの出力
print(df['title'][19])
print(df['title'][51])
print(df['title'][88])
```

```terminal:異常値を持つ動画のタイトルの出力結果
【漫画】もしも小人になったらどうなるのか？…あんなコトやこんなコトが…？？【アニメ】【漫画動画】
【アニメ】整形中毒になるとどうなるのか…生まれ変われるってホント！？【漫画動画】
【無痛症】痛みを感じなくなった男の末路…【アニメ】【漫画動画】
```

フラグちゃんファンの方にはなじみ深い，動画がリストアップされたかと思います．
チャンネル公開から2年ですが，ほかの動画を寄せ付けない高い再生回数を持つ動画が，
今回異常な再生回数を持つ動画として，検出されました．

# おまけ

次は，動画の再生回数ではなく高評価数でやってみました．

![flag_likecount_anomaly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/cbb3fdc1-f87a-e831-c17d-ac5e3f8f2587.png)

再生回数とは異なり，異常な値を持つ動画は4つ存在しました．
その動画は以下の通りです．

```terminal:異常値を持つ動画のタイトルの出力結果
【漫画】もしも小人になったらどうなるのか？…あんなコトやこんなコトが…？？【アニメ】【漫画動画】
【無痛症】痛みを感じなくなった男の末路…【アニメ】【漫画動画】
死亡フラグの1DAYルーティン【アニメ】【漫画動画】
【究極の選択】金と人の命はどちらが大事なのか…？【アニメ】【漫画動画】
```

上2つは再生回数でも異常な値を持っていましたが，下2つは再生回数では異常な値とは判定されませんでした．
つまり，下2つの動画は，高評価数で異常な値を持つ動画といえます．また，再生回数にあり高評価数にない動画は，再生回数のわりに高評価数が高くないという意味で異常な動画といえるかもしれません．

# 簡単なまとめ
- フラグちゃんの動画の再生回数と動画公開日をもとにmsticpy を用いて時系列分析し，その結果を可視化した．
- 分析した結果，異常値は3つ存在した．
- 高評価でやってみると，再生回数にない動画が2つ存在した


# 今後の予定
他にも気になることがあったら，可視化していく予定です．
次は，タイトルや概要欄に使用されている単語の登場回数を調査したり，そこから動画のカテゴリ付けなどをしていく予定です．

# おわりに

ここまで読んでいる人はいないと思いますが，もしいたらまずは，以下のリンクから<b>全力回避フラグちゃん!</b> チャンネルとフラグちゃんのTwitter をフォローしてください．この記事を読むより大切なことです．
大事なことなのでもう一度，<b>チャンネル登録</b>と<b>Twitter のフォロー</b>をよろしくお願いいたします．

# 参考文献
機械学習の手法を実践する際に活用させていただきました．ありがとうございます．
- [セキュリティエンジニアのための機械学習――AI技術によるサイバーセキュリティ対策入門．Chiheb Chebbi　著、新井 悠、一瀬 小夜、黒米 祐馬　訳．2021/11](https://www.oreilly.co.jp/books/9784873119076/)

# 関連リンク
- YouTube Data API Channels リソース  https://developers.google.com/youtube/v3/docs/channels?hl=ja
- 全力回避フラグちゃん! https://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw/videos
- 株式会社Plott / Plott Inc. https://plott.tokyo/#top
- フラグちゃんのTwitter https://twitter.com/flag__chan
- Github  https://github.com/uky007/flag_analysis