Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

インターン生がプッシュ通知の配信時刻最適化に取り組んでみた!

はじめに

初めまして。長岡技術科学大学の山本( もっさん / @__Y4M4MOTO__ )と申します。9 月中旬から 11 月までの 2 カ月半、プロダクト開発本部の技術戦略室にて、データサイエンティストのインターンをさせていただきました。この記事では、私がインターン中に取り組んだ「プッシュ通知の配信時刻最適化 PoC」の話をしたいと思います。

背景

Yappliの主要機能の1つにプッシュ通知があります。今回、クライアントの満足度向上のために、プッシュ通知の開封率を高める手段を検証しました。アイデアとして、以下を考えました。

  • ユーザがすぐ開封しやすい時間を推定し、その時間にプッシュ通知を配信する

プッシュ通知の開封率向上に、このアイデアが寄与するかどうかの調査が、今回のインターンでの目的です。

やったこと

調査では、 2 つの疑問を検証しました。

  1. 配信時刻を最適化すると本当に開封率が向上するのか?
  2. ユーザごとに配信時刻を最適化できるのか?

使った技術

  • BigQuery
  • Google スプレッドシート
  • Python
    • Jupyter Lab
    • plotly
    • scikit-learn

検証内容

1. 配信時刻を最適化すると本当に開封率が向上するのか?

この疑問を解消するために、2 つの調査を行いました。

  1. そもそも配信時刻によって開封率は変わるのか?
  2. 配信後すぐ開封してもらえたら、開封率は高くなるのか?

1.1. そもそも配信時刻によって開封率は変わるのか?

まず、配信時刻の最適化によってプッシュ通知の開封率が向上する余地がありそうかどうかを調べました。そのために、配信時刻によって開封率が変化するのかどうかを確認しました。

ある月に配信されたプッシュ通知について配信時刻を 1 時間ごとに区切り、各時間帯でプッシュ通知の開封率の平均値を比較しました。

平均値の計算イメージを次の図に示します。この図では、18時台のプッシュ通知の開封率の平均値を計算しています。

f:id:yamamoto-yuta:20211201052028j:plain

集計は BigQuery を用いて行い、集計結果の可視化は Google スプレッドシートを用いて行いました。

集計結果では、時間帯によって通知開封率の平均値が大きく変化していました。このことから、配信時刻によって開封率が変化する可能性が高そうなことを確認できました。

1.2. 配信後すぐ開封してもらえたら、開封率が高くなるのか?

この調査では、もしプッシュ通知を配信後すぐに開封してもらえた場合、本当に開封率が高くなるのかを確認しました。

調査は、ある月に配信されたプッシュ通知を、アプリごとに次の 2 グループに分け、その開封率の平均を計算することで行いました。

  1. 配信後、一定時間以内に開封したユーザの多かった通知グループ
  2. 配信後、一定時間以内に開封したユーザの少なかった通知グループ

各グループに属する通知のイメージを次の図に示します。

f:id:yamamoto-yuta:20211201054153j:plain

配信後、aグループの平均開封率がbグループの平均開封率を上回っていれば、配信後すぐ開封してもらえるプッシュ通知の方が、開封率が高くなると言うことができます。

こちらも、集計は BigQuery、集計結果の可視化は Google スプレッドシートを用いました。

集計結果では分析対象のすべてのアプリで、aグループの平均開封率がbグループの平均開封率を上回っていました。このことから、配信後すぐ開封してもらえたら開封率が高くなる、ということが確認できました。

2. ユーザごとに配信時刻を最適化できるのか?

この疑問を解消するために、 2 つの調査を行いました。

  1. すぐ開封してもらえる時刻を推定できるのか?
  2. 推定した時刻に配信したとして、本当に開封率が上がるのか?

2.1. すぐ開封してもらえる時刻を推定できるのか?

この調査では、ユーザにすぐ開封してもらえる時刻の推定を行いました。

推定は次の方法で行いました。

  1. ユーザーが、プッシュ通知を週 1 回以上のペースで開いていたかどうかをhour毎に集計
  2. 集計結果をもとにユーザをクラスタリング
  3. クラスタごとに開封ユーザー数のhour別構成比を調べ、最大値の 70%以上の値のhourを、当該クラスタのユーザがすぐ開封する時刻の推定値とする

推定イメージを次の図に示します。

f:id:yamamoto-yuta:20211201054802j:plain

集計を BigQuery、クラスタリングと可視化を Python で行いました。

推定結果としては、12 時台に開きやすいクラスタや 20 時台に開きやすいクラスタなどを検出することができました。

2.2. 推定した時刻に配信したとして、本当に開封率が上がるのか?

この調査では、先ほど推定した配信時刻に通知を配信したとして、本当に開封率が上がるのかを調べました。

調査は、推定時に対象とした月の翌月に配信された通知を対象としました。調査方法としては、クラスタごとに、推定時刻に配信された通知とそれ以外の時刻に配信された通知で平均開封率を集計して比較しました。

集計イメージを次の図に示します。

f:id:yamamoto-yuta:20211201061204j:plain

集計を BigQuery、可視化を Google スプレッドシートで行いました。

集計結果では、検出したクラスタの過半数で、推定時刻に配信された通知の平均開封率が、それ以外の時刻に配信された通知の開封時刻を上回っていました。このことから、ユーザがプッシュ通知を開封しやすい時刻の推定において、一定の成功を収めることができたと言えます。

技術的に難しかったところ

データの集計ミスに早く気づくこと

集計されたデータは表形式に並んだ数字の羅列ですので、どこかにミスがあったとしてもぱっと見では中々気づけません。しかし、集計ミスは早めに気づかないと後の分析に致命的な影響を与えかねません。では、どうすれば早くミスに気づけるのでしょうか?この辺り、データサイエンティストの 阿部さん にアドバイスをいただきました。

アドバイスの内容は主に次の 2 つでした。

  1. 「この集計を行ったら、こんな感じの結果になっているはず」という集計後のイメージを持つ
  2. 集計出来たらまず統計指標(データ件数、平均、最大値、最小値など)や分布を確認する

この 2 点を意識するようにしたところ、気づけずスルーしてしまうミスはほとんど無くなりました。例えば、開封率を計算する場合、集計後のデータは 0 以上 1 以下に収まっているはずです。したがって、集計後のデータの最大値が 1 より大きかったり、最小値が 0 より小さかったら集計ミスと気づくことができます。また、1 時間毎の開封数の分布を確認する場合、感覚として昼の 12 時や夕方 18 時に分布が偏りそうだと予想することができます。したがって、深夜に分布が偏っていたらタイムゾーンにミスがありそうだと気づくことができます。

まとめ

今回は、プッシュ通知の開封率向上を目的として、「ユーザがすぐ開封しそうな時刻にプッシュ通知を配信する」というアイデアが開封率向上に寄与するかを検討しました。その結果、次の 2 点を確認することができました。

  • 配信後すぐ開封するユーザの多いプッシュ通知は、開封率が高かった
  • ユーザごとにすぐ開封してもらえそうな配信時刻を推定し、推定時刻に配信した場合に開封率が向上する可能性が高い

今回の検討が、新機能の開発(例えば、ユーザごとにプッシュ通知の配信時刻を最適化して自動配信する機能など)に繋がっていけばと思います。ここまでお読みいただきありがとうございました!