Generalized Bass Model: Diffusion Prediction Considering Marketing Mix

Introduction

In the previous article, we introduced the Bass Model, which explains the diffusion process of new products. The standard Bass Model makes the implicit assumption that “market conditions (such as price and advertising) are constant”. However, in reality, marketing measures (marketing mix) such as:

  • Launching a large-scale advertising campaign immediately after release
  • Reducing the price (price down) midway

significantly affect the speed of diffusion.

The Generalized Bass Model (GBM) incorporates these dynamic factors into the model. This article explains the theory of GBM and simulation using Python (verifying the effects of price reductions and advertising campaigns).

Source Code

GitHub

  • The Jupyter Notebook file is available here

Google Colaboratory

  • To run on Google Colaboratory, click here

Execution Environment

The OS is macOS. Note that the options may differ from Linux or Unix commands.

!sw_vers
ProductName:		macOS
ProductVersion:		15.5
BuildVersion:		24F74
!python -V
Python 3.14.0

Import necessary libraries. Since GBM can be difficult to solve analytically in some cases (when marketing variables change in complex ways), we will use numerical integration (odeint) for simulation this time.

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

# Graph style settings
plt.style.use('seaborn-v0_8-darkgrid')

1. Theory of Generalized Bass Model (GBM)

The Generalized Bass Model, proposed by Bass, Krishnan, & Jain (1994), adds a term $x(t)$ representing current marketing effort to the standard Bass Model.

1.1 Differential Equation

$$ \frac{dN(t)}{dt} = \left( p + q \frac{N(t)}{M} \right) (M - N(t)) \cdot x(t) $$

Here, $x(t)$ is a function representing the effect of marketing variables, defined as follows:

$$ x(t) = 1 + \beta_P \frac{P’(t)}{P(t)} + \beta_A \frac{A’(t)}{A(t)} $$

More simply, it can be thought of as “the multiplier of current effort relative to the baseline marketing effort”.

  • $x(t) = 1$: Normal state (same as standard Bass Model)
  • $x(t) > 1$: Diffusion accelerates due to aggressive measures (price cuts, increased advertising)
  • $x(t) < 1$: Diffusion slows down due to headwinds (price hikes, decreased advertising)

2. Simulation with Python

Now, let’s simulate how the diffusion process changes under several scenarios.

2.1 Model Implementation

Define a function to perform numerical integration.

def gbm_ode(N, t, M, p, q, marketing_func):
    """Differential equation of Generalized Bass Model"""
    x_t = marketing_func(t)
    dNdt = (p + q * N / M) * (M - N) * x_t
    return dNdt

def solve_gbm(M, p, q, marketing_func, t_points):
    """Execute numerical integration and return N(t) and n(t)"""
    # Initial value N(0) = 0
    N0 = 0

    # Calculate cumulative adopters N(t) with odeint
    N_sol = odeint(gbm_ode, N0, t_points, args=(M, p, q, marketing_func))
    N_t = N_sol.flatten()

    # Calculate new adopters n(t) (substitute into differential equation)
    # Note: odeint results are discrete points, so calculate the slope at those points
    n_t = np.array([gbm_ode(n, t, M, p, q, marketing_func) for n, t in zip(N_t, t_points)])

    return N_t, n_t

2.2 Scenario Settings

We compare the following three scenarios:

  1. Base Case: $x(t) = 1$ (Standard Bass Model)
  2. Price Drop: Price is lowered at $t=10$, accelerating diffusion ($x(t)$ permanently increases from 1.0 to 1.5)
  3. Ad Campaign: Strong advertising is run only between $t=5$ and $t=8$ ($x(t)$ temporarily becomes 2.0)
# Parameters
M = 10000
p = 0.01
q = 0.3
t_max = 30
t_points = np.linspace(0, t_max, 300)

# Definition of marketing function x(t)

def x_base(t):
    return 1.0

def x_price_drop(t):
    # Effect becomes 1.5 times after t=10
    return 1.5 if t >= 10 else 1.0

def x_ad_campaign(t):
    # Effect becomes 2.0 times between t=5~8
    return 2.0 if 5 <= t <= 8 else 1.0

# Run simulation
results = {}
scenarios = {
    'Base Case': x_base,
    'Price Drop (t>=10)': x_price_drop,
    'Ad Campaign (t=5-8)': x_ad_campaign
}

for name, func in scenarios.items():
    N, n = solve_gbm(M, p, q, func, t_points)
    results[name] = (N, n)

2.3 Visualization of Results

Plot the transition of the number of new adopters $n(t)$ for each scenario.

plt.figure(figsize=(10, 6))

colors = ['gray', 'tab:blue', 'tab:red']
linestyles = ['--', '-', '-']

for (name, (N, n)), color, ls in zip(results.items(), colors, linestyles):
    plt.plot(t_points, n, label=name, color=color, linestyle=ls, lw=2)

plt.title('Generalized Bass Model Simulation: New Adopters n(t)')
plt.xlabel('Time')
plt.ylabel('New Adopters')
plt.legend()
plt.show()

Discussion

  • Base Case (Gray): Draws a smooth bell shape.
  • Price Drop (Blue): At the moment $x(t)$ rises at $t=10$, the number of adopters jumps up, and thereafter it transitions at a higher level than the base, bringing the peak earlier.
  • Ad Campaign (Red): Adoption increases rapidly only during the campaign period ($t=5\sim8$), but after the campaign ends, it may fall below the base as a reaction (cannibalization of future demand).

Conclusion

By using the Generalized Bass Model, it becomes possible to quantitatively evaluate and predict the impact of corporate strategic actions on the market, not just natural diffusion.

In actual business, using past sales data and transition data of prices and advertising costs, one can estimate $p, q$ and the elasticity of marketing variables, which can be useful for future policy planning.