Як правило, я знаходжу більше двох-трьох рядків на одній грані сюжету починає важко читати (хоча я все ще роблю це весь час). Отже, це цікавий приклад того, що робити, коли у вас є щось, що концептуально може бути стогранним сюжетом. Один із можливих способів - намалювати всі 100 граней, але замість того, щоб намагатись отримати їх усі на сторінці відразу, дивлячись на них по черзі в анімації.
Ми фактично використовували цю техніку в своїй роботі - ми спочатку створили анімацію, що показує 60 різних графіків ліній як фон для події (запуск нової серії даних), а потім з’ясували, що таким чином ми насправді підбирали деякі особливості даних які не було видно на гранованих ділянках з 15 або 30 гранями на сторінку.
Отже, ось альтернативний спосіб представлення необроблених даних, перш ніж почати видаляти користувача та типові часові ефекти, як рекомендує @whuber. Це подано лише як додаткову альтернативу його викладу необроблених даних - я повністю рекомендую вам потім продовжити аналіз за такими напрямками, як ті, які він пропонує.
Один із способів подолати цю проблему - створити сюжетні графіки 100 (або 240 на прикладі @ whuber) окремо та об'єднати їх в анімацію. Нижче наведений код створить 240 подібних зображень, і тоді ви можете використовувати безкоштовне програмне забезпечення для створення фільмів, щоб перетворити це на фільм. На жаль, єдиний спосіб, коли я міг би це зробити і зберегти прийнятну якість, - це файл розміром 9 Мб, але якщо вам не потрібно надсилати його через Інтернет, це може не бути проблемою, і все одно я впевнений, що є способи, як це зробити трохи більше анімація кмітливість. Пакет анімації в R може бути корисним тут (дозволяє зробити це все за викликом від R), але я просто спростив цю ілюстрацію.
Я зробив анімацію такою, що вона малює кожну лінію великим чорним кольором, а потім залишає бліду напівпрозору зелену тінь позаду, так що око отримує поступову картину накопичуваних даних. У цьому є як ризики, так і можливості - порядок додавання рядків залишить інше враження, тож слід подумати про те, щоб зробити його деяким сенсом.
Ось кілька знімків із фільму, в яких використовуються ті самі дані, що і @whuber:
# ---------------------------- Data generation - by @whuber ----------------------------#
n.users <- 240 # Number of users (here limited to 657, the number of colors)
n.periods <- 60 # Number of time periods
i.break <- 40 # Period after which change occurs
n.outliers <- 3 # Number of greatly changed users
window <- 1/5 # Temporal smoothing window, fraction of total period
response.all <- 1.1 # Overall response to the change
threshold <- 2 # Outlier detection threshold
# Create a simulated dataset
set.seed(17)
base <- exp(rnorm(n.users, log(10), 1/2))
response <- c(rbeta(n.users - n.outliers, 9, 1),
rbeta(n.outliers, 5, 45)) * response.all
actual <- cbind(base %o% rep(1, i.break),
base * response %o% rep(response.all, n.periods-i.break))
observed <- matrix(rpois(n.users * n.periods, actual), nrow=n.users)
# ---------------------------- The analysis begins here ----------------------------#
# Alternative presentation of original data
#
setwd("eg animation")
for (i in 1:n.users){
png(paste("line plot", i, ".png"),600,600,res=60)
plot(c(1,n.periods), c(min(observed), max(observed)),
xlab="Time period", ylab="Number of actions",
main="Raw data", bty="l", type="n")
if(i>1){apply(observed[1:i,], 1, function(a) {lines(a, col=rgb(0,100,0,50,maxColorValue=255))})}
lines(observed[i,], col="black", lwd=2)
abline(v = i.break, col="Gray") # Mark the last period before a change
text(1,60,i)
dev.off()
}
##
# Then proceed to further analysis eg as set out by @whuber