dimanche 2 décembre 2018

Génération de population agricole à partir de données agrégées et d’un panel représentatif de fermes.


       






Sujet : Génération de population agricole à partir de données agrégées et d’un panel représentatif de fermes.


Lieu du stage : Cemagref, groupement de Clermont-Ferrand
Unité de Recherche LISC (Laboratoire d'Ingénierie pour les Systèmes Complexes)
24, Avenue des Landais – BP 50085
63172 Aubière Cedex.







Remerciements :

Je tiens à remercier Thierry Faure, mon maître de stage, pour m’avoir accordé sa confiance dans ce projet un peu abrupt pour un néophyte en informatique.
Merci également à mes camarades stagiaires qui par leur appui en langage JAVA, m’ont fait progresser bien plus vite que n’importe quel livre.
Enfin, merci à toute l’équipe du LISC, pour son accueil, sa disponibilité et sa bonne humeur permanente.




















Mots clés : statistiques, données agrégées, échantillonnage, optimisation.




Résumé :

Ce stage a consisté en l’étude des méthodes de reconstruction d’une population agricole à partir de deux sources de données : des échantillons et des données agrégées au niveau d’une ou plusieurs sous régions. Notre rapport  décrit d’abord l’analyse statistique de la population agricole du Honduras, effectuée principalement avec le logiciel Scilab. Il détaille ensuite la conception d’une application visant à créer une telle population à partir de ces deux sources de données. 





Abstract :

During this internship, we have studied methods of agricultural population re-creation from samples and aggregated data at the level of several districts. First we have made a statistical analysis of the Honduras’s agricultural population, with the Scilab software mainly. Then, we have designed a program which creates a population from these two sources of data.
















Introduction


Ce rapport présente les travaux que nous avons effectué au sein du LISC (Laboratoire d'Ingénierie pour les Systèmes Complexes), unité de recherche du CEMAGREF de Clermont-Ferrand, dans le cadre de notre stage de DESS qui s’est déroulé de début Avril à fin Septembre 2002.

Le CIAT (Centre International de l’Agriculture Tropicale) a développé des partenariats avec des organismes publics de recherche français, dont le CEMAGREF. L’un de ces projets  concerne l’étude de la diffusion de l’innovation agricole.
Cette étude nécessite la manipulation de données de recensement à l’échelle individuelle (surface de l’exploitation, types et quantités de production, informations sur les agriculteurs…).
Mais pour des raisons de confidentialité, on ne dispose généralement pas de telles données au niveau individuel mais plutôt de données agrégées à l’échelle de la commune ou du département et de quelques échantillons de données individuelles.

Le LISC, au cours de précédents travaux (projet européen IMAGES), a commencé à développer des méthodes permettant de générer une population d’exploitations statistiquement valide à partir d’échantillons et de données agrégées.

Notre stage a consisté à développer en JAVA un outil générique mettant en œuvre de telles méthodes afin d’automatiser et de faciliter les opérations statistiques que nous venons de voir.

Afin de pouvoir manipuler à la fois les données individuelles et les données de recensement agrégées nous disposions  de la base de données complète du paysage agricole du Honduras. Avant de concevoir l’application en tant que telle, nous avons donc créé des données agrégées de cette population et testé différents outils statistiques afin d’ébaucher au mieux la structure de données et les fonctions du programme, ainsi que les paramètres les plus représentatifs pour la recréation de population.







               I. Présentation de l’entreprise




Le CEMAGREF, c'est-à-dire le Centre national d'Etudes sur le Machinisme Agricole, le Génie Rural, les Eaux et Forêts, est un établissement public à caractère scientifique et technologique (EPST). Il existe depuis 1981 et comporte aujourd’hui 32 unités de recherche réparties dans toute la France sur 10 groupements géographiques. Il dépend à la fois du ministère de l'Education nationale, de l'Enseignement Supérieur, de la Recherche et de la Technologie et du ministère de l'Agriculture, de la Pêche et de l'Alimentation.


Outre la contribution au progrès des connaissances, le CEMAGREF diffuse des méthodes de diagnostic et de contrôle, il développe des outils de négociation et de gestion, il conçoit des technologies innovantes et apporte son expertise aux services publics et aux entreprises.

La figure suivante montre de manière synthétique ses principales activités et ses principaux partenaires :

Figure 1 : Activités du CEMAGREF
Les compétences du CEMAGREF s’orientent sur quatre grands domaines d’étude, qui constituent chacun un département scientifique :

-          le fonctionnement des hydrosystèmes,
-          le génie des équipements et services pour l’eau et les déchets,
-          la gestion des territoires à dominante rurale,
-          le génie des équipements dans le secteur agricole et alimentaire. 

Pour les années à venir, les deux priorités scientifiques du CEMAGREF concernent les hydrosystèmes et leurs relations avec l'agriculture d'une part, la gestion des risques naturels d'autre part.
Les méthodologies scientifiques telles que modélisation, information géographique et informatique scientifique, qui constituent un apport essentiel à la recherche en ingénierie  sont également privilégiées.


·         Produits de la recherche

Les recherches et les activités conduites au CEMAGREF donnent lieu à des produits variés.
Ainsi, les publications, les participations à des colloques, les expertises et conseils aux services publics, les essais et analyses, les brevets et logiciels, la formation initiale et continue, la participation à la normalisation illustrent les missions de l'institut.
Pour ces productions, adaptées aux utilisateurs auxquelles elles sont destinées, le CEMAGREF met en place une démarche qualité, aujourd'hui acquise pour les essais et les analyses, en cours pour les activités de recherche.

Les produits du CEMAGREF sont : 

-          Les publications (740 publications/an),
-          les participations à des colloques (320 communications/an),
-          les expertises et conseils aux services publics (800 mois-ingénieurs/an),
-          les essais et analyses (560 mois-ingénieurs/an),
-          les brevets (28),
-           les logiciels (10 commercialisés),
-           la formation initiale et continue (10 % du temps/an des ingénieurs et des chercheurs dans plus de 50 universités),
-           la participation à la normalisation (30 mois-ingénieurs/an).



Le CEMAGREF emploie  environ 1 000 permanents dont 450 ingénieurs et chercheurs. Leurs compétences, centrées sur les sciences de l'ingénieur, intègrent les sciences de la nature et du vivant, les sciences de l'univers et mobilisent les sciences humaines et sociales. Leur origine diversifiée facilite la construction de partenariats variés. Le CEMAGREF accueille en moyenne une centaine de thésards et 500 stagiaires de longue durée.

L'effectif des ingénieurs et chercheurs se répartit équitablement selon les grandes orientations scientifiques, comme le montre la figure :


           
Figure 2 : Effectif des ingénieurs et chercheurs

Deux tiers des emplois sont financés par le budget civil de la recherche et du développement. Le dernier tiers est mis à disposition principalement par le ministère de l'agriculture, de la pêche et de l'alimentation.



Le budget 2001 est de 63 millions d’euros (413 MF). Les recettes provenant des contrats s'élèvent à 13 millions d’euros (85 MF) et assurent l'essentiel des moyens de fonctionnement des unités de recherche. Chaque année, plus de 150 contrats de recherche et de transferts sont signés.
La figure suivante montre la répartition des dépenses pour 2001 :
Figure 3 : Répartition des dépenses



Le groupement de Clermont–Ferrand, l’une des 9 délégations du territoire français, est implanté sur le campus scientifique des Cézeaux ou en plus de son rôle d’institut de recherche il s'applique à développer des partenariats scientifiques, d'enseignement supérieur et de formation. Il possède également une antenne à Montoldre (Allier).

Le CEMAGREF de Clermont-Ferrand est constitué de 3 unités de recherche, qui ont la particularité d’appartenir à des départements scientifiques différents :

-          DFCF : Dynamiques et Fonctions des espaces ruraux
-          TSCF : Technologies, Systèmes d'information et procédés pour l'agriculture et l'agroalimentaire (C’est l’unité la plus importante en terme de personnel)
-          LISC : Laboratoire d'Ingénierie des Systèmes Complexes


Le LISC est une unité qui n’appartient en fait à aucun des quatre départements scientifiques définis à l’échelon national, mais est rattachée directement à la direction scientifique du CEMAGREF.
Et du fait de son statut interdisciplinaire, l’unité de recherche participe à des projets scientifiques en collaboration avec les quatre départements.

Le rôle du LISC est d’évaluer et de développer des méthodes de modélisation de systèmes complexes. Ce travail est mené en collaboration étroite avec les équipes thématiques de l’établissement et des partenaires extérieurs au travers de projets communs, souvent interdisciplinaires.

Les recherches font appel à diverses disciplines, dont les principales sont les mathématiques appliquées, les statistiques, l'informatique et  l'intelligence artificielle.  Les aspects théoriques et informatiques des modèles sont développés dans le cadre de projets en partenariat avec des équipes thématiques. La recherche se déploie dans trois directions principales :

-          les modèles dynamiques distribués spatialement,
-          les modèles statistiques et les bases de connaissances,
-          les méthodes et outils d'utilisation collective de modèles dans une négociation.


Le thème de recherche de l’unité, MAGESTYC (Modèles pour l’Aide à la GESTion des sYstèmes Complexes), vise à élaborer, tester, valider des méthodes de modélisation génériques utilisables dans les domaines du CEMAGREF : écosystèmes, dynamiques sociales et interactions avec le milieu, interactions entre équipements et milieux naturels.
 Le travail de recherche se concentre particulièrement sur l’utilisation de modèles géométriques dynamiques, qui permettent de définir l’évolution locale de formes, à diverses échelles. Ces modèles sont élaborés dans une démarche incrémentale, en étroite liaison avec des experts du terrain et des domaines abordés. Leur confrontation aux historiques de données disponibles et à l’appréciation des acteurs est une question particulièrement sensible. Les applications principalement visées sont des outils de gestion de la connaissance, généralement destinés aux experts d’un domaine, ou directement des outils d’aide à la décision ou à la négociation pour les acteurs de terrain et les décideurs publics.



Basé à Cali, en Colombie le CIAT (Centre International de l’Agriculture Tropicale), organisme à l’origine de notre projet, est en fait un des centres de recherche du CGIAR (Consultative Group on International Agricultural Research).

Crée en 1971, Le CGIAR est une association internationale dont les membres publics et privés supportent 16 centres dans plus d’une centaine de pays.
Son but est d’utiliser l’outil scientifique pour améliorer la production agricole et d’apporter des solutions aux problèmes de nutrition, de santé et d’environnement des pays tropicaux principalement.
Plus de 8500 chercheurs travaillent au CGIAR et les produits de leur recherche débouchent dans le domaine public.


           


           





               II. Présentation de l’étude




Le CIAT (Centre International de l’Agriculture Tropicale), pour étudier la diffusion de l’innovation agricole dans les pays concernés par son action, doit disposer de données de recensement à l’échelle individuelle ou familiale. (Ces données sont des informations sur les exploitants, les terrains et les productions des fermes).

 Or, non seulement les recensements sont peu nombreux et espacés dans le temps, mais il est rare que ceux ci soient disponibles de manière exhaustive. Souvent on ne dispose, pour des raisons de confidentialité, que d’échantillons (de taille variable, mais représentatifs de la population) et de données agrégées à l’échelle du village, de la commune ou de districts supérieurs.
Il faut donc à partir de ces deux sources de données pouvoir recréer  une population statistiquement valide, avec une erreur minimale d’erreur entre population générée et population réelle.

Le CIAT a donc développé un partenariat avec le LISC, du CEMAGRF de Clermont-Ferrand, qui a commencé à développer des méthodes de recréation de population lors du projet IMAGES (CT 96 2092), projet qui  concernait l’étude des décisions des agriculteurs européens sous l’application de la Politique Agricole Commune (PAC).

L’objectif premier de notre stage au sein du LISC a donc été de concevoir une application dotée d’une interface conviviale qui effectuerait cette recréation de population à partir de données agrégées et d’échantillons. Nous allons maintenant voir plus en détail les objectifs et contraintes du programme.



Voici les spécifications qui sont apparues au début de l’étude :
·         Le programme sera codé en JAVA, langage dont la robustesse et l’approche objet conviennent parfaitement  pour une telle application, et qui n’a pas besoin de hautes performances en termes de vitesse d’exécution. De plus, programme et code sources seront disponibles en libre accès : il ne doit donc pas y avoir de classes protégées par copyright ni d’appels à des modules externes appartenant à des applications payantes.
·         Le programme devra reposer sur une interface graphique suffisamment intuitive pour permettre à l’utilisateur néophyte de le faire fonctionner rapidement sans recourir constamment à un mode d’emploi.
·         Il devra comporter un module de localisation car il sera utilisé par des personnes de langue espagnole ou anglaise.
·         L’outil doit être générique : On doit pouvoir traiter des données d’entrée qui varient selon la population étudiée :
-  Le nombre de paramètres est variable et ceux-ci peuvent être qualitatifs ou quantitatifs : ils doivent être reconnus comme tels par le programme,
-  Le nombre de niveaux d’agrégation (échelles géographiques) peut varier.
·         Il y a donc nécessité de garder une certaine souplesse pour définir la structure des fichiers d’entrée. Les contraintes de format devront être suffisamment souples pour tenir compte de la variété des cas rencontrés.

Au fur et à mesure du déroulement du stage, de nouveaux objectifs  sont apparus :
Le principal a été d’envisager d’ajouter au programme la fonction « inverse » de celle qu’il effectue : C’est à dire créer un échantillon représentatif (au taux d’erreur désiré) à partir de la population entière. Cet ajout trouve tout son intérêt car on rencontre de plus en plus le besoin de créer un échantillon type a partir d’une population mère : pensons par exemple à un bureau de recensement, ou une agence publicitaire désireuse de connaître les profils types de ses clients pour mieux les cibler.
C’est une manipulation qui demande peu d’ajout de code, car les structures de données et les fonctions d’optimisation demeurent les mêmes. Le seul problème étant la quantité de mémoire requise pour charger la matrice de population entière.


Voyons maintenant plus précisément les spécifications du programme en décrivant les différents modules qu’il comportera (en termes de code, un module correspondra à une ou plusieurs classes ou même un package) :

  • Module « population »
Il contiendra toutes les variables concernant les données de la matrice de population, les données agrégées, les échelles…

  • Module « statistiques » 
Le programme doit disposer de nombreux outils pour faire l’agrégation des données : les plus classiques comme moyenne, somme, variance, écart-type mais aussi  d’autres qui sont de plus en plus utilisés, comme les quantiles. On pourra également rajouter des modules plus complexes comme des analyses factorielles des correspondances, des analyses par clusters…

  • Module « optimisation »
Il comportera au moins 2 algorithmes de minimisation pour optimiser le taux d’erreur lors de la recréation de population :
Un algorithme quadratique et un algorithme de type génétique, qui travailleront séparément ou ensemble.

      Notons qu’au début du projet, il était prévu de rechercher dans la littérature un algorithme quadratique qui conviendrait au mieux au problème mais le temps et la complexité qu’impliqueraient son codage nous ont incité à rechercher un algorithme déjà écrit : Or il existe peu de tels algorithmes disponibles dans le domaine public : celui de Scilab (appelé par la fonction " optim") s’est révélé vaste et incompréhensible, car il contient de nombreuses routines en Fortran non documentées. Nous avons finalement  opté pour un algorithme venant de "R" : un environnement de calcul statistique en sources libres.

  • module « visualisation »
Ce module servira à visualiser les différentes données traitées par le programme sous forme graphique. Nous avons projeté de l’élaborer à partir de JAS (Java Analysis Studio), un package gratuit spécialisé dans cette tâche.

  • Un module « plan d’expérience »
Comme son nom l’indique, il servira à établir facilement des plans d’expériences  mais il permettra aussi de les mémoriser.




·         Première quinzaine  d’avril : bibliographie sur les méthodes d’optimisation  (algorithmes quadratiques et génétiques) et articles sur les méthodes statistiques de recensement de population.

·         Deuxième quinzaine d’avril à mi-juin : Analyse de données avec Scilab sur la population du Honduras : calcul des données agrégées pour les paramètres de terrains, les paramètres de producteurs puis analyse des corrélations.
Découverte du langage JAVA et entraînement à la conception d’interfaces graphiques (avec jcreator).

·         Fin juin à mi-juillet : Définition de la structure du programme, Conception UML du diagramme de classes, ébauche de l’interface graphique.

·         Mi-juillet à fin août : Codage du programme. Rédaction du rapport.

·         Mois de septembre : codage, perfectionnement et ajout de nouveaux modules.






               III. Descriptif des outils acquis



Durant ce stage nous avons nettement amélioré nos compétences en langage orienté objet (vues en DESS avec le langage C++), grâce à la pratique de l’UML et du langage JAVA.
 Nous avons également manipulé des outils statistiques tels que Scilab. Enfin nous avons abordé des méthodes d’optimisation de type quadratique et génétique pour les besoins de notre application.

1.  Logiciels et langages


1.1   Scilab 2.6


 Scilab (pour Scientific Laboratory) est un programme français de statistiques et de mathématiques gratuit et en sources libres (licence GNU), développé par l’INRIA depuis 1989. Il regroupe de nombreuses et diverses fonctions visant à faciliter le travail sur des groupes de données (matrices et vecteurs).

Nous n’avons pas utilisé le logiciel Matlab, plus performant mais payant, pour rester dans une optique de gratuité des outils et des travaux fournis : En effet, le programme et les outils qui lui sont associés pour le pré-traitement des données, tels que Scilab, doivent être en sources libres.

1.2   Microsoft EXCEL


Nous avons utilisé Excel en appui à Scilab pour plus de facilité dans l’édition des données agrégées et la création de graphiques.
Si le logiciel est performant pour ces tâches d’édition et de présentation il n’est cependant pas d’une grande efficacité pour les fonctions statistiques (nombre de lignes limité à 65000, mauvaise gestion des intervalles de classe dans les graphiques…).

1.3   Le langage JAVA


Créé en 1995  par la société Sun, ce langage objet est en constante amélioration et connaît un grand succès dans le monde grâce à ses nombreux avantages :
Il est syntaxiquement proche du C++, ce qui facilite le passage de l’un à l’autre.
Il est multi plate-forme (seule l’installation de la machine virtuelle est requise)
Il est robuste : c’est un langage complètement objet, très typé et qui possède beaucoup de gestions d’exceptions.
Il possède beaucoup de fonctions simplifiées grâce à un panel de classes livrées avec le JDK, à la suppression des pointeurs et la gestion de la mémoire par le Garbage Collector.
La conception d’interfaces graphiques est rendue très simple par les composants AWT et swing.

Le langage JAVA possède néanmoins des points noirs comme sa relative lenteur (car c’est un langage interprété), ou bien l’absence d’héritage multiple (compensée par les interfaces).

Durant ce stage nous avons utilisé le JDK 1.3.
 (Nous avons écarté le JDK 1.4 car il est trop récent et souvent des problèmes incongrus peuvent se poser avec modules externes ajoutés).
Nous avons utilisé les composants graphiques SWING plutôt que les composants AWT car ils sont plus complets et optimisés.

1.4   Jcreator


Plus exactement : Jcreator 2.00 LE (Lite Edition) de Xinox software : c’est une version gratuite de ce logiciel de développement en JAVA.
Nous l’avons utilisé au début de notre stage lors de notre initiation au langage JAVA
Il est complet, tout en étant très léger, et son interface ressemble trait pour trait à celle de Microsoft Visual C++.
Le seul hic est qu’il ne possède pas de débogueur intégré.

1.5   Jbuilder 5


Borland Jbuilder (utilisé avec le JDK1.3) est un éditeur de développement JAVA proposant  une  interface de conception visuelle complète
Nous l’avons choisi en raison de sa capacité à créer rapidement une interface graphique.
De plus, de nombreux assistants, audits de code et classes types permettent d’accélérer le codage.
Cependant certaines des classes qu’il utilise sont sous licence et ne sont donc pas portables à l’extérieur, car notre programme requiert une gratuité complète.

1.6   ArgoUML


ArgoUML  permet de faire des diagrammes en modélisation UML puis de générer du code JAVA à partir de ceux-ci.
ArgoUML est en version 0.10 : il est en cours de développement et donc pas très stable. Son successeur, nommé Poseïdon, fonctionne mieux mais est plus lourd. Nous avons donc préféré utiliser ArgoUML car nous l’avons utilisé uniquement pour faire le diagramme de classes du programme.

1.7   WinEdit 2000


WinEdit est un éditeur de texte très complet qui remplace avantageusement le bloc-notes et devient indispensable pour lire les très gros fichiers texte telles que les matrices de paramètres utilisés durant notre stage.

1.8   Xanadu


Ce petit logiciel gratuit permet de traduire facilement un mot dans la langue souhaitée.
C’est en fait une sorte de moteur de recherche qui affiche dans un onglet une page de réponses pour chacun des différents sites de traduction on-line auxquels il a fait sa requête.
La multiplicité des réponses, la non présence de publicité et  la simplicité d’utilisation en font un outil très agréable à utiliser.
Nous l’avons utilisé pour des traductions de l’espagnol et de l’anglais.


1.9   Java analysis studio


JAS (version 2.2.5 ) est une application gratuite et multi-plateforme qui a pour ambition de faciliter l’affichage et l’analyse de données, indépendamment de leur format ou de leur nature.
Elle dispose de nombreuses fonctions statistiques et d’une interface graphique très riche et intuitive permettant
Le code source étant disponible, nous comptons utiliser certaines de ses classes pour le module de visualisation.


Nous allons à présent voir les différentes méthodes d’optimisation étudiées pour les besoins du programme.


2.  Les méthodes de reconstruction de population


Décrivons d’abord d’une manière générale la méthode de reconstruction de population à partir de données agrégées et d’échantillons que nous allons utiliser :
On définit d’abord tous les individus de l’échantillon comme des « prototypes » : chaque prototype représente une exploitation agricole type.
Cet échantillon ne devra pas être trop petit et représenter suffisamment bien la population initiale (échantillon non biaisé), ce qui n’est pas toujours évident dans la pratique.

On va ensuite attribuer des coefficients (appelés λi ) à chaque prototype. Le produit des prototypes par leurs coefficients nous donnera une nouvelle population. Tout le travail d’optimisation consiste donc à choisir de façon optimale ces coefficients afin de respecter les contraintes imposées par les données agrégées.
Ce problème apparaît donc comme la résolution d’un système linéaire. Cependant, dans la majeure partie des cas, un tel système ne possède pas de solution.
Nous devrons donc le transposer en un problème quadratique, ce qui permettra d’obtenir à priori une solution optimale.

Mais on peut également approcher le problème sous une toute autre approche, qui est celle des algorithmes de type « génétique » :
Ceux ci aboutissent en général rapidement à une solution sub-optimale mais ensuite, au fil des itérations, leur progression devient très lente, avec peu d’assurance d’atteindre la solution optimale.
Il est cependant intéressant de comparer leurs solutions avec celles des algorithmes de type quadratique.

Nous allons d’abord voir la méthode utilisée pour transformer le problème linéaire en un problème quadratique puis nous présenterons l’algorithme quadratique utilisé dans le programme et enfin nous allons comparer différents algorithmes de type génétique.



2.1 Méthodes de formulation du problème pour la résolution quadratique



Pour le problème qui nous concerne, résoudre un système quadratique revient à trouver le minimum d’une somme quadratique de différences.

Nous allons étudier ceci en partant d’un exemple assez simplifié où deux types de paramètres sont utilisés : le nombre de producteurs et les différentes productions.
Considérons une population P initiale, constituée de N individus (agriculteurs).
Ces agriculteurs produisent K sortes de produits k.
Considérons maintenant notre échantillon : une population P’ de n individus : ce sera donc l’ensemble des prototypes à partir desquels nous allons générer une population P’’ semblable à P.

Considérons que les paramètres de notre population P sont :
-           : nombre d’agriculteurs de P produisant k
-          Et  : quantité de k produite dans P.

Nous noterons également  la quantité de k produite par l’individu i de P’.

La problème peut alors s’écrire sous cette forme :
avec
 =   et  =

Les variables de décision du problème sont :
-           = 1 si xi produit k.
-          * = 0 si xi ne produit pas k.

α et β sont des coefficients de pondération : ils servent à donner plus ou moins d’importance à certains paramètres.

Sous une autre formulation, le problème devient :


avec

Développons maintenant ce polynôme du second degré en xi, nous obtenons :


Et nous reconnaissons la forme quadratique suivante :

xt * Q*x  + 2*pt * x,

où x=(xi), Q=(qij) et p=(pi) avec :
 pour i >= j , i,j=1..n.
qij = 0 pour i >= j , i,j=1..n.

pi =

Si nous notons I la matrice identité, le problème devient, avec les notations ci dessus:
min (0.5*xt*Q*x+pt*x)
I*x=N

C’est cette formulation qui sera utilisée lors de la résolution par le programme.
Il faudra donc calculer et fournir, entre autres, à la routine d’optimisation la matrice Q et le vecteur p.

2.2 L’algorithme quadratique utilisé par l’application


L’algorithme utilisé par notre programme ne sera pas codé dans une classe mais sera en fait appelé par un module extérieur : « R »

Le projet « R » (www.r-project.org) est un langage et un environnement pour le calcul statistique et l’affichage graphique. Il est gratuit et en sources libres car  il est développé sous licence GNU. Il fonctionne sous de nombreuses plates-formes (Windows, linux, Mac…).
R possède de nombreuses fonctions statistiques évoluées, et peut facilement en intégrer de nouvelles, par l’ajout de packages.

L’algorithme d’optimisation quadratique de R est décrit par Goldfarb et Idnani (1983) :
Il consiste en fait en une série de méthodes de programmation quadratique. Ils le décrivent comme un algorithme dual efficace et numériquement stable pour les problèmes quadratiques entiers positifs.
Sa particularité est d’utiliser le minimum non contraint de la fonction objectif  comme point de départ.
De plus son implémentation utilise les factorisations de Cholesky et de type QR et les procédures pour les mettre à jour.


 2.3 Algorithmes de type génétique



Nous entendons ici par algorithmes de type génétique tous les algorithmes n’utilisant pas de méthodes analytiques, ou ne pouvant être décrits précisément ou bien dont la solution exacte, si elle est connue, est trop compliquée pour être calculée en un temps raisonnable.

Voyons un comparatif entre les deux approches, qui se révèlent complémentaires :


Approche ad hoc (analytique, spécifique)
Approche génétique 
Rapidité
Selon solution, parfois bonne
Bonne à très bonne
Performance
Selon solution
Bonne
Compréhension du problème
Nécessaire
Non nécessaire
Travail humain
Très variable : De quelques jours à quelques thèses
Faible : Quelques jours ou semaines
Applicabilité
La plupart des problèmes intéressants n'ont pas d'expression mathématique exploitable, ou sont non-calculables, ou NP-complets.
Générale
Etapes intermédiaires…
ne sont pas des solutions (il faut attendre la fin des calculs)
sont des solutions (le processus peut être interrompu à tout moment)

Pour notre problème utiliser de telles méthodes signifiera, comme pour un algorithme quadratique, générer des coefficients λi pour multiplier les prototypes de façon à  minimiser au maximum l’erreur entre données agrégées initiales et données agrégées générées.
Mais ici, au lieu de chercher la valeur des λi, nous leur donnons une valeur de départ quelconque puis nous les modifions petit à petit selon diverses méthodes, en observant si l’erreur résultante a été diminuée ou pas. C’est le nombre d’itérations qui est déterminera la qualité de la solution : si celle ci progresse vite au départ, elle atteint ensuite une phase de plateau.

Williamson  et coll.(1998 ) ont exposé un éventail de méthodes de type génétique pour des travaux d’estimation de population à partir des échantillons du recensement de 1991 au Royaume Uni. Ces travaux correspondant assez aux nôtres, nous allons pouvoir adopter l’une de ces méthodes pour notre programme, sans avoir à trop la modifier.
Nous allons donc passer en revue ces différentes méthodes et garder la meilleure.

Tout d’abord examinons la méthode la plus basique que l’on puisse imaginer : Essayer toutes les combinaisons possibles de coefficients multiplicateurs λi pour un échantillon donné : Le problème se révèle tout de suite gigantesque pour une base de données telle que la nôtre! Il faut donc trouver des méthodes plus élaborées pour arriver rapidement à une solution, en général sub-optimale.
Voyons les 3 méthodes proposées par les auteurs, et leurs variantes :


  1. L’approche “Hill climbing”(Ascension de colline)

Par cette méthode, on n’essaie plus toutes les combinaisons possibles mais on en choisit une seule, puis on fait quelques changements minimes : si l’erreur est diminuée on conserve les changements, sinon on les rejette, puis on fait de nouveaux changements.
Cette méthode a l’avantage de faire diminuer rapidement l’erreur globale mais son gros problème est que si on arrive a un pic sub-optimal (minima local de la fonction qui n’est pas le minima absolu) on ne peux plus « en sortir », car l’approche hill climbing veux que l’on progresse toujours dans un seul sens.

Voici le déroulement de cette méthode :

a) on dispose d’un échantillon, (ou bien on le choisit au hasard dans la population initiale, 1%  par exemple).

b) on multiplie chaque prototype de l’échantillon par des coefficients λi (de valeur quelconque au début).

c) On calcule  l’effectif des contraintes observées à partir de la nouvelle population générée.

d) On calcule (ou on connaît) l’effectif des contraintes attendues de la population initiale.

e) On calcule un indicateur d’erreur appelé TAE (total des erreurs absolues) :
TAE = somme des valeurs absolues des différences entre valeurs des contraintes observées (générées) et valeurs des contraintes théoriques (dont on dispose au départ).
Si le TAE  atteint la valeur de 0 alors la solution est optimale.

Le choix de cet indicateur est préférable à un test de χ² qui, selon les auteurs, n’est pas adapté à ce genre de population (car des valeurs de paramètres très disparates aboutissent à un khi ² anormalement fort). Les autres tests paramétriques sont également proscrits du fait de la grande auto-corrélation qui règne souvent entre les paramètres.

f) On change la valeur de quelques λi (au hasard ou pas) et on recalcule le TAE : si le TAE a diminué on conserve les changements opérés, sinon on revient à la précédente configuration.
Puis on recommence un très grand nombre de fois cette méthode , jusqu'à trouver un TAE acceptable.

Voyons deux variantes de cette méthode :

HC 1 : On fait un simple remplacement de coefficients λi au hasard.

HC 2 : Le seul changement consiste, au lieu de sélectionner des coefficients λi au hasard,  à étudier la contribution pour le TAE de plusieurs valeurs de λi  pour chaque élément (prototype) et d’éliminer celles qui  augmentent le plus l’erreur totale.

La méthode HC2 semble plus efficace que HC1 mais pourtant c’est cette dernière qui a les meilleurs résultats. En effet, à l’expérience, HC2 tombe rapidement dans des pics sub-optimaux et est plus lente, ceci étant dû à la perte de diversité due à sa sélectivité supérieure.



  1. L’approche “simulated annealing” (recuit simulé)

Le principe de base du recuit simulé est emprunté à la métallurgie : on chauffe un morceau de métal, puis on le laisse refroidir lentement. Le refroidissement lent et régulier du métal permet aux atomes de se stabiliser peu à peu dans une position d'énergie minimale. Ici nous allons minimiser, non pas l'énergie d'un cristal, mais une fonction de coût (erreur totale) caractéristique du problème, où une solution est d'autant meilleure que son coût est faible.

La méthode permet le « back-tracking » : c’est à dire pouvoir redescendre d’un pic sub-optimal (augmenter temporairement l’erreur) pour atteindre plus tard un pic de moindre erreur.

Son fonctionnement repose sur une formule de thermodynamique :

P(δE) = exp (-δE / T)
Avec :
P = probabilité (d’augmentation)
δE = augmentation potentielle du TAE  (changement potentiel de performance de recombinaison).
T = niveau maximum de dégradation de performance acceptable pour la modification d’un élément dans une combinaison.

Il en découle que :
Plus δE est faible et plus la probabilité d’un changement potentiel sera grande.
Plus T est faible et moins une baisse importante de performance sera acceptée.

Le déroulement  de cette méthode est semblable à celui du hill climbing hormis que les changements prévus sont soumis à cette formule.

Si un élément augmente la performance globale (diminution de l’erreur), il est automatiquement accepté.

Si un élément diminue la performance globale il ne sera  accepté que si P(δE) est supérieure ou égale à un nombre aléatoire compris entre 0 et 1.


La méthode du « simulated annealing » a été testée en deux variantes, qui varient seulement au niveau des valeurs de T initiales :

SA1 : Au départ on fixe T comme la variation maximum de TAE pouvant être créée par un changement de coefficient.
La période pour laquelle T diminue a été fixée à 10*T. ( c’est un ratio empirique qui donne de très bons résultats).

SA2 : T est choisie plus faible mais la période de diminution de T l’est aussi, car on garde le même ratio : 10*T . Ceci a pour conséquence de faire ressembler la méthode à un hybride avec la méthode hill climbing.

SA2 fonctionne beaucoup mieux que SA1, qui est handicapée par de trop grandes fluctuations dues à la facilité de sortir des pics sub-optimaux.
Il faut donc, dans cette méthode, minimiser le plus possible le back-tracking, sans toutefois le supprimer.


  1. L’approche par algorithme génétique

L’algorithme génétique au sens strict s’appuie sur une vision « évolutive » empruntée à la biologie.
Il fait intervenir des entités appelées chromosomes, qui sont les vecteurs de la reproduction, c’est à dire la transmission de l’information d’une itération de l’algorithme à une autre. Dans notre cas on pourra définir un chromosome comme un ensemble de coefficients λi. Chaque chromosome possède un niveau de santé (fitness) qui correspond au complément de sa contribution au TAE selon un nombre arbitraire. Ainsi, seuls les chromosomes ayant le meilleur niveau de santé pourront se reproduire. La reproduction fonctionne par un processus appelé croisement (cross-over) : deux chromosomes parents s’échangent équitablement leur information (les coefficients dans notre cas) et créent ainsi deux chromosomes fils.
Il peut y avoir plusieurs croisements et le taux d’information transmise peut varier.
De plus plusieurs mécanismes peuvent intervenir sur ce processus :

-          L’élitisme : On considère qu’un certain pourcentage des chromosomes les plus sains (meilleurs niveaux de santé) feront partie de la génération suivante sans passer par la reproduction.

-          La mutation : On intervient sur le croisement entre deux parents en ajoutant une probabilité (faible) de non-transmission d’un élément d’un parent à un enfant, qui conserve alors son élément d’origine. Ceci  permet d’injecter ou de réinjecter de la diversité dans le déroulement de l’algorithme car la sélection perpétuelle par le niveau de santé fait décroître progressivement cette diversité.


Cinq variantes de l’algorithme génétique ont été testées. Elles variaient sur plusieurs paramètres : nature de la fonction de calcul du niveau de santé, taux d’élitisme, nombre de croisements, taux de mutation…
Les performances de chacune de ces variantes importent peu ici, car aucune n’est meilleure que les algorithmes hill climbing ou  simulated annealing.

Au final nous retiendrons que c’est l’algorithme SA2 (simulated annealing avec une faible valeur de T) qui donne les meilleurs résultats. C’est donc celui-ci que nous choisirons et implémenterons dans notre application.

               IV. L’étude



Cette étude pourrait se décomposer de manière grossière en 2 grandes parties :
D’abord l’analyse des données puis la réalisation du programme.

  1. Analyse des données


Les Données dont nous disposions pour faire notre étude viennent d’un recensement effectué au Honduras : Ce recensement a porté sur tout le pays et concernait la population agricole.
Le questionnaire soumis aux exploitants portait sur trois types d’informations :

·         Les caractéristiques du producteur,
·         Les caractéristiques des exploitations (subdivisées en 2 parties : propriété des terres et usage des terres),
·         Les productions (nature des productions et leur quantités).

Le recensement a donc engendré une base de données pour chacun de ces domaines, mais il a également établi les localisations de chaque ferme recensée sous forme de coordonnées spatiales (position X et Y) et sous forme de référence aux districts auxquelles elles appartiennent.


Le Honduras, petit pays d’Amérique Centrale (112088 km² et 5 600 000 habitants) est structuré administrativement selon 3 échelles principales :
Les départements, qui contiennent des municipalités, qui contiennent des villages.

Carte administrative  du Honduras




De façon chiffrée le pays comporte :
-          18 départements
-          290 municipalités (soit environ 16 municipalités par département)
-          3760 villages (soit environ 13 villages par municipalité)
-          317187 fermes  (soit 84 fermes par villages)

Chaque ferme possède un identifiant unique de 12 chiffres, constitué d’un « code village » de 5 chiffres, plus 7 chiffres propres à la ferme.
Ce code village contient aussi en lui même  les codes de municipalité et de département de la ferme concernée. L’identifiant d’une ferme contient donc tous les codes d’échelle.

Examinons maintenant plus en détail les 3 bases de données du recensement :
- Les paramètres d’exploitation : Ce sont toutes des surfaces, et elles sont données en Ha.
En voici la liste des paramètres : il y a d’abord la liste des propriétés des surfaces  puis l’usage des terres :

EXPLOITATIONS
numéro
propriété des terres
paramètre
1
terrains propres (personnels)
2
terrains nationaux
3
Ejidales (non traduit)
4
Terrains loués
5
Terrains occupés (sans contrat)
6
sous total
7
Terrains loués à un tiers
8
total de l'exploitation
9
usage des terres
cultures annuelles
10
cultures permanentes
11
repos long (plus d’un an)
12
repos court (moins d’un an)
13
pâturages naturels
14
pâturages cultivés
15
bois, forêts
16
étangs, lacs…
17
autres usages agricoles
18
autres usages non agricoles..


- Les paramètres des producteurs : ce sont des données qualitatives sur les exploitants, codées sous forme de classes (exemple : 5 classes de condition juridique) ou bien binaires (Homme/Femme) :

PRODUCTEURS
1
condition juridique
2
age
3
sexe
4
alphabétisation
5
Plus haut niveau d'études atteint
6
Plus niveau d'études validé
7
type de questionnaire



- Malheureusement les données de productions n’ont pas pu nous parvenir à temps, ni pour faire l’analyse de données, ni pour les utiliser avec le programme (bien que celui soit configuré pour les accueillir).
Ces données (qui contenaient les types de production et leur quantité) étaient en fait sous forme de base de données relationnelle, car pour une ferme donnée il peut y avoir plusieurs productions (de culture ou d’élevage).
Notons que, cette base de données étant peu compatible avec la structure de données du programme, il était prévu lors de la phase de conception de la convertir en une base unique, toutes les productions d’une ferme et leurs caractéristiques étant affichées sur une seule ligne.

 Pour terminer, la base de données des coordonnées spatiales des fermes : nous ne l’avons pas utilisé pour l’instant mais nous notons qu’elle représente un outil intéressant pour des recherches de corrélation.




Nous disposons donc de deux matrices de paramètres : exploitations  et producteurs. Elles possèdent chacune 317187 lignes (c’est à dire le nombre de fermes du pays) et leur nombre de colonne est respectivement 24  et 10. (Et non pas 18 et 7, car aux paramètres en tant que tels s’ajoutent l’identifiant de la ferme, le code de village, d’autres champs de localisation et parfois des colonnes doublons).
Nous allons décrire point par point les opérations effectuées avec Scilab sur ces données pour aboutir aux données agrégées de la population et à leur analyse.


  • remarques préalables :
Nous avons adopté le choix d’utiliser des matrices sous forme de fichiers textes plutôt que sous forme de fichiers codés, moins coûteux en espace mais non lisibles directement.
C’est pourquoi nous utilisons les fonctions fscanfmat et fprintfmat : lecture et écriture de matrices en mode texte.
Pour être lisibles par Scilab nous avons enlevé l’entête du fichier d’origine et mis des espaces comme séparateurs de données.
On trouvera dans l’annexe 1 le code source des algorithmes les plus représentatifs pour  chacun des points développés ci après.


A.    Obtention des codes municipalité et département


Il faut avant tout  récupérer pour chaque ferme son numéro de département et de municipalité, c’est à dire les deux échelles sur lesquelles porteront la majorité des agrégations. Pour cela, nous utilisons la fonction floor pour tronquer de manière entière  le code village de manière entière :
Code département = floor (code village/10000) ;
Code municipalité = floor (code village/100) ;


Notons ici qu’une erreur de zéro s’est glissée dans l’e-mail qui nous informait de ces coefficients de division : Et pour obtenir les codes municipalités nous avons divisé par 1000 au lieu de 100…
Et comme nous ne devions voir la personne qui nous a fourni les données que deux mois plus tard, nous avons fait toute notre analyse de données avec cette erreur :
Au final nous avions 38 municipalités au lieu de 290, et les données agrégées en découlant n’avaient évidemment aucun utilité réelle.
Heureusement ceci n’a eu que peu de préjudices pour la suite de nos travaux, si ce n’est d’empêcher la possibilité de trouver des corrélations valables entre paramètres à ce niveau d’agrégation.



    1.  Création des données agrégées (sommes et variances) à chaque niveau d’agrégation pour les données d’exploitation.

Les paramètres d’exploitation sont des données quantitatives (surfaces). Nous avons donc agrégé chaque paramètre, district par district, pour chacune des échelles.
De plus nous avons ajouté une colonne au fichier résultat, contenant la somme des fermes contenues dans chaque district.
Ceci constitue donc les données agrégées sous forme de sommes.
Nous avons aussi agrégé les variances de chaque paramètre, en utilisant cette fois la fonction Corr au lieu de faire une simple somme des valeurs.

Puis nous avons séparé cette matrice en autant de fichiers que de colonnes, pour une plus grande facilité d’utilisation de ces données, qui seront traitées sous Excel.


    1. Visualisation des données par classes de superficie : (au niveau global, départemental et municipal)  et par déciles

Pour avoir un aperçu général des données, nous avons sélectionné des paramètres représentatifs, tels que la surface totale des exploitations, et les avons agrégé selon des classes définies.
Pour les surfaces, les intervalles de classe ont été choisis d’ordre exponentiel car le Honduras, comme de nombreux pays d’Amérique latine, possède une grande disparité agricole : D’un coté des milliers de fermes de moins d’un hectare, de l’autre quelques immenses exploitations de plus de 10000 hectares, avec tous les intermédiaires entre les deux.

Nous avons également refait ce classement par la méthode des quantiles (déciles plus exactement) qui est plus parlante dans ce cas.


D.    Agrégation des paramètres pour les données des producteurs.


Ces paramètres sont d’ordre qualitatif : il y a des variables binaires, comme le sexe (bien qu’il y ait toujours en plus un champ supplémentaire : « non renseigné ») et des variables de classes comme le niveau d’études. Même l’age peut être considéré comme une variable de classe car le champ « 99 » ne signifie pas « 99 ans » mais « non renseigné ».

Mais pour ce paramètre âge on choisira des intervalles de classe adaptés : par tranche de 10 ans plutôt que année par année.
Les données agrégées des producteurs seront donc toutes organisées par classes : on séparera donc chaque fichier colonne (contenant les données pour un paramètre) en autant de fichiers que de classes contenues dans le paramètre.


    1. Agrégation des 2 matrices : producteurs et exploitations

Pour pouvoir rentrer tous les paramètres en même temps dans le programme nous allons agréger les 2 matrices de données
Scilab réalise très facilement et très rapidement cette fonction. (Syntaxe : z = [x y])
Auparavant nous avons dû trier chacune des matrices par ordre croissant de l’identifiant. Ceci grâce à la fonction gsort, également très rapide (car c’est une fonction interne de Scilab ; si nous avions du créer une routine de tri à l’aide d’une boucle « for… », l’exécution de l’algorithme aurait été beaucoup plus longue).
Notons d’ailleurs ici que pour optimiser un algorithme utilisant de telles matrices, on peut agir à deux endroits :
-          S’assurer que la matrice est entièrement en mémoire, pour limiter les accès disque,
-          limiter le nombre de passages en revue de cette matrice avec des boucles « for », « while »…


    1. formatage des fichiers pour le programme 

Le programme demandera un certain formatage pour le fichier d’entrée. Il y aura en fait trois fichiers, pour plus de souplesse :
  • Infopop.txt : Ce premier fichier contiendra les informations globales de la population : reprise de l’entête du fichier initial avec noms des paramètres, types de variables et catégories, ainsi que des informations sur les différentes échelles utilisées.
  • codevillage.txt : Ce fichier contiendra les codes de village de chaque ferme. Ce champ a été extrait de la matrice principale pour plus alléger les accès mémoire.
  • matpop.txt : C’est la matrice globale sans les entêtes. Il contient tous les paramètres de toutes les fermes, séparés par un caractère défini (ici : une virgule).




Nous avons ensuite étudié les  corrélations entre les paramètres de la population dans le but de
déterminer ceux qui seront utilisés par l’application au niveau de l’algorithme de minimisation quadratique, c’est à dire ceux à partir desquels on va créer les contraintes pour la population à générer.
En effet, il serait inutile et coûteux en termes de mémoire et de temps de définir des contraintes provenant de deux paramètres très corrélés car les prototypes générés auraient le même profil si on prenait en compte un seul paramètre.

Quant aux paramètres non utilisés, ils serviront pour la validation : On vérifiera ainsi que les données agrégées de la population initiale et celles de la population générée sont semblables pour ces paramètres (qui ne sont pas intervenus dans le processus de recréation).

Nous avons calculé la corrélation de toutes les combinaisons de paramètres pris deux à deux car même si certains couples n’ont pas de sens, on  est sur de ne pas passer ceux qui pourraient se révéler intéressants.
Faute de temps nous nous sommes limités à traiter les corrélations pour les données quantitatives mais pas pour les données qualitatives (Données des producteurs) : pour exploiter ces dernières, il aurait fallu transformer les variables qualitatives en variables binaires.



L’algorithme en Scilab pour le calcul des corrélations se situe à l’annexe 1.G
Nous obtenons le coefficient de corrélation par la formule :

Coefficient de corrélation = Covariance / produit des Ecarts Types des 2 séries de données

La fonction Scilab corr permettant d’obtenir la covariance.

Notons ici une source d’erreur possible : Scilab n’utilise pas les variances (écarts types au carré) de la même façon qu’Excel pour le calcul du coefficient de corrélation. 

En effet Excel utilise la variance calculée pour une population : (fonction var.p) de formule :


Alors que Scilab utilise la variance d’un échantillon,
 de formule :




Les résultats de l’analyse de données sont présentés dans l’annexe 2.
Nous avons omis les diagrammes qui portaient sur les municipalités car comme nous l’avons vus, ils se sont révélés faux. Et le temps nous à manqué pour les refaire.
Malheureusement les corrélations ont été faites entièrement au niveau des municipalités, nous ne pouvons donc rien en tirer si ce n’est qu’elles ont montré que sur des données trop disparates, comme les surfaces des fermes, les corrélations sont biaisées. ( Il y avait par exemple une zone avec une ferme de plus de 13000 ha ! cette disproportion augmentait artificiellement le coefficient de corrélation).


  1. Conception de l’application


Le programme a été conçu sous Jbuilder 3.5.
L’interface utilise uniquement des composants swing.
Nous nous sommes assurés que le code soit vide de toute classe sous licence Jbuilder (par exemple le VerticalFlowLayout : classe servant à disposer facilement des objets graphiques alignés verticalement).

Les classes sont regroupées dans un package portant le nom de JStatBox, qui est également le nom de l’application.
Le programme démarre à partir d’une classe Main qui appelle une classe Interface. Celle-ci appellera à son tour les classes des différents modules, au fur et à mesure qu’ils sont requis par l’utilisateur. Fondamentalement les classes principales sont indépendantes de l’interface graphique. Mais on ne peut pas les faire fonctionner  de façon autonome pour autant (mode Batch) car certaines opérations de l’utilisateur ne sont possibles que par l’intermédiaire de  l’interface (du moins pour l’instant).

Nous allons décrire l’application module par module, en partant d’une vision globale par l’approche UML pour décrire ensuite les attributs et méthodes clés des classes de chaque module.

Le programme n’étant pas terminé à l’heure où nous écrivons, nous nous concentrerons principalement sur le module Population et sur l’interface.


           
C’est le module qui se charge de lire les données d’entrée, de les traiter pour qu’elles soient facilement utilisables par les autres modules, en les mémorisant sous forme d’arborescence de fichiers grâce à la classe Echelle


Voyons sa structure sous forme de diagramme en modélisation UML (nous ne faisons apparaître que les méthodes les plus importantes, les méthodes d’accès aux données privées sont ignorées) :

Diagramme de classe du module Population

Les classes  prototype et agrégation ont des relations de  composition vis à vis de la classe Population, tandis pour les objets Echelle et ChoixAgreg , il n’y a qu’une seule instance de chaque par classe Population.

Nous allons d’abord voir la classe Population puis voir ensuite les classes qui lui sont subordonnées.


1)      Classe Population

                                  
La classe Population est l’objet qui va contenir toutes les données concernant une population étudiée :

Attributs :
Vector vpop :    vecteur contenant tous les prototypes (objets prototypes) de la population étudiée.

Vector vagreg :    vecteur contenant toutes les données agrégées calculées (objets Agreg) de la population étudiée

char sep : le caractère de séparation des données de la matrice globale.

Vector ventete :     vecteur contenant le nom de chaque paramètre.

Vector vcategorie :    vecteur contenant la catégorie (exploitation, producteur ou production) de chaque paramètre.

Vector vtype : vecteur contenant le type (float, int, boolean…) de chaque paramètre.

Vector vech :  vecteur contenant les noms des différentes échelles de la population.

Vector  vfraction : diviseur pour l'agrégation (10000 pour dep , 100 pour mun, 1 pour village)

Vector vCodeEch : contient la liste des codes village pour chaque prototype.

ChoixAgreg choixagreg :  objet contenant tout les paramètres d’agrégation et ceux qu’on aura sélectionnés effectivement pour le calcul des données agrégées.

Echelle arbre : l’arborescence des différentes sous régions.

Vector vreference : vecteur contenant les références de chemin (sous forme d’objets File) de tous les villages (c’est à dire la plus petite sous région de la population)



Méthodes :
public void lirefichierInfo(File data, String nom) : lecture du fichier infopop.txt (informations sur les paramètres et les échelles de la population ) en utilisant la classe BufferedReader.

public void lirefichierData(File data, String nom) :   lecture du fichier de données matpop.txt

public void lirefichierEchelle(File data, String nom) :  lecture du fichier des codes village des prototypes codevilage.txt

public String getCodeEchelle(int idxCode, int idxEch) :  méthode qui reçoit un  n° de prototype et un niveau d'échelle et qui renvoie le code d’échelle correspondant.

public void ecrirefichier(Population pop, String fsortie, char separ) :    écriture de la matrice de population dans un fichier texte en utilisant la classe BufferedWriter. Cette méthode a été écartée au profit d’une methode plus efficace : l’écriture des données dans des répertoires arborescents.(voir plus loin)

public void creeVreference(Vector v) : méthode qui crée les références (sous forme d’objet File) aux différents répertoires de l’arborescence, pour un accès plus rapide.






2)      Classe Prototype

L’objet Prototype représente un vecteur ligne de la matrice de population c'est-à-dire une ferme avec tous ses paramètres, contenus sous forme de chaîne de caractères dans un vecteur (vligne) : D’abord l’identifiant puis les caractéristiques du terrain, les caractéristiques de l’exploitant et enfin les caractéristiques des productions.

Attributs :
Vector vligne : Vecteur contenant les paramètres d’un prototype, sous forme de chaînes de caractère.



3)      Classe Agreg

L’objet Agreg représente une donnée agrégée pour un paramètre donné, un outil d’agrégation (somme, variance…) et éventuellement un paramètre de référence de classe.
Ce paramètre de référence de classe est un autre paramètre de la population à partir duquel on peut découper le premier paramètre en un certain nombre de classes. Ceci

A cet objet Agreg correspondra un fichier agreg.txt. Donc le niveau d’échelle de l’agrégation n’a pas besoin d’être précisé puisqu’ il est défini par l’endroit ou se situera le fichier dans l’arborescence de répertoires.


Attributs :
 String paraAgreg : nom du paramètre agrégé sous forme codée

  int codeType : le type des données (elles sont traitées différemment si elles sont quantitatives ou qualitatives).

  int refProto : le numéro de paramètre sur lequel porte les données agrégées

  int nbClasses : le nombre de classes, si le paramètre a été séparé en classes. (par défaut c’est 1 si il n’y a pas de découpage).

  int refClasseProto : le numéro de paramètre utilisé comme référence pour le découpage en classes.

  int[] tabBorne : tableau des intervalles de classes.

  int[] tabData : tableau des données agrégées pour chaque classe (de même taille que tabBorne)






4)      Classe échelle

Le but de cet objet est la création d’une arborescence de répertoires qui reprendra la structure imbriquée des différentes sous régions du pays étudié. Chaque répertoire (ou nœud de l’arbre) correspondra à un district (département, municipalité, village…) et contiendra un fichier d’informations. Ensuite viendront s’ajouter dans les répertoires de la dernière échelle (ici les villages) des fichiers contenant les données des prototypes de ces nœuds (village) en question.
On transforme donc la grande matrice de population en une série de petits fichiers auxquels on accède lorsque l’on en a besoin, plutôt que de charger en mémoire la matrice globale dans son ensemble.
Ensuite, on n’utilisera plus que cette structure en arbre que l’on  pourra charger au démarrage de l’application et abandonner l’usage de la matrice globale.


L ‘arbre est en fait une liste chaînée d’objets Echelle. Une méthode récursive crée un nœud et remplit ses descendants (sous régions de ce nœud) avec cette même méthode (appel récursif), jusqu’à atteindre la limite d’échelles.

La construction de l’arbre se fait par parcours en profondeur des différentes échelles, pour n’avoir qu’un seul parcours de la matrice de population globale. Un parcours en largeur aurait pris beaucoup plus de temps.


Attributs :
 Vector vfils : tableau contenant la liste des objets échelle successeurs de l'objet Echelle courant

 String nomEchelle : nom d’échelle du nœud : "dep"  si l'objet Echelle est un département

  int niveau :  code correspondant au niveau d’échelle. "1"  si l'objet Echelle est un département.

 String code : numéro de district

  int nbSousNiveau : taille du vecteur vechelonLocal, c’est à dire le  nombre de descendants du nœud.

  Vector vechelonLocal : tableau des informations (sous forme d’objets InfoNoeud)
de chaque échelon contenu dans l'objet échelle courant.

  File ref : référence de chemin de l’objet échelle (ex: global\dep_1\)

Méthodes :
Echelle creerArbre (Population pop) : méthode qui initialise la création de l’arbre.

void remplir(Population pop, int numProto, Echelle pere, int niveauCourant) : méthode récursive qui crée un nœud de l’arbre et le remplit de ses descendants en s’appelant elle même.

void writeArbre(Echelle arb, File repPater, String repfils) : méthode qui crée les repertoires pour chaque nœud de l’arbre et y ajoute des fichiers d’information.

void ecrireVpoptoProto(Population pop) méthode qui écrit dans des fichiers séparés (et qui les placent dans l’arborescence) les données de chaque village.

5)      Classe Infonoeud

Cette classe contient diverses informations pour chaque nœud de l’arborescence.

Attributs :
String nom : nom du nœud (département, municipalité, village…)
float superficie : somme des superficies des fermes contenues  dans le nœud et ses descendants.
int nbProto : nombre de fermes(producteurs) contenu dans le nœud et ses descendants.




6)      Classe ChoixAgreg

Paramètres de population, outils d’agrégation et échelles peuvent varier d’une étude de cas à l’autre Ils doivent donc être définis sous formes dynamiques : on utilise donc des  vecteurs pour les stocker. De même pour les 3 vecteurs qui leurs sont associés et qui stockent les choix de l’utilisateur pour l’agrégation.


Attributs :
Vector vNomParam : vecteur contenant la liste ordonnée des noms de paramètres affichés dans l’onglet Statistiques

Vector vChoixParam : vecteur contenant true ou false selon les paramètres choisis pour l’agrégation.

Vector vNomEchelle : vecteur contenant la liste ordonnée des noms d’échelle affichés dans l’onglet Statistiques

Vector vChoixEchelle : vecteur contenant true ou false selon les échelles choisies pour l’agrégation.


Vector vNomOutil : vecteur contenant la liste ordonnée des noms d’outils affichés dans l’onglet Statistiques

Vector vChoixOutil : vecteur contenant true ou false selon les outils choisis pour l’agrégation.



Méthodes :
 void creervListeAgreg(Population pop,String sEchelle) : méthode générale qui appelle les 3 suivantes :
void creervNomEchelle(pop,sEchelle) : méthode qui crée le vecteur vNomEchelle et qui initialise le vecteur vChoixEchelle à zéro.

void creervNomParam(pop) : méthode qui crée le vecteur vNomParam et qui initialise le vecteur vChoixParam à zéro.

void creervNomOutil() : méthode qui crée le vecteur vNomOutil et qui initialise le vecteur vChoixOutil à zéro.






Le module de statistiques a pour but de fournir des méthodes pour créer les données
agrégées à partir des trois types de paramètres que l’utilisateur aura choisi:
Echelles, Paramètres de la population et outils d’agrégation.
Par outil d’agrégation nous entendons : somme, variance, écart type, quantiles, voire fonctions plus élaborées par la suite.

Ce module est en cours de codage à l’heure où nous écrivons.



Il comprend les deux algorithmes que nous avons présenté antérieurement :
  • L’algorithme de minimisation quadratique provenant de « R ». La classe d’appel est créée et fonctionnelle mais non encore implémentée dans le programme.

  • l’algorithme de type génétique (SA2 : recuit simulé) n’est pas encore créé.



L’interface dispose d’une barre de menu : pour fonctions diverses dont choix de la langue
pour cela nous avons créé un « Ressource Bundle » : organisation des chaînes de caractères sur des fichiers différents pour chaque langue, ensuite on choisit quel fichier charger pour avoir la langue voulue.

On voit ensuite un onglet pour chaque module. Pour l’instant ne sont terminés que les onglets population et statistiques. Puis viendrons s’ajouter les onglets Minimisation, et Visualisation qui correspondent aux modules correspondants.

Voyons un aperçu de l’onglet population (page suivante) :
A gauche : la liste des paramètres lorsque la population est chargée.
Au milieu : les boutons de lecture et d’écriture de la matrice de population et de l’arbre d ‘échelles.

Lorsque la population n’est pas chargée, les autres onglets sont inaccessibles, de même que les boutons qui font références à la population chargée.
La fenêtre principale avec l’onglet population




Voyons à présent un aperçu de l’onglet Statistiques (page suivante) :
Il est constitué de trois panneaux contenant des boutons à cocher créés dynamiquement.
Ces panneaux correspondent aux  paramètres à définir pour calculer les données agrégées (Paramètres de population, Echelles, Outils).
A droite une liste de boutons permettant de lancer ,de réinitialiser le processus de création des données agrégées, et de sauver celles ci.

La fenêtre principale avec l’onglet Statistiques








                                 




               V. Conclusion








Bilan

Ce vaste projet est terminé en ce qui concerne la partie analyse de données mais ne l’est pas pour l’application.

Au final les résultats de l’analyse de données se révèlent mitigés au niveau de leur qualité, à cause notamment d’une simple erreur de zéro qui a eu de fâcheuses conséquences.
Nous avons également entrevu la difficulté de trouver des tests statistiques convenant le mieux aux différents cas, c’est à dire capables de faire « parler » les données.
Et puis nous regrettons de n’avoir pu disposer des données de production, certainement très riches en information.
 Quoi qu’il en soit cette première partie du stage a rempli parfaitement son rôle de découverte des méthodes de reconstruction de population et de préparation nécessaire à la deuxième partie.

En ce qui concerne l’application, il reste beaucoup a faire. Un certain retard a été pris lorsque nous avons travaillé sur la structure de l’objet Echelle, qui demandait une structure parfaitement optimisée pour satisfaire les limitations en mémoire du programme. Beaucoup de temps à également été passé au début de la phase de code, car la programmation objet demande une certaine « mécanique de pensée » qui ne s’acquiert qu’avec une pratique intensive.

En ce qui nous concerne, ce stage a été doublement bénéfique puisqu’il nous a fait pratiquer de nombreuses techniques statistiques et fait découvrir toute la conception d’un projet informatique, depuis la formalisation UML jusqu’au codage en langage objet. 



Perspectives

D’ici la fin de notre stage, il faudra tout d’abord terminer le noyau de base du programme : C'est-à-dire le module Statistiques et le module Minimisation avec ses deux algorithmes de minimisation.

Puis de nombreuses améliorations seront à faire, dans le souci d’assurer une bonne succession du code pour la ou les personnes qui prendront le relais du développement ( ce sera à priori essentiellement notre maître de stage) Et il y a également le souci de fournir un outil documenté et facile d’accès aux destinataires du programme.
Ainsi, nous prévoyons de :
- Documenter les classes en HTML (avec javadoc)
- Ecrire un mode d’emploi
- terminer la localisation en anglais et en espagnol.

Puis plus tard pourront être réalisés :
- le module visualisation des données.
- l’implémentation d’outils statistiques évoluées dans module statistiques.
- la création d’un module permettant de sauver et charger des plans d’expérience.

Ce projet est un point de départ. On peux déjà imaginer la possibilité d’y greffer des modules  dont les objectifs serviraient un autre domaine, mais qui utiliseraient les structures et outils de cette application.



               Références bibliographiques

 

Williamson P., Birkin M., Rees P. H. 1998, “The estimation of population microdata by using data from small area statistics and samples of anonymised records”. Environment and planning A 30 785-816.


Charlton J. 1998, “Use of the Census Samples of anonymised Records (SARs) and survey data in combination to obtain estimates at local authority level”. Environment and planning A 30 775-784.


Goldfarb D., Idnani A. 1983, “A numerically stable dual method for solving strictly convex quadratic programs”. Mathematical programming 27 1-33.




               ANNEXES





Annexe 1 : code source en langage Scilab des algorithmes utilisés lors de l’analyse de données.

1.A. Création des listes de code : département et municipalité







Annexe 2 : Extraits des résultats de l’analyse de données.


Analyse des données
Pour les caractéristiques des exploitations et des producteurs






Le nombre de fermes est très variable d’un département à l’autre (pour la plupart il y en a de 10000 à 25000). On note également de très faibles effectifs : le département 9 avec 3800 fermes et surtout le département 11 avec un peu plus de 300 fermes. C’est dans ce dernier que l’on notera plus tard de grandes différences  avec les autres départements dans l’analyse des différents paramètres.


Au niveau village, la variabilité devient beaucoup plus importante : les villages vont d’une seule ferme à 1391.(moyenne : 84 , variance : 7818).





Surfaces totales :

Ces graphiques ne permettent pas de voir si il y a des zones de fermes de même taille.
(ex : municipalité contenant une majorité de grandes fermes). On va donc séparer les tailles de fermes en classes de superficie (voir plus loin).

Répartition de la taille des fermes suivant la méthode des déciles :

Intervalles : surface totale (Ha)
% de fermes dans l’intervalle
0
0,068
0
0,068
0,616
10
0,616
0,685
10
0,685
1,027
10
1,027
1,37
10
1,37
2,055
10
2,055
2,74
10
2,74
4,658
10
4,658
8,219
10
8,219
19,863
10
19,863
13461,644
10


100


Corrélations entre fermes de grande et de petite taille :
 





On ne voit pas de corrélation évidente : le fait qu’il y ait de grandes ou très grandes fermes n’empêche pas la présence de fermes de petite taille : ceci est confirmé par le graphique suivant :




On voit qu’il n’y a pas de fortes différences entre les municipalités : toutes contiennent des fermes de tailles variées en proportions comparables (sauf pour les fermes de très grande taille qui sont rares et plutôt dispersées parmi les municipalités). 
On note cependant pour le département 15  une proportion plus faible de fermes de 0 à 1 Ha au profit de fermes plus grandes (10 à 50 mais aussi 50 à 100).


a)     

Propriété des terres


On voit de grandes variations pour les classes « terres personnelles » « terres nationales » et « ejidales » (les 3 classes les plus représentées).
Par exemple le département 9 contient une majorité de terres nationales.

Le département 15 qui possède également une part importante de terres nationales. (Corrélation possible avec le fait que ce département comporte beaucoup de fermes de grande taille).


b)     Usage des terres



Ici on observe beaucoup de variabilité, pour presque tous les paramètres, mais on ne distingue pas de corrélation particulière.

Les terres semblent avoir un usage agricole similaire dans toutes les régions. On notera cependant la  concentration de « plans d’eau » dans le département 6 (lac … ?)



a)      Condition juridique

  

La quasi-totalité des fermes sont individuelles. Ceci explique la forte corrélation de ce paramètre avec la surface totale.


 On ne pas conclure de corrélation évidente grandes fermes - propriétés non individuelles.

b)     Age du producteur

  


Pas de différence fondamentale de classes d’âge entre les différentes municipalités (à part le département 11 : faible pourcentage de 20-29 ans)


c)      Sexe du producteur
 



Il y a à priori peu de variations de sexes entre départements : environ 10% de femmes sauf dans le département 9 ou il y en a presque 30% .

d)     Alphabétisation

  

Alphabétisation : 50 à 60 % en moyenne sauf département 11 : plus de 90% (mais c’est un  département de très petite taille : effet d’une variance plus élevée ?).




e)      Niveau d’études atteint et niveau d’études validé

Le niveau d’études se situe pour tous les départements entre « aucun » et « primaire » avec un pourcentage similaire (sauf pour département 11 : peut être à cause de sa taille).
 


Aucun commentaire:

Enregistrer un commentaire