Используя R, чтобы получить волатильность и Пик, чтобы в среднем.Соотношение данных интернет трафика - PullRequest
3 голосов
/ 20 февраля 2011

Ниже приведены данные сетевого трафика для каждого часа десятидневного периода, как указано в наборе данных 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

Редактировать: plyr дошел до меня.

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.Есть предложения по улучшению?

1 Ответ

1 голос
/ 21 февраля 2011

Вам нужно сделать это в два этапа (используя пакет plyr). Во-первых, как вы указали, может быть несколько комбинаций Day-Hour для одной и той же категории, поэтому мы сначала агрегируем для каждой категории , его итоги за каждый час, независимо от дня :

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
...