En utilisant R pour obtenir une volatilité et une pic à la moyenne.Ratio de données de trafic Internet
-
15-11-2019 - |
Question
J'ai des données de trafic réseau dans ce qui suit pour chaque heure d'une période de dix jours comme suit dans un jeu de données 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
Comme on le voit, il y a une répétition de catégorie en une seule heure également. Je dois calculer la volatilité et l'heure de pointe jusqu'à des ratios d'heures moyenne de ces différentes catégories d'applications.
Alors, comment puis-je regrouper et calculer ces deux statistiques pour chaque catégorie? Je suis nouveau pour r et ne pas avoir beaucoup de connaissance de la manière d'agréger et d'obtenir les moyennes comme mentionnées.
Ainsi, le résultat final ressemblerait à ceci, d'abord que le volume de chaque catégorie est agrégé sur une seule période de 24 heures en additionnant le volume, puis en calculant les deux statistiques
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
EDIT: Plym vous m'a fait aussi loin que ceci.
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 )
}
)
Mais ce n'est pas ce que j'espérais. Je souhaite les statistiques par catégorie où toutes les heures des jours sont agrégées d'abord en 24 heures en additionnant les volumes, puis le ratio volatilité et PA a été calculé. Toute suggestion d'amélioration?
La solution
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