Julien PRAMIL (Insee), Nicolas TOULEMONDE (Insee)
Pourquoi le machine learning ?
Source : Hadley Wickham, R for data science
table_mutations1 = Inputs.table(dvf, {"columns": ['date_mutation', 'valeur_fonciere', 'adresse_nom_voie']})
plot_mutations = Plot.plot({
y: {grid: true, label: "Nombre de transactions"},
x: {
ticks: 12,
transform: (d) => Math.pow(10, d),
type: "log",
tickFormat: "~s",
label: "Prix (échelle log) →"
},
marks: [
Plot.rectY(
dvf.filter(d => d.valeur_fonciere > 10000),
Plot.binX({y: "count"},
{
x: d => Math.log10(d.valeur_fonciere),
tip: true
})
),
Plot.ruleY([0])
]
})Exemple : les données DVF
import {us_power_plants, states} from "@observablehq/build-your-first-map-with-observable-plot"
table_power_plants = Inputs.table(
us_power_plants
)
plot_power_plants = Plot.plot({
projection: "albers-usa",
marks: [
Plot.geo(states, { fill: "white", stroke: "#e2e2e2" }),
Plot.dot(us_power_plants, {
x: "longitude",
y: "latitude",
r: "Total_MW",
fill: "PrimSource",
opacity: 0.7,
tip: true
}),
Plot.dot(us_power_plants, { // Can you figure out what this additional Plot.dot layer adds?
x: "longitude",
y: "latitude",
r: "Total_MW",
fill: "PrimSource",
stroke: "black",
filter: d => d.Total_MW > 3500,
}),
Plot.text(us_power_plants, { // Add text to the map using data from us_power_plants
x: "longitude", // Place text horizontally at plant longitude
y: "latitude", // Place text vertically at plant latitude
text: "Plant_Name", // The text that appears is the value from the Plant_Name column,
filter: (d) => d.Total_MW > 3500, // Only add text for plants with capacity exceeding 3500 MW
fontSize: 12, // Increased font size
fontWeight: 600, // Increased font weight
stroke: "white", // Adds white outer stroke to text (for readability)
fill: "black", // Text fill color
textAnchor: "start", // Left align text with the x- and y-coordinates
dx: 15 // Shifts text to the right (starting from left alignment with coordinate)
})
],
r: { range: [1, 15] },
color: { legend: true },
height: 500,
width: 800,
margin: 50
})async function transformToPost(description) {
// Base URL with query parameters
const baseUrl = `https://codification-ape2025-pytorch.lab.sspcloud.fr/predict/?nb_echos_max=5&prob_min=0.01&num_workers=0&batch_size=1`;
// Build the request body according to the expected schema
const body = {
forms: [
{
description_activity: description
}
]
};
// Send the POST request
const response = await fetch(baseUrl, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(body)
});
// Parse and return the JSON response
return response.json();
}viewof activite = Inputs.text({
label: '',
value: 'ma société fera du conseil en traitement de données',
width: 800
})
viewof prediction = Inputs.button("Run Prediction", {
reduce: async () => {
return await transformToPost(activite);
}
})
// afficher les résultats joliment
prediction_table = {
if (!prediction || !prediction.length) {
return html``
}
// la réponse est un tableau avec un seul objet
const result = prediction[0]
const { IC, MLversion, ...codes } = result
const rows = Object.values(codes).map(({ code, libelle, probabilite }) => {
return html`
<tr>
<td>${code} – ${libelle}</td>
<td style="text-align:right;">${probabilite.toFixed(3)}</td>
</tr>
`
})
return html`
<table style="border-collapse: collapse; width: 100%;">
<caption style="margin-bottom: 0.5em;">
Confidence score : ${(+IC).toFixed(3)}
</caption>
<thead>
<tr>
<th style="text-align:left;">Description (NA2008)</th>
<th style="text-align:right;">Probability</th>
</tr>
</thead>
<tbody>
${rows}
</tbody>
</table>
`
}Aspect transactionnel
Donnée n’est stabilisée qu’après plusieurs cycles de gestion
La collecte devient un processus vivant
Les déclarations administratives (Rivière 2018)
Obligation est faite à un certain nombre d’entités (individus, entreprises, organismes publics) de fournir des informations respectant une certaine forme, selon certaines modalités (internet, papier) et temporalités.
Par exemple, les déclarations fiscales des ménages sont annuelles, avec un calendrier déterminé à l’avance (qui dépend du format, papier ou internet).
McKinsey définissait les propriétés du big data selon 5V :
Le secret statistique (article 7bis de la loi de 1951)
Le secret statistique crée une obligation spéciale dans le cas de données confidentielles collectées, détenues ou produites pour des usages statistiques. Il interdit strictement la communication de données individuelles ou susceptibles d’identifier les personnes, issues de traitements à finalités statistiques, que ces traitements proviennent d’enquêtes ou de bases de données. En dérogation aux règles communes applicables au secret professionnel, le secret statistique est en effet opposable à toute réquisition judiciaire ou émanant d’autorités administratives (fiscale ou douanière par exemple).
Le Code statistique non signifiant (CSNS)
Code statistique non signifiant (CSNS) pour les besoins de mise en œuvre de traitements à finalité de statistique publique impliquant le numéro de sécurité sociale (NIR) ou des traits d’identité, en particulier les appariements au sein du Service statistique publique.
| Répertoire | Responsable | Finalité |
|---|---|---|
| répertoire national d’identification des personnes physiques (RNIPP) | Insee | identification des personnes physiques nées en France |
| Système national de gestion des identifiants (SNGI) | CNAV | identification des personnes physiques |
| ayants droit de la sécurité sociale | ||
| répertoire Sirene | Insee | identification des personnes morales françaises |
| l’identifiant national élève (INE) | SSM Enseignement supérieur (SIES) | Identifier les étudiants |
| Donnée | Autorité centralisatrice |
|---|---|
| DSN | Gip-MDS |
| Données hospitalières | ATIH-10 |
| SI gestion des eaux | SANDRE12 |
Enjeux méthodologiques très liés au changement de paradigme de collecte
Plus un design ad hoc
robots.txtPython : BeautifulSoup (parser), Scrapy (crawler)R : httr, rvest, politeSelenium : outils d’automatisationPython : requestsUne des premières cartes statistiques (1798)
John Snow cartographie le choléra à Londres


Illustration de l’effet MAUP (modifiable areal unit problem)
Carte des densités de population sur des carreaux de largeur d’un kilomètre à Lyon et ses alentours en 2017 (calculées à partir de Filosofi). Source : géoportail.
Voir geoportail, statistiques-locales.insee.fr ou France Pixel par Etienne Côme
Un exemple de visualisation express des données Filosofi grâce à la librairie gridviz (visible sur Observable)
Fideli (Fichier démographique sur les logements et les individus)
Filosofi (Fichier localisé social et fiscal)
BPE (Base permanente des équipements)
Sirene (répertoire des entreprises)
RP (Recensement de la Population)
Généralement, RIL et Cadastre comme source première de la géolocalisation
DuckDBIdée : texte = ensemble de mots que l’on pioche plus ou moins fréquemment
Outil classique et immédiat : la matrice document-terme.
Regardons sur un exemple, sur le corpus suivant :
| La pratique du tricot et du crochet | Transmettre la passion du timbre | Vivre de sa passion | |
|---|---|---|---|
| crochet | 1/7 | 0 | 0 |
| de | 0 | 0 | 1/4 |
| du | 2/7 | 1/5 | 0 |
| et | 1/7 | 0 | 0 |
| la | 1/7 | 1/5 | 0 |
| passion | 0 | 1/5 | 1/4 |
| pratique | 1/7 | 0 | 0 |
| sa | 0 | 0 | 1/4 |
| timbre | 0 | 1/5 | 0 |
| transmettre | 0 | 1/5 | 0 |
| tricot | 1/7 | 0 | 0 |
| vivre | 0 | 0 | 1/4 |
TF-IDF (Term Frequency – Inverse Document Frequency) :
L’idée est simple :
| La pratique du tricot et du crochet | Transmettre la passion du timbre | Vivre de sa passion | |
|---|---|---|---|
| crochet | 0.157 | 0 | 0 |
| de | 0 | 0 | 0.275 |
| du | 0.116 | 0.081 | 0 |
| et | 0.157 | 0 | 0 |
| la | 0.058 | 0.081 | 0 |
| passion | 0 | 0.081 | 0.101 |
| pratique | 0.157 | 0 | 0 |
| sa | 0 | 0 | 0.275 |
| timbre | 0 | 0.220 | 0 |
| transmettre | 0 | 0.220 | 0 |
| tricot | 0.157 | 0 | 0 |
| vivre | 0 | 0 | 0.275 |

Consignes sur le site web
Codification automatique des entreprises dans la nomenclature d’activités
Exploitation des données Sirene avec et TorchTextClassifiers (méthode Fasttext)
Ouverture à la problématique du MLOps appliquée au NLP
OpenFoodFacts avec Elasticsearch et uint8), valeurs flottantes entre 0 et 1, etc.


Mathématiquement, repose sur le produit de convolution matriciel noté \(A \star B\), qui est différent du produit matriciel
Le produit de convolution de deux matrices \(A \star B\) permet de faire une somme pondérée des éléments de la matrice \(A\) par ceux de \(B\).
La matrice \(B\) est la matrice de convolution (aussi appelé ** filtre**, noyau ou kernel), et permet d’extraire des informations de \(A\).
Par exemple, ce filtre \(B\) permet d’extraire les contours : le résultat de \(A \star B\) représentera les contours de \(A\). \[ B = \begin{bmatrix} 1 & 0 & -1\\ 0 & 0 & 0\\ -1 & 0 & 1 \end{bmatrix} \]


Le noyau (ou kernel), en jaune, glisse sur la matrice de devant à traiter. Une multiplication élément par élément est faite sur chaque sous-matrice de la taille du noyau. Pour chacune de ces multiplication, les coefficients sont ensuite sommés pour donner une valeur de sortie unique.
Tâches classiques de vision




scikit-learn