2016-04-27 9 views
1

私は、Recency、Frequency、およびMonetaryに基づいて10パーセンタイルを計算するデータフレームを作成しようとしています。私はそれをほとんどセットアップしましたが、私が10を求めているときに、なぜ私のコードが3つのNTILESを返しているのかわかりません。私は現在、まだ立ち止まっています。次のステップは、各ntileの顧客の割合を計算することです。あなたは新しさ、頻度および通貨比率のための10個のバケットたい場合、例えばRFM解析のためにRのNTILEを計算する

rm(list = ls()) 
setwd("/Users/a76475/Documents/Customer_Analytics") 
rfm<-read.csv("cdnow_students_transaction.csv") 

#Set up test and calibration samples 
rfm$DATE <- as.Date(rfm$DATE, format = "%m/%d/%y") 
calib <- subset(rfm, rfm$DATE<"1997-09-29") 
valid <- subset(rfm, rfm$DATE>"1997-09-30") 

#Aggregate for frequency, monetary, and recency -- Calibration 
recency<- aggregate(DATE ~ ID, data =calib, FUN = max) 
colnames(recency) <- c("ID","Recency") 
frequency <- aggregate(DOLLARS ~ ID, data =calib, FUN = length) 
colnames(frequency) <- c("ID","Frequency") 
monetary <- aggregate(DOLLARS ~ ID, data =calib, FUN = mean) 
colnames(frequency) <- c("ID","Monetary") 
calib <- merge(frequency, monetary, by = "ID") 
calib <- merge(calib, recency, by = "ID") 

#Aggregate for frequency, monetary, and recency -- Validation 
recency<- aggregate(DATE ~ ID, data =valid, FUN = max) 
colnames(recency) <- c("ID","Recency") 
frequency <- aggregate(DOLLARS ~ ID, data =valid, FUN = length) 
colnames(frequency) <- c("ID","Frequency") 
monetary <- aggregate(DOLLARS ~ ID, data =valid, FUN = mean) 
colnames(frequency) <- c("ID","Monetary") 
valid <- merge(frequency, monetary, by = "ID") 
valid <- merge(valid, recency, by = "ID") 

colnames(valid) <- c("ID","FREQ","MONETARY","RECENCY") 
colnames(calib) <- c("ID","FREQ","MONETARY","RECENCY") 
calib$RECENCY <- NULL 

#Create recency score 
#For validation 
for (i in 1:nrow(valid)) { 
    valid$RECENCY1[i] = as.numeric(max(valid$RECENCY) - valid$RECENCY[i]) 
} 
valid$RECENCY <- valid$RECENCY1 
valid$RECENCY1 <- NULL 

#For calibration 
for (i in 1:nrow(calib)) { 
    calib$RECENCY1[i] = as.numeric(max(valid$RECENCY) - calib$RECENCY[i]) 
} 
calib$RECENCY <- calib$RECENCY1 
calib$RECENCY1 <- NULL 

#Merge datasets 
rfm <- merge(calib,valid, by="ID", all.x = TRUE) 

#Create Column for retention% 
require(dplyr) 
rfm$monetary.ntile <- ntile(rfm$MONETARY.y,10) 
rfm$freq.ntile <- ntile(rfm$FREQ.y,10) 
rfm$recency.ntile <- ntile(rfm$RECENCY,10) 
+0

ネイサン・ルークを、StackOverflowのへようこそ。助けをより簡単にするために、(1)[良い質問をするにはどうすればいいですか]、[2] [MCVEの作成方法]( (3)[Rで最小限の再現可能な例を提供する方法](http://stackoverflow.com/questions/5963269/how-to-make-a-http://stackoverflow.com/help/mcve) great-r-reproducible-example#answer-5963610)。次に、あなたの質問を編集して改善することをお勧めします。すなわち、いくつかの擬似入力データ(多くの読者はCDNowデータについて知らない)と多分期待される出力を提供します。 – lukeA

答えて

0

、::

はここに私のコードです

set.seed(1) 
n <- 100 
df <- data.frame(
    R = runif(n, 1, 365), 
    F = runif(n, 1, 5), 
    M = runif(n, 0, 100) 
) 
apply(df, 2, function(col) { 
    breaks <- quantile(col, probs=seq(0, 1, length.out = 10)) 
    findInterval(col, breaks) 
}) 
関連する問題