2

restaurants(IDで識別される)のスコアに関する観測を含むテーブルがあります。変数meanは、各日を中心とした 1 週間のウィンドウ (つまり、3 日前から 3 日後まで) に受け取ったレビューの平均評価であり、変数countは同じウィンドウで受け取ったレビューの数です (以下のコードを参照してください)。私のdputデータフレームのランダムに生成されたサンプルの a)。

いずれかの変数に大きなスパイクがあるレストランに注目したいと考えています (平均評価が突然大幅に上昇したり、突然低下したりするなど)。それらのレストランについて、分布をプロットして何が起こっているかを調査したいと思います (レストランがたくさんあるので、手動で行うことはできず、半分手動で検査するためにドメインを制限する必要があります)。

また、私のデータは日単位なので、粒度を下げたいと思っています。特に、特定の月のすべての評価またはカウントを単一の値で平均したいと考えています。

動物園は私がそれをうまくやるのに役立つはずだと思います.例のデータフレームを考えると、それを動物園の時系列に変換できると思います.

z <- read.zoo(df, split = "restaurantID", 
       format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)

ただし、restaurantID で分割すると、期待した結果が得られません。代わりに得られるのは、多くの NA です。

     mean.1006054 count.1006054 mean.1006639 count.1006639 mean.1006704 count.1006704 mean.1007177 count.1007177
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA
         mean.1007296 count.1007296 mean.1007606 count.1007606 mean.1007850 count.1007850 mean.1008272 count.1008272
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA

restaurantID 列で分割しないと機能することに注意してください。

df$website <- NULL
> z <- read.zoo(df, format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)
> head(z)
         restaurantID     mean count
Lug 2004      1418680 3.500000     1
Ago 2004      1370457 5.000000     1
Nov 2004      1324645 4.333333     1
Gen 2005      1425933 1.920000     1
Feb 2005      1315289 3.000000     1
Mar 2005      1400577 2.687500     1

また、plot.zoo(z)機能しますが、もちろん、作成されたグラフは私にとって意味がありません。

私の質問は次のとおりです。

1) どちらかの列の「月間」スパイクが高いレストランをフィルタリングするにはどうすればよいですか?

2) restaurantID を分割して、そのようなレストランのみの時系列をプロットするにはどうすればよいですか?

DATA HERE (SO の単語制限に収まらない)

4

2 に答える 2

0

試す:

# helper function to calculate change per time interval in a sequence
difflist <- function(v) {rr <- 0; for (i in 2:length(v)) {rr <- c(rr, v[i] - v[i-1])}; return(rr) }

# make center as dates
df$center <- as.Date(df$center,format='%m/%d/%Y')

# sort data frame in time order
df <- df[order(df$restaurantID, df$center),]

# now calculate the change in each column
deltas <- ddply(df, .(restaurantID), function(x) {cbind(center = x$center, delta_mean = difflist(x$mean), delta_count = difflist(x$count)) } )

# filter out only the big spikes
deltas_big <- subset(deltas, delta_mean > 2 | delta_count > 3)

# arrange the data
delta_melt <- melt(deltas_big,id.vars=c('restaurantID','center'))

# now plot by time
ggplot(delta_melt, aes(x=center,y=value,color=variable)) + geom_point()
于 2013-02-23T03:51:02.700 に答える