統計学といくつかのよしなしごと

つれづれなるままに、日くらし統計学にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。

顧客のセグメント移動を概観するはなし

優良顧客はいつまで優良か

 企業に対する顧客の貢献度を何等か数値化したうえでセグメントを設定し、優良顧客にはこれこれ、離脱顧客にはそれそれといったアプローチをとるのは王道中の王道になっている。差し当たっての問題は「いかにして顧客セグメントを設定するか」だが、ひとまず大枠をとらえて方針を決める程度ならRFMやパレートの法則などのコンセプトに則って設定するというので当面は十分に機能する場合も少なくないと思う。一方でこれだけでは一地点で顧客のステータスを決め打っているに過ぎないため、定期的な更新が必要になるのだが、そこで「そもそも自社の顧客はどの程度セグメントを移ろいやすいのか」という疑問が出てくる。優良顧客はずっと優良顧客でいるのか、あるいはしばらくすると優良でなくなってしまうのかを企業単位、あるいはブランド単位で知っておくことは施策のサイクルや方向性を検討するうえで有意義だろうから、そのために定点観測する指標を持っておきたい。今回はあまり複雑なモデリングをせずに、社会移動データの分析で使われる手法を用いてそれを概観できるのではないかというはなし。

移動指標について

 ここでは移動指標の考え方について『人文・社会科学の統計学』の第9章に則って簡単に説明する。以下のクロス表を用いる。

f:id:yanbow221:20180102154038p:plain

 この表は父から息子への階層移動表で、例えば676名いたホワイトカラーにおいてその息子もホワイトカラーであったのは517名であるという具合の表になっている。移動研究においては息子の階層は父の階層からどの程度影響しているかに焦点を当てていて、それを「開放的」だとか「閉鎖的」だと言う風に言うらしい。ぱっと見たところホワイトカラーの息子はホワイトカラーで居続けていて、農業の息子は各階層に散らばっているように印象を持つ。

①構造移動と純粋移動

 移動性を考える際にはその移動を「構造移動」と「純粋移動」に区別する。構造移動とは対角セルについて、その行と列の周辺分布の違いによって必然的に起きる移動のことを言う。例えば(1, 1)セル(父子ともにホワイトカラー)に注目すると、{\displaystyle n_{1・} = 676}である一方{\displaystyle n_{・1} = 1011}なので、{\displaystyle 1011-676=335}名は必然的にホワイトカラー以外の父階層から入ってこなければならず、これを構造移動と定義する。実際の移動量からこの構造移動量を除いたものは周辺分布の違いによらない移動と考えられるため、これを純粋移動と定義する。先のケースで言えば実際の他階層からホワイトカラーへの移動は{\displaystyle 244 + 250 = 494}なので、この差{\displaystyle 494 - 335 = 159}名がホワイトカラー階層における純粋移動となる*1。定式化すると

{\displaystyle
構造移動\ \ \ \ \ |n_{i・} - n_{・i}| \\
純粋移動\ \ \ \ \ min\{n_{i・},\ n_{・i}\} - n_{ii}
}

となる。全ケース数を{\displaystyle N}とすれば、これらを用いて

{\displaystyle
粗移動率\ \ \ \ \ \ \ \frac{N-\Sigma_{i} n_{ii}}{N} \\
構造移動率\ \ \ \ \ \frac{\Sigma_{i} |n_{i・}-n_{・i}|}{2N} \\
純粋移動率\ \ \ \ \ \frac{\Sigma_{i} (min\{n_{i・}, \ n_{・i}\} - n_{ii})}{N}
}

が定義される。ここで粗移動率=構造移動率+純粋移動率である。

②安田係数

 上記の考え方は階層移動を考えるうえで有用だが、移動率は移動表全体に関するものであり、一方構造移動/純粋移動は各階層における絶対数を扱っているため階層間で単純には比較できない。そのため各階層の移動性を比較する指標が必要となるが、その一つが安田係数である*2。以下で定義される。

{\displaystyle
\begin{eqnarray}
y_{i} &\equiv& \frac{階層iの純粋移動の実現値}{独立移動における階層iの純粋移動の期待値}
\\ 
&=& \frac{min\{n_{i・}, \ n_{・i}\} - n_{ii}}{min\{n_{i・}, \ n_{・i}\} - n_{i・}n_{・i}/N}
\end{eqnarray}
}

 {\displaystyle y }の値は実現値が独立移動と等しければ({\displaystyle n_{ii}=n_{i・}n_{・i}/N })1であり、純粋移動が少なく非移動が多くなると0に近づく。これをもって各階層の移動性を比較、評価することができるようになった。

架空の顧客セグメントデータに適用する

 これらの指標を使ってセグメント間の移動を評価するシミュレーションを行う。想定としては以下の通り。

  1. 特定企業の扱うブランドA, Bについて、同時点でそれぞれの購入顧客を何等かの基準によりhigh(h), medium(m), low(l)の3セグメントに設定した
  2. 各ブランドで対象となった顧客はどちらも1,500名で、最初の時点における各セグメントのサイズはそれぞれ500名ずつとした
  3. 一定期間経った後、各ブランドの対象となった1,500名それぞれを先の基準に照らしセグメントを振り分けた*3

 生成したデータはこんな感じ。どちらも同数の顧客を対象にしているので、一見してブランドAのほうが同セグメントに留まりやすく、ブランドBはセグメント間の移動がより激しくなっていることが分かると思う。
f:id:yanbow221:20180102171522p:plain
f:id:yanbow221:20180102171535p:plain

 これについて紹介した各指標を算出してみる。

#データの生成
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)

という一節がある。購買データについても同様に

  • 一定間隔で指標を追い、どの程度のスパンで顧客が移り変わっていくか
  • 商品やブランド間で指標を比較し、セグメントの移動パターンがどのように異なっているか

を見ることは施策の更新頻度や顧客セグメントに基づく施策方針(その実施有無を含め)を検討するうえで一つの参考になるんじゃないかと思う。さらに考察を深めるための方法論もあるので、機会があったらまた検討してみたい。

*1:行周辺度数と列周辺度数のどちらが大きいかで行に考えるか列に考えるか変わるのでそこだけ注意

*2:前述の『人文・社会科学の統計学』では結合指数/分離指数という指標の欠点を克服した指標であることや安田係数にも問題があることなど詳しく書いてある

*3:各セグメント同数としたのは最初の時点のみで、その後のセグメント設定では基準に設けた値(例えば累積の購買金額)のセグメント閾値を用いて振り分けを行う

*4:浮動票的な