# # Cドライブ直下のファイル配置は権限によってはエラーとなります。 # 一番最後の<19>のテーブル保存の箇所において、 # 書籍とは違うC:/temp/ という箇所を指定しています。 # idposdata.csvを置く場所も含めてファイルパスは各自の環境で調整をして下さい。 # # <10>データ読み込み rfmdata <- read.csv("C:/idposdata.csv", header = T) # <11>基準日からの日数「datediff」を計算。 # difftimeコマンドによって、異なる2つの日付型の変数から差分を求め、 # それを「datediff」という変数に格納。 rfmdata$datediff<- round(as.numeric(difftime("2013-01-01",rfmdata$date,units="days"))) # <12>Rを計算。IDごとの最も少ない日数とする。 # aggregateコマンドのオプション「min」によって取得。 Recency <- aggregate(rfmdata$datediff,list(rfmdata$custID),min) names(Recency) <- c("custID","Recency") # <13>Fの計算。顧客IDをキーに、頻度を集計 Frequency <- aggregate(rfmdata$sales,list(rfmdata$custID),length) names(Frequency) <- c("custID","Frequency") # <14>decileと同じだが、Mの計算 # 計算後、テーブル名、変数名を分かりやすくする。 Monetary <- aggregate(rfmdata$sales,list(rfmdata$custID),sum) names(Monetary) <- c("custID","Monetary") # <15>各変数を結合 temp <- merge(Frequency,Monetary,"custID") customerRFM <- merge(temp,Recency,"custID") # <16>RFMの5rankを計算 customerRFM$rankR <- cut(customerRFM$Recency,quantile(customerRFM$Recency,(0:5)/5,na.rm=TRUE),label=FALSE,include.lowest=TRUE) customerRFM$rankF <- cut(customerRFM$Frequency,quantile(customerRFM$Frequency,(0:5)/5,na.rm=TRUE),label=FALSE,include.lowest=TRUE) customerRFM$rankM <- cut(customerRFM$Monetary,quantile(customerRFM$Monetary,(0:5)/5,na.rm=TRUE),label=FALSE,include.lowest=TRUE) # <17>Rのランクを反転(小さい方が良い、とするため) customerRFM$rankR <- 6-customerRFM$rankR # <18>RFMのクロス集計 table(customerRFM[,5:6]) table(customerRFM[,6:7]) table(customerRFM[,5:7]) # <19>各ランクが高い人を抽出。そのテーブルを保存。 subset(customerRFM, customerRFM$rankM==5 & customerRFM$rankF==5 & customerRFM$rankR==5) RFMgoodcustomers <- subset(customerRFM, customerRFM$rankM==5 & customerRFM$rankF==5 & customerRFM$rankR==5) write.csv(RFMgoodcustomers, "C:/temp/RFMgoodcustomers.csv", quote=F, row.names=F)