概要
Rによるデシル分析についてご紹介します。
デシル分析とは、売上など特定の数値で顧客データを並び替えたあとに、10等分する分析です。
上位に集中する特徴を捉えて、次の施策を考案するために活用します。
準備
データ
まず、1カスタマー1データで売上データを準備します。
customerId,sales_amount 1289,2599 1925,110 1498,75 ...
実装
さっそくデシル分析をしていきます。
まず、上記で準備した売上データを読み込みます。
sales_data = read.csv("~/Downloads/decile.csv", header = T)
つぎに、str()
でデータ構造を確認します。
str(sales_data) 'data.frame': 10000 obs. of 2 variables: $ customerId : int 1289 1925 1498 1535 1886 1773 1422 1219 1215 1500 ... $ sales_amount: int 2599 110 75 99 2485 3828 191 3901 266 58 ...
また、summary()
で基礎統計量も確認します。
summary(sales_data) customerId sales_amount Min. :1000 Min. : 1.0 1st Qu.:1251 1st Qu.: 66.0 Median :1498 Median : 197.0 Mean :1498 Mean : 610.8 3rd Qu.:1749 3rd Qu.: 587.0 Max. :1999 Max. :9998.0
そして、売上のヒストグラムを表示します。
hist(sales_data$sales)
基礎データの概略を把握した後、さっそく顧客IDごとの売上集計をして、結果を確認します。
sales_data_sum <- aggregate(sales_data$sales_amount,list(sales_data$customerId),sum) str(sales_data_sum) 'data.frame': 1000 obs. of 2 variables: $ Group.1: int 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 ... $ x : int 1177 6364 6995 2909 11470 9235 6312 1814 4930 10560 ...
列名を付け直して、わかりやすくします。
names(sales_data_sum) <- c("customerId","Monetary") str(sales_data_sum) 'data.frame': 1000 obs. of 2 variables: $ customerId: int 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 ... $ Monetary : int 1177 6364 6995 2909 11470 9235 6312 1814 4930 10560 ...
ヒストグラムで表示確認します。
hist(sales_data_sum$Monetary)
さて、つぎは、
顧客IDごとに売上集計がとれたので、顧客を10等分してランク名を付けます。
quantile()
で指定分位数に分割し、cut()
で量的変数を質的変数に変換します。
各顧客IDごとに、decile_rankが付与されています。
sales_data_sum$decile_rank <- cut(sales_data_sum$Monetary,quantile(sales_data_sum$Monetary,(0:10)/10,na.rm=TRUE),label=FALSE,include.lowest=TRUE) str(sales_data_sum) 'data.frame': 1000 obs. of 3 variables: $ customerId : int 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 ... $ Monetary : int 1177 6364 6995 2909 11470 9235 6312 1814 4930 10560 ... $ decile_rank: int 1 7 7 3 9 9 7 2 5 9 ...
cf. (0:10)/10
は、0.1刻みで0から1まで生成する記法です。
res = (0:10)/10 > res [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
ランクづけができたら、それぞれのランクごとに集計します。
decile <- aggregate(sales_data_sum$Monetary,list(sales_data_sum$decile_rank),sum) names(decile) <- c("decile_rank","Monetary") str(decile) 'data.frame': 10 obs. of 2 variables: $ decile_rank: int 1 2 3 4 5 6 7 8 9 10 $ Monetary : int 114950 211066 288829 373596 467780 566464 687162 830994 1031740 1535566
デシルランクごとに売上比率を算出します。
total <- sum(decile$Monetary) percent <- decile$Monetary / total * 100 decile2 <- cbind(decile, percent) decile3 <- decile2[order(-decile2$decile_rank),] str(decile3) 'data.frame': 10 obs. of 3 variables: $ decile_rank: int 10 9 8 7 6 5 4 3 2 1 $ Monetary : int 1535566 1031740 830994 687162 566464 467780 373596 288829 211066 114950 $ percent : num 25.14 16.89 13.6 11.25 9.27 ...
もし、上位金額のデータだけを活用したい場合は、以下のように抽出し、CSVファイルに出力して活用できます。
subset(sales_data_sum, sales_data_sum$decile_rank==10) decile_top_customers <- subset(sales_data_sum, sales_data_sum$decile_rank==10) write.csv(decile_top_customers, "~/Downloads/decile_top_customers.csv", quote=F, row.names=F)
以上、Rによるデシル分析をご紹介しました。