inFablic | Fablic, inc. Developer's Blog.

フリマアプリ フリル (FRIL) を運営する Fablic の公式開発者ブログです。Fablic のデザイナー・エンジニア・ディレクターが情報発信していきます。

CM投下量からAppStoreのランキング順位を予測する

こんにちは。shobyです。

フリルでは定期的に全国でCMを放送しており、各CMについて分析を行っています。

今回は、CM投下量からAppStoreのランキング順位を予測する方法をご紹介します。

概要

  • CMの効果予測とランキング
  • CMとAppStoreランキングの関係
  • インストール数によるランキング順位の予測
  • 線形回帰によるモデル化
  • 線形回帰による学習と予測
  • フリルでの活用例

CMの効果予測とランキング

CMの効果予測においては、ランキングによる効果は不確定要素の一つであり、予測を不正確なものにする原因の一つです。*1 そのため、ランキングによる効果を単独で予測し、CM全体の効果予測の正確性を上げることを目指します。

CMとAppStoreランキングの関係

CMを放送した場合、インストール数が増加し、それによりAppStoreのランキングも上昇することが知られています。

そのため、以下をそれぞれモデル化することができれば、CM投下量を元に、ランキング順位を予測することができます。

  • CM投下量によるインストール数の予測
  • インストール数によるランキング順位の予測

今回は特にインストール数によるランキング順位の予測を行うことを考えます。

CM投下量によるインストール数の予測に関しては、こちらの記事をご覧ください。

in.fablic.co.jp

インストール数によるランキング順位の予測

AppStoreのランキングの仕組みをモデル化し、インストール数によりランキング順位がどうなるかを予測します。

AppStoreランキング順位は、主にインストールやDAU、評価などを元にしたアルゴリズムで構築されていると考えられています。 このうち特にインストール数はランキングに与える影響が大きいと考えられているため、今回は特にインストール数とランキング順位の関係をモデル化し、インストール数からランキング順位の概算値を予測することを考えます。

今回は、線形回帰を使って、モデル化を行います。

線形回帰によるモデル化

線形回帰によりインストール数とランキング順位の関係をモデル化します。

線形回帰とは、複数の変数間の関連性を表すための分析手法です。*2

線形回帰によるモデル化を行う際には、変数間の関係性を適切に表す多項式を選ぶ必要があります。 今回は概算値を求めるのが目標であるため、簡易化のために、日別のランキング順位とインストール数の2変数で線形回帰を行いました。*3

ランキング順位とインストール数に関しては、図示するとおおよそ反比例の関係にあることがわかります。

f:id:shoby:20171006115432p:plain

そのため、今回はランキング順位yとインストール数xに関して、以下の多項式を用いて線形回帰を行いました。*4

 \displaystyle
y = \theta_0 + \theta_1x^{-1}

この数式におけるパラメータである \theta_0\theta_1を求めることで、予測を行います。

線形回帰による学習と予測

scikit-learnを用いて線形回帰を行います。実際のコードが以下の通りです。

import numpy as np
import pandas as pd
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score

# データセット。1カラム目にx、2カラム目にyが入っている
dataset = pd.read_csv('ranking.csv').values

# 教師データとテストデータの閾値。7:3に分ける
threshold = int(len(dataset) * 0.7)

# 多項式に合わせてxを1/xに加工
x_train = 1/dataset[:threshold, 0]
y_train = dataset[:threshold, 1] 
x_test = 1/dataset[threshold:, 0]
y_test = dataset[threshold:, 1]

# xを[n_samples,n_features], yを[n_samples, n_targets]にreshape
x_train = x_train.reshape(len(x_train), 1)
y_train = y_train.reshape(len(y_train), 1)
x_test = x_test.reshape(len(x_test), 1)
y_test = y_test.reshape(len(y_test), 1)

# 学習
model = linear_model.LinearRegression()
model.fit(x_train, y_train)

# テストデータを用いた予測
y_predict = model.predict(x_test)

# 精度評価
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_predict))
print('Variance score: %.2f' % r2_score(y_test, y_predict))

LinearRegressionモデルを用いて、学習をした上で、Mean squared errorおよびr2_scoreを用いて精度評価を行なっています。

学習したモデルを元に、入力値に対して再度予測を行い、正解と共にプロットしたのが以下の図になります。

f:id:shoby:20171006161500p:plain

厳密ではありませんが、概ね傾向を捉えられているのが確認できるかと思います。

このインストール数とランキング順位に関するモデルを、CM投下量によるインストール数の予測モデルと組み合わせることで、CM投下量からランキング順位を予測することができるようになります。

フリルでの活用例

フリルでは、CM投下量からAppStoreのランキング順位を予測できるようになったことで、不確定だったランキングの効果も含めたCMの効果予測を行うことができるようになりました。

iOS 11からはAppStoreの構成も代わり、ランキングの効果が変わると予想されるため、予測と比べてどうだったか比較することで、ランキング効果の変化も分析していく予定です。

まとめ

CM投下量によるインストール数の予測と、インストール数によるランキング順位の予測を行うことができれば、CM投下量からランキング順位を予測することができます。 インストール数とランキング順位に関しては、線形回帰を用いて大まかな傾向を掴む予測をすることが可能です。

これにより、フリルでは不確定だったランキングの効果を含めた予測を行うことができるようになりました。

参考

Linear Regression Example — scikit-learn 0.19.0 documentation

*1:ランキング経由の流入は、順位が上がるほど指数関数的に増加するため、ランキングの順位によって、CMのKPIの一つであるオーガニックインストール数が大きく影響を受けます。

*2:https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0

*3:正確な予測や、ランキングアルゴリズムの特定が目標であれば、1日前、2日前のインストール数や、DAU、評価などを変数として組み入れると良いと思います。

*4:CouseraのMachineLearningコースに準拠した形式で記述しましたが、より簡単な書き方をすると y = \frac{a}{x} + bという単純な反比例を表す数式です