Développement

Ce fichier du fédéral était impeccable. C'est exactement pour ça qu'il allait faire mentir mon produit.

J'ai compté les 51 999 lignes du lot de juillet 2026 du Guichet-Emplois. Aucun salaire manquant, 99,1 % de codes valides — et deux fois plus de cuisiniers que de toute l'informatique canadienne.

21 août 202612 min de lecturePASCAL POTVIN
Écouter l'article

Un fichier impeccable

Le lot de juillet 2026 du Guichet-Emplois fait 53,2 Mo, encodé en UTF-16LE, 65 colonnes, 51 999 lignes. Je l'ai téléchargé pour répondre à une question précise : est-ce que je peux dire à quelqu'un ce qu'un métier paie à Sherbrooke, avec un chiffre que je n'ai pas inventé ?

La première passe est rassurante. 99,1 % des lignes portent un code de profession CNP 2021 exploitable. Le salaire est renseigné sur 100 % des lignes — pas un seul trou. Les dates sont propres, les provinces normalisées, aucun doublon d'identifiant. Sur les critères qu'on vérifie d'habitude, c'est un des fichiers publics les plus propres que j'aie manipulés.

Puis j'ai compté l'informatique. Développement, Web, données, cybersécurité, réseaux, soutien technique, tout confondu : 1 295 offres pour tout le Canada, sur un mois. Le design graphique en ajoute 130. Ensemble, 2,7 % du fichier. Le même mois compte 2 469 offres de cuisiniers et cuisinières.

Près de deux fois plus de cuisiniers que de toute l'informatique canadienne. C'est à ce moment-là que j'ai compris que j'étais à deux doigts de brancher ce fichier à l'envers dans Boussole, l'outil d'orientation que je construis.

Ce qu'on vérifie, et ce qu'il aurait fallu vérifier

Un jeu de données peut mentir de deux façons. Il peut mentir sur les valeurs — champs vides, encodage cassé, unités mélangées, doublons. C'est ce qu'on vérifie, parce que c'est ce qui plante le pipeline, et donc ce qui se voit. Un NOT NULL qui saute, un parseFloat qui rend NaN, une jointure qui explose : le fichier proteste.

Ou il peut mentir sur ce qui s'est retrouvé dedans. Et là, il ne proteste jamais. Toutes tes vérifications passent au vert, tes agrégats se calculent, tes graphiques s'affichent — et ils décrivent fidèlement une population qui n'est pas celle que tu crois observer.

Le Guichet-Emplois n'est pas un échantillon du marché du travail canadien. C'est le babillard fédéral, et on y publie pour des raisons qui n'ont rien à voir avec la répartition réelle des emplois. Statistique Canada dénombrait 506 700 postes vacants au premier trimestre de 2026 (Le Quotidien du 16 juin 2026). Le lot de juillet annonce 100 835 postes à pourvoir. Ce sont deux unités différentes — un stock trimestriel moyen d'un côté, un flux mensuel d'affichages de l'autre, et les comparer directement serait exactement le genre de raccourci que cet article dénonce. Mais même en étant très généreux sur la conversion, on parle d'une fraction du marché, pas d'une photographie.

Aucun de mes tests de qualité ne pouvait me dire ça. Il fallait poser une autre question : qui a eu une raison de publier ici, et qui n'en a eu aucune ?

Deux fichiers dans le même fichier

Le premier indice était dans une colonne que j'avais ignorée : Indicateur Source Externe.

Elle sépare les offres saisies directement dans le Guichet-Emplois de celles moissonnées ailleurs par flux XML — sites d'emploi privés, babillards provinciaux. Les premières sont richement décrites. Les secondes portent un métier, un lieu, une date, un salaire, et c'est tout. La documentation du jeu de données le dit noir sur blanc, et précise même que les « NA » signalent une information non disponible. Je ne l'avais pas lue avant de commencer à compter. Ça m'apprendra.

En comptant, la fracture est nette : 21 785 offres natives (41,9 %) et 30 214 offres externes (58,1 %). Sur les natives, la scolarité demandée, l'expérience demandée et les conditions d'emploi sont renseignées à 100 %. Sur les externes, à 0 %. Pas « peu remplies ». Zéro.

Le piège est mécanique. Ceci se calcule sans broncher et ne veut rien dire :

sql
select feer, percentile_cont(0.5) within group (order by taux_horaire) as median
from offres
group by feer;

Tant que la requête ne touche que le salaire et le code de profession, elle porte sur les 52 000 lignes et elle est juste. Dès qu'elle touche aux horaires ou à la scolarité, elle porte en réalité sur 21 785 lignes — les natives — sans que rien dans le résultat ne le signale. Deux populations, un seul GROUP BY, une médiane qui a l'air d'un chiffre national.

La leçon est généralisable : toute colonne qui identifie une source est une frontière de population, pas une métadonnée décorative. Si un fichier en contient une, la première chose à faire est de recalculer le taux de remplissage de chaque colonne de chaque côté de la frontière. Ça prend dix minutes et ça a réécrit la moitié de mes conclusions.

295 fois la même annonce

Le deuxième indice, je l'ai trouvé en cherchant pourquoi le salaire médian en TI me paraissait trop beau.

295 offres du lot portent exactement le même titre — « analyste en technologie de l'information » — au même taux de 50,00 $ l'heure. C'est 23 % de toute l'informatique canadienne du fichier, et 91 % de ces annonces proviennent d'une source externe. Un gabarit, republié en boucle par une plateforme moissonnée.

Retire-le, et la médiane TI passe de 50,00 $ à 37,00 $ l'heure. Treize dollars de l'heure d'écart, produits par une seule annonce répétée.

Aucun dédoublonnage classique ne l'attrape. Les 295 lignes ont des identifiants distincts, des dates de publication différentes, parfois des villes différentes. Sur les clés, ce sont 295 offres distinctes. C'est sur le contenu qu'elles n'en font qu'une. Depuis, quand une médiane me surprend agréablement, je compte les valeurs modales avant de me réjouir : si une seule combinaison titre + salaire pèse plus de quelques pour cent d'un segment, ce n'est pas un marché que je regarde, c'est un formulaire.

Pourquoi le numérique est absent — et ce n'est pas ce qu'on croit

L'explication paresseuse serait : il n'y a pas de jobs en TI au Canada. C'est faux, et le fichier lui-même contient la réfutation.

81,7 % des offres TI présentes viennent d'une source externe, contre 58,1 % pour l'ensemble du fichier. Autrement dit, les employeurs du numérique ne publient pratiquement pas dans le Guichet-Emplois. Le peu qu'on y trouve a été ramassé ailleurs. Ils recrutent sur LinkedIn, sur des babillards spécialisés, sur leur propre site, par réseau.

L'explication inverse est plus intéressante : ce n'est pas que le numérique est absent, c'est que d'autres secteurs sont mécaniquement forcés d'être présents. Pour obtenir une étude d'impact sur le marché du travail, un employeur doit annoncer le poste sur au moins trois plateformes pendant quatre semaines consécutives dans les trois mois précédant sa demande — et le Guichet-Emplois est l'une des plateformes obligatoires. Depuis le 1er janvier 2026, la preuve d'affichage a d'ailleurs été rétablie pour les demandes en agriculture primaire. Le babillard fédéral n'enregistre donc pas le marché : il enregistre en priorité les secteurs qui ont une obligation réglementaire d'y passer.

Ça se voit à l'œil nu dans mes chiffres régionaux. Le métier le plus affiché en Estrie en juillet 2026, ce ne sont ni les cuisiniers ni les caissiers : ce sont les manœuvres aux soins du bétail, avec 18 offres.

Et voici ce qui m'a le plus surpris. Le Conseil de l'information sur le marché du travail a publié en octobre 2020 un rapport sur la représentativité des offres en ligne qui conclut exactement l'inverse pour l'ensemble des plateformes : les annonces en ligne sur-représentent la gestion et les emplois qualifiés, et sous-représentent les métiers et l'agriculture. Le Guichet-Emplois seul fait le contraire.

Grande catégorieGuichet-Emplois, juillet 2026Annonces en ligne, toutes plateformesPostes vacants réels
Gestion0,4 %10,2 %5,2 %
Affaires, finance, administration13,8 %16,6 %10,9 %
Santé8,7 %7,9 %6,8 %
Métiers, transport, machinerie20,1 %12,6 %18,3 %
Ressources naturelles, agriculture3,7 %1,3 %3,9 %

Les deux dernières colonnes viennent du rapport du CIMT et couvrent 2018-2019 ; la première est mon dénombrement de juillet 2026. Les périodes ne coïncident pas et il ne faut pas lire les écarts au dixième près. La forme, elle, est sans ambiguïté : sur la gestion, le Guichet-Emplois est vingt-cinq fois sous la moyenne des plateformes en ligne et treize fois sous la réalité ; sur les métiers et l'agriculture, il colle mieux au réel que l'ensemble du Web.

Ce n'est donc pas « les données en ligne sont biaisées » — c'est que chaque babillard a sa propre sélection, et qu'on ne peut pas la déduire de la qualité du fichier. Il faut la déduire de qui est obligé, incité ou indifférent à y publier.

La règle : enrichir une liste, jamais la produire

C'est la correction qui a changé l'architecture du produit, et c'est celle que je retiens le plus.

La tentation était évidente : j'ai un fichier avec des salaires réels, des horaires réels, des volumes réels. Je m'en sers pour construire la liste des métiers à proposer aux gens. Sauf que ce fichier sous-représente précisément les métiers qu'une personne en exploration a le plus de chances d'envisager. Laisser les données choisir, c'est répondre « cuisinier, camionneur » à quelqu'un dont le profil pointe vers le numérique ou la création. Techniquement irréprochable, et complètement à côté.

La liste des métiers vient donc de la Classification nationale des professions elle-même, qui en couvre environ 500 groupes de base sans considération de qui affiche où. Le fichier ne sert plus qu'à accrocher un salaire et des horaires locaux à des métiers déjà retenus pour une autre raison. Et quand il n'a rien à accrocher, il le dit : « peu d'offres publiées ici ce mois-ci » est une information, pas un vide à masquer.

Le coût de cette rigueur est faible, et c'est ce qui m'a décidé. Les offres se concentrent violemment : 33 codes CNP couvrent la moitié du marché, 116 en couvrent 80 %, alors que le lot en touche 491. Cartographier 116 professions à la main est l'affaire d'une journée — et le résultat reste inspectable, ce qu'une correspondance générée à l'exécution par un modèle ne serait jamais.

Le seul endroit où le fichier est franchement exemplaire, c'est le dégradé salarial. Le deuxième chiffre du code CNP 2021 encode la catégorie FEER — formation, études, expérience, responsabilités. Croisé au taux horaire sur 43 823 offres payées à l'heure, il donne une échelle d'une netteté rare : 18,25 $ sans scolarité formelle, 20,00 $ avec un secondaire, 23,17 $ pour un collégial court, 28,00 $ pour un collégial complet, et un saut à 37,50 $ pour le diplôme universitaire. Environ deux dollars de l'heure par cran, puis une marche.

Ce que le fichier ne dira jamais

Dix-huit colonnes existent et ne contiennent rien. Les seize colonnes d'avantages sociaux — assurance collective, régime de pension, REER, soins dentaires, invalidité — n'affichent pas un seul « Oui » sur 52 000 lignes. S'y ajoutent Conditions d'emploi Virtuel et Divers lieux de travail : aucune donnée sur le télétravail. J'ai vérifié le lot de juin pour écarter un bogue d'export : identique, alors que le drapeau « Soir » y porte bien 8 434 « Oui ». Ce n'est pas le bloc qui est cassé, ce sont ces colonnes-là que personne ne remplit.

Le réflexe suivant a failli me coûter cher.

Faute de colonne, j'ai cherché le télétravail dans les intitulés de poste. 1 452 offres contiennent « à domicile ». Ce sont des aides de maintien à domicile, des préposés aux soins à domicile, des gardiens d'enfants en milieu familial — des gens qui se déplacent chez les clients, l'exact opposé du travail à distance. Une recherche par mots-clés ne donnait pas ici un résultat approximatif : elle donnait le résultat retourné.

Quand une donnée manque, il faut aller la chercher ailleurs et accepter ses conditions. Pour le télétravail, je suis passé par le tableau 98-10-0494 du recensement de 2021 — lieu de travail selon la grande catégorie de profession, 41 régions métropolitaines. Il donne 60,0 % en sciences naturelles et appliquées, 58,4 % en arts et culture, contre 9,7 % dans les métiers et le transport et 5,8 % en fabrication.

Sauf que ce recensement a été collecté en mai 2021, en plein confinement. Les niveaux absolus sont gonflés et ne décrivent pas 2026. Ce qui reste solide, c'est l'ordre : un métier de sciences appliquées se télétravaillera toujours davantage qu'un métier de fabrication. J'utilise donc le classement, jamais le pourcentage brut — et le produit n'affiche jamais ces chiffres tels quels.

Mis côte à côte avec la répartition des offres, le croisement dessine presque un miroir : les catégories les plus publiées sur le Guichet-Emplois sont les moins télétravaillables. La corrélation de Pearson entre les deux colonnes est de −0,39 sur dix points. Modérée, portée par les extrêmes. Ce n'est pas une loi — c'est une mise en garde de plus.

Les cinq questions que je pose maintenant

Ce dossier m'a coûté deux jours et m'a évité de livrer un produit poliment faux. Depuis, avant d'écrire une ligne de code sur un jeu de données que je n'ai pas produit, je réponds à ces cinq questions par écrit.

Qui a eu une raison de figurer là-dedans, et qui n'en a eu aucune ? Existe-t-il une colonne « source » qui découpe le fichier en populations aux règles différentes ? Y a-t-il une valeur ou une combinaison de valeurs qui pèse assez lourd pour déplacer une médiane à elle seule ? Quelles colonnes existent mais sont vides — et est-ce vrai sur plusieurs lots, ou seulement sur celui-ci ? Et surtout : est-ce que je m'apprête à laisser ces données produire une liste d'options, ou seulement à enrichir une liste construite ailleurs ?

Cette dernière question est celle qui compte le plus en 2026, et elle dépasse largement mon cas. On branche des corpus dans des systèmes qui répondent avec assurance, et le silence d'un corpus est indiscernable d'une absence. Un modèle qui lit ce fichier répondra « cuisinier, camionneur, préposé à l'entretien » à un profil qui pointe vers la création — sans hésitation, sans avertissement, et avec de vrais salaires à l'appui pour rendre la réponse crédible.

Le fichier était impeccable. C'est bien ça, le problème : rien dans un fichier propre ne t'avertit qu'il ne contient pas ce que tu cherches.


Tous les dénombrements de cet article proviennent du fichier job-bank-open-data-all-job-postings-fr-juillet2026.csv, jeu de données ea639e28 d'Emploi et Développement social Canada, publié sous la Licence du gouvernement ouvert – Canada. Les 51 999 lignes ont été comptées directement, sans échantillonnage.

§ COMMENTAIRES

Laisser un commentaire