Pierre-Carl Michaud

Professor of Economics, HEC Montreal

View the Project on GitHub

Regard sur la pénurie de main-d’oeuvre

On parle beaucoup de pénurie de main d’oeuvre au Québec. Plusieurs employeurs et associations d’employeurs affirment que le gouvernement doit intervenir. Il y a deux tendances, conjecturelle (l’économie va bien) et structurelle (le vieillissement), qui peuvent expliquer cette pénurie. On pourrait vouloir intervenir dans le deuxième cas, parce qu’on veut s’assurer de financer les dépenses publiques, ou palier aux effets du vieillissement sur la croissance économique. Mais si cette pénurie est causé par la conjoncture, il y a peu à faire. Si on force trop la note, il y aura plus de chômeurs une fois la récession venue. Mais avant de parler de remède, vaut mieux regarder si on voit bien des signes d’une pénurie, ou dans des termes plus correctes, des frictions plus importantes sur le marché de l’emploi. Heureusement, il y a un cadre théorique, celui du modèle de search and friction (Mortensen et Pissarides), ainsi que des données de Statistiques Canada, sur les postes vacants, le chômage et les salaires offerts pour valider ceci.

import pandas as pd
from matplotlib import pyplot as plt

On prend la table 14-10-0325-01 de Statistiques Canada qui provient de l’Enquête sur les postes vacants et les salaires (EPVS):

df = pd.read_csv('14100325-eng/14100325.csv')

On se concentre sur le Québec

df = df[df['GEO']=='Quebec']

On isole le taux de vacances (nb de postes vacants par emploi) et le salaire horaire moyen (celui offert sur les postes vacants)

df['year'] = pd.DatetimeIndex(df['REF_DATE']).year
df['month'] = pd.DatetimeIndex(df['REF_DATE']).month
V = df[df['Statistics']=='Job vacancies']
V = V[['year','month','VALUE']]
V.columns = ['year','month','V']
w = df[df['Statistics']=='Average offered hourly wage']
w = w[['year','month','VALUE']]
w.columns = ['year','month','wages']

Allons chercher les chomeurs de la Table 14100287 de CANSIM (on a fait une pré-section car le fichier est gros):

dfu = pd.read_csv('14100287-eng/14100287-quebec.csv')
U = dfu.loc[:,['year','month','VALUE']]
U['VALUE'] = U['VALUE']*1e3
U.columns = ['year','month','U']

Rassemblons les infos dans une table:

table = V.merge(U,on=['year','month'])
table = table.merge(w,on=['year','month'])
table['year'] = table['year'].astype(str)
table['month'] = table['month'].astype(str)
table['time'] = table['year'].str.cat(table['month'], sep='-')

Une mesure des frictions sur le marché du travail est le ratio du nb de poste vacants au nombre de chômeurs. On l’appelle souvent \(\theta\).

table['theta'] = table['V']/table['U']

L’évolution des fractions peut bien se voir du graphique dans le plan chomeurs-vacances, ce qu’on appelle la courbe de Beveridge:

plt.figure()
for i in range(len(table)): 
    plt.scatter(table.loc[i,'U'], table.loc[i,'V'], marker='o', color='red')
    plt.text(table.loc[i,'U']+0.01, table.loc[i,'V']+0.01, table.loc[i,'time'], fontsize=9) 
plt.plot(table['U'],table['V'])
plt.xlabel('U (chomeurs)')
plt.ylabel('V (vacances)')
plt.show()

png

On voit que le marché est beaucoup plus sous tension qu’en 2015. On s’est déplacé vers le haut à gauche dans ce plan (U,V). Il y a maintenant un poste vacant pour environ 2 chomeurs quand c’etait plus de 5-6 il y a quelques années. La pente de l’origine à chaque point est \(\theta\), une mesure de friction. Un modèle de friction simple prédit une hausse des salaires. On peut regarder la relation entre la mesure de frictions et les salaires. Faut ajuster les salaires pour l’inflation. Corrigeons pour inflation en utilisant le série de FRED pour le Canada (CPALCY01CAQ661N):

cpi = pd.read_csv('CPALCY01CAQ661N.csv')
cpi['year'] = pd.DatetimeIndex(cpi['DATE']).year.astype(str)
cpi['month'] = pd.DatetimeIndex(cpi['DATE']).month.astype(str)
table.merge(cpi,on=['year','month'])
table['wages'] = table['wages']*cpi.loc[-1:,'CPALCY01CAQ661N']/cpi['CPALCY01CAQ661N']

On peut maintenant montrer la relation et comment celle-ci à évoluer dans le temps:

plt.figure()
for i in range(len(table)): 
    plt.scatter(table.loc[i,'theta'], table.loc[i,'wages'], marker='o', color='red')
    plt.text(table.loc[i,'theta']+0.01, table.loc[i,'wages']+0.01, table.loc[i,'time'], fontsize=9) 
plt.plot(table['theta'],table['wages'])
plt.xlabel('$\\theta$ (V/U)')
plt.ylabel('w (salaire horaire)')
plt.show()

png

Les salaires sont en hausse en réaction à une hausse importante des frictions sur les marchés. Cette hausse est-elle élevée? Question importante: que faire? Faudrait départager la part expliquée par le vieillissement et celle qui est causé par la conjoncture.