Utilizando R para obtener volatilidad y pico a promedio.Relación de datos de tráfico de Internet
-
15-11-2019 - |
Pregunta
Tengo datos de tráfico de red en lo siguiente para cada hora de un período de diez días de la siguiente manera en un conjunto de datos 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
Como se ve, también hay repetición de categoría dentro de una sola hora. Necesito calcular la volatilidad y la hora pico a las relaciones de hora promedio de estas diferentes categorías de aplicaciones.
volatilidad : desviación estándar de volúmenes por hora dividida por promedio por hora.
hora pico a AVG. Relación de hora : proporción de volumen de la hora máxima al vol. de la hora promedio para esa aplicación.
Entonces, ¿cómo agrego y calcula estas dos estadísticas para cada categoría? Soy nuevo en R y no tengo mucho conocimiento de cómo agregar y obtener los promedios mencionados.
Entonces, el resultado final se vería algo así, donde primero se agrega el volumen de cada categoría en un solo período de 24 horas al sumar el volumen y luego calcular las dos estadísticas
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
Editar: PlyR me consiguió en cuanto a esto.
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 )
}
)
Pero esto no es lo que esperaba. Quiero las estadísticas por categoría donde todas las horas de los días se agreguen primero en 24 horas sumando los volúmenes y luego se calcula la relación volatilidad y PA. ¿Alguna sugerencia de mejora?
Solución
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