読者です 読者をやめる 読者になる 読者になる

ニコニコ動画の全視聴数の推移 2011-2016

ニコニコ動画、ここ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月)に当たる。

f:id:shibacow:20161105030343p:plain

2011年は、大体二千万再生くらいだったが、2015年-2016年では三千万から四千万再生くらいだ。

2011年からの一日の総コメント数

f:id:shibacow:20161105034006p:plain

コメント数は、2011年から減り始め、2013年には一日100万コメントを割り込むようになった。 最近は、更に減り、70万コメント位になっている。 スマホでの視聴ではコメントを打ちにくくそれが、影響しているのかも知れない。

2011年から一日の投稿動画数(純増)

一日の動画投稿数。本当は動画投稿数とは少し異なり、動画の純増数をグラフ化した。ニコニコ動画は、動画の削除も盛んで、一日の投稿動画の総数の差では、投稿数から削除した数を引いたものしか分からない。

f:id:shibacow:20161105034759p:plain

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']) # pandasのDataFrameの形でデータを取り出す
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'
#df3[keys].hist(bins=15)

df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)

視聴数の推移を求める。boxplotでやたら横幅が広い画像が出たがなぜだがわからず。

f:id:shibacow:20161105030343p:plain

keys='total_res'
#df3[keys].hist(bins=15)

df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)

コメント数の推移を求める。

f:id:shibacow:20161105034006p:plain

keys='total_video'
#df3[keys].hist(bins=15)

df4.boxplot(column=keys,by=df4[keys].index.map(lambda x:"{}_{}".format(x.year,x.quarter)),rot =270)

動画投稿数の推移を求める。

f:id:shibacow:20161105030343p:plain

*1:サービス開始は2006年12月12日だそうだ

*2:箱ひげ図という