Использование R для получения волатильности и Peak для получения среднего значения.Соотношение данных интернет-трафика
-
15-11-2019 - |
Вопрос
У меня есть данные о сетевом трафике для каждого часа десятидневного периода, как показано ниже в наборе данных 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
Как видно, есть повторения категорий и в течение одного часа.Мне нужно рассчитать волатильность и соотношение часов пиковой нагрузки к средним часам для этих различных категорий приложений.
Волатильность:Стандартное отклонение часовых объемов, разделенное на среднечасовое значение.
Час пик в ср.соотношение часов:Отношение громкости максимального часа к об.среднего часа для этого приложения.
Так как же мне агрегировать и рассчитать эти две статистические данные для каждой категории?Я новичок в R и не имею особых знаний о том, как агрегировать и получать средние значения, как уже упоминалось.
Таким образом, окончательный результат будет выглядеть примерно так: сначала объем для каждой категории агрегируется за один 24-часовой период путем суммирования объема, а затем расчета двух статистических данных.
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
Редактировать:Плир довел меня до этого.
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 )
}
)
Но это не то, на что я надеялся.Мне нужна статистика по категориям, где все часы дня сначала объединяются в 24 часа путем суммирования объемов, а затем рассчитываются коэффициент волатильности и PA.Есть предложения по улучшению?
Решение
Вам нужно будет сделать это в два этапа (используя plyr
упаковка):Во-первых, как вы отметили, для одной и той же категории может быть несколько комбинаций «день-час», поэтому мы сначала агрегируем для каждой категории ее итоговые значения в течение каждого часа, независимо от дня:
df1 <- ddply( df, .(Hour, Category), summarise, Volume = sum(Volume))
Затем вы получите статистику:
> 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