1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

準双曲割引モデルを用いてログインボーナスのユーザの継続率への貢献度を可視化してみた

1
Posted at

本記事は、QualiArts Advent Calendar 2025 の9日目の記事です。

バックエンドエンジニアの木村です。
本記事では準双曲割引モデルを紹介しながら、ソシャゲのログインボーナスがユーザの継続率にどう影響するのかを可視化してみたいと思います。

準双曲割引モデルとは

【質問A】どっちを選びますか?

  • 今日、10,000円もらう
  • 明日、10,100円もらう

【質問B】どっちを選びますか?

  • 1年後、10,000円もらう
  • 1年と1日後、10,100円もらう

多くの人は質問Aにはを、質問Bにはを選択すると思います。準双曲割引モデルとは現在と将来を明確に断絶しながら、現在の報酬よりも将来の報酬を割引いて評価する行動経済学で扱われるモデルです。ある時点$t$における個人の効用$U_t$は一般的に以下のように表すことができます。

U_t = u_0 + \beta\sum_{t=1}^Tδ^tu_t

ここで$\beta$は現在バイアス(現在の効用と比べて将来の効用を非合理に低く見積もる)を、$δ$は割引因子を表します。

パラメータ 用語 性質
$\beta$ 現在バイアス 現在と比べて、将来の効用を過度に低く見積もる性質
$δ$ 割引因子 時間経過に伴い、将来の価値を一定率で割り引く性質

同じような行動経済学の用語で指数割引モデルがあり、一般的に以下のような式で表すことができます。

U_t = u_0 + \sum_{t=1}^Tδ^tu_t

準双曲割引モデルとの違いは将来の効用に対して、さらに現在バイアスで割り引くかどうかです。
現在バイアスがなければ、将来のある時点$t$と$t+1$には$δ$の違いしかないため、上の質問A、質問Bの両方に②と答えることになります。(1日待てば100円増えるという条件はどちらも同じである)
現在バイアスがあることによって、将来のある時点$t$と$t+1$($t>0$)には$δ$の違いしかないが、$t=0$の場合では$\betaδ$の違いが出てしまうため質問Aに対して①と答えてしまいます。(1日待てば100円増えるという条件はどちらも同じであるにもかかわらず)
このように準双曲割引モデルは人間の直感的な効用の評価をより正確に表したモデルになっています。

シミュレーションしてみる

今回はある時点における効用を以下のように定義してシミュレーションしてみたいと思います。

U_t = (b_0 + b_1 + b_2) + \beta \sum_{k=1}^{14} \delta^k u_{t+k} \quad (t = 0, 1, \dots, 180)

ここで$b_0$はゲームの面白さや課金によるサンクコストなどによるユーザの効用($b_0 > 0$)を、$b_1$はログインボーナスによるユーザの効用($b_1 > 0$)を、$b_2$はログインコスト($b_2 < 0$)を表します。
また、ユーザは自身の効用を短期間で評価すると仮定して、将来の価値の算出期間を2週間に設定します。

パラメータ設定

実際のソシャゲに近い環境を作るために、メインユーザ(ゲームの面白さや課金によるサンクコストなどによる効用が高い)が1,000人(全体の10%)、ライトユーザ(前述の効用が低い)が9,000人(全体の90%)とし、一週間でジュエルとアイテムとコインを各曜日で受け取れることとします。

# -------------------------------
# 1. パラメータ設定
# -------------------------------
SIMULATION_DAYS = 180
LOOK_AHEAD_DAYS = 14

# ユーザ数
N_MAIN_USERS = 1000
N_LIGHT_USERS = 9000

# 共通パラメータ
COST_LOGIN = 50

# ログボ設定(変更なし)
UTILITY_JEWEL = 100
UTILITY_ITEM = 70
UTILITY_COIN = 50

ユーザ分布生成

ライトユーザに比べてメインユーザはゲーム自体から得る効用が高く、現在バイアスや割引因子は1に近い(将来の効用を高く見積もる)ことがわかります。

# メインユーザ
MAIN_BASE = {
    # 現在バイアス
    "beta": 0.90,
    # 割引因子
    "delta": 0.99,
    # ゲームの面白さの初期値
    "u_init_mean": 150,
    # ゲームの面白さの減衰率
    "decay_mean": 0.9995
}

# ライトユーザ
LIGHT_BASE = {
    # 現在バイアス
    "beta": 0.60,
    # 割引因子
    "delta": 0.80,
    # ゲームの面白さの初期値
    "u_init_mean": 60,
    # ゲームの面白さの減衰率
    "decay_mean": 0.995
}

def generate_user_params(n, base_params):
    u_inits = np.random.normal(base_params["u_init_mean"], 25, n)
    decays = np.random.normal(base_params["decay_mean"], 0.005, n)
    decays = np.clip(decays, 0.90, 0.9999)
    return {
        "beta": base_params["beta"],
        "delta": base_params["delta"],
        "u_inits": u_inits,
        "decays": decays
    }

シミュレーション

ログボによるユーザの継続率への貢献度を測定するために、ログボがもらえる場合と貰えない場合の2パターンでシミュレーションを行います。

以下、実際のシミュレーションを行う関数です。
$t > 0$では上で示したモデルにより、14日後までのゲームの面白さによるユーザの効用が割引因子params["delta"]によって割引かれて評価されてしまい、さらに将来のある時点$t$の効用が現在バイアスparams["beta"]によって過度に低く評価されているのがわかります。
現在の自身の効用がマイナスになればユーザはゲームから離脱します。

# -------------------------------
# 2. シミュレーション実行関数
# -------------------------------
def run_simulation(n_users, params, has_logbo):
    is_active = np.ones(n_users, dtype=bool)
    retention_rates = []

    current_utilities = params["u_inits"].copy()
    decays = params["decays"]

    for t in range(SIMULATION_DAYS):
        if t > 0:
            weekday = t % 7
            bonus_utility = 0
            if has_logbo:
                if weekday in (0, 2, 4):
                    bonus_utility = UTILITY_ITEM
                elif weekday in (1, 3, 5):
                    bonus_utility = UTILITY_COIN
                elif weekday == 6:
                    bonus_utility = UTILITY_JEWEL

            today_utility = current_utilities + bonus_utility - COST_LOGIN

            future_values = np.zeros(n_users)
            temp_utils = current_utilities.copy()
            for k in range(1, LOOK_AHEAD_DAYS + 1):
                temp_utils = temp_utils * decays
                step_val = temp_utils - COST_LOGIN
                future_values += (params["delta"] ** k) * step_val

            decision_scores = today_utility + params["beta"] * future_values
            is_active = is_active & (decision_scores >= 0)

        retention_rates.append(np.sum(is_active) / n_users * 100)
        current_utilities = current_utilities * decays

    return retention_rates

シミュレーション結果

このシミュレーションを回した結果が以下の画像です。
メインユーザはゲーム自体からくる効用の影響が高いため、ログインボーナスの有無によって継続率には大きな差はありません。
ライトユーザに関してはログインボーナスの有無によって継続率に14%の差があることがわかります。
ライトユーザは将来のゲームの面白さをメインユーザに比べて大きく割引いてしまうため、効用がログインコストのマイナスの影響を大きく受けてしまい継続率が低くなりますが、ログインボーナスがあることによってログインボーナスがないユーザと比べて得られる効用が大きくなり継続率が高くなっています。
このようにログインボーナスはライトユーザに対してゲームの継続率を高めるというプラスの効果を発揮しています。
retention_final_4lines.png

最後に

本記事では準双曲割引モデルを用いて、行動経済学の視点からログインボーナスの有効性を可視化してみました。

直感的には効果がありそうと感じるような施策でもモデルに落とし込むことで見ただけでわかりやすく効果を説明することができます。

今回は準双曲割引モデルの挙動を確認できるように調整したパラメータを用いましたが、実際の運用においては行動ログやKPIの数値などから適切なパラメータを推定することでより精度の高い分析が可能になるかもしれません。

最後まで読んでいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?