トレタ データサイエンス研究所

Report
2018年8月31日

予約台帳「トレタ」利用における解約予測モデルの構築

この記事をシェアする

分析内容

「トレタ」は飲食店が予約を管理するための予約/顧客管理サービスを提供しています。「トレタ」を導入頂いた飲食店には、なるべく長くサービスをご利用頂きたいと考えていますが、何らかの理由により解約に至ってしまう場合もあります。今回は飲食店での「トレタ」の利用度合いを追跡し、データから解約の兆候を事前に察知できないかを検討しました。

まず、「トレタ」の予約データから解約を予測するためには、予約データと解約の関係性を正確に把握する必要があります。解約の予兆がないにもかかわらず、解約するとみなしてしまうような間違った推測をしてしまうことを防がなければいけません。

例えば、飲食店が電話で予約を受けつけて「トレタ」に予約を記録したデータの入力件数は、「トレタ」の利用度合いの重要な手がかりになりますが、予約の入力数が減る要因は店舗によって異なるので、予約データの減少はサービスへの不満を表しているとは限りません。鍋料理を提供する飲食店の場合、冬にお客様が多く来店する傾向がある一方で、夏にかけて来店数と予約数が共に減ることが容易に想像できます。このような場合、予約入力の減少(サービス利用の減少)がサービス解約に繋がる可能性は低いのです。これを考慮して、予約数の減少を追跡する期間を変えるような工夫をしなければいけません。

そこでまずは、飲食店の「トレタ」での予約入力度合いが、どうサービス解約に関係しているのかをRで可視化しながらモデルで使う変数を検討しました。

可視化

過去のデータを可視化した結果、ある日を基準とした過去2週間の予約データとその後3ヶ月以内の解約率が強く相関していることが分かったので、このデータをモデルで使うことにしました。ここでは可視化の過程で使ったグラフをいくつか紹介したいと思います。

spineplot(closed ~ used_1_to_2_weeks_prior, data = win)

2週間連続使用を表すダミー変数に対する解約率を可視化

これはモザイクプロットと呼ばれるグラフで、「トレタ」を継続的に使っている店舗と使っていない店舗で解約率がどれぐらい違うのかを表しています。横軸は過去2週間の予約データの入力状況で店舗を分けており、右側が「トレタ」を継続的に使っている(過去2週間1回ずつは予約を手入力している)店舗で、左側が過去2週間で予約データが入力されていない店舗です。縦軸は、濃い方がその後3ヶ月経っても「トレタ」を継続利用頂いている店舗で、白い方がその後3ヶ月以内に解約となってしまった店舗です。ご覧の通り、左側の「トレタ」で予約データを継続的に入力頂いていない飲食店は、入力頂いている飲食店よりもは白い面積によって表される3ヶ月以内の解約率が高いことが分かります。

spineplot(closed ~ sum_res_1_to_2_weeks_prior, data = win,
breaks = c(0,5,25,50,100,200,max(win$sum_res_1_to_2_weeks_prior)))

予約数に対する解約率を可視化

同じモザイクプロットですが、今度は横軸に予約数をとりました。このグラフから予約の入力数が低い飲食店ほど、解約率が高いことが分かります。

モデリング

解約率と相関関係が強い変数があることが分かったので、ロジスティック回帰を使って店舗に対する解約率を予測することにしました。

まず、データをトレーニングデータとテストデータに分けます。

set.seed(117)
smp_size <- floor(0.8 * nrow(win)) #8割がテストデータ
train_ind <- sample(seq_len(nrow(win)), size = smp_size)

win_train <- win[train_ind, ] 
win_test <- win[-train_ind, ]

 

次にロジスティックモデルを学習させます。この過程で他の変数もモデルに入れて試しましたが、後で紹介するAUCを基準に変数をグラフで紹介した2つに絞りました。

lm <- glm(closed ~ used_1_to_2_weeks_prior + sum_res_1_to_2_weeks_prior, 
data=win_train, family=binomial(link=logit))

学習結果は次の数式で表わせました:

πは解約率。最初の変数は過去2週間連続して予約を1回ずつ以上手入力していることを表すダミー変数で、2つ目の変数は過去2週間の予約数。

このモデルによると2週間「トレタ」を全く使っていない店舗と100件予約が入っている店舗の解約率は約4倍違います。後者は予約があまり入っていないにも関わらず、解約率が相対的に低いことから、継続的な利用がサービスの定着度と強く関係していることが分かります。

テスティング

最後に、テストデータに対してROC曲線を作り、モデルの精度を検証しました。

p <- predict(lm, win_test, type="response")
pr <- prediction(p, win_test$closed)
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
plot(prf)

auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]
auc

このグラフにおいて、横軸は偽陽性率(解約しなかった店舗の中でモデルが解約すると予測した割合)を表しています。また、縦軸は真陽性率(解約した店舗の中でモデルが解約すると予測した割合)を表しています。この2つの割合はモデルが予測した解約率が何%を超えた時に店舗が解約するとみなすか(カットオフ値)によって変化していきます。

また、モデルの精度を測るためAUC(ROC曲線の下の面積)という指標がよく使われます。この面積が1に近いほどモデルの精度が高いと言えるのですが、今回はAUCが0.698でした。あまり精度が高いモデルとは言えなさそうです。

考察

最初に、今回の分析で予測の精度が低くなった要因を考えたいと思います。

まず、手作業で入力された解約日を使ってモデルの変数を作っていることが1つの要因として考えられます。解約手続きを自動化して解約日をより正確に記録できれば精度向上が期待できます。

また、予約を継続的に入力しているにも関わらず解約する店舗がありますが、この場合の解約理由の1つとして予約管理以外の機能において不具合が生じていることが挙げられます。例えば、「トレタ」は飲食店がお客様の情報を管理するための顧客台帳も提供していますが、これが何らかの理由で機能していない場合、飲食店は「トレタ」のサービスを解約し、他社のサービスに移る可能性があります。そこで、飲食店の顧客台帳の使用頻度からも解約を予測できるように、顧客台帳の入力データを長期的に収集してもいいかもしれません。

最後に、解約予測を通じて顧客の定着度をデータから定量的に測るヒントを得ることができたので、それについて話したいと思います。

「トレタ」のように継続利用を前提とするサービスを展開している会社にとって、サービスがどれだけ顧客に定着しているのかを知ることは大切です。また、定着度が低い顧客がいる場合は、サービス自体の改善や、サービスの利用度合いをどうやったら上げることができるのかを考えなければいけません。

学習させたロジスティックモデルにおいて、過去のサービス利用度合いが、将来の解約率に対する影響が強かったことから、サービスの基本機能を継続利用をしていない顧客の定着度が低いということが推測できます。この推測に基づいて、継続利用を1つの指標として、トレタで店舗に対するサービスの相談を行うという案がありました。

diagram by Haokang Den

具体的に過去4週間のうち、1週間でも予約の手入力がない週があった場合を訪問対象の店舗に入れることにしました(最終的にモデルでは2週間前までのデータを使いましたが、4週間前までのデータも有意でした)。このように、最初の目的以外のことにも分析が生きることがデータサイエンスの1つの魅力だと思いました。

この記事をシェアする
真先 伸彰
この記事を書いた人

新着記事