SlideShare a Scribd company logo
動画タグネットワーク分析を用いた
ニコニコ動画における萌芽文化発見の試み
~”ゆっくり関連タグ”を例として~
Yusuke Fukasawa(@fukka1225)
2015/10/21
本スライドで用いたゆっくり霊夢などの画像は
ニコニ・コモンズ(nc105190)よりお借りしました
 自己紹介
Yusuke Fukasawa(@fukka1225)
東京大学大学院工学系研究科シス創・TMI(副専攻)の修士
普段は、はてなブックマークの大喜利を見ていたり
ライターをしていたりします
(http://credo.asia/author/yusuke/)
本業は経済現象に関するマルチエージェントシミュレーション
ニコニコ動画とはそれなりの付き合い(プレミアム会員4年目)
1.
仮説や前提、先行研究の紹介
前置きだよ!
 前提
昨今、ニコニコ動画はつまらなくなったと言われております
今まであった文化と今現在の大勢を占めている”ニコニコ動画的で
ない“文化(ゲーム実況者のアイドル化現象など)のぶつかり合い
「マリオメーカー問題」という言葉も出来るほどに
そんなぶつかり合いなどないし、懐古厨が騒いでいるだけという意
見ももちろんありますが、今回はニコニコ動画がかつて持っていた
文化が廃れているのでは、という前提に立ちます
 仮説
これまでの文化が廃れつつあるならば、それに対して反発するので
はなく今ある“ニコニコ的な文化”に注目することも大事なのでは
今回、“ニコニコ的な文化”として注目するのは“ゆっくり”
 東方キャラクターはニコニコ動画との付き合いが長い
 投稿者の匿名性を保ちながらも、動画に分かりやすいモチー
フを与える重要な役割を果たしている
“ゆっくり”文化を動画タグネットワークで俯瞰・分析するとともに、
今はまだ文化として定着していないが、ネットワーク構造的に定着
してもおかしくない文化を動画タグで見つけることを試みる
 なぜ動画タグなのか?
“動画タグ”とは、各動画に投
稿者及び視聴者がその動画を
表現するものとしてつける
だいたい動画タグを見れば内
容が推測できる時もある
これらタグをノードとして捉
えることでネットワークとし
て表現
各タグごとに平均再生回数や
コメント数など動画に関する
情報も取得できる
http://www.nicovideo.jp/watch/sm6857306
もはや歴史的資料となった
「ごちうさ」第一羽
 先行研究の紹介_1
大規模学術論文データの共著ネットワーク分析に基づく萌芽領域の
中心研究者予測に関する研究(東京大学,森純一郎,2015)
論文を一緒に書いたことがある人:共著者の関係をネットワーク上
で表現し、そのネットワークを用いて萌芽領域の中心研究者を機械
学習で予測する、というもの
???
なにいってるんだ
こいつ
 先行研究の紹介_2
つまるところこんな感じだと思われる
著者
A
著者
B
著者
C
著者
D
著者
G
著者
F
著者
H
著者
E
著者
I
1. 次数の大きいノードが影響力の高
い研究者であると考えそれらを正例、
次数の小さいノードを負例として考
える
2. 機械学習で分類器を作成
3. 今はまだ共著者数が多くないが、
ネットワークの構造指標的に次数が
多くなるだろうと予測されるノード
(研究者)を抽出する
正例
負例
新たに見つけた
ノード
あくまでも
イメージ図です
 今回の手法_1
先行研究ではネットワークの次数を指標にトレーニングセットを作
成していたが、今回の分析では「タグ毎の平均再生回数・コメント
数・マイリスト数から計算されるランキングポイント」を指標とす
る
“ランキングに近いほど文化として定着しているタグである”と考え、
今回の分析で
”まだそれほどランキングポイントを獲得できてはいないが
ネットワーク構造的にいつランキング入りするほど文化と
して定着してもおかしくないタグ”
を発掘したい
 今回の手法_2
分類に用いる学習器にはSVM(R:e1071パッケージ)を用いる
SVMの勉強も兼ねてます
ランダムフォレストで各種変数の重要度も一応計算しますが、今回
はその結果を用いてパラメータを選別はしませんでした
分類器による結果をノード属性に反映し、Gephi上で可視化して分
析するところまでをゴールとしました
 (参考)Gephiとはなんぞや
 (参考)Gephiとはなんぞや
グラフ形式ファイルからcsvまで幅広く読み込んでネットワーク描
写をしてくれるオープンソースソフトウェア
各種統計量もボタン一つで計算してくれます
“グラフのPhotoshop”とも呼ばれているそうな
重すぎてCPUがフィーンと鳴ります
Cytoscape派の方々
ごめんなさい
2.
SVMで使うデータセットのため
ネットワーク特徴量を求める
機械学習で分類する前
の下準備!
 データを集めてくる
ニコニコ動画スナップショット検索APIで、”ゆっくり”を含むタグ
を持つ動画を取得します(http://github/dichika/niconico で公開
されているラッパーを使用しました。)
選んだタグは動画数が1000以上あるもの
APIの関係上、取得できるサイズは100が限界でした。全部で28個
のタグで検索し、2800個の動画情報を取得し、一つのデータへ
require(niconico)
require(igraph)
# ゆっくりに関連したタグで検索をかける
s1<-getSearch(query = "ゆっくり実況プレイ", size = 100, type =
"tag")
s2<-getSearch(query = “ゆっくり実況”, size = 100, type = “tag”)
〜中略〜
s27<-getSearch(query = "ホラーゆっくり実況", size = 100, type =
"tag")
s28<-getSearch(query = "ゆっくり生活", size = 100, type = "tag")
 処理前のデータ
タグは空白区切り
 ネットワーク形式へ_1
このあとまとめてきた動画情報に含まれるタグの部分からタグの共
起関係を抽出してグラフ表現に直さなくてはなりません
しかし、先ほどの状態からRだけで処理を完結させる方法が思いつ
かなかったので再現性は保てませんがエクセルで処理を行いました
こういう要素列であれば、次のように変換することで隣接行列形式
にすることが出来る関数を見つけましたので、それを利用します
(a,b,c)
(b,c)
(c)
1 1 1
0 1 1
0 0 1
 処理後のデータ
seed.csvとして
こいつを保存します
 ネットワーク形式へ_2
この状態から次の関数(https://gist.github.com/peccu/4328957
)で隣接行列形式に変換します
adjacency <- function(n){
## 出力行列の初期化
mydata <- diag(0,length(colnames(n)))
## 行,列に名前を付ける
colnames(mydata) <- colnames(n)
rownames(mydata) <- colnames(n)
## rは列番号
for(r in 1:length(colnames(n))){
## r行目に,縦方向に合計したものを代入
mydata[r,] <- colSums(
## r列目が1になっている行を対象にして
n[n[,r] == 1,]
)
}
mydata
}
関数使わせていただきました
ありがとうございました
 ネットワーク形式へ_3
先ほどの関数を用いて変換し、igraphの書き出し機能でGephiで読
み込めるフォーマット”gml”にします
わざわざGephiで計算させるのは、ネットワークオブジェクトは
Gephiで扱う癖が抜けないため
もっとRと仲良くならねばなりません
seed<-read.csv("seed.csv",fileEncoding="cp932")
adj<-adjacency(seed)
g <- graph.adjacency(adj,weighted=TRUE)
write.graph(g,"taggraph.gml","gml")
多分igraphで
全部計算できましたね
 各種統計量を計算する
Gephiではネットワーク分析に必要
なほとんどの指標をすぐに計算で
きます
ローデータのままだと分析が難し
いので次数が9以下のノードは全て
削除してから処理します
今回はネットワークの特徴量とし
て特に選り好みすることなく全部
計算してもらって、csvを出力しま
した
 タグごとに動画に基づく属性を与える
吐き出されたcsvにはノードごとの統計量が付与されているので、
ここに各タグごとの平均再生回数・コメント数・投稿日時・再生時
間・マイリスト数を計算して新たに付与します
新たに付与
した属性
Gephiで計算した
ネットワーク統計量
3.
SVMでの分類を試みる
作成したデータから
分類器を作って分類させます!
 トレーニングセット(学習・テスト)の作成_1
モデルを学習させるデータとその精度をテストするデータに分けな
いといけない
本当はチューニング用のデータもあるべきですが、Rでモデルを
作った後別データでチューニングする方法を知らないのです
(http://techlife.cookpad.com/entry/2015/09/30/170015)
今回トレーニングセットを選ぶのに用いた指標:ランキング総合ポ
イント
 ランキング総合ポイント=(総合ポイント=再生数+(コメント数
×補正値)+マイリスト数×15)
 補正値=(再生数+マイリスト数)/(再生数+コメント数+マイリス
ト数)
 広告ポインヨは今回無視しています
 トレーニングセット(学習・テスト)の作成_2
ランキング総合ポイントで上位100、下位100くらいになるように
データを選別して半々に分けます
# 予め作成したノードリストを読み込む
set<-read.csv(“taggraph_nodes.csv”,fileEncoding = “CP932”)
#再生数などの情報は既にポイントで反映していると考え削除しておく。計算結果を最終
的にsetに貼って出力しGephiでまた使う
set1<-set[,c(-2,-3,-10,-17,-18,-19)]
plus<-subset(set1,set1$Points>2.5*mean(set1$Points))
minus<-subset(set1,set1$Points<0.05*mean(set1$Points))
plus$culture<-as.factor(1)
minus$culture<-as.factor(0)
# チューニング用とテスト用に分ける
plus1<-plus[c(1:47),]
plus2<-plus[c(48:93),]
minus1<-minus[c(1:46),]
minus2<-minus[c(47:93),]
learning<-data.frame(rbind(plus1,minus1))
test<-data.frame(rbind(plus2,minus2))
実際には100じゃなくて
93ですが
 トレーニングセット(学習・テスト)の作成_3
データ型をそれぞれ適したものにしつつ整形していきます
Apply型関数で一気にやるべきですほんとは
HubとAuthorityは値が同じだったのでAuthorityのみ残します
# 日付型は使えないのでnumericに。あと、Hubは削除。
set1$ave_starttime<-as.numeric(set1$ave_starttime)
set1$Authority<-as.numeric(set1$Authority)
learning1<-learning[,c(-1,-5,-16)]
learning1$ave_starttime<-as.numeric(learning1$ave_starttime)
learning1$Authority<-as.numeric(learning1$Authority)
test1<-test[,c(-1,-5,-16)]
test1$ave_starttime<-as.numeric(test1$ave_starttime)
test1$Authority<-as.numeric(test1$Authority)
 分類器の作成
# SVMによる学習とチューニングを行います
presvm<-svm(culture~.,learning1,cross=8)
summary(presvm)
Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 1
## gamma: 0.07692308
## Number of Support Vectors: 52
## ( 26 26 )
## Number of Classes: 2
## Levels:
## 1 0
## 8-fold cross-validation on training data:
## Total Accuracy: 84.04255
## Single Accuracies:
## 81.81818 83.33333 100 83.33333 63.63636 91.66667 91.66667 75
 分類器のチューニング_1
# ここからはチューニング。一回目。
gammaRange = 10^(-5:5)
costRange = 10^(-2:2)
t <- tune.svm(culture ~ ., data = learning1, gamma=gammaRange,
cost=costRange,
tunecontrol = tune.control(sampling="cross",
cross=8))
cat(“- best parameters:n”)
cat("gamma =", t$best.parameters$gamma, "; cost =",
t$best.parameters$cost, ";n")
cat("accuracy:", 100 - t$best.performance * 100, "%nn")
plot(t, transform.x=log10, transform.y=log10)
 分類器のチューニング_2
ベストパラメータは
cost=10^2,gamma=10^(-2)で
正解率が90.43561%でした
 分類器のチューニング_3
#二回目のチューニング。色が濃いところにグリッドサーチを絞る
gamma <- 10^(-1)
cost <- 10^(1)
gammaRange <- 10^seq(log10(gamma)-
1,log10(gamma)+1,length=11)[2:10]
costRange <- 10^seq(log10(cost)-
1 ,log10(cost)+1 ,length=11)[2:10]
t <- tune.svm(Species ~ ., data = iris, gamma=gammaRange,
cost=costRange,
tunecontrol = tune.control(sampling="cross",
cross=8))
cat("gamma =", t$best.parameters$gamma, "; cost =",
t$best.parameters$cost, ";n")
cat("accuracy:", 100 - t$best.performance * 100, "%nn")
plot(t, transform.x=log10, transform.y=log10)
 分類器のチューニング_4
ベストパラメータは
cost= 6.309573,gamma= 0.03981072で
正解率が97.36842 %でした
→過学習気味?
 分類器のチューニング_5
何はともあれ高い値を出しているので、こいつでいくことに
テストデータで精度を確認する
精度は低いが…今回は結局このまま突っ走りました
gamma <- t$best.parameters$gamma
cost <- t$best.parameters$cost
model <- svm(culture ~ ., data = learning1, gamma=gamma,
cost=cost,probability = TRUE)
#テストデータで精度を確認する
pred <- predict(model, test1)
table(pred, test1[,14])
pred 1 0
## 1 34 12
## 0 13 33
うわっ…
私の学習器の精度低すぎ(約72%)…?
低いです
 ノード属性に確率を与えてcsvで吐き出す
トレーニングセットに使ったものにはフラグをつけて
可視化の際に邪魔にならないよう確率を0にしました
 (参考)ランダムフォレストで算出した
各変数の重要度_1
ランダムフォレストで計算できる特徴量の重要度(ジニ係数減少量)
を求めてみます
# 蛇足だとは思いますが一応チューニング
tuneRF(learning1[,-14],learning1[,14],doBest=T)
決定木の分割する木の数を
最適化しています
 (参考)ランダムフォレストで算出した
各変数の重要度_2
mtry=6が最適らしいので
# mtry=6が最適な模様
importance<-randomForest(culture~.,learning1,mtry=6,importance
= TRUE)
knitr::kable(importance(importance))
ggplot2で横棒グラフにしてみました
 (参考)ランダムフォレストで算出した
各変数の重要度_3
平均動画時間の
圧倒的強さ
4.
結果の確認
いろいろな見方で
結果を確認してまいります!
 色々な対応で散布図を描いてみる_1
次
数
…
 色々な対応で散布図を描いてみる_2
……
 色々な対応で散布図を描いてみる_3
やはり重要度が低い特徴量には殆ど関連性が
見えない
 色々な対応で散布図を描いてみる_4
ネットワーク特徴量として最も重要度が大きかった
固有ベクトル中心性でもこの程度である
 色々な対応で散布図を描いてみる_5
ランキング総合ポイントで分類器を作っているので
当然ですが動画メタ情報はそれなりに反応します
 色々な対応で散布図を描いてみる_6
 色々な対応で散布図を描いてみる_7
マイリストと確率との相関性が薄かったのが
意外なところ
前二つに比べて回帰直線が見えにくいです
 色々な対応で散布図を描いてみる_8
動画平均再生時間はランキング総合ポイントとは
関係なかったのに非常に相関性が強いのは何故なんだ
 色々な対応で散布図を描いてみる_9
平均動画投稿日時とは関係がなさそう
 Gephiで見る動画タグネットワーク_1
出来上がった動画タグネットワークを見ていくコーナー
Modurarity Classで分割してみていきます
全体図ですが
何が何やらですね
 Gephiで見る動画タグネットワーク_2
コミュニティ1…ゲーム実況
“ゲーム”や“ゆっくり実況プレイ”
などのタグが多く含まれるコミュニティ
 Gephiで見る動画タグネットワーク_3
コミュニティ2…東方
ゆっくり霊夢などの
元ネタだが、
それでもゲーム実況
コミュニティよりは
小さい
 Gephiで見る動画タグネットワーク_4
コミュニティ3…ゆっくり・解説系
独立したキャラクターとして
ゆっくり霊夢などを扱うタグ
科学系と結びつきが強い
というかグループ分けが難しい
 Gephiで見る動画タグネットワーク_5
コミュニティ4…科学系
科学系の動画では
ゆっくり霊夢などで
解説を読み上げる
場合が多い
 Gephiで見る動画タグネットワーク_6
コミュニティ5,6…歌うゆっくりシリーズ
ゆっくりに歌わせたり
VOCALOIDと一緒に
歌っていたりなど
 Gephiで見る動画タグネットワーク_7
コミュニティ7…料理動画
ゆっくり料理動画
のコミュニティ
“てってってー”が
あったりします
 Gephiで見る動画タグネットワーク_8
コミュニティ8…その他のタグ
その他のカテゴリを
問わないタグは
大きいネットワーク
周辺に存在している
模様
 Gephiでネットワークが成長する様子を見て
みよう_1
2008年〜
最初は特に大きな
繋がりはない状態です
 Gephiでネットワークが成長する様子を見て
みよう_2
2009年〜2010年ごろ
東方コミュニティが
出現します
東方コミュニティ
 Gephiでネットワークが成長する様子を見て
みよう_3
2012年ごろまで
東方コミュニティ
の周辺あたりで
ネットワークが成長
実況系のコミュニティ
自体は既にあるが
まだ東方コミュニティ
の周辺でしかなかった
科学系
コミュニティ
歌に関連する
コミュニティ
“ゆっくり・解説”
コミュニティ
 Gephiでネットワークが成長する様子を見て
みよう_4
2012年を超えるあたりから
実況コミュニティが
急速に成長します
さながら
ビッグバンのような
成長ぶり
 Gephiでネットワークが成長する様子を見て
みよう_5
〜2015年
ゲーム実況の
急速な成長以降
大きな変化はない模様
 Gephiでネットワークが成長する様子を見て
みよう
まず2009年から2010年にかけて「東方」コミュニティ
が出現
その後、周辺のコミュニティとして「歌うゆっくり」や
「その他タグ」が成長していく
2012年ごろから「ゲーム実況コミュニティ」が急速に
大きくなり、他を飲み込んでいる印象
→タグネットワークの成長は止まっている状態とも言え
るか
仕事を選べない
私たち
5.
“ゆっくり文化”の再発見
文化というか
定着しつつあるタグというか
 “文化”として定着しつつある
“ゆっくり”関連タグとは_1
見つかればいいなあ
くらいの感覚で
SVMで算出した確率に基づいて、”今後定着するであろ
う”タグを探してみる
分類器の精度が悪かったので、95%以上のものについて
のみ注目する
出来ればあまり大きくないコミュニティから見つけたい
まず全体を通して高い確率を示すもの、次に主要コミュ
ニティごとに見ていく
 “文化”として定着しつつある
“ゆっくり”関連タグとは_2
これだけじゃ
わからんぜ
確率が高いものをGephi上で青くしてみたのがこちら
 “文化”として定着しつつある
“ゆっくり”関連タグとは_3
全体のネットワークにおいて高いものから表にしてみた
ここはほぼ
ゲーム実況か
東方
コミュニティ
name ave_view ave_comment ave_mylistave_length
modify_prob
ability
まんじゅうこわい 24930.5 511.5 433.5 1504.0 99.691%
ACE2 34896.0 1517.5 81.5 1658.0 99.529%
ウルヲイ 52591.5 4787.5 154.5 1327.5 99.524%
綺麗な我様 11705.0 497.0 56.0 1632.0 99.493%
紡がれ続けた物語の終わ
り 11705.0 497.0 56.0 1632.0 99.493%
タイトルに偽り無し 11705.0 497.0 56.0 1632.0 99.493%
物語は紡ぎ紡がれていく 11705.0 497.0 56.0 1632.0 99.493%
聞くだけ動画 23658.5 422.5 431.0 1054.0 99.197%
壷算 13365.0 231.0 55.0 1212.0 99.161%
へうげもの 13365.0 231.0 55.0 1212.0 99.161%
化け物つかい 15909.0 409.0 60.0 2112.0 99.125%
ハロワ 15909.0 409.0 60.0 2112.0 99.125%
変態包囲網 51482.0 2326.0 123.0 1429.0 99.026%
ツーリング 51482.0 2326.0 123.0 1429.0 99.026%
 “文化”として定着しつつある
“ゆっくり”関連タグとは_4
「まんじゅうこわい」が一番高い確率を叩き出す
解せぬ
name ave_view ave_comment ave_mylistave_length
modify_prob
ability
まんじゅうこわい 24930.5 511.5 433.5 1504.0 99.691%
ACE2 34896.0 1517.5 81.5 1658.0 99.529%
ウルヲイ 52591.5 4787.5 154.5 1327.5 99.524%
綺麗な我様 11705.0 497.0 56.0 1632.0 99.493%
紡がれ続けた物語の終わ
り 11705.0 497.0 56.0 1632.0 99.493%
タイトルに偽り無し 11705.0 497.0 56.0 1632.0 99.493%
物語は紡ぎ紡がれていく 11705.0 497.0 56.0 1632.0 99.493%
聞くだけ動画 23658.5 422.5 431.0 1054.0 99.197%
壷算 13365.0 231.0 55.0 1212.0 99.161%
へうげもの 13365.0 231.0 55.0 1212.0 99.161%
化け物つかい 15909.0 409.0 60.0 2112.0 99.125%
ハロワ 15909.0 409.0 60.0 2112.0 99.125%
変態包囲網 51482.0 2326.0 123.0 1429.0 99.026%
ツーリング 51482.0 2326.0 123.0 1429.0 99.026%
 “文化”として定着しつつある
“ゆっくり”関連タグとは_5
「まんじゅうこわい」周辺のネットワークを確認する
ゆっくりに物語を
喋らせている
のが多い印象
 “文化”として定着しつつある
“ゆっくり”関連タグとは_6
「”ゆっくり,科学系解説”コミュニティ」で確率が高いタグ
解説系では
定番の反応
ですね
name ave_view
ave_com
ment ave_mylist ave_length
modify_prob
ability
動画には本文を書けば
どうか 4662 170 26 578 93.746%
ひらがなでしゃべらせ
て 4662 170 26 578 93.746%
分からんということが
分かった. 40737.5 898.7 151.8 720.5 93.602%
FMEAutomator 13267 417 420 372 92.169%
ニコ生 13267 417 420 372 92.169%
FME 13267 417 420 372 92.169%
ニコ生講座 13267 417 420 372 92.169%
ヤンデレ 58156.8 4258.8 173.4 820.2 91.928%
AxisPowersヘタリア 6369.5 191 29.5 463 91.315%
がんばりましょう 6369.5 191 29.5 463 91.315%
 “文化”として定着しつつある
“ゆっくり”関連タグとは_7
「動画には本文を書けばどうか」周辺のネットワークを確
認する
解説系という感じ
なぜヘタリアも
あるんだろう
 考察まとめ
ぐぬぬ
以上のコミュニティ以外では確率が著しく下がるため、今
回は分析を見送りました
個人的には、”既に文化として定着している感のあるタグ”
しか確率が高いものとして出てこなかった印象
ランキングポイントをトレーニングセットの基準にする以
外の方法で”文化として根付いているタグ”を選別するやり
方を見つけないといけない
あるいはもう、”ゆっくり”に関連するタグでは新たな文化
は生み出されないのかもしれない
今後はVOICELOID(結月ゆかり)などを対象にするべきかも
 今後の技術的課題や展望
もっと
精進せねば
処理の途中で文字化けしてしまい、判別困難なタグができ
てしまったのが残念
ネットワーク分析ではデータが膨大になりがちなので、メ
モリを増設しないと
今回の先行研究は非常に応用範囲が広い(レコメンドなど)
ので、今後も色々実践していきたいと思っております
 今回の処理ログなど
お役に立てれば幸いです
全ノードのデータ(文字化けがあります)…
http://github.com/fufufukakaka/niconico_analysis/blob/
master/taggraph_dynamic%20%5BNodes%5Dmmmmm
.csv
 Rのログ(全部で3つあります)…
https://github.com/fufufukakaka/niconico_analysis/blob
/master/niconico_tag_network(_2,3).Rmd

More Related Content

動画タグネットワーク分析を用いた ニコニコ動画における萌芽文化発見の試み ~”ゆっくり関連タグ”を例として~