「全力回避フラグちゃん!」チャンネルの動画をグラフ化するとどうなるのか？【Python】【グラフ化】

# はじめに

YouTube が大好きで，その中でも日常的に良く視聴しているチャンネルのことをもっとよく知りたくなったため，今回のようなデータを自分で収集し，グラフ化することで状況を見やすくするということをしたくなったのが本記事作成のモチベーションです．

今回は"全力回避フラグちゃん!" という株式会社Plott 様が運営しているYouTube のあるチャンネルに公開されている動画から再生数や動画の公開日，登場キャラや話の終わり方の情報を収集してグラフ化することで全体像を見えるようにしました．
<b>運営会社様やチャンネル及びキャラクターについて詳しく知りたい方は，本記事の末尾の関連リンクをご参照ください．</b>

それ以上のことは特にありません．フラグちゃんは，他のPlott 様のチャンネルとは異なり，話の内容によって出現する主要キャラがバラバラな感じ※がしたので，再生回数となんか関係あるのかなーと思いグラフ化してみたというだけのお話です．
※ フラグちゃんでさえでない回が少ないですが存在します．モブ男は皆勤賞です．

## 注意事項
本記事で実施していることは動画から得られる情報をプロットしただけです．
また，2020/12/28 時点で記録しているため，現在の情報と異なる可能性があることと，
目視で記録していたため情報に誤りがある場合がございます．ご了承ください．

# 用いたデータセット
今回はチャンネルの動画一覧から古い順に動画の内容を確認し，以下の情報をまとめたデータセットを作成しました．
目視と手作業で実施しています．本当はAPI もしくは，Web スクレイピング等で取得可能な情報は取得したうえで，
さらに自動化したいと思いましたが，それでは時間を要するという点とどうせ動画見ないと記録できない部分もあったので，見ながら作っちゃえということで作業しました．※
ファイルのフォーマットは下記情報をまとめたCSV ファイルです．
<b>※私はフラグちゃんのファンなので，すべての動画を見直しつつ，データを記録するのに何の苦痛も感じませんでした．なお，真似をすることは推奨できませんが...</b>

- 古い順から昇順の番号
- 動画公開日
- 動画タイトル
- 再生回数 (万未満切り捨て，12/28 23:00記録)
- Dead End 有無
- 死亡フラグ登場 有無
- 生存フラグ登場 有無
- 恋愛フラグ登場 有無

上記の中で実際に使用したのは動画公開日，再生回数，各々の有無です．それ以外の情報は今後の分析等で使用していこうかなと考えています．
2020/12/28 時点で，219本の動画が公開されており，上記の集計結果は以下のようになりました．

|動画数  |Dead End 数  |死亡フラグ登場回数  |生存フラグ登場回数  |恋愛フラグ登場回数  | 死亡フラグ回収率 |
|:-:|:-:|:-:|:-:|:-:|:-:
| 219  |12  |210  |39|17|約 5.7 % |

Dead End は，動画の最後にDead End と表記されているもの(カタカナも含めています)が対象です．
それ以外にも明らかにフラグ回収されている描写はいくつもありましたが，あまり主観的に判断するとデータが崩れてしまう恐れがあるため，今回はこのような定義付けをしました．

死亡フラグちゃんの登場回数は，そのままですが，話によってはモブ男の妄想内だけの登場もあり，それもカウントしています．
生存フラグさん，恋愛フラグさんの登場は，最近の6チャンネルコラボであった声だけの出演もカウントしています．

死亡フラグ回収率の計算式は

```math
\begin{align}
[死亡フラグ回収率] = [\mathrm{Dead \ End} \ 数] \ / \ [死亡フラグ登場回数]
\end{align}
```

と定義しています．

また，再生数の平均値と中央値は以下のような形になります．平均値のみ，「概要」から得られる総再生回数の値を用いて計算しています．

|動画再生回数の平均値 [万] |動画再生回数の中央値 [万] |
|:-:|:-:|
| 75  | 61 |

## プログラム

今回作成したデータセットからグラフをプロットするプログラムです．
作成には苦労しましたが，特に難しい部分はありません．
Qiita がプログラマのためのブログサービス？らしいので一応コード載せましたが，何なら読み飛ばしていただいて結構です．

```py:グラフ作成プログラム
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
import matplotlib.patches as mpatches
from matplotlib.path import Path
from pandas.plotting import register_matplotlib_converters

#データセット対象のCSV ファイル
file = "flag_video_data_date.csv"
#Date, 再生回数
num_play = pd.read_csv(file, header=0, encoding='UTF8', usecols=[1, 3], parse_dates=[0])
num_play = num_play.dropna(how='all')
#Date, Dead End
num_dead = pd.read_csv(file, header=0, encoding='UTF8', usecols=[1, 4], parse_dates=[0])
num_dead = num_dead.dropna(how='all')
#Date, 死亡フラグ
num_shibou = pd.read_csv(file, header=0, encoding='UTF8', usecols=[1, 5], parse_dates=[0])
num_shibou = num_shibou.dropna(how='all')
#Date, 生存フラグ
num_seizon = pd.read_csv(file, header=0, encoding='UTF8', usecols=[1, 6], parse_dates=[0])
num_seizon = num_seizon.dropna(how='all')
#Date, 恋愛フラグ
num_renai = pd.read_csv(file, header=0, encoding='UTF8', usecols=[1, 7], parse_dates=[0])
num_renai = num_renai.dropna(how='all')

# debug
#print(num_play)
#num_play.to_csv('exam_num_play.csv')

#Plot するグラフ
#Date
x = num_play[num_play.columns[0]]
#print(type(x[0]))

#x = pd.date_range(x[0], x[218], freq='D')
#再生回数
y1 = num_play[num_play.columns[1]]
#Dead End
y2 = num_dead[num_dead.columns[1]]
#死亡フラグ
y3 = num_shibou[num_shibou.columns[1]]
#生存フラグ
y4 = num_seizon[num_seizon.columns[1]]
#恋愛フラグ
y5 = num_renai[num_renai.columns[1]]

#グラフの大きさ
plt.figure(figsize=(20.0, 10.0), dpi=300)
#フォント設定
plt.rcParams['font.family'] = 'Times New Roman'


# グラフプロット
## 再生回数を棒グラフでプロット
play = plt.bar(x, y1, width=1.0, bottom=None, color="lightblue")

## カウントを点でプロット
for i in range(len(x)):
    if y3[i] == 1:
        shibou, = plt.plot(x[i], y1[i], marker='s', markersize=5, color='#ff7f00', linestyle='None')

    if y2[i] == 1:
        dead, = plt.plot(x[i], y1[i], marker='*', markersize=8, color='r', linestyle='None')
    
    if y4[i] == 1:
        seizon, = plt.plot(x[i], y1[i], marker='o', markersize=4, color='c', linestyle='None')

    if y5[i] == 1:
        renai, = plt.plot(x[i], y1[i], marker='$\heartsuit$', markersize=3, color='#f781bf', linestyle='None')

## 平均値と中央値を横線でプロット
avg = plt.hlines(num_play.mean(axis=0), x[0], x[len(x) - 1], 'b', linestyles='dashed')
med = plt.hlines(num_play.median(axis=0), x[0], x[len(x) - 1], 'r', linestyles='dashed')
print(num_play.mean(axis=0))
print(num_play.median(axis=0))
        
# 軸の範囲
plt.xlim('2019-11-01', x[len(x) - 1])
plt.ylim([0, 350])

# グラフタイトル
plt.title("全力回避フラグちゃん! 動画集計データ", fontname="MS Gothic", fontsize=20)

# 軸メモリ
plt.tick_params(axis='x', labelsize=20, labelrotation=45)
plt.tick_params(axis='y', labelsize=20)

# ラベル名
plt.xlabel("動画公開日", fontsize=20, fontname="MS Gothic")
plt.ylabel("再生回数 [万]", fontname="MS Gothic", fontsize=20)

# 凡例
play_title = "再生回数"
dead_title = "Dead End"
shibou_title = "死亡フラグ"
seizon_title = "生存フラグ"
renai_title = "恋愛フラグ"
avg_title = "平均値"
med_title = "中央値"

plt.legend([play, dead, shibou, seizon, renai, avg, med], [play_title, dead_title, shibou_title, seizon_title, renai_title, avg_title, med_title], bbox_to_anchor=(1.0, 1.0), prop={"family":"MS Gothic", 'size':20}, markerscale=3)

#画像保存
plt.savefig("flag_video_stas_graph.png", bbox_inches="tight", pad_inches=0.0)
```

#グラフ化した結果

以下のグラフが本記事の成果となります．
再生回数は棒グラフで表しています．
Dead End があった回は赤い星，死亡ブラぐちゃんの登場回はオレンジの四角，生存フラグさんの登場回は青い丸，恋愛フラグさんの登場回はピンクのハートで表しています．プロットされる場所は，ちょうど棒グラフの一番先にしています．
動画再生数の平均値は青色の破線，中央値は赤色の破線でプロットしています．

![flag_video_stas_graph_20201228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/2bf2d85a-a832-1edb-d90a-20407875ffa4.png)


# 簡単な考察？
せっかくグラフ化できたので，簡単な考察というか感想を述べます．
まず，再生回数の大きいところ，平均値の2倍に位置する150万回以上再生されている動画の多くは死亡フラグちゃん単独回で，あっても生存フラグさんが出てくる回となります．
数あるDead End 回でこの周辺に位置するのは1話だけ．
ということから考えると，とりあえずキャラを出しておけば100万再生回数を超えるような大きなインパクトが得られるかというと，違うだろうという結論に至ります．とどのつまり，再生回数はキャラの登場に依存するわけではなく，内容のクオリティかと思います．

次に平均値や中央値に関すると，現在のチャンネル登録者数が約42万人にもかかわらず，平均値と中央値はその値を上回る値を持っています．
つまり，チャンネル登録はしないが，内容に興味があってみている人，もしくはリピート再生するコアな視聴者が多いということなのでしょうか．
(YouTube の再生回数のカウント方法に詳しくないので，何とも言えないですが)
前者であるなら未開拓層にも動画が届けられているので今後の登録者数の伸びも期待できそうですし，後者ならそれはそれで視聴者を引き付けて話さない魅力を持っているということになるかと思います．どっちもありそうな気もしますが...

最後に横軸に着目します．動画投稿頻度ですが，宣言している隔日投稿は2回くらいできてませんが，その直後で連日投稿しておりトータルでは隔日投稿した以上の動画が投稿されています．やっぱりYouTuber はすごいですね...
逆に言えば，このクオリティと頻度で投稿しているにもかかわらず1年で40万人かーとも思ってしまいます．

# 簡単な結論

やってみて得られた感想になってしまいますが，結論をまとめます．

- 再生回数は登場キャラではなく内容のクオリティのほうが関連性がありそう
- 登録者数以上の平均値や中央値をもっており，今後にも期待できる魅力的なチャンネルである
- 隔日投稿以上のことができている

# 今後の予定
以下のようなことができたらなあと考えています．

- タイトルから各フラグの出現確率を算出し，予測する
- タイトルからおおまかな再生回数を予測する
- 入力された文字からタイトルを参照してフラグ他立つかどうかを判定するbot の作成

他にも画像認識にも手が出せたらなあと興味は今のところ尽きません．
あと，チャンネル登録者数の推移情報が手に入れば，今回のグラフにプロットしたいです．

# おわりに

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

# 関連リンク
- 全力回避フラグちゃん! https://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw/videos
- 株式会社Plott / Plott Inc. https://plott.tokyo/#top
- フラグちゃんのTwitter https://twitter.com/flag__chan