Nogizaka46 9th single

乃木坂46 9th single は50万枚を越えるか?

同志社大学文化情報学部 定量的データ分析演習 参考資料

2014-04-28

直近3曲での回帰の 9th 90%信頼区間は50万枚を越える!!

AKBグループと公式ライバル 乃木坂46 のシングル曲

乃木坂46は、2012年2月22日に1st single ぐるぐるカーテンを発売し、 2014年4月2日に 8th single 気づいたら片想い を発売した。
このリリースと、 他のグループのリリースを比較すると次図の通りである。特に、NMB48は 乃木坂46より7ヶ月前に1st singleを発行してこれまで9シングルを発売 している。SKE48はより歴史が長いがほぼNMB48と同様の動きである。 AKB48はこれらよりも多いが、「じゃんけん選抜曲」(次図の◇)と、 「総選挙の投票権封入曲」(□)の2つのシングルが特別な意味がある。 前者は売上が落ちることが多く、後者は逆に180万枚に達することもある。 それらを除く他とほぼ同じペースの発行である。

plot(-release$days, release$grp, axes = F, xlab = "days before 2014/4/2", ylab = "", 
    main = "シングル リリース時期 ", xlim = c(-1050, 50), ylim = c(0.7, 5.2))
axis(1, at = -100 * (0:10), 100 * (0:10))
axis(2, at = 1:5, as.character(levels(release$grp)), las = 2)
collist <- c(rep(1, 14), rep(2, 9), rep(3, 9), rep(4, 8), rep(5, 3))
points(-release$days, release$grp, pch = 16, col = collist, cex = 2)
nogi <- c(1, 5, 10, 14, 15, 20, 23, 24, 27, 32, 33, 37, 40, 41, 43)
text(-release$days[nogi], release$grp[nogi], release$kyoku[nogi], pos = 1)
text(-release$days[nogi], release$grp[nogi], release$ngp[nogi], pos = 3)
asel <- c(3, 5, 8, 10, 13)
apch <- c(5, 22, 5, 22, 5)
points(-release$days[asel], release$grp[asel], pch = apch, cex = 2.1, col = 2, 
    lwd = 2)
mtext("AKB/2(売上の1/2)  ◇ じゃんけん選抜曲、□ 総選挙投票券封入曲", side = 1, 
    line = 2)

plot of chunk dots

初週売上の推移

各グループのシングル初週売上の推移をみると、次図の通りである。 AKB48については、売上の1/2を表示する。従って50万枚の点線は AKB48に関しては100万枚である。 乃木坂46のシングル初週売上は、常に前作を上回っている。HKT48も これまで3作ではあるが右上がりである。
そして、乃木坂46の直近3作は、回帰するまでもなくほぼ直線上で 推移している。それを延長すれば、回帰直線は9thにおいて50万枚を 越えることがわかる。念のため、信頼度90%の回帰直線信頼区間も 表示したが、その範囲は50万枚を超えている。
次作で初週売上50万枚超えは十分可能性があるといえるであろう。 なお、8作全体の傾向は二次近似が適切でありより勢いのある曲線となる。

グラフを4通り提示する。matplot, linesを重ねる、ggplot2, latticeである。

nogi.short <- cbind.data.frame(mai = maisu[7:9, 4], th = 7:9)
nogi.lm <- lm(mai ~ th, nogi.short)
matplot(maisu, type = "o", lwd = 2, lty = c(2, 3, 4, 1, 5), pch = 19, xlim = c(1, 
    10), xaxt = "n", yaxt = "n", ylim = c(50000, 680000), main = "乃木坂46, SKE48, NMB48, HKT48 シングル曲初週売上 (万枚)", 
    ylab = "")
axis(1, at = 2:10, c("1st", "2nd", "3rd", paste(4:9, "th", sep = "")))
axis(2, at = 1e+05 * (1:7), 10 * (1:7), las = 2)
abline(v = 10, h = 5e+05, lty = 3)
abline(nogi.lm, lty = 2, lwd = 1.5, col = 4)
new <- data.frame(th = seq(7, 10, by = 0.1))
nogi.pred <- predict(nogi.lm, new, interval = "confidence", level = 0.9)
matlines(new, nogi.pred[, -1], lty = 3, lwd = 1.5, col = 4)
legend("bottomright", c(colnames(maisu), "直近3回帰"), text.col = c(1:5, 4), 
    ncol = 3, lty = c(2, 3, 4, 1, 5, 2), col = c(1:5, 4), lwd = 2)
mtext("AKB/2(売上の1/2) は「じゃんけん選抜曲」と「総選挙投票権封入曲」を除いている", 
    side = 1, line = 2)

plot of chunk matplot


summary(nogi.lm)
## 
## Call:
## lm(formula = mai ~ th, data = nogi.short)
## 
## Residuals:
##     1     2     3 
##   787 -1574   787 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   -86095      10959   -7.86    0.081 .
## th             60350       1363   44.28    0.014 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1930 on 1 degrees of freedom
## Multiple R-squared:  0.999,  Adjusted R-squared:  0.999 
## F-statistic: 1.96e+03 on 1 and 1 DF,  p-value: 0.0144
cnt = 0
ncol = c(1, 5, 3, 2, 4)
nlty = c(2, 5, 4, 3, 1)
plot(release[, 1], release[, 4], type = "n", xlim = c(1000, 0), ylim = c(110000, 
    890000), main = "時期に合わせた初週売上推移", xlab = "days before 2014/4/2", 
    ylab = "万枚", yaxt = "n")
axis(2, at = 1e+05 * (1:9), 10 * (1:9), las = 2)
abline(h = 5e+05, lty = 3)
for (cat in levels(release$grp)) {
    cnt <- cnt + 1
    temp <- release[release$grp == cat, ]
    lines(temp[, 1], temp[, 4], type = "o", lwd = 2, col = ncol[cnt], pch = 19, 
        lty = nlty[cnt])
}
asel <- c(3, 5, 8, 10, 13)
apch <- c(5, 22, 5, 22, 5)
points(release$days[asel], release$mai[asel], pch = apch, cex = 2.1, col = 2, 
    lwd = 2)
legend("bottomright", levels(release$grp), text.col = ncol, ncol = 3, lty = nlty, 
    col = ncol, lwd = 3)

plot of chunk lines

ggplot2

優れたグラフを作ることができる。但し、多少の慣れを必要とする。

require(ggplot2)
.plot <- ggplot(data = release, aes(x = (-1) * days, y = mai, colour = grp, 
    shape = grp)) + geom_point(size = 4) + geom_line(size = 1.1) + xlab("days before 2014/4/2") + 
    ylab("初週売上") + labs(colour = "grp", shape = "grp") + theme_bw(base_size = 16, 
    base_family = "serif") + theme(legend.position = "top")
# scale_colour_brewer(palette = 'Set1') + scale_y_continuous(expand =
# c(0.01, 0)) +
print(.plot)

plot of chunk ggplot2

lattice

lattice による命令は下記のように簡単であり、かつ線種とシンボルも自動的に選択され、わかりやすいグラフができる。ただし、R Markdown を knitr で処理すると、線種・シンボルともに均一となってしまうので、現状では使いにくい。

require(lattice)
xyplot(mai ~ -days, groups = grp, data = release, type = "b", lwd = 2, auto.key = list(columns = 5), 
    cex = 1.5)

plot of chunk lattice