ニコニコ動画、ここ5年の全視聴数推移を調べた。
概要
ニコニコ動画が、サービス開始からそろそろ10年になるらしい*1。
夏の風物詩のように、ニコニコ動画衰退論がささやかれるので、実際のところどうなのかをまとめてみた。
ニコニコ動画では、このページhttp://www.nicovideo.jp/video_topで、総動画数総再生数総コメント数を調べることが出来る。
2011年よりこの数値をとっている。表示されるのは総再生数なので、一日ごとの差分を見れば、再生数がどの程度変動しているか分かる。
pythonの分析環境Project Jupyter | Homeと言うものがありそれを使ってみたかったので、分析してみた。
昔書いたこちらの記事のアップデート記事である。
shibacow.hatenablog.com
2011年からの一日の総視聴数
2011年年からの1日の総視聴数をグラフにすると次のようになる。変動を見やすくするため、四半期(90日)単位のまとめた*2。
赤い線は90日をまとめた上での中間の値(中央値)青の4角は、それぞれ、90日の視聴数を、小さい順に並べて、25%の位置にある値と75%にある値の範囲である。まあ、一日の平均的な視聴数はそのくらいにあると考えれば良い。
また、縦軸の1-5はそれぞれ、一千万再生から五千万再生に当たる。
横軸の2011_3は2011年3四半期(2011年6月-9月)に当たる。

2011年は、大体二千万再生くらいだったが、2015年-2016年では三千万から四千万再生くらいだ。
2011年からの一日の総コメント数

コメント数は、2011年から減り始め、2013年には一日100万コメントを割り込むようになった。
最近は、更に減り、70万コメント位になっている。
スマホでの視聴ではコメントを打ちにくくそれが、影響しているのかも知れない。
2011年から一日の投稿動画数(純増)
一日の動画投稿数。本当は動画投稿数とは少し異なり、動画の純増数をグラフ化した。ニコニコ動画は、動画の削除も盛んで、一日の投稿動画の総数の差では、投稿数から削除した数を引いたものしか分からない。

2011年には、一日5000動画ほど増えていたが、最近は3000ちょい位。横ばいから若干下がっているようにも見える。
これは、動画投稿数が減ったのか、動画投稿数は一定だが削除数が増えたのかは分からない。
投稿動画のサイズ数が100MBから1.5GBに変わったのでそれが今後影響するだろうか。
まとめ
ニコニコ動画の2011年から2016年までの一日単位の、総動画視聴数、総コメント数、総動画投稿数をまとめた。
変化の早いネットの世界で、10年もサービスを提供できているのがすごいなと思った。
次の十年、ニコニコ動画はどう変化するのだろうか?
おまけ
前の記事と同様に、他の方が追試出来るように元になったデータをおいておきます。
https://dl.dropboxusercontent.com/u/52083005/%E3%83%8B%E3%82%B3%E5%8B%95%E8%A6%96%E8%81%B4%E6%95%B0%E6%8E%A8%E7%A7%BB%282011-2016%29.csv
カンマ区切り、日付、総視聴数、動画投稿数、コメント数
になっています。
date |
total_view |
total_video |
total_res |
2011-07-07 |
25668498001 |
6215110 |
3171405319 |
2011-06-29 |
25519243483 |
6175177 |
3159675814 |
2011-07-05 |
25629892748 |
6206050 |
3168753300 |
2016-11-03 |
79431428013 |
13892040 |
5127220695 |
2016-11-04 |
79469769819 |
13895552 |
5127856263 |
2016-11-05 |
79501400310 |
13898666 |
5128197883 |
このページhttp://www.nicovideo.jp/video_top下部にある、
総動画数 13,899,563 (1234),総再生数 79,508,387,456,総コメント数 5,128,496,130
を毎日取ったデータになっています。
おまけ(Jupyter-notebook)での分析事例
今回始めてJupyterを使ってみたが、結構便利だった。特にpythonのデータ分析ライブラリpandasとの連携は結構便利だった。
実際どのようにデータをまとめたか、実例を示す。
パスワード等は、dotenvで秘匿した。
import pymysql
import pandas.io.sql as psql
import pandas as pd
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
import os
connection = pymysql.connect(host=os.environ.get("MYSQL_HOST"),
user=os.environ.get("MYSQL_USER"),
password=os.environ.get("MYSQL_PASS"),
db=os.environ.get("MYSQL_DB"),[f:id:shibacow:20161105030343p:plain]
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
集計の元になるデータはMySQLに保存しているのでそれを取得する。
%matplotlib inline
sql="select date_format(date,'%Y-%m-%d') as date,total_view,total_video,total_res from head_line where hour(date) = 0;"
df = psql.read_sql(sql, connection,index_col=['date'])
connection.close()
df
データを取り出す。
生のデータは下記のようなデータ。
|
total_view |
total_video |
total_res |
date |
|
|
|
2011-07-07 |
25668498001 |
6215110 |
3171405319 |
2011-06-29 |
25519243483 |
6175177 |
3159675814 |
2011-07-05 |
25629892748 |
6206050 |
3168753300 |
2011-07-08 |
25688332251 |
6220608 |
3172805412 |
2011-06-30 |
25532404679 |
6179159 |
3161062606 |
2011-07-06 |
25649441785 |
6210713 |
3170208631 |
2011-07-02 |
25566192673 |
6188544 |
3163677078 |
2011-07-03 |
25586929485 |
6194878 |
3165350407 |
2011-07-10 |
25697841451 |
6230748 |
3175964918 |
2011-06-28 |
25504077880 |
6171226 |
3158244709 |
2011-07-04 |
25610962630 |
6201121 |
3167275560 |
2011-07-09 |
25676175057 |
6225132 |
3174180719 |
2011-07-01 |
25550751270 |
6183766 |
3162389186 |
2011-07-11 |
25722218681 |
6236701 |
3177878150 |
2011-07-12 |
25740820291 |
6240772 |
3179341304 |
2011-07-13 |
25758942644 |
6244412 |
3180828088 |
2011-07-14 |
25776853770 |
6248912 |
3182241856 |
2011-07-15 |
25795989564 |
6253650 |
3183695290 |
2011-07-16 |
25815077220 |
6258060 |
3185161503 |
2011-07-17 |
25839078907 |
6264020 |
3186957844 |
2011-07-18 |
25862885471 |
6269457 |
3188856253 |
2011-07-19 |
25888359965 |
6275589 |
3190803602 |
2011-07-20 |
25910349992 |
6281083 |
3192720554 |
2011-07-21 |
25932553442 |
6286115 |
3194525492 |
2011-07-22 |
25954017328 |
6291405 |
3196286224 |
2011-07-23 |
25974682603 |
6296178 |
3198055768 |
2011-07-24 |
25994094398 |
6301902 |
3199918724 |
2011-07-25 |
26017595943 |
6307814 |
3201901581 |
2011-07-26 |
26037201371 |
6311686 |
3203648580 |
2011-07-27 |
26057985435 |
6316005 |
3205519576 |
... |
... |
... |
... |
2016-10-07 |
78540469776 |
13805528 |
5111521033 |
2016-10-08 |
78571868061 |
13808908 |
5112057667 |
2016-10-09 |
78610591273 |
13813170 |
5112754887 |
2016-10-10 |
78648629467 |
13817141 |
5113513792 |
2016-10-11 |
78688111980 |
13821629 |
5114229736 |
2016-10-12 |
78716649700 |
13823269 |
5114907735 |
2016-10-13 |
78750017702 |
13826416 |
5115431383 |
2016-10-14 |
78782252333 |
13829280 |
5115935421 |
2016-10-15 |
78808116368 |
13832072 |
5116417915 |
2016-10-16 |
78848927694 |
13836082 |
5117085534 |
2016-10-17 |
78890787429 |
13840397 |
5117836803 |
2016-10-18 |
78913288918 |
13842122 |
5118411190 |
2016-10-19 |
78946009528 |
13844557 |
5118922663 |
2016-10-20 |
78975480428 |
13846753 |
5119285619 |
2016-10-21 |
79008786862 |
13849860 |
5119930731 |
2016-10-22 |
79036248402 |
13852872 |
5120442702 |
2016-10-23 |
79072535276 |
13856393 |
5121110246 |
2016-10-24 |
79111390199 |
13860591 |
5121860183 |
2016-10-25 |
79143498816 |
13864002 |
5122408876 |
2016-10-26 |
79173603174 |
13866512 |
5122918150 |
2016-10-27 |
79205807745 |
13869340 |
5123404989 |
2016-10-28 |
79232873844 |
13872029 |
5123888573 |
2016-10-29 |
79264668078 |
13874739 |
5124400200 |
2016-10-30 |
79301912653 |
13878326 |
5125031457 |
2016-10-31 |
79343199373 |
13883244 |
5125730243 |
2016-11-01 |
79373571612 |
13887162 |
5126220221 |
2016-11-02 |
79400805678 |
13889885 |
5126748616 |
2016-11-03 |
79431428013 |
13892040 |
5127220695 |
2016-11-04 |
79469769819 |
13895552 |
5127856263 |
2016-11-05 |
79501400310 |
13898666 |
5128197883 |
1947 rows × 3 columns
df2=df[['total_view','total_video','total_res']].diff().dropna()
df2.index=pd.to_datetime(df2.index)
df3=df2.where(df2 > 1).dropna()
df4=df3.query('total_res < 3000000 & total_video < 8000 & total_view < 70000000')
一日単位のデータは、どんどん増えていくので、前日との差分を求める(diff)。前日との差分なので一番最初のデータは無い(NaN)になるので、それは除外する(dorpna)。
数値がおかしくて、前日との差分がマイナスになったり極端に大きかったりするのでそれらのデータは除外する。
keys='total_view'
df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)
視聴数の推移を求める。boxplotでやたら横幅が広い画像が出たがなぜだがわからず。

keys='total_res'
df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)
コメント数の推移を求める。

keys='total_video'
df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)
動画投稿数の推移を求める。
