Usando R para obter volatilidade e pico para média.Proporção de dados de tráfego da Internet
-
15-11-2019 - |
Pergunta
Tenho dados de tráfego de rede a seguir para cada hora de um período de dez dias, como segue em um conjunto de dados 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 visto, também há repetições de categoria em uma única hora.Preciso calcular a volatilidade e a relação entre horário de pico e hora média dessas diferentes categorias de aplicativos.
Volatilidade:Desvio padrão dos volumes horários dividido pela média horária.
Horário de pico em média.proporção de horas:Relação entre o volume da hora máxima e o vol.da hora média para essa aplicação.
Então, como agrego e calculo essas duas estatísticas para cada categoria?Sou novo em R e não tenho muito conhecimento de como agregar e obter as médias conforme mencionado.
Portanto, o resultado final seria mais ou menos assim, onde primeiro o volume de cada categoria é agregado em um único período de 24 horas, somando o volume e depois calculando as duas estatí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 levou até aqui.
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 )
}
)
Mas não era isso que eu esperava.Quero as estatísticas por categoria onde todas as horas dos dias são agregadas primeiro em 24 horas, somando os volumes e depois calculando a volatilidade e o índice de PA.Alguma sugestão para melhoria?
Solução
Você precisaria fazer isso em duas etapas (usando o plyr
pacote):Primeiro, como você apontou, pode haver vários combos Dia-Hora para a mesma categoria, então primeiro agregamos, para cada categoria, seus totais dentro de cada Hora, independente do dia:
df1 <- ddply( df, .(Hour, Category), summarise, Volume = sum(Volume))
Então você obtém suas estatísticas:
> 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