kaeken(嘉永島健司)Techブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

Rによるデシル分析

概要

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によるデシル分析をご紹介しました。