Services de données statistiques

Jean-Pierre Malrieu

Notes de cours

"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"

Section 1 : Statistique publique et open data

"dans un premier temps le mouvement open data a consisté à ouvrir les données, ensuite il a bâti ses propres principes" :

  • mouvement du droit à l'information, "ça vient beaucoup du journalisme et de la politique"
  • mouvement open source ; "il faut mentionner aussi une espèce de satellite, le mouvement open science"
  • "et il y a aussi des acteurs publics, des gouvernements qui ont ouvert les données, et des acteurs privés comme Google qui ont joué le jeu de l'open source et de l'open data"

Charte internationale de l'open data : "le mouvement a commencé à réfléchir sur lui-même"

  1. open by default : "la bonne pratique de l'open data, ce n'est pas d'avoir des données privées et d'en ouvrir qu'un petit peu ; il faut faire l'inverse et ouvrir par défaut"
  2. timely : "l'autre idée, c'est que les données ne soient pas trop en retard : ouvrir les données quand personne n'en aura plus rien à foutre, ça sert à rien"
  3. accessible and usable : "il faut qu'elles soient ouvertes à tout le monde et facile à utiliser", "il faut qu'elles soient accessibles via le web : si tu dois venir avec ta 2CV récupérer les données, ce n'est pas de l'open data" ; "il ne faut pas que ce soit inutilement compliqué, c'est un boulot hein, y'a des ingénieurs payés pour faire de la merde et protéger leur marché"
    Info

    le terme technique est offuscation

  4. comparable and interoperable : "tu vas utiliser les mêmes formats que tout le monde", "et il faut que ce soit mangeable par un tas de processus différents"

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"

Info

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"

  • The Guardian et "Free Our Data"
  • Open Knowledge Foundation
  • l'OCDE "qui n'était qu'un agrégateur, sa raison d'être était de disséminer"
    "ça a donné lieu à l'élaboration d'une charte spécifique", dont parmi les principes 3 sont "vraiment réalisés par les SDS" :
  • immédiateté
  • accessibilité en ligne
  • traitement automatique

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 ?"

  • organismes dont c'est l'activité centrale, INSEE, Eurostat, etc.
  • institutions dont c'est une mission annexe : "il se trouve que le FMI est un gros pourvoyeur de stats au niveau mondial, idem pour la BCE, la Banque mondiale"
  • "il y a de plus en plus d'organismes qui ont adopté des missions de mises à disposition des données statistiques" : données des municipalités par ex.
    "y'a plein de gens qui sont tentés de s'accaparer et se redistribuer ces données"

"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"

TP

"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"

table 10211

"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"
Pasted image 20241118104836.png

"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"
            }
        ]
    }
}
TP

"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 ?

  • avec un navigateur web : peu de contrôle
  • avec une invite de commande (curl)
  • via du code (API fetch) : maximum de contrôle
    principaux types de SW : "plus personne n'utilise les services SOAP, c'était la grande promesse mais c'était trop en avance sur son temps", "aujourd'hui tout le monde utilise les services REST"
    "un service REST c'est un service qui se prend une méga cuite entre chaque requête : il oublie tout à chaque fois"
    "on ne peut pas tout faire en REST, mais ça s'applique bien à la plupart des cas" : "tout le monde peut comprendre les conventions de nommage, c'est pour ça que ça a si bien marché"

"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"

TP

"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 Endpoint

To 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 named server.js in the same directory as your index.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:

  1. Install Express by running npm install express in your terminal.
  2. Run the server with node server.js.
  3. 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 ?"

Info

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"):

  • "what does not change, first" : "on met d'abord ce qui ne bouge pas"
  • ensuite, "comment on ordonne ce qui change" : "tout dépend de comment est fichue la table à l'origine"
TP

"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"

Interface
Utilisateur
Service de données
Base de données
TP

"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"