Я пытаюсь построить 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))
Это не дало мне несколько строк для нескольких клиентов.
Итак, у меня в основном два вопроса:
Что может быть лучшим способом представления этих данных?
Как мы можем улучшить мой код, чтобы отображать 16000 строк на одном графике? (Меня не очень волнует этот вопрос, если я могу получить другой способ представления этих данных)
Мы будем очень благодарны за любую помощь в этом вопросе.
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
.
Может быть, вы смотрите на что-то вроде этого:
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)
Результаты:
Теперь вы можете представить себе, что делаете то же самое, переключая geom_point
на geom_boxplot
или geom_errorbar
во всех ваших точках данных. В качестве альтернативы вы можете отказаться от огранки и просто построить один график, но вам нужно будет указать в вызове геометрии опцию «уклонение», чтобы избежать наложения блоков друг на друга.
Результаты2:
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.
geom_line(data=res,aes(x=Date,y=Revenue,group=CustNum),alpha=0.2)
?