RoomClip 開発者ブログ

プロダクトKPIと数値取得方法について

こんにちは。TunnelでRoomClipのプロダクト改善を担当しております高橋です。

プロダクトと一言で言っても色んな捉え方があるかと思いますが、弊社のプロダクトチームでは、ユーザーが普段一番触れるところであるアプリの機能追加や改修、バグ修正などの開発業務から、ユーザーの課題解決や満足度向上のための諸々の施策の実行など、サービス改善につながること全般をやっております。

私自身は元々アプリのエンジニアで、現在はRoomClipのアプリを中心としたプロダクト改善のための施策運用をやっております。(その関係で、最近はアプリ開発のためのコードを書くというよりもむしろ、数値分析のためのSQLを書いていたりすることが多かったりします^^;)

今回は最初ということもあるので、プロダクトチームとして、どのような指標を扱っていて、それをどのように数値として取得しているかについて、以降で簡単にお話ししようと思います!

■ アクティブユーザー数

何はともあれ最重要指標です。何人のユーザーが使ってくれているのか。これが伸びないとにっちもさっちもいかないので、まず真っ先に見なければならない数値です。

■ 継続率

前月起動したユーザーのうち、何%が翌月も起動したか。前述のアクティブユーザー数は、DL数と継続者数に分解されますが、その後者にあたります。DL数は外部要因によるところもありますが、継続率はダイレクトにアプリ自体の質を表す指標にもなります。

ユーザーの満足度を測る指標とは何かという議論は諸々あるかと思いますが、結局はこの数値が伸びているかどうかが、アプリにおけるユーザーの成功体験及び満足度に直結していると捉えています。

■ ECサイト送客回数/アクティブユーザー数

RoomClipでは投稿したユーザーが写真に商品情報を付与する機能があり、写真を見た人はそこに写っている商品を購入サイトに行って買うことができるようになっています。この指標は、その購入サイトを何回見に行ってもらえたかというもので、この数値が売上にも大きく関わってきます。

ユーザーの利便性と収益性をいかに両立させるかは、サービス運営上の非常に重要なテーマになるかと思いますが、ユーザーは写真から商品を見つけて購入→よりよい部屋を実現できる、運営側は購入が発生することで販売手数料が得られるという図式を実現するものとして非常に重視しています。

■ 写真閲覧数/アクティブユーザー数

一人のユーザーが何枚の写真を見ているかということになりますが、この枚数が多いほど、ユーザーがサービスに没入している、と捉えています。(ここは滞在時間でもいいのですが、RoomClipではユーザーがいかに「参考にしたい、実現したい」と思えるような写真に出会えるかを重視しているため、この指標を見ています)

タイムラインをどこまで見てもらえているか、検索からどれだけ写真が見られているかといったものがここに入ってきます。

■ 1投稿あたりリアクション数

ユーザーの写真投稿に対して、いいねやコメントなどのリアクションがいくつ付いたかを取得しています。RoomClipは写真投稿のCGMサービスであるということもあり、ユーザーが投稿者と閲覧者の2つに大きく分類されます。1つのプロダクトで異なる2つのタイプのユーザーを共存させないといけない、というところにCGMの難しさがありますが、この指標は投稿者の満足度、投稿モチベーションを担保できているかを見るものです。

いいねやコメントがつかないと投稿リテンションが下がることは判明しているため、例えば閲覧者に寄せすぎた施策を打った結果、この数値が大きく下がってしまうようなことがないかをチェックしています。


これらの数値はすべてre:dashで毎日更新するよう管理し、日ごとで大きな動きがないか、毎朝チーム内で確認しております。(こんな感じです。一部都合でぼかしてます。)

re:dashを導入してしばらくになりますが、このあたりを自動でわかりやすい形で出してくれるので、手間が省けた&メンバーとの共有をしやすくなった&他のメンバーがどんな数値取得してウォッチしているかがわかる、というメリットがありました。

技術ブログなので最後一応技術的な部分というところで、上で書いた指標の一つである「写真閲覧数/アクティブユーザー数」を例に、どのようなクエリを書いて数値を出力しているかを簡単にお話しして終わろうと思います。

データを格納しているのはRedshiftで、下記2つのテーブルに、それぞれユーザーの起動と写真閲覧のイベントが格納されているとします。(※テーブル構造、カラム名等については実際のものではない部分がありますのでご了承ください。)

access_log

date user_id os
2017-01-15 02:30:49 2 ios
2017-01-15 02:30:51 3 android
: : :

view_log

photo_id date user_id os
1 2017-01-15 02:39:49 2 ios
2 2017-01-15 02:39:51 3 android
: : : :

これを元に下記のクエリをre:dashで定期的に回しています。 (やたら長くなってしまってすみません笑)

ここでのポイントは、
① WITHを使ってネストを浅くして、可読性を上げる。
② OSごとに出す(日付とOSでまとめたデータを、縦持ちから横持ちに変換する)
③ データ欠損などによる日付の歯抜けに対応する。

普通に出力する分には3.の部分までで終わりなのですが、万が一計測がバグで止まっていて日付に歯抜けが発生する場合などに備えて、4,5で対処しています。

カレンダーテーブル作成については、最初generate_series関数を使ってやろうと思ったのですが、エラーになったので、ROW_NUMBER() OVER () で連番を出すことで対応しました。(このあたり他にうまいやり方あったら教えてください)

結果こんな感じになります。日ごとにios, androidそれぞれの一人あたり閲覧数が出力されるので、これをチャートにすればいいわけですね。

date ios android
2017-01-01 XXXX XXXX
2017-01-02 XXXX XXXX
2017-01-03 XXXX XXXX
2017-01-04 XXXX XXXX
2017-01-05 XXXX XXXX
: : :

以上、簡単ではありますが、RoomClipプロダクトチームのKPIと数値取得の方法についてお話ししました。 今後は、個々の施策に踏み込んだ話や細かい計測周りについてまたお話しできればと思っております!

またどうぞよろしくお願いします。


この記事を書いた人:高橋弘

RoomClipでアプリの開発及びUI/UXの設計、サービス成長のための施策の打ち出しなどのプロダクト改善を担当しています。


AWS DMSでMySQL(RDS)とRedshiftをリアルタイム同期させてみた

こんにちは、Tunnelでエンジニアをしている谷(naotee)です。

RedShiftはwindow関数が使えますし、大量のレコードがあったとしても、集計や分析系のクエリが早く返ってきて便利ですよね。 また、RedShiftに突っ込んだログ系のデータのidの詳細を持っているのがMySQLなんですが、JOINさせる際にできる限り新しいデータで見れる方が良いですよね。 ということで、今回AWS DMSのOngoind Replicationを利用し、MySQL(RDS)とRedshiftをリアルタイム同期させてみました。

DMSとは

「AWS Database Migration Service は、広く普及しているほとんどの商用データベースとオープンソースデータベース間のデータ移行にご利用いただけます。」

AWS Database Migration Service(データベースを簡単かつ安全に AWS へ移行) | AWS

DMSを利用するにあたって必要なもの

  • 同期元DB(source endpoint)
  • 同期先DB(target endpoint)
  • DMS用ec2インスタンス

上記3つは全て同じリージョンである必要があります。 弊社のMySQL(RDS)は東京リージョンに、RedShiftはコスト対策のためバージニアにありましたので、 MySQL(RDS)のクロスリージョンレプリカを利用してバージニアに同期元DBを設置し、バージニアでDMSを設定しました。

同期(タスク)の種類は3つあります。

  • migrate existing data(初期転送のみ)
  • migrate existing data and replicate ongoing changes(初期転送後、差分転送開始)
  • replicate data changes only(差分転送のみ)

今回はRedShiftに0から同期するので「migrate existing data and replicate ongoing changes(初期転送後、差分転送開始)」をタスクで指定します。

DMSの画面での作業の流れ

「Get started」に従うと下記のような流れになります。「cancel」をクリックして、個別に設定することもできます。

  • sourceとtargetにアクセス可能なレプリケーションインスタンスを立ち上げます
  • endpointのsourceとtargetを指定します
  • taskを指定します

MySQL(RDS)で注意が必要な設定

MySQL(RDS)で差分転送を利用するためにはbinログの設定が必要となります。下記を参照ください。

MySQL 互換データベースの AWS Database Migration Service のソースとしての使用

エラー事例

「Check 'stl_load_errors' system table for details. [122502] ODBC general error. (ar_odbc_stmt.c:4063)」というエラーが出たため、stl_load_errorsテーブルを確認すると「Invalid timestamp format or value [YYYY-MM-DD HH24:MI:SS]」というメッセージを確認しました。 MySQLにある0000-00-00 00:00:00というレコードを適切なものに修正すればエラーがなくなりました。

運用中のエラー検知について

タスクがエラーとなって止まった時の検知方法ですが、 AWSのサポートセンターに確認しましたところ、直接アラートを上げる方法ないみたいです。

大きく2つのやり方を紹介してもらいました。

1.AWS CLI にてレプリケーションタスクの状態を取得する方法

例:「aws dms describe-replication-tasks --filter Name=replication-task-id,Values=[レプリケーションタスクID]」

ただし、値を検知してアラートを上げる仕組みを構築する必要があります

2.DMSで出力しているCloudWatchのログから、フィルタパターンに例えば「"]E:"」を指定するようなカスタムメトリックスを作成し、アラームを利用して検知する方法

やってみて

運用中2回停止したことがあり、本番環境から直接参照するデータベースに同期先データベースを利用することは要検証かと思いますが、日々の数値確認や、バッチ処理によるデータ作成のときに利用するには十分活用できると感じました。

参照サイト


この記事を書いた人:naotee

エンジニアのnaoteeです。 サーバーまわりやwebまわりを触っています。データーまわり触るの好きです。