Video game sales depend on genre, platform and release year, and those inputs overlap. A platform that was popular in one era also carried certain genres, so a plain comparison of averages mixes them together.
Regression analysis is one way to separate them. This page shows ordinary least squares (OLS) regression on a made-up example you can run, and explains how to read the output: which genres and platforms are associated with higher sales per title, after accounting for release year.
This is not about proving one console was "better" than another. It is about describing which factors (genre, platform, release year) are associated with sales, so decisions rest on evidence rather than guesswork.
Worked Example (Simulated): Genre, Platform and Year on Sales
Question: In made-up game data, how do genre, platform, and release year relate to sales per title?
Inputs: Simulated data, seed 23. The script makes one row per title, with genre, platform, year, and sales. It builds in these effects: Sports +0.35 and RPG -0.20 against Action, Beta +0.40 against Alpha, and +0.08 per year, plus random noise with standard deviation 0.45. It then fits ordinary least squares (OLS), a method that estimates the average link between each input and sales while holding the other inputs fixed.
Method: Action, Alpha, and year 2020 form the base case. The model estimates changes from that base for Sports, RPG, Beta, and each later release year. The script gives approximate 95% intervals from the OLS standard errors.
import numpy as np
SEED = 23
N = 240
rng = np.random.default_rng(SEED)
genres = np.array(["Action", "Sports", "RPG"])
platforms = np.array(["Alpha", "Beta"])
years = rng.integers(2020, 2024, size=N)
genre = rng.choice(genres, size=N, p=[0.50, 0.30, 0.20])
platform = rng.choice(platforms, size=N, p=[0.55, 0.45])
noise = rng.normal(0, 0.45, size=N)
sales = (1.20 + 0.35 * (genre == "Sports") - 0.20 * (genre == "RPG")
+ 0.40 * (platform == "Beta") + 0.08 * (years - 2020) + noise)
sales = np.maximum(sales, 0)
# Model: sales ~ intercept + Sports + RPG + Beta + centered year.
X = np.column_stack([
np.ones(N),
(genre == "Sports").astype(float),
(genre == "RPG").astype(float),
(platform == "Beta").astype(float),
years - 2020,
])
beta, _, _, _ = np.linalg.lstsq(X, sales, rcond=None)
pred = X @ beta
resid = sales - pred
df = N - X.shape[1]
sigma2 = (resid @ resid) / df
cov = sigma2 * np.linalg.inv(X.T @ X)
se = np.sqrt(np.diag(cov))
r2 = 1 - (resid @ resid) / ((sales - sales.mean()) @ (sales - sales.mean()))
print(f"Simulated data, seed {SEED}")
print(f"Rows: {N}; outcome: simulated sales units per title")
print("Predictors: genre, platform, release year")
print(f"Mean simulated sales: {sales.mean():.3f}")
print(f"OLS R-squared: {r2:.3f}; residual df: {df}")
names = ["Intercept (Action, Alpha, year 2020)", "Sports vs Action",
"RPG vs Action", "Beta vs Alpha", "Per year"]
for name, value, err in zip(names, beta, se):
lo, hi = value - 1.96 * err, value + 1.96 * err
print(f"{name}: {value:.3f}; approximate 95% interval [{lo:.3f}, {hi:.3f}]")
Printed output:
Simulated data, seed 23
Rows: 240; outcome: simulated sales units per title
Predictors: genre, platform, release year
Mean simulated sales: 1.543
OLS R-squared: 0.256; residual df: 235
Intercept (Action, Alpha, year 2020): 1.265; approximate 95% interval [1.148, 1.382]
Sports vs Action: 0.170; approximate 95% interval [0.045, 0.295]
RPG vs Action: -0.249; approximate 95% interval [-0.396, -0.103]
Beta vs Alpha: 0.414; approximate 95% interval [0.301, 0.526]
Per year: 0.067; approximate 95% interval [0.018, 0.116]
Result: The script builds in Sports +0.35, RPG -0.20, Beta +0.40 and +0.08 per year. In this run, the Sports estimate is 0.170 sales units above Action, with an interval from 0.045 to 0.295. That interval misses the built-in 0.35, which happens by chance in some runs. The Beta estimate is 0.414 above Alpha, with an interval from 0.301 to 0.526. The model R-squared is 0.256, so the inputs account for only part of the spread in the simulated sales.
Limit: This is made-up data with a simple model. It does not show what real games will sell.
Sources
- Wasserstein R, Lazar N (2016), The ASA statement on p-values: context, process, and purpose, The American Statistician, doi 10.1080/00031305.2016.1154108. Cited only to show that the American Statistical Association published a statement on p-values in 2016.
The Question This Analysis Answers
Before running any regression, define the research question. Here's what video game sales trend and regression analysis tells you:
Primary question: Which game genres and platforms are associated with higher global sales, after controlling for release year and market timing?
Secondary questions:
- How much of the variance in sales can we explain with observable features (genre, platform, year)?
Note what this analysis doesn't answer: it won't tell you whether Mario Kart is "better" than Gran Turismo, or whether your indie game will succeed. Regression identifies patterns in historical data. Causation requires experiments: randomized tests where you control genre, platform, and marketing while holding everything else constant. Good luck getting Nintendo to randomize their next release for your study.
Why Use Regression Instead of Simple Comparisons?
You could calculate average sales by genre and call it a day. "Action games average more sales than Puzzle games, so Action wins!" But that comparison is confounded.
What if Action games were mostly released on a popular platform in a strong sales year, while Puzzle games launched on a niche platform after the market declined? You'd be comparing apples (releases in a strong market) to oranges (releases in a weak one).
Ordinary Least Squares (OLS) regression controls for these confounds. It estimates the independent effect of each genre while holding platform and release year constant. The model asks: "If two games launched the same year on the same platform, how much more would the Action game sell than the Puzzle game, on average?"
This compares like with like within observational data. It describes associations and does not show cause.
How OLS Regression Works for Video Game Sales
The regression model predicts Global_Sales (in millions) as a function of categorical variables:
Global_Sales = β₀ + β₁(Genre) + β₂(Platform) + β₃(Year) + ε
Where:
- β₀ (intercept): Expected sales for the baseline category (typically the most common genre/platform)
- β₁ (Genre coefficients): How much each genre adds/subtracts from baseline sales
- β₂ (Platform coefficients): How much each platform adds/subtracts from baseline sales
- β₃ (Year coefficient): Linear time trend (positive = growing market, negative = declining)
- ε (residual): Unexplained variance (game quality, marketing, IP strength, luck)
Because genres and platforms are categorical (not continuous numbers), the model uses dummy variable encoding. If there are 12 genres, you create 11 binary variables (Genre_Sports, Genre_RPG, etc.), leaving one as the reference category. The coefficients then represent differences relative to that baseline.
Example interpretation: If Genre_Sports has a coefficient of +1.2M with p < 0.001, it means Sports games sold 1.2 million more copies than the baseline genre (say, Action) in these data, holding platform and year constant. A p-value alone does not show that a pattern is real. Report the estimated effect and its uncertainty, and state the null model used.
What P-Values Actually Mean
A p-value < 0.05 is the chance, if the stated null model is true, of seeing data at least as extreme as these data. It does not show that an effect is real or that chance is the cause.
But don't worship p-values. With a very large dataset, even tiny effects can get small p-values. Ask: Is the effect large enough to matter? A coefficient of +0.05M (50K units) might have a small p-value but be irrelevant for business decisions. Look at effect sizes, not just p-values.
Reading the Coefficients
Each coefficient is a difference from the base case, in the units of the outcome. In the worked example, "Sports vs Action" is the estimated change in sales for a Sports title against an Action title with the same platform and year. Values above zero mean higher estimated sales than the base case, and values below zero mean lower.
The base case matters. The model uses one category per input as the reference (here Action, Alpha and year 2020), so every other category is compared to it. Change the reference and the coefficients change, though the fitted model does not.
Release year is a confounder. Market size changes over time, so a mediocre game launched in a strong year can outsell a better game from a weak one. That is why the model includes year as an input: it accounts for the time trend, so genre and platform are compared within the same period.
How to Interpret Your Results
You've run the analysis. Now what? Here's how to translate regression output into business decisions:
1. Separate Statistical Significance from Practical Importance
A coefficient can be "significant" (p < 0.05) but too small to matter. If Genre_Adventure has a coefficient of -0.05M (p = 0.03), it's statistically distinguishable from zero, but 50,000 units is a rounding error for a AAA game. Focus on effect sizes, not just p-values.
2. Remember What "Controlling For" Means
When the regression says "Sports games sell more than the baseline genre, controlling for platform and year," it means: if you compare two games released the same year on the same platform, and one is Sports while the other is the baseline genre, the Sports game averages more sales, by the size of the coefficient.
This isn't a guarantee. The coefficient is an average effect across all games in the dataset. Your specific game will vary based on quality, marketing, IP strength, and competition.
3. Check the R² (Model Fit)
The regression report should include an R² value: the proportion of variance in sales explained by the model. If R² = 0.40, it means genre, platform, and year explain 40% of the variation in sales. The other 60% is unexplained (residual variance).
In the worked example above, R² is 0.256. A low R² is common when the model doesn't capture game quality, marketing budget, critical reviews, IP recognition, competitive releases, or random viral success. Those factors drive huge variance but aren't in the dataset.
A low R² doesn't make the analysis useless. It just means genre and platform are only part of the story. Use regression for directional guidance ("Sports games tend to outperform Puzzle games"), not precise prediction ("this Sports game will sell exactly 1.2M units").
4. Beware Survivorship Bias
The dataset includes games that made it to retail and sold enough units to be tracked. Canceled projects and very small releases may not be here. The coefficients reflect conditional effects: among games that shipped and got distribution.
If you're deciding whether to greenlight a project, regression can't tell you the probability of shipping. It only tells you: conditional on shipping, which genres/platforms performed better historically.
5. Use Regional Breakdowns for Localization Decisions
If you are considering a release in one region, run a separate regression on that region's sales column (for example JP_Sales instead of Global_Sales) to see which genres over- or under-perform in that market. Regional sales alone do not show player preferences or the cause of any difference.
A genre with a positive global coefficient can have a negative coefficient in one region. That is a reason to look at the regional numbers before you plan around the global one.
When This Analysis Fails (And What to Use Instead)
Video game sales regression works well for exploratory analysis and benchmarking. But it has limits:
Limit 1: Can't Predict Hit Games
The model tells you genre/platform averages, not whether your specific game will succeed. Quality, marketing, reviews, and timing matter more than genre.
What to use instead: Pre-launch testing. Run closed betas, measure engagement metrics (session length, retention, virality), and use cohort retention analysis to forecast long-term player value.
Limit 2: Doesn't Account for Marketing Spend
A AAA game with a $100M marketing budget will outsell an indie game with $10K spend, even if both are the same genre/platform. The regression attributes the difference to unobserved factors (residual variance), not marketing.
What to use instead: If you have marketing spend data, add it as a predictor. Run a multiple regression: Sales ~ Genre + Platform + Year + Marketing_Spend. The coefficient on marketing tells you ROI (how many additional sales per dollar spent).
Limit 3: Historical Patterns Don't Guarantee Future Performance
Digital distribution, free-to-play models, live-service games, and mobile gaming have changed the market. A regression on retail data from one era won't predict a later one.
What to use instead: If analyzing modern games, use recent data that includes digital sales, microtransactions, and platform-specific metrics (Steam player counts, console achievement percentages). Or better: run A/B tests on pricing, store page design, and trailer variants to generate causal data.
Limit 4: Can't Distinguish Correlation from Causation
The regression controls for observed confounds (year, platform, genre), but not unobserved ones. Maybe Sports games sell well because EA and 2K dominate the genre with massive budgets and exclusive licenses (NFL, FIFA). The genre coefficient might actually be a "big publisher" coefficient in disguise.
What to use instead: For true causal inference, you need experiments. Randomly assign games to different genres (impossible), or run A/B tests on controllable factors (pricing, discounts, trailer messaging). Regression is descriptive inference, not causal proof.
Best Practices for Running Your Own Analysis
If you're applying this method to your own sales data, follow these guidelines:
1. Clean Your Data First
Check for missing values, duplicates, and outliers. If some games have missing genre tags, either drop them or impute a category (not recommended, introduces bias). If one game sold far more than the rest, decide whether to include it (keeps the data realistic) or exclude it (prevents one game from dominating the regression).
2. Use Categorical Encoding, Not Ordinal Numbers
Don't code genres as Genre=1 (Action), Genre=2 (Sports), etc. That implies "Sports is twice Action," which is meaningless. Use dummy variables: create binary columns is_Action, is_Sports, etc. Most regression software (Python's statsmodels, R's lm) handles this automatically with pd.get_dummies() or factor().
3. Test for Multicollinearity
If two predictors are highly correlated (e.g., Year and Platform, because certain platforms only existed in certain years), the regression can't separate their effects. Check Variance Inflation Factors (VIF). If VIF > 10, consider dropping one predictor or combining correlated variables.
4. Check Residual Plots
After fitting the model, plot residuals (observed sales - predicted sales) against predicted sales. The plot should look like random noise. If you see patterns (e.g., residuals increase with predicted sales), the model is mis-specified: maybe you need to log-transform sales or add interaction terms (Genre × Platform).
5. Hold Out Data to Check the Model
Don't evaluate the model on the same data you used to train it. Hold out part of the games as a test set. Fit the regression on the rest, then predict sales for the test set. Compare predicted vs. actual. If test-set R² is much lower than training R², the model is overfitting.
6. Report Confidence Intervals, Not Just Coefficients
Every coefficient has uncertainty. If Genre_Sports = +0.35M with a 95% CI of [+0.10M, +0.60M], you're confident the true effect is positive, but it could be anywhere from small (+0.10M) to large (+0.60M). Wide intervals mean "we don't have enough data to pin down the effect precisely."
The Difference Between This and A/B Testing
Some readers are thinking: "Why not just A/B test? Release the same game in two genres and see which sells better."
Because you can't randomize genre. A game's genre is baked into its design. You can't take Call of Duty, randomly assign half the audience to experience it as a Shooter and half as a Strategy game, then compare sales. Genre isn't a treatment you can manipulate. It's an inherent property.
A/B testing works for factors you can randomize: pricing ($19.99 vs. $29.99), trailer variants (action-focused vs. story-focused), store page headlines, discount timing. For those, run experiments. Test which price maximizes revenue, or which trailer drives more wishlists.
But for genre, platform, and other design-locked factors, regression is one option. It's observational, not experimental, so it can't prove causation.
When You CAN Run Experiments in Gaming
Live-service games enable true A/B tests. If you run a multiplayer game, you can randomize players into test groups:
- Pricing tests: Offer 50% of new players a $4.99 starter pack, 50% a $9.99 pack. Measure revenue per user.
- Reward tests: Give Group A daily login bonuses, Group B weekly bonuses. Measure retention.
- Difficulty tests: Randomize tutorial difficulty. Measure completion rates and Day-7 retention.
These are causal tests. The effect you measure is the effect of the treatment, because you randomized who got it. For pre-launch design decisions (genre, platform, art style), you're stuck with observational data and regression.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
FAQs: Video Game Sales Regression Analysis
What's the difference between correlation and causation in video game sales analysis?
Correlation shows that two variables move together (like "games on one platform sold well"), but doesn't explain why. Causation requires controlled comparison. OLS regression helps by controlling for confounds like release year, so Action and Puzzle games can be compared after accounting for platform and timing. It is not a randomized experiment, so it describes patterns and does not prove cause.
Why does the regression use categorical encoding for genres and platforms?
Because genres and platforms aren't continuous numbers. There's no meaningful difference between "Action = 1" and "RPG = 2". Categorical encoding (dummy variables) creates a binary yes/no variable for each category. The regression then estimates each category's effect relative to a baseline (usually the most common category). This lets you answer: "How much more does a Sports game sell than an Action game, holding platform and year constant?"
How large a dataset do I need for reliable OLS regression results?
Rule of thumb: at least 10-15 observations per predictor variable. If you're estimating effects for 12 genres and 10 platforms (22 dummy variables total), you need 220-330 games minimum. With smaller datasets, coefficients become unstable and confidence intervals widen. If you have fewer than 100 games, stick to descriptive statistics and simple comparisons rather than regression.
Can I use this analysis to predict sales for a new game I'm developing?
With caution. The regression tells you historical patterns: which genres and platforms were associated with higher sales in the past. But it can't account for quality, marketing budget, IP strength, or competitive landscape. Use it as one input for expectations. Combine regression insights with market research and testing for realistic forecasts.
What does "statistically significant" actually mean in the regression output?
A p-value is the chance, if the stated null model is true, of seeing data at least as extreme as these data. A small p-value means the result would be less common if that null model were true. It does not prove an effect, and it does not show that chance is the cause. Read it with the estimate and its uncertainty. Do not confuse a small p-value with practical importance. A tiny effect can be significant with enough data.