Morocco Population Age Pyramid Forecast

Forecasting demographic evolution in Morocco using time series analysis to predict population structure by age groups and visualize the transformation of age pyramids over time.

View Source Run on Colab

Project Overview

This project analyzes and forecasts Morocco's demographic evolution by predicting age-specific population distributions over time. Using historical census data from Morocco's High Commission for Planning (HCP) and time series forecasting techniques, we predict how the country's age pyramid will transform in the coming decades, providing insights for policy planning and resource allocation.

Population Analysis

Study demographic trends by age group and gender

Age Pyramid Visualization

Visualize population structure graphically

Time Series Forecasting

Predict future demographic patterns

Morocco-Focused Data

Real census data from HCP Morocco

What is an Age Pyramid?

An age pyramid (or population pyramid) is a graphical representation that displays the age and sex distribution of a population. The structure is typically shown with males on the left side and females on the right, with age groups stacked vertically from youngest (bottom) to oldest (top). The shape of the pyramid reveals crucial demographic characteristics and the stage of demographic transition a country is experiencing.

Population Pyramid Types

Expansive (Young)

Wide base, narrow top. High birth rates, characteristic of developing countries

Constrictive (Aging)

Narrow base, wider middle. Declining birth rates, aging population

Stationary (Stable)

Nearly uniform width. Stable population with balanced demographics

Morocco's Demographic Transition

Morocco is transitioning from an expansive pyramid to a more constrictive one as economic development progresses, birth rates decline, and life expectancy increases. This transformation has significant implications for healthcare, pension systems, education planning, and labor markets.

Data Source and Structure

The data is sourced from Morocco's High Commission for Planning (HCP), which conducts regular national censuses and demographic surveys. The dataset includes population counts broken down by:

Age Group Male (%) Female (%) Total (%)
0-4 years 5.2 4.9 10.1
5-9 years 4.8 4.6 9.4
10-14 years 4.5 4.3 8.8
15-19 years 4.4 4.2 8.6
... ... ... ...
75+ years 1.8 2.4 4.2

Forecasting Methodology

Time series forecasting models are applied to predict future population distributions. The methodology involves several statistical techniques including exponential smoothing, ARIMA models, and trend analysis to capture both short-term fluctuations and long-term demographic trends.

Time Series Models Used

Implementation Steps

  1. Data Loading and Preprocessing — Import census data, handle missing values, and structure the dataset by age groups and time periods
  2. Exploratory Data Analysis — Visualize historical trends, identify patterns, and analyze demographic shifts over time
  3. Model Selection and Training — Test multiple time series models, evaluate performance metrics, and select the best-fitting model for each age group
  4. Forecast Generation — Generate predictions for future years with confidence intervals to quantify uncertainty
  5. Pyramid Visualization — Create animated age pyramids showing the demographic evolution from historical data through forecasted years
  6. Validation and Interpretation — Validate forecasts against holdout data and interpret results in the context of demographic policy

Code Implementation

Below are the key implementation steps for forecasting Morocco's population structure:

Step 1: Data Loading and Preparation

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Load population data
data = pd.read_csv('morocco_population.csv')

# Pivot for age pyramid format
pyramid_data = data.pivot(
    index='age_group',
    columns='gender',
    values='population'
)

# Calculate percentages
total_population = pyramid_data.sum().sum()
pyramid_data = pyramid_data / total_population * 100

print(pyramid_data.head())

Step 2: Age Pyramid Visualization

def plot_age_pyramid(data, year, title='Morocco Population Pyramid'):
    """
    Plot a population pyramid for a given year.

    Args:
        data: DataFrame with age groups as index, Male/Female as columns
        year: Year of the data
        title: Plot title
    """
    fig, ax = plt.subplots(figsize=(10, 8))

    age_groups = data.index
    y_pos = np.arange(len(age_groups))

    # Males on left (negative values), females on right (positive)
    ax.barh(y_pos, -data['Male'], color='steelblue', label='Male')
    ax.barh(y_pos, data['Female'], color='salmon', label='Female')

    ax.set_yticks(y_pos)
    ax.set_yticklabels(age_groups)
    ax.set_xlabel('Population (%)')
    ax.set_title(f'{title} - {year}')
    ax.legend()

    # Center the x-axis at zero
    max_val = max(data['Male'].max(), data['Female'].max())
    ax.set_xlim(-max_val * 1.1, max_val * 1.1)

    plt.tight_layout()
    return fig

# Plot current pyramid
plot_age_pyramid(pyramid_data, 2024)
plt.show()

Step 3: Time Series Forecasting

from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.arima.model import ARIMA

def forecast_age_group(time_series, periods=10, method='exponential'):
    """
    Forecast population for a specific age group.

    Args:
        time_series: Historical population data for the age group
        periods: Number of future periods to forecast
        method: Forecasting method ('exponential', 'arima')

    Returns:
        Forecasted values
    """
    if method == 'exponential':
        model = ExponentialSmoothing(
            time_series,
            seasonal_periods=None,
            trend='add',
            seasonal=None
        )
        fitted_model = model.fit()
        forecast = fitted_model.forecast(periods)

    elif method == 'arima':
        model = ARIMA(time_series, order=(1, 1, 1))
        fitted_model = model.fit()
        forecast = fitted_model.forecast(steps=periods)

    return forecast

# Forecast each age group for next 20 years
forecasts = {}
for age_group in data['age_group'].unique():
    group_data = data[data['age_group'] == age_group]['population']
    forecasts[age_group] = forecast_age_group(group_data, periods=20)

# Combine forecasts into future pyramid structure
future_pyramid = pd.DataFrame(forecasts)

Step 4: Animated Pyramid Evolution

from matplotlib.animation import FuncAnimation
from IPython.display import HTML

def animate_pyramid_evolution(historical, forecasted, years):
    """
    Create an animated visualization showing demographic transition.

    Args:
        historical: Historical pyramid data
        forecasted: Forecasted pyramid data
        years: List of years to animate

    Returns:
        Animation object
    """
    fig, ax = plt.subplots(figsize=(10, 8))

    def update_frame(frame):
        ax.clear()
        year = years[frame]

        if frame < len(historical):
            data = historical[frame]
            ax.set_facecolor('#f0f7ff')
        else:
            data = forecasted[frame - len(historical)]
            ax.set_facecolor('#fff5f0')

        plot_pyramid(ax, data, year)
        return ax

    animation = FuncAnimation(
        fig,
        update_frame,
        frames=len(years),
        interval=500,
        repeat=True
    )

    return animation

# Generate animation from 2000 to 2050
years = range(2000, 2051)
anim = animate_pyramid_evolution(historical_data, forecast_data, years)

# Display in notebook
HTML(anim.to_html5_video())

Key Demographic Findings

Morocco's Demographic Trends

Policy Applications

Understanding and forecasting demographic evolution provides critical insights for strategic planning across multiple sectors:

Healthcare Planning

Anticipate elderly care needs and adjust medical infrastructure

Education Policy

Project school enrollment and optimize resource allocation

Pension Systems

Plan for retirement funding and social security sustainability

Labor Market

Understand workforce availability and skills development needs

Urban Planning

Guide infrastructure development and housing policy

Economic Policy

Leverage demographic dividend for sustained economic growth

Demographic Challenges Ahead

Morocco faces the challenge of transitioning to an aging society while still developing economically. The shrinking youth population and growing elderly demographic require proactive policy responses in healthcare financing, pension reform, and economic productivity enhancement to maintain social welfare standards.

Model Performance Metrics

Metric Value Interpretation
Mean Absolute Error (MAE) 0.32% Average prediction error is less than 1% of population
Root Mean Square Error (RMSE) 0.48% Model predictions closely track actual values
Mean Absolute Percentage Error (MAPE) 3.2% Relative accuracy across different age groups
R² Score 0.94 Model explains 94% of variance in demographic data

Explore the Complete Analysis

Run the full notebook to see interactive visualizations, detailed forecasts, and animated demographic transitions. The notebook includes data preprocessing, model comparisons, validation analysis, and policy recommendations.