ラブライブ!各話の百合ネットワークの動的変化

MikuHatsune2013-12-16

昔、pixivの出演共起から百合ネットワークを考えたのだが、今回はラブライブ!各話でのキャラ同士の会話回数をカウントして、百合ネットワークがどう変わっているかを見た。
アニメ全13話を視聴して、キャラ同士名前を呼び合っている回数をカウントするのだが、
 愛称は可(小泉花陽を「かよちん」、矢澤にこを「にこにー」など)
 綾瀬絵里を「生徒会長」、東條希を「副会長」、南ことりを「ミナリンスキー」、矢澤にこを「部長」
 「うちで9人や」など不特定多数
は除外した。データは下。
 
メンバー集めの1〜3話では、高坂穂乃果を中心とした2年生での会話が多いが、4話では小泉花陽がμ'sに入ろうか悩んでいるところに西木野真姫星空凛があーだこーだ言って1年生回になっていた。
5話ではアイドル研究部の矢澤にこをメンバーに引き入れるためになんやかんやして、6話でメンバー内(東條希と綾瀬絵里を除く)で誰がセンターがいいか議論していた。結局「みんなが歌ってみんながセンター」という高坂穂乃果の案でまるく収まったが、この回がもっともネットワークのエッジ結合率的な推移性が高かった。
その後、綾瀬絵里がダンスうまくて何とかメンバーに引き入れる7, 8回を経て、水着回である合宿では先輩禁止例のため、お互いに名前で呼び合うことにした。この回も会話回数が多かった。
あとは南ことりが転校するとか、高坂穂乃果が勝手にダークサイドに落ちたりと誰得シリアス回を挟んで、3話では誰も集まらなかった学院講堂でリベンジライブして終了。


 
推移性(Transitivity)はあるノードに近接する任意の2つのノードがエッジを有するとき、統計量が大きくなる。ノード数Vのネットワークに存在するエッジE\in V*Vが、無向ネットワーク内ですべてのノードにつながっていたら統計量が1になる。
各話ごとで推移性をとると、6話のセンターが誰かあれこれ言っていた時が仲の良さが最大で、そのあとは地味に減少しているっぽい。

プロットへのpngの貼り付けはこちらを参照。

library(png)
# 適当なところから png を取ってきておく。
pics <- vector("list", 9)
j <- 0
for(i in id){
	j <- j+1
	pics[[j]] <- readPNG(paste("/pngfiles/", i, ".png", sep=""), native=TRUE)
}
ra <- 1 #原点に近いところが潰れるので拡大したかったけど、等倍でやった。
xy0 <- sapply(pics, dim)[1:2, ] #pixel
rownames(xy0) <- c("height", "width")
s0 <- 0.004 #拡大縮小率
# anime
library(igraph)
matraw <- as.matrix(read.csv("clipboard", header=TRUE)) # 生データ

# 愚直に
matani <- array(0, c(nrow(matraw), ncol(matraw), 13)) # 全13話の時系列カウント
colnames(matani) <- colnames(matraw)
Matani <- diag(0, 9)
colnames(Matani) <- colnames(matraw)
for(i in seq(nrow(matraw))){
	for(j in seq(ncol(matraw))){
		tmp <- as.numeric(strsplit(matraw[i, j], " ")[[1]])
		matani[i, j, ] <- tmp
		Matani[i, j] <- sum(tmp)
	}
}
gani <- apply(matani, 3, graph.adjacency, mode="undirected", weighted=TRUE, diag=FALSE)

# 全話
g4 <- graph.adjacency(Matani, mode="undirected", weighted=TRUE, diag=FALSE)

# 各話
gkakuwa <- apply(matani, 3, graph.adjacency, mode="undirected", weighted=TRUE, diag=FALSE)
kakuwa.trans <- sapply(gkakuwa, transitivity) # とかやると一気に統計量が取れる

# タイトル一覧
titlelist <- c("叶え!私たちの夢", "アイドルをはじめよう!", "ファーストライブ",
			   "まきりんぱな", "にこ襲来", "センターは誰だ?",
			   "エリーチカ", "やりたいことは", "ワンダーゾーン",
			   "先輩禁止!", "最高のライブ", "ともだち", "μ'sミュージックスタート!")
titlelist <- paste("#", seq(titlelist), titlelist)

# 推移性(transitivity)のプロット
par(mar=c(5.5, 5.5, 4, 2))
plot(kakuwa.trans, type="l", xlab="", ylab="Transitivity", lwd=5, ylim=c(0, 1), xaxt="n", cex.axis=1.6, cex.lab=2)
axis(1, seq(titlelist), label=NA)
text(seq(titlelist), rep(par()$usr[3], length(titlelist)), titlelist, xpd=TRUE, srt=25, adj=c(1, 2))

lay <- layout.circle(g4) # 円形レイアウトにする
library(animation)
saveGIF({
	for(i in seq(dim(matani)[3])){
		hoge <- graph.adjacency(matani[, , i], mode="undirected", weighted=TRUE, diag=FALSE)
		E(hoge)$width <- E(hoge)$weight
		E(hoge)$color <- "black"
		V(hoge)$label <- NA
		V(hoge)$size <- 0
		par(mar=c(1, 0.5, 4, 0.5))
		plot(hoge, layout=lay)
		title(titlelist[i], cex.main=2)
		lay0 <- lay
		for(j in seq(pics)){
			xleft=lay0[j, 1]*ra - xy0[2, j]/2*s0
			ybottom=lay0[j, 2]*ra - xy0[1, j]/2*s0
			xright=lay0[j, 1]*ra + xy0[2, j]/2*s0
			ytop=lay0[j, 2]*ra + xy0[1, j]/2*s0
			rasterImage(image=pics[[j]], xleft=xleft, ybottom=ybottom, xright=xright, ytop=ytop, xpd=TRUE)
		}
	}
}, interval=2, ani.width=600, ani.height=600)

各話の会話回数。一人あたりはスペース区切りで、全体はタブ区切りである。

飯田里穂	Pile	久保ユリカ	新田恵海	内田彩	三森すずこ	楠田亜衣奈	徳井青空	南條愛乃
0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 10 2 1 2 0 0 2 0 0 0	1 2 1 12 0 1 1 2 2 3 0 0 1	0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 2 0 0 1 1 0 0 0	0 0 0 0 0 4 0 0 0 2 0 0 0	0 0 0 0 0 0 1 0 0 0 0 0 0	0 0 0 0 0 1 0 0 1 1 0 2 0	0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 1 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 1 0 0 0 0 0 0 0 	0 0 0 0 0 1 1 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 3 0 0 0	0 0 0 0 0 0 1 1 0 0 0 0 0	0 0 0 0 0 0 0 0 0 1 0 0 0
0 1 0 2 0 0 1 0 0 1 0 0 0	0 2 0 11 0 1 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 1 2	0 0 0 0 0 1 0 0 1 0 0 0 0	0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 1	0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 1	0 1 3 0 0 1 1 0 0 3 1 1 0	0 0 1 2 1 1 0 0 1 0 0 0 1	0 0 0 0 0 0 0 0 0 0 0 0 0	4 1 4 4 1 5 1 1 12 2 4 6 7	5 6 7 0 4 6 1 3 8 0 1 3 3	0 0 0 0 0 1 0 1 0 1 0 1 0	0 0 0 0 5 1 2 0 0 1 4 1 1	0 0 0 0 0 0 0 3 0 1 3 0 1
0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	8 1 1 1 4 2 3 2 5 4 8 7 1	0 0 0 0 0 0 0 0 0 0 0 0 0	5 2 3 0 1 1 0 0 4 1 1 0 3	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 1 0 1 0 0 1 0 0 1	0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0 0	0 0 0 0 0 2 1 0 0 0 0 0 0	0 0 0 1 0 1 1 0 0 0 0 0 0	5 3 5 0 3 4 6 0 1 0 4 6 12	1 4 1 0 1 2 4 0 5 0 4 4 8	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 2 1 0 2 0 0 0	0 0 0 0 1 1 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 3 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 5	0 0 0 0 0 1 0 0 0 1 0 0 0	0 0 0 0 0 1 1 0 0 1 0 2 0	0 0 0 0 0 0 0 0 0 0 0 2 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 3 0 0 0 0 0 1 0 0	1 0 0 0 0 2 5 7 3 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 1 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 2	0 0 0 0 0 0 0 0 0 0 0 0 1	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 1 0 1 0 0 0 0 2 0	0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0	0 0 0 0 0 0 0 0 0 1 0 1 0	0 0 0 0 0 0 0 0 0 3 0 0 0	0 0 0 0 0 0 0 0 0 1 5 5 6	1 0 0 0 0 0 0 0 1 0 0 1 1	0 0 0 0 0 0 0 0 0 4 0 0 1	1 0 0 0 1 1 0 2 0 0 0 1 2	0 0 0 0 0 0 0 0 0 0 1 0 0	0 0 0 0 0 0 0 0 0 0 0 0 0