ニコニコ動画の統計を出すプログラムを作ってみた


はじめに

最近DockerとPythonを勉強しており、それを使って何か作れないかと考えていました。
そこで、https://nicosearch.info/ のようなWebサイトを作成していたので
ニコニコ動画のAPIのノウハウ?を活かし、今までに投稿された動画の再生数などの統計を出すプログラムを作成してみました。

動作環境

DockerにAggregateとStatisticsコンテナを作成してdocker-composeでコンテナ間通信を行う環境を作成し、Pythonを使って動画のサンプルを取得し、統計処理させてグラフを生成します。

  • Aggregate

APIから今まで投稿された動画の中からランダムに動画を集めてその情報をDBに保存し続ける(バックグラウンドで動作推奨)
取得するのは動画ID、タイトル、再生、コメント、マイリスト、カテゴリタグなど
無限ループするのでプロセスを手動またはcronで止める必要あり

  • Statistics

DBから統計データを出力する
統計を出すデータは各再生数ごとの区分、中央値、標準偏差等
※中央値:例えば100動画の中から50番目の順位の再生数を出力します。人並の再生数などが知りたいときに有効な統計値
※標準偏差:値が高いほど再生数の高い動画と低い動画の格差があることを示し、値が低ければ格差が少ないことを表す統計値

allvideo.pyが全動画の統計、tagvideo.pyはカテゴリタグごとの統計

コンテナだとGUIが使えないのでグラフを生成できないことに気づいたため、自分の端末にDBを保存しプログラムを動かしてグラフを作成しています。(事前に考えて作成すればよかった)

使用したAPI・GitHub

API

コンテンツ検索API
キーワードやソート順などのパラメータを与えることによって検索した結果をJSON形式で取得可能
ニコ動の動画だけでなく、ニコ生、ニコ静、ニコニコニュースなどにも対応

getthumbinfo
URLの最後に「sm9」などの動画IDを付与することにより、XML形式で動画のタイトル、投稿日時、再生数などが取得可能

GitHub

Aggregateでデータを取得する

データを保存していくためのDBを作成します。

# python db/db_create.py 


main.pyでプログラムを実行しデータをDBに保存していきます。

# python main.py
------------------------------
sm30795549
insert:sm30795549
sm30795549,「Intersect Thunderbolt-Remix」 【eXceed3rd-JADE PENETRATE-BLACK PACKAGE】,154,0,1,2018-12-04 22:34:38.829940,2017-03-10 17:59:18,No category
------------------------------
sm18305907
insert:sm18305907
sm18305907,【三国志大戦3】えっ・・・黄忠の開幕、短すぎ・・・?【証105VS証102】,2144,184,3,2018-12-04 22:34:40.065611,2012-07-09 16:11:51,No category
------------------------------
sm29082040
歌ってみた
insert:sm29082040
sm29082040,被害妄想携帯女子(笑)歌ってみた【ジョウソンタ・無色みや】,949,12,15,2018-12-04 22:34:41.259039,2016-06-19 19:30:00,歌ってみた
------------------------------
sm4955208
ゲーム
insert:sm4955208
sm4955208,クロスエッジ 温泉イベント(4回目),5154,96,12,2018-12-04 22:34:42.497974,2008-10-17 00:36:22,ゲーム
------------------------------
sm17041342
車載動画
insert:sm17041342
sm17041342,【こくこく動画】国道434号線徳山~錦バイパス《平瀬ダム付替道路》,514,18,3,2018-12-04 22:34:43.574361,2012-02-22 00:11:38,車載動画
------------------------------
sm21142315
演奏してみた
insert:sm21142315
sm21142315,【夜咄ディセイブ】バンドで演奏してみた,1157,17,6,2018-12-04 22:34:45.035741,2013-06-18 00:59:21,演奏してみた
------------------------------
sm23990756
その他
insert:sm23990756
sm23990756,【艦これMMD】あなたはどっち派?龍鳳と大鯨が可愛い「おこちゃま戦争」,15769,66,319,2018-12-04 22:34:46.067926,2014-07-13 05:01:00,その他
------------------------------
sm31678494
ゲーム
insert:sm31678494
sm31678494,082 実況プレイ 「トゥームレイダー:アンダーワールド」 #021,48,3,1,2018-12-04 22:34:47.036612,2017-08-03 19:23:22,ゲーム
------------------------------
sm14475708
スポーツ
insert:sm14475708
sm14475708,【2011.4.30】D-STAGE 2011 2/2,1034,17,6,2018-12-04 22:34:48.785555,2011-05-17 00:24:37,スポーツ
------------------------------
sm26870946
自然
insert:sm26870946
sm26870946,金城山(高棚),72,1,1,2018-12-04 22:34:49.895190,2015-08-06 19:44:05,自然
------------------------------
sm18676017
ゲーム
insert:sm18676017
sm18676017,【Dovahkiin】Skyrim実写【For the King】,1350,10,16,2018-12-04 22:34:52.108761,2012-08-21 18:26:08,ゲーム
------------------------------
sm9016041
ゲーム
insert:sm9016041
sm9016041,【実況プレイ】 不思議の国の救世主伝説12 【アリスインナイトメア】,58,11,1,2018-12-04 22:34:53.619464,2009-12-06 14:38:03,ゲーム
------------------------------
sm22488006
ゲーム
insert:sm22488006
sm22488006,【TAS】 空中要塞 エアー・フォートレス 【NES】 3/3,1990,24,1,2018-12-04 22:34:55.119688,2013-12-20 00:52:32,ゲーム
:
:
:

Statisticsで統計データ出力

Aggregateコンテナでプログラムをバックグランドで3日間動作し続けて取得した動画の件数はDBを調べてみたところ
16万5045件

DBにある全ての動画データの統計

# python allvideo.py
1000000再生以上:52, per:0.03
100000再生以上:1635, per:0.99
10000再生以上:14314, per:8.67
1000再生以上:63234, per:38.31
100再生以上:135936, per:82.36
動画総数:165045
avarage:再生数6053コメント数228マイリスト数61
median:再生数552コメント数13マイリスト数3
std:再生数43738コメント数4801マイリスト数684

カテゴリタグ別の統計

# python tagvideo.py
【アニメ】
動画総数:5681
avarage:再生数18075コメント数1019マイリスト数185
median:再生数2252コメント数37マイリスト数15
std:再生数72854コメント数8771マイリスト数1188
【ゲーム】
動画総数:68254
avarage:再生数4651コメント数185マイリスト数22
median:再生数403コメント数13マイリスト数2
std:再生数33693コメント数1992マイリスト数313
【実況プレイ動画】
動画総数:6200
avarage:再生数2716コメント数72マイリスト数10
median:再生数117コメント数5マイリスト数1
std:再生数18884コメント数389マイリスト数89
【東方】
動画総数:2665
avarage:再生数11060コメント数257マイリスト数125
median:再生数1494コメント数26マイリスト数10
std:再生数62384コメント数1552マイリスト数742
【アイドルマスター】
動画総数:3369
avarage:再生数5303コメント数159マイリスト数60
median:再生数1074コメント数18マイリスト数8
std:再生数24716コメント数887マイリスト数284
【ラジオ】
動画総数:2187
avarage:再生数7129コメント数278マイリスト数55
median:再生数970コメント数14マイリスト数6
std:再生数25182コメント数1572マイリスト数302
【描いてみた】
動画総数:679
avarage:再生数12270コメント数334マイリスト数268
median:再生数1314コメント数37マイリスト数13
std:再生数51241コメント数1272マイリスト数1176
【TRPG】
動画総数:79
avarage:再生数43086コメント数514マイリスト数164
median:再生数8949コメント数165マイリスト数37
std:再生数109317コメント数1067マイリスト数330
【エンターテイメント】
動画総数:6817
avarage:再生数7441コメント数306マイリスト数83
median:再生数957コメント数13マイリスト数4
std:再生数55064コメント数5140マイリスト数1466
【音楽】
動画総数:10808
avarage:再生数5021コメント数111マイリスト数95
median:再生数693コメント数6マイリスト数8
std:再生数39545コメント数1449マイリスト数917
【歌ってみた】
動画総数:7969
avarage:再生数7773コメント数193マイリスト数131
median:再生数340コメント数9マイリスト数4
std:再生数79099コメント数2656マイリスト数1147
【演奏してみた】
動画総数:2122
avarage:再生数6258コメント数126マイリスト数100
median:再生数704コメント数10マイリスト数5
std:再生数51103コメント数1305マイリスト数997
【踊ってみた】
動画総数:1517
avarage:再生数14159コメント数299マイリスト数205
median:再生数1304コメント数26マイリスト数13
std:再生数148153コメント数4213マイリスト数2127
【VOCALOID】
動画総数:4120
avarage:再生数6516コメント数137マイリスト数167
median:再生数630コメント数11マイリスト数10
std:再生数45069コメント数1208マイリスト数1220
【ニコニコインディーズ】
動画総数:409
avarage:再生数2982コメント数20マイリスト数35
median:再生数227コメント数3マイリスト数3
std:再生数27454コメント数119マイリスト数164
【ASMR】
動画総数:8
avarage:再生数2239コメント数21マイリスト数21
median:再生数2338コメント数12マイリスト数10
std:再生数2334コメント数26マイリスト数34
【MMD】
動画総数:117
avarage:再生数7040コメント数106マイリスト数208
median:再生数1515コメント数18マイリスト数36
std:再生数16662コメント数314マイリスト数629
【バーチャル】
動画総数:30
avarage:再生数5589コメント数101マイリスト数43
median:再生数1404コメント数17マイリスト数18
std:再生数8970コメント数190マイリスト数65
【動物】
動画総数:1689
avarage:再生数6023コメント数94マイリスト数34
median:再生数337コメント数7マイリスト数2
std:再生数41485コメント数834マイリスト数209
【料理】
動画総数:691
avarage:再生数11598コメント数297マイリスト数106
median:再生数1123コメント数30マイリスト数6
std:再生数43078コメント数1348マイリスト数537
【自然】
動画総数:522
avarage:再生数6553コメント数248マイリスト数35
median:再生数330コメント数6マイリスト数2
std:再生数42774コメント数1483マイリスト数273
【旅行】
動画総数:617
avarage:再生数3288コメント数71マイリスト数27
median:再生数261コメント数6マイリスト数2
std:再生数37837コメント数366マイリスト数433
【スポーツ】
動画総数:2174
avarage:再生数7547コメント数190マイリスト数53
median:再生数1008コメント数18マイリスト数4
std:再生数49749コメント数1532マイリスト数498
【ニコニコ動画講座】
動画総数:372
avarage:再生数4855コメント数175マイリスト数66
median:再生数528コメント数8マイリスト数4
std:再生数22391コメント数1313マイリスト数405
【車載動画】
動画総数:902
avarage:再生数2091コメント数64マイリスト数11
median:再生数536コメント数13マイリスト数3
std:再生数6705コメント数233マイリスト数38
【歴史】
動画総数:420
avarage:再生数8977コメント数484マイリスト数81
median:再生数1112コメント数22マイリスト数8
std:再生数44519コメント数4177マイリスト数479
【鉄道】
動画総数:16
avarage:再生数1243コメント数45マイリスト数4
median:再生数237コメント数6マイリスト数2
std:再生数2909コメント数119マイリスト数7
【科学】
動画総数:507
avarage:再生数9744コメント数184マイリスト数64
median:再生数919コメント数14マイリスト数3
std:再生数46697コメント数615マイリスト数290
【ニコニコ技術部】
動画総数:311
avarage:再生数20016コメント数948マイリスト数133
median:再生数1644コメント数24マイリスト数7
std:再生数123226コメント数10966マイリスト数706
【ニコニコ手芸部】
動画総数:55
avarage:再生数6651コメント数135マイリスト数48
median:再生数801コメント数23マイリスト数7
std:再生数27868コメント数478マイリスト数231
【作ってみた】
動画総数:353
avarage:再生数6872コメント数197マイリスト数54
median:再生数811コメント数13マイリスト数4
std:再生数22456コメント数2005マイリスト数243
【政治】
動画総数:2014
avarage:再生数4096コメント数300マイリスト数21
median:再生数734コメント数31マイリスト数2
std:再生数16227コメント数1577マイリスト数184
【例のアレ】
動画総数:2040
avarage:再生数18219コメント数334マイリスト数128
median:再生数2923コメント数52マイリスト数10
std:再生数85319コメント数1952マイリスト数794
【その他】
動画総数:3650
avarage:再生数5525コメント数123マイリスト数113
median:再生数1056コメント数13マイリスト数10
std:再生数25178コメント数993マイリスト数654
【日記】
動画総数:1243
avarage:再生数3283コメント数132マイリスト数26
median:再生数624コメント数8マイリスト数2
std:再生数16112コメント数939マイリスト数366
【No category】
動画総数:23240
avarage:再生数4810コメント数290マイリスト数66
median:再生数655コメント数14マイリスト数3
std:再生数25614コメント数10790マイリスト数477

改良点

  1. 端末で実行するよりもWebブラウザなどでいつでも確認できるようにしたい
  2. ランダムでサンプルデータを取るよりも2007年から現在まで動画ID順でデータを取得していけば良いと思った ただし、その分時間がかかり今の環境では全ての動画データを集めるのは難しい
  3. まだプログラム自体が汚いところもあるのでリファクタリングする
  4. ASMRや鉄道などのタグは2018年11月にカテゴリタグ化されたばかりだったのでサンプル数が非常に少なくなってしまった なのでカテゴリタグ関わらずタグのデータを取得できるようにしたい