Ogólnie stwierdzam, że więcej niż dwie lub trzy linie na jednym fragmencie fabuły stają się trudne do odczytania (chociaż ciągle to robię). Jest to więc interesujący przykład tego, co zrobić, gdy masz coś, co koncepcyjnie może być fabułą o 100 aspektach. Jednym z możliwych sposobów jest narysowanie wszystkich 100 aspektów, ale zamiast próbować umieścić je wszystkie na stronie na raz, oglądając je pojedynczo w animacji.
W mojej pracy wykorzystaliśmy tę technikę - pierwotnie stworzyliśmy animację pokazującą 60 różnych wykresów liniowych jako tło dla zdarzenia (uruchomienie nowej serii danych), a następnie stwierdziliśmy, że robiąc to, rzeczywiście wybraliśmy niektóre funkcje danych które nie były widoczne na wykresach fasetowanych z 15 lub 30 fasetami na stronę.
Oto więc alternatywny sposób prezentacji surowych danych, zanim zaczniesz usuwać użytkownika i typowe efekty czasowe zalecane przez @whuber. Jest to przedstawione jako dodatkowa alternatywa dla jego prezentacji surowych danych - w pełni zalecam, aby następnie przejść do analizy zgodnie z tymi, które on sugeruje.
Jednym ze sposobów obejścia tego problemu jest osobne utworzenie 100 (lub 240 w przykładzie @ Whubera) wykresów czasowych i połączenie ich w animację. Poniższy kod wygeneruje 240 oddzielnych obrazów tego rodzaju, a następnie możesz użyć bezpłatnego oprogramowania do tworzenia filmów, aby przekształcić je w film. Niestety, jedynym sposobem, w jaki mogłem to zrobić i zachować akceptowalną jakość, był plik 9 MB, ale jeśli nie musisz przesyłać go przez Internet, może to nie stanowić problemu, a poza tym jestem pewien, że można to zrobić z nieco większą ilością doświadczony animator. Pakiet animacji w R może być tutaj przydatny (pozwala to zrobić wszystko w rozmowie z R), ale dla tej ilustracji jest to proste.
Stworzyłem animację tak, że rysuje każdą linię na grubą czerń, a następnie pozostawia za sobą blady półprzezroczysty zielony cień, aby oko uzyskało stopniowy obraz gromadzących się danych. Są w tym zarówno zagrożenia, jak i szanse - kolejność dodawania wierszy pozostawi inne wrażenie, więc powinieneś rozważyć nadanie mu pewnego znaczenia.
Oto niektóre zdjęcia z filmu, który korzysta z tych samych danych, które wygenerował @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