顧客のセグメント移動を概観するはなし
優良顧客はいつまで優良か
企業に対する顧客の貢献度を何等か数値化したうえでセグメントを設定し、優良顧客にはこれこれ、離脱顧客にはそれそれといったアプローチをとるのは王道中の王道になっている。差し当たっての問題は「いかにして顧客セグメントを設定するか」だが、ひとまず大枠をとらえて方針を決める程度ならRFMやパレートの法則などのコンセプトに則って設定するというので当面は十分に機能する場合も少なくないと思う。一方でこれだけでは一地点で顧客のステータスを決め打っているに過ぎないため、定期的な更新が必要になるのだが、そこで「そもそも自社の顧客はどの程度セグメントを移ろいやすいのか」という疑問が出てくる。優良顧客はずっと優良顧客でいるのか、あるいはしばらくすると優良でなくなってしまうのかを企業単位、あるいはブランド単位で知っておくことは施策のサイクルや方向性を検討するうえで有意義だろうから、そのために定点観測する指標を持っておきたい。今回はあまり複雑なモデリングをせずに、社会移動データの分析で使われる手法を用いてそれを概観できるのではないかというはなし。
移動指標について
ここでは移動指標の考え方について『人文・社会科学の統計学』の第9章に則って簡単に説明する。以下のクロス表を用いる。
この表は父から息子への階層移動表で、例えば676名いたホワイトカラーにおいてその息子もホワイトカラーであったのは517名であるという具合の表になっている。移動研究においては息子の階層は父の階層からどの程度影響しているかに焦点を当てていて、それを「開放的」だとか「閉鎖的」だと言う風に言うらしい。ぱっと見たところホワイトカラーの息子はホワイトカラーで居続けていて、農業の息子は各階層に散らばっているように印象を持つ。
①構造移動と純粋移動
移動性を考える際にはその移動を「構造移動」と「純粋移動」に区別する。構造移動とは対角セルについて、その行と列の周辺分布の違いによって必然的に起きる移動のことを言う。例えば(1, 1)セル(父子ともにホワイトカラー)に注目すると、である一方なので、名は必然的にホワイトカラー以外の父階層から入ってこなければならず、これを構造移動と定義する。実際の移動量からこの構造移動量を除いたものは周辺分布の違いによらない移動と考えられるため、これを純粋移動と定義する。先のケースで言えば実際の他階層からホワイトカラーへの移動はなので、この差名がホワイトカラー階層における純粋移動となる*1。定式化すると
となる。全ケース数をとすれば、これらを用いて
が定義される。ここで粗移動率=構造移動率+純粋移動率である。
架空の顧客セグメントデータに適用する
これらの指標を使ってセグメント間の移動を評価するシミュレーションを行う。想定としては以下の通り。
- 特定企業の扱うブランドA, Bについて、同時点でそれぞれの購入顧客を何等かの基準によりhigh(h), medium(m), low(l)の3セグメントに設定した
- 各ブランドで対象となった顧客はどちらも1,500名で、最初の時点における各セグメントのサイズはそれぞれ500名ずつとした
- 一定期間経った後、各ブランドの対象となった1,500名それぞれを先の基準に照らしセグメントを振り分けた*3
生成したデータはこんな感じ。どちらも同数の顧客を対象にしているので、一見してブランドAのほうが同セグメントに留まりやすく、ブランドBはセグメント間の移動がより激しくなっていることが分かると思う。
これについて紹介した各指標を算出してみる。
#データの生成 set.seed(221) dat.start <- c(500, 500, 500) prob.a <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.7, 0.2, 0.1)) prob.b <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.2, 0.4, 0.3)) prob.c <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.05, 0.15, 0.8)) prob.d <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.35, 0.35, 0.3)) prob.e <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.3, 0.4, 0.3)) prob.f <- sample(c("h", "m", "l"), rep = T, 500, prob = c(0.33, 0.32, 0.35)) a <- table(prob.a) b <- table(prob.b) c <- table(prob.c) d <- table(prob.d) e <- table(prob.e) f <- table(prob.f) dat.A <- rbind(a, b, c) row.names(dat.A) <- c("h", "m", "l") dat.B <- rbind(d, e, f) row.names(dat.B) <- c("h", "m", "l") dat.A <- dat.A[, c(1,3,2)] dat.B <- dat.B[, c(1,3,2)] #移動率と安田係数を求める関数 ido <- function(data){ if(nrow(data) != ncol(data)){stop("移動前後のセグメント定義が一致しません")} ido.kozo <- matrix(NA, nrow = 1, ncol = ncol(data)) ido.jun <- matrix(NA, nrow = 1, ncol = ncol(data)) yasuda <- matrix(NA, nrow = 1, ncol = ncol(data)) for(i in 1:nrow(data)){ ido.kozo[i] <- max(rowSums(data)[i], colSums(data)[i]) - min(rowSums(data)[i], colSums(data)[i]) #構造移動 ido.jun[i] <- min(rowSums(data)[i], colSums(data)[i]) - data[i, i] #純粋移動 yasuda[i] <- ido.jun[i] / (min(rowSums(data)[i], colSums(data)[i]) - (rowSums(data)[i] * colSums(data)[i] / sum(data))) #安田係数 } colnames(ido.kozo) <- colnames(ido.jun) <- colnames(yasuda) <- colnames(data) ratio.ara <- (sum(data) - sum(diag(data))) / sum(data) #粗移動率 ratio.kozo <- sum(ido.kozo) / (2 * sum(data)) #構造移動率 ratio.jun <- sum(ido.jun) / sum(data) #純粋移動率 ratio.ido <- rbind(ratio.ara, ratio.kozo, ratio.jun) kiyo.ara <- ratio.ara / ratio.ara kiyo.kozo <- ratio.kozo / ratio.ara #構造移動率 / 粗移動率 kiyo.jun <- ratio.jun / ratio.ara #純粋移動率 / 粗移動率 kiyo.ido <- rbind(kiyo.ara, kiyo.kozo, kiyo.jun) matome <- cbind(ratio.ido, kiyo.ido) dimnames(matome) <- list(c("粗移動率", "構造移動率", "純粋移動率"), c("移動率", "寄与度")) result <- list(ido.kozo, ido.jun, matome, yasuda) names(result) <- c("構造移動", "純粋移動", "クロス表全体の移動率", "安田係数") return(result) }
結果はこんな感じ。
> ido(dat.A) #ブランドAにおける各指標の値 $構造移動 h m l [1,] 10 112 122 $純粋移動 h m l [1,] 132 172 94 $クロス表全体の移動率 移動率 寄与度 粗移動率 0.34666667 1.0000000 構造移動率 0.08133333 0.2346154 純粋移動率 0.26533333 0.7653846 $安田係数 h m l [1,] 0.4040816 0.6649485 0.3211845 > ido(dat.B) #ブランドBにおける各指標の値 $構造移動 h m l [1,] 25 44 19 $純粋移動 h m l [1,] 298 298 289 $クロス表全体の移動率 移動率 寄与度 粗移動率 0.61933333 1.00000000 構造移動率 0.02933333 0.04736276 純粋移動率 0.59000000 0.95263724 $安田係数 h m l [1,] 0.9410526 0.9351464 0.9012474
まず移動率における構造移動率と純粋移動率の比を見てみると、ブランドBはブランドAよりも純粋移動率の比が高く、95%程度になっている。このことからブランドBは顧客の入れ替わりが激しく、少なくともこの2地点間隔ではセグメントに基づく施策の打ち分けが機能しない懸念があるか、あるいはそもそもの商品特性として(ブランド単体においては)企業への貢献度に基づくセグメント設定に意味がないなどの仮説が立つだろう。
安田係数でも同様で、ブランドBについてはセグメントh, m, lすべて0.9を超えておりセグメントの移動性が独立に近い。一方でブランドAは全体的にブランドBほど係数が大きくなく、最初の時点で設定したセグメントがある程度継続されていることがわかる。その中でセグメントmはやや係数が高めで他セグメントへの移動性が強いことを示しており、これが実データであれば「程々な顧客は上位にも下位にも移ろいやすい*4」ということが言えるだろう。
おわりに
今回は顧客のセグメントの移動を社会移動データとみなして移動パターンを概観する方法を書いた。先の本には、
社会移動の研究の主要関心の一つは、異なる時点や社会の間で、階層移動のパターンにちがいがあるかどうかという問題である
(P275)
という一節がある。購買データについても同様に
- 一定間隔で指標を追い、どの程度のスパンで顧客が移り変わっていくか
- 商品やブランド間で指標を比較し、セグメントの移動パターンがどのように異なっているか
を見ることは施策の更新頻度や顧客セグメントに基づく施策方針(その実施有無を含め)を検討するうえで一つの参考になるんじゃないかと思う。さらに考察を深めるための方法論もあるので、機会があったらまた検討してみたい。