Я пытаюсь построить Date по оси X и Revenue по оси Y. У меня есть данные примерно о 16000 клиентов, совокупный доход за неделю. Набор данных выглядит как примерный набор данных ниже (за исключением того, что у меня есть данные примерно за 100 недель и 16000 клиентов):

CustNum    Date    Revenue
1    2013-01-07    35
1    2013-01-14    23
1    2013-01-21    42
1    2013-01-28    65
2    2013-01-07    78
2    2013-01-14    48
2    2013-01-21    85
2    2013-01-28    34

Я хотел бы построить эти данные на одном графике с одной линией на графике, представляющей одного клиента. Другими словами, на графике будет более 16 000 строк, показывающих Revenue для каждого клиента каждую неделю.

Теперь я понимаю, что этот график будет действительно запутанным с 16000 строками на нем, и я хотел бы иметь предложения о том, как лучше отображать эти данные, чтобы они не были такими загроможденными.

Я попробовал следующий код, который не дал мне желаемого результата:

p <- ggplot() + geom_line(data=res,aes(x=Date,y=Revenue,color=custnum))

Это не дало мне несколько строк для нескольких клиентов.

Итак, у меня в основном два вопроса:

  1. Что может быть лучшим способом представления этих данных?

  2. Как мы можем улучшить мой код, чтобы отображать 16000 строк на одном графике? (Меня не очень волнует этот вопрос, если я могу получить другой способ представления этих данных)

Мы будем очень благодарны за любую помощь в этом вопросе.

0
Patthebug 4 Ноя 2014 в 02:47
Какую информацию вы пытаетесь передать своим сюжетом? Что есть общая тенденция среди клиентов? Или с другой стороны, что существует большая изменчивость? Решите, что вы хотите показать, и только затем выберите как это показать.
 – 
Zé Loff
4 Ноя 2014 в 03:03
После того, как я нанесу эту информацию на график, я попытаюсь показать, что определенные маркетинговые кампании повлияли на подмножество всех клиентов, которое я подмножу и покажу на том же графике. Таким образом, в конечном итоге эффект маркетинговых кампаний будет отображаться.
 – 
Patthebug
4 Ноя 2014 в 03:04
Может geom_line(data=res,aes(x=Date,y=Revenue,group=CustNum),alpha=0.2) ?
 – 
Ben Bolker
4 Ноя 2014 в 03:05
Я имею в виду, хотите ли вы показать тенденции с течением времени, точку, после которой все изменилось, что-то вроде «что». Я просто пытаюсь понять, действительно ли вам нужны строки. Боксплоты или скрипичные сюжеты могут быть вариантами, например... В любом случае, вам будет трудно придумать 10 легко различимых цветов, не говоря уже о 16000. Эти линии будут неразличимы и, следовательно, бесполезны, ИМХО.
 – 
Zé Loff
4 Ноя 2014 в 03:18
- Я согласен, что цвета вообще не будут различимы. На ваш вопрос: да, я хотел бы показать, что после определенного момента для некоторых клиентов все изменилось, тогда как для других все оставалось неизменным. Например. Мы провели кампанию, направленную на нескольких клиентов, вопрос в том, как кампания повлияла на доход, связанный с этими клиентами. Я предполагаю, что я должен специально смотреть на пострадавших клиентов, а не на всех клиентов одновременно.
 – 
Patthebug
4 Ноя 2014 в 03:26

2 ответа

Вот базовый план R подхода в моем комментарии выше. Я использую большую матрицу для хранения всех данных. Первый столбец — получил ли клиент лечение. Последующие столбцы — еженедельный доход за 100 недель.

Во-первых, я смоделирую некоторые данные, в них много временного шума.

#First records are a stable pattern
notreat<- matrix(c(rep(0,8000), 100+rnorm(8000*100,0,5)),nrow=8000)
#second set of records get no treatment for 50 weeks    
treat<- matrix(c(rep(1,8000), 100+rnorm(8000*50,0,5)),nrow=8000)
#then get the treatment for 50 weeks
treat<-cbind(treat, 
             matrix(rnorm(50*8000,100+0.75*(0:50)),nrow=8000,ncol=50,byrow=TRUE))

m <- rbind(notreat, treat)

#use a color palette with transparency to be able to discern the overall pattern.
palette ( c(rgb(.4,0,0,0.01),rgb(0,0,0.4,0.01)))


#This will take several seconds to render 16000 lines
matplot(t(m[,2:101]),col=1+m[,1],type="l")

Вы можете поместить свой фрейм данных в тип матрицы, которую я создаю здесь, используя что-то вроде пакета unstack() или reshape.

1
vpipkt 4 Ноя 2014 в 20:19
Мне еще предстоит применить это к своим данным и изменить их в нужном формате, но это очень похоже на то, что я хотел. Я запустил ваш код, и на выходе получилась красота, очень похожая на акварель. Большое спасибо за помощь, приятель.
 – 
Patthebug
4 Ноя 2014 в 21:01
Я черпал вдохновение у Натана Яу из flowingdata.com. У него много хороших примеров R
 – 
vpipkt
4 Ноя 2014 в 21:10

Может быть, вы смотрите на что-то вроде этого:

CustNum = c("1","1","1","1",
            "2","2","2","2")
Date = c("2013-01-07","2013-01-14","2013-01-21","2013-01-28",
         "2013-01-07","2013-01-14","2013-01-21","2013-01-28")
Revenue = c("35","23","42","65","78","48","85","34")

df = as.data.frame(cbind(CustNum,Date,Revenue))

df$CustNum = as.factor(df$CustNum)
df$Revenue = as.numeric(as.character(df$Revenue))

## create the factor variable
df$Treatment = ifelse(df$CustNum == '1','campaign','no campaign')

ggplot(df) + geom_point(aes(x=Date, y=Revenue, color=Treatment), size=5) + facet_wrap(~Treatment)

Результаты: Plot

Теперь вы можете представить себе, что делаете то же самое, переключая geom_point на geom_boxplot или geom_errorbar во всех ваших точках данных. В качестве альтернативы вы можете отказаться от огранки и просто построить один график, но вам нужно будет указать в вызове геометрии опцию «уклонение», чтобы избежать наложения блоков друг на друга.

Результаты2: Plot2

0
iouraich 4 Ноя 2014 в 07:50