Services de données statistiques
Jean-Pierre Malrieu
"le fait de pouvoir accéder à des données automatisées, ça a révolutionné l'architecture du web" : "il faudra bien comprendre que dans ce cours, ce que vous allez apprendre concerne tous les types de données, pas seulement statistiques"
"le 2e objectif de ce cours, c'est de vous persuader qu'il faut un bon modèle de données derrière, et pourquoi pas réutiliser un modèle qui existe déjà"
"et enfin, je me suis rendu compte qu'au fond, il y avait une assez faible culture de la part des étudiants sur la manière dont fonctionne le web, sur ce qu'est une requête HTTP, sur comment un navigateur affiche des choses et permet d'interagir avec l'utilisateur"
"vous devez avoir les bons réflexes si vous travaillez ensuite dans le domaine de l'open data : qu'est-ce qu'on peut faire quand on veut ouvrir des données ? le top du top c'est de mettre en place des services de données"
"maintenant il y en a pléthore : par ex. pour les parieurs sportifs, vous avez des services qui vous donnent tous les buts marqués dans toutes les rencontres de foot par tous les joueurs", "mais on ne va pas parler de ça"
une grande part de l'intérêt de l'open data tient non seulement aux données mises à disposition mais aussi au mode de mise à disposition
les services de données sont les modes de mise à disposition les plus avancés
"le ministère de I'Intérieur a une base de données relationnelle avec toutes les données électorales, mais ils n'en donnent pas l'accès, il n'envoient que des putains de fichiers, c'est partout comme ça dans l'open data"
"la pratique la plus classique, c'est de transformer le contenu de leurs bases SQL en un fichier que l'utilisateur peut consulter, mais il faut cliquer sur plein de boutons pour faire tes requêtes"
"dans un premier temps le mouvement open data a consisté à ouvrir les données, ensuite il a bâti ses propres principes" :
Charte internationale de l'open data : "le mouvement a commencé à réfléchir sur lui-même"
le terme technique est offuscation
les services de données statistiques concernent principalement les principes 2, 3 et 4
"comprehensive, c'est pas toujours le cas"
"l'idée sous-jacente derrière le mouvement open data, c'est de supprimer les intermédiaires"
"dans les compréhensions classiques du politique, vous avez le détenteur du savoir qui communique au peuple, qui sait mieux que l'individu ce qui est bon pour lui"
"le mouvement open data rejette ça : c'est à la société de décider quelles données lui seront utiles, il faut toute la donnée brute"
"derrière cette idée d'ouvrir les données, il y a l'idée que certaines données sont d'intérêt public et général, la société se porte mieux, soi-disant, si on est au courant de ces infos"
"normalement en théorie économique, un bien est rival ; un bien commun est un bien dont il est difficile d'interdire l'accès"
"avec la connaissance, c'est un truc assez particulier : quand on a un bien commun non rival, comme l'information ouverte, on peut considérer qu'il s'agit d'un bien collectif"
Audrey Lamy-Martinot : "sachez qu'une information c'est une donnée contextualisée : une donnée sans contexte ce n'est pas une information"
"et si vous avez plus de connaissances, vous avez moins de croyances : il y a cette idée un peu naïve que la connaissance fait reculer l'erreur", "et que + de connaissances = + d'innovation"
"je préfère ces idéaux-là au cynisme des politistes, personnellement hein", "oui c'est naïf, mais la société est fondée sur des grandes naïvetés"
les SDS permettent de réaliser 3 des grand principes de l'open data, "mais il y a des trucs avec lesquels ils ne sont pas trop en phase"
l'idée fondamentale de l'open data selon laquelle "l'information doit provenir des gens" (participation) : "là c'est niet, on est dans la statistique, la source doit provenir d'un protocole", "le côté collaboration n'est pas essentiel"
"cela dit ce n'est pas complètement vrai : quand le ministère de l'intérieur ouvre les données sur les élus ou les votes, il peut y avoir des erreurs, et tout le monde peut regarder pour faire remonter ces erreurs, c'est quand même un peu participatif"
"mais globalement, y'a rarement des gens qui font ça avec les données de l'inflation de l'INSEE"
"et d'ailleurs ça a un peu foiré : il y a eu de grands espoirs dans un site qui s'appelait Statista, cette idée d'avoir une statistique intégralement collaborative, un Wikipédia de la donnée stat, ça a fait flop, en tout cas pour l'instant ça n'a pas marché"
"il faut bien comprendre qu'au-delà de l'open data, il y a l'open government"
Initiative de l'OCDE en 2008 : la donnée doit être gratuite, ou au coût marginal de mise à disposition
dans le cas de la statistique publique, ce coût est très faible ou nul
qu'est-ce qui fait qu'une donnée est une donnée statistique ?
"faut pas rêver, il n'existe pas de définition très nette, néanmoins : les données statistiques, c'est les données qui sont produites par des organismes de stat"
"la plupart du temps c'est des nombres, c'est des données auxquelles on croit en général, qu'on ne donne pas qu'une fois mais qu'on publie régulièrement, et qu'on essaie de bien documenter"
"y'a des traders qui trouvent que la donnée de stat sur l'économie n'est pas assez véloce, ils regardent des photos avec un algo pour savoir à quelle vitesse s'élèvent les bâtiments en construction en Chine"
"à un moment donné, Google pensait prétendre les épidémies de grippe en regardant les requêtes pour le mot "grippe", ça s'est planté totalement, en général la big data n'a toujours pas supplanté la stat"
"mais c'est vrai qu'aujourd'hui c'est plus difficile de payer des gens pour aller faire de la stat alors qu'on n'a qu'à aller voir ce qu'ils font sur internet"
"maintenant que j'ai défini un peu les données statistiques, qui sont les gens qui produisent les données statistiques ?"
"un truc vraiment, vraiment lamentable, c'est l'Union européenne qui a décidé de protéger les bases de données" : directive de 1996
"si t'as packagé les données dans ta base de données à toi, même si tu n'as pas été le producteur de ces données, les gens n'ont pas le droit d'utiliser ta base"
"heureusement ça a foiré cette affaire, en pratique c'était tellement difficile d'attaquer les gens, mais c'est pour montrer qu'en face du mouvement open data, il y avait un contre-mouvement puissant qui disait : la donnée a de la valeur, il faut la vendre"
"et la Banque mondiale alors c'est le pompon, un organisme entièrement financé par le public, ces enfoirés ils t'interdisaient d'utiliser leurs données y compris pour l'enseignement"
"on a l'impression que l'open data c'est un long fleuve tranquille qui s'est imposé par la force de son évidence, mais il aurait pu échouer, et le monde serait différent de celui que l'on connaît"
développement d'agrégateurs privés : "évidemment c'est Google, vous pouvez lui demander n'importe quoi"
"la stat publique a été un modèle pour le développement de l'open data, c'est elle qui a été à l'initiative des modèles en vigueur aujourd'hui"
"je ne vais pas faire la 2e partie du cours"
"à la place, vous aurez comme mission d'effectuer une requête HTTP qui fournit exclusivement le nombre de Norvégiens âgés de 105 ans ou plus en 2023 et 2024"
"vous savez comment faire une requête HTTP ?" "vous pouvez en faire avec les navigateurs, mais ils ne savent faire qu'une requête GET ; or, là vous devez faire une requête POST"
"et maintenant je vais vous demander d'écrire du JSON bien formé"
"l'entreprise datacrunch, installée à Avignon et fondée, a deux employés, Myriam, développeuse et Jules, commercial"
"et il faut préciser que les deux sont en couple"
{
"entreprise": {
"nom": "datacrunch",
"année": "2022",
"adresse": {
"ville": "Avignon"
},
"employés": [
{
"nom": "Myriam",
"poste": "Développeuse",
"conjoint": "123"
},
{
"id": 123,
"nom": "Jules",
"poste": "Commercial"
}
]
}
}
"maintenant faites la même chose en XML et générez un schéma"
<?xml version="1.0" encoding="UTF-8"?>
<entreprise>
<nom>datacrunch</nom>
<année>2022</année>
<adresse>
<ville>Avignon</ville>
</adresse>
<employés>
<employé syndiqué="true">
<nom>Myriam</nom>
<poste>Développeuse</poste>
</employé>
<employé syndiqué="false">
<nom>Jules</nom>
<poste>Commercial</poste>
</employé>
</employés>
</entreprise>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="entreprise">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="nom"/>
<xs:element type="xs:short" name="année"/>
<xs:element name="adresse">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="ville"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="employés">
<xs:complexType>
<xs:sequence>
<xs:element name="employé" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="nom"/>
<xs:element type="xs:string" name="poste"/>
</xs:sequence>
<xs:attribute type="xs:string" name="syndiqué" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
il faut distinguer la syntaxe de la sémantique
espace de nom : "quand y'a rien dans le XML, il va aller chercher la définition dans le XSD par défaut, mais vus pouvez tout à fait avoir des définitions liées à des espaces de noms particuliers, et vous pouvez tout à fait réutiliser les définitions des autres, ça c'est méga puissant"
quel format utiliser ?
"si c'est pour de l'export, la bonne réponse c'est : les deux", "la quasi-totalité des SDS vous donne le choix entre JSON et XML"
"99% du web aujourd'hui c'est du JavaScript, y'a quasiment rien à faire pour utiliser du JSON en JavaScript, c'est pour ça que c'est si populaire"
"le principe fondamental du DOM, c'est que si y'a un truc qui vient en bas, c'est qu'il est au fond" (sic) : "la force du HTML, c'est sa simplicité"
mise à disposition de ressources : "ce n'est pas forcément des fichiers, ça peut être des requêtes"
architecture classique : le serveur va fabriquer la représentation des données, "y'a que l'appli d'Eurostat qui sait parler à la BDD d'Eurostat"
architecture avec service web : "Eurostat va faire des requêtes ailleurs, elle peut demander des données à la BCE et faire l'agrégation sur sa page", "vous avez une application qui parle à une application", "et surtout Eurostat n'a plus à se faire chier à stocker la donnée, ils vont la piocher en temps réel à plusieurs endroits parallèles"
"on est allés plus loin aujourd'hui" : architecture avec données à la demande, "tout le contenu n'est plus donné par la BDD de l'appli"
les services web (= qui utilisent le protocole HTTP) sont une sous-catégorie des services web
comment interroger un service web ?
curl
)fetch
) : maximum de contrôle"y'a eu une tentative de faire mieux que les services web, c'était le Web sémantique, mais on attend toujours que ça s'impose"
"utilisez une LLM pour générer une page pour "rire" côté serveur et côté client"
j'ai utilisé llama3.3 via le site de Sanjuan :
Below is an example of how you can create an HTML file that includes two buttons: "Laugh from client-side" and "Laugh from server-side". Since the "server-side" functionality typically involves backend technologies like Node.js, PHP, Python, etc., to keep things simple and focused on the frontend, I'll simulate a basic server-side interaction using JavaScript's
fetch
API for demonstration purposes. This example assumes you have a basic understanding of HTML, CSS, and JavaScript.For the "server-side" part, we will use a mock endpoint (
/laugh
) that would typically be handled by a backend server. However, since this is a frontend-focused example, I'll provide a simple Node.js server example at the end to handle the/laugh
endpoint for completeness.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Laugh Buttons</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 20px;
}
button {
margin: 10px;
padding: 10px;
border-radius: 5px;
cursor: pointer;
}
</style>
</head>
<body>
<button id="clientLaugh">Laugh from client-side</button>
<button id="serverLaugh">Laugh from server-side</button>
<div id="result"></div>
<script>
document.getElementById('clientLaugh').addEventListener('click', function() {
laughFromClientSide();
});
document.getElementById('serverLaugh').addEventListener('click', function() {
laughFromServerSide();
});
function laughFromClientSide() {
// Simple client-side functionality
alert("HAHA, laughed from client-side!");
document.getElementById('result').innerText = "Le cient a ri";
}
function laughFromServerSide() {
// Simulating server-side interaction using fetch API
fetch('/laugh')
.then(response => response.text())
.then(data => {
alert(data);
document.getElementById('result').innerText = "Server says: You should laugh now!";
})
.catch(error => console.error('Error:', error));
}
</script>
</body>
</html>
Optional Node.js Server (server.js) for Handling
/laugh
EndpointTo fully demonstrate the concept, including a basic server to handle the
/laugh
endpoint, you can use Node.js and Express. First, ensure you have Node.js installed on your system. Then, create a file namedserver.js
in the same directory as yourindex.html
:
const express = require('express');
const app = express();
const port = 3000;
app.use(express.static(__dirname)); // Serve static files from the current directory
app.get('/laugh', (req, res) => {
res.send("HAHA, server made you laugh!");
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
To run your Node.js server:
- Install Express by running
npm install express
in your terminal.- Run the server with
node server.js
.- Open a web browser and navigate to
http://localhost:3000/index.html
.This setup allows you to see both client-side and simulated server-side functionality in action.
"il faut bien comprendre la simplicité épatante du Web : tu modifies le DOM, tu lui dis quel élément modifier, et bingo c'est fait", "on ne redessine que les parties à modifier, c'est pour ça que les navigateurs web sont si efficaces"
"la prochaine fois, on demandera à ce que le rire ne vienne pas du client, mais que le rire vienne d'un serveur"
document.getElementById('result').innerHTML = "Rire" ;
// ↑ ↑ ↑ ↑ ↑
// cherche cherche en valeur à ne prend apparaît
// dans tout fonction de trouver en compte dans le
// le DOM id="" dans que ce qu'il <div id="result">
// (var globale) id="" y a entre
// les balises ?
Xavier Badosa, "JSON-stat, a simple light standard for all kinds of data disseminators" (2013) (vidéo commentée) :
"la façon classique de disséminer des données, c'est des tables" : "pourquoi ?"
Cf. Marrel : écriture - liste - tableau = "les outils fondamentaux qui font entrer l'humanité dans l'Histoire"
"la force des tables, c'est leur capacité à vous donner l'info sous une forme très abrégée"
le sens de la donnée est lié à sa position dans la table : "il faut regarder l'intitulé de la colonne et de la ligne pour savoir de quoi il s'agit, c'est vachement économe en métadonnées", "si on devait répéter les intitulés pour chaque donnée de la table, il faudrait le répéter des centaines de fois"
"en fait on est même sur une structure de cube, mais sur la 3e dimension on n'a qu'une seule valeur", "c'est une tranche du cube"
comment représenter ces données en cube le plus simplement possible ? "en les mettant à la queue-leu-leu" (dans un array JSON)
malédiction de la dimensionalité : "quand tu complexifies l'espace dans lequel positionner les individus, la probabilité que tu puisses suffisamment remplir cet espace réduit exponentiellement"
"t'as des espaces énormes et plus ils sont énormes et plus ils sont vides, et moins tu peux prédire des choses depuis ces données"
"heureusement pour nous, les données statistiques ne sont pas très vides, elles ont tendance à être denses parce qu'alimentées régulièrement", "pour ça, la représentation en cube ça marche bien"
"un array, ce n'est pas un carré : quand quelqu'un le reçoit, il ne sait pas comment ces données sont arrangées, il lui faut l'ordre des dimensions"
reconstruire le cube sur la base de l'array ("the unflattening problem"):
"on va construire une interface pour interroger le services de données de Statistics Norway"
"on va bâtir notre interface sur la base du service, et quand on aura fait ça, on ira chercher la donnée qui nous intéresse pour l'afficher"
"pour l'année, on n'a pas besoin d'aller plus loin que 1846, y'a pas de données au-delà"
"j'ai écrit pour vous une partie du job, pour le reste, chaque fois que j'ai marqué TODO, vous devrez regarder dans les fonctions du toolkit JSON-stat, consulter la vidéo et le diapo (cf. plus haut), et compléter le code"
"c'est aussi ça que permet un service de données : fabriquer à la volée une interface dynamique qui ne contient que le contenu qu'elle reçoit" (ex. https://data-explorer.oecd.org/)
"ce que je vous propose, c'est de faire la même chose que ça, mais pour les nuls"
"donc c'est bien d'avoir le modèle de données, mais c'est encore mieux quand vous avez les bibliothèques qui vous donnent des facilités de code, qui vous permettent d'entrer dans les données formatées selon ce modèle : c'est ça que permet JSON-stat"
"si jamais vous pilotez un projet de mise à disposition de données, il faut choisir un modèle de données qui peut être consommé par divers projets informatiques"
"imaginons qu'on veuille faire un site : on peut avoir nos données dans une base de données SQL, et on veut que la page soit construite côté client"
"votre job à vous, c'est pas de construire ce site, c'est de prototyper la conception abstraite du service de données pour la communiquer à l'informaticien"
"c'est ça que je veux que vous fassiez : utilisez OpenAPI et Swagger pour construire la doc de votre API"