Usando r per ottenere la volatilità e il picco in media.Rapporto dei dati del traffico Internet
-
15-11-2019 - |
Domanda
Ho i dati del traffico di rete nel seguente per ogni ora di un periodo di dieci giorni come segue in un set di dati r.
Day Hour Volume Category
0 00 100 P2P
0 00 50 email
0 00 200 gaming
0 00 200 video
0 00 150 web
0 00 120 P2P
0 00 180 web
0 00 80 email
....
0 01 150 P2P
0 01 200 P2P
0 01 50 Web
...
...
10 23 100 web
10 23 200 email
10 23 300 gaming
10 23 300 gaming
.
Come visto ci sono ripetizioni della categoria all'interno di una singola ora. Ho bisogno di calcolare la volatilità e l'ora di punta ai rapporti delle ore medi di queste diverse categorie di applicazioni.
Volatilità : Deviazione standard dei volumi orari divisi per media oraria.
Allora, come posso aggregare e calcolare queste due statistiche per ogni categoria? Sono nuovo a r e non ho molta conoscenza di come aggregare e ottenere le medie come menzionato.
Allora, il risultato finale assisterà qualcosa del genere in cui il volume per ogni categoria è aggregato su un singolo periodo di 24 ore sommando il volume e quindi calcolando le due statistiche
.
Category Volatility Peak to Avg. Ratio
Web 0.55 1.5
P2P 0.30 2.1
email 0.6 1.7
gaming 0.4 2.9
Modifica: Plyr mi ha fatto fino a questo.
.
stats = ddply(
.data = my_data
, .variables = .( Hour , Category)
, .fun = function(x){
to_return = data.frame(
volatility = sd((x$Volume)/mean(x$Volume))
, pa_ratio = max(x$Volume)/mean(x$Volume)
)
return( to_return )
}
)
Ma questo non è quello che speravo. Voglio le statistiche per categoria in cui tutte le ore dei giorni sono aggregate prima in 24 ore sommando i volumi e poi il volatilità e il rapporto PA calcolato. Eventuali suggerimenti per il miglioramento?
Soluzione
You'd need to do it in two stages (using the plyr
package): First, as you pointed out, there can be multiple Day-Hour combos for the same category, so we first aggregate, for each category, its totals within each Hour, regardless of the day:
df1 <- ddply( df, .(Hour, Category), summarise, Volume = sum(Volume))
Then you get your stats:
> ddply(df1, .(Category), summarise,
+ Volatility = sd(Volume)/mean(Volume),
+ PeakToAvg = max(Volume)/mean(Volume) )
Category Volatility PeakToAvg
1 P2P 0.3225399 1.228070
2 Web NA 1.000000
3 email 0.2999847 1.212121
4 gaming 0.7071068 1.500000
5 video NA 1.000000
6 web 0.7564398 1.534884