IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Calcul du degré de rapprochement (Matching level) entre enregistrements [AC-2007]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut Calcul du degré de rapprochement (Matching level) entre enregistrements
    Bonjour à tous,
    Pour mon travail de mémoire j'ai conçu une base de données sur Access relative à la caractérisation et stockage de données sur les conflits au travail. Ce que je souhaite faire c'est que lorsqu'on introduit un nouveau cas, c'est de pouvoir interroger la base de données existante et ressortir le ou les cas qui se rapprochent le plus du nouveau cas introduit, avec si possible un calcul d'un certain degré de rapprochement (Matching level).
    L'idéal serait de décider quels critères sont pertinents pour la classification puis ressortir les enregistrements qui s'approchent le plus. Donc pouvoir aussi changer les critères ou rajouter des critères et refaire la classification. enfin si possible enregistrer le résultats de la classification.
    L'objectif est de pouvoir prendre les décisions les meilleures en se basant sur les expériences passées.
    Pour info, j'utilise MS Office 2007 et j'ai des notions élémentaires en VBA.

    Précisions :

    Je reprend ma questions ci-dessus avec plus de détails.

    Voilà, j'ai une dizaine de variables pertinentes permettant de caractériser les enregistrements de ma base de données (Département, secteur d'activité, type de contrat, durée de collaboration,..etc). Certaines variables sont numériques ou à modalités.
    Je veux qu'à chaque fois qu'un nouveau enregistrement est introduit, la base de données est reclassée et on ressort les cas les plus proches du nouveau cas introduit avec si possible un degré de matching (100% = cas identique, ... etc).
    J'espère avoir des orientations et d'avance merci pour vos réponses.
    Madimed
    74000



    D'avance merci pour vos réponses.
    MADIMED

  2. #2
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Bonjour

    Dans un premier temps j'écrirais en VBA une fonction pour chaque critère qui déterminera le nombre de points à retourner pour ce critère. Exemple pour un code postal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function CompareCP(strSource As String, strCompareA As String) As Integer
    'Retourne 10pts si même CP
    'Retourne 5 pts si même dept
    If strSource = strCompareA Then
        CompareCP = 10
    ElseIf Left(strSource, 2) = Left(strCompareA, 2) Then
        CompareCP = 5
    End If
    End Function
    La fonction CompareCP retourne 10 points si les deux enregistrements sont dans le même secteur, 5 si uniquement dans le même département et 0 dans le reste des cas. Pour chaque fonction il faudra donc déterminer comment pondérer les résultats.

    Ensuite, il sera facile d'écrire une requête qui permettra de faire les comparaisons entre la saisie utilisateur depuis le formulaire et la valeur du champ concerné pour chaque enregistrement. On peut aussi utiliser un recordset qui sera chargé de ramener les infos de la fiche incident concernée mais le principe est le même puisqu'il s'agit de construire la requête en VBA.

    Exemple si l'utilisateur a saisi le CP : 69006

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IDIncident, CompareCp("69006",CPIncident) FROM TblIncident
    On aura donc comme ça, et en ajoutant autant de fonctions qu'il le faut le taux de rapprochement pour chaque colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IDIncident, CompareCp("69006",CPIncident), CompareMontantDommage(10000,MontantDommageIncident) FROM TblIncident
    Après, on peut en faire la somme, un pourcentage : ce que tu appelles le matching level.

    En triant sur cette somme en ordre décroissant et en prenant les X premières valeurs on aura donc les X cas les plus approchant.

    Techniquement, ce n'est pas compliqué. Le seul bémol est que ma solution n'est pas très souple. Si on se rend compte avec le temps que les règles de calculs sont trop généreuse ou à l'inverse imprécise, il faudra remodifier le code VBA. Cependant si les critères sont bien établis dès le début et avec suffisament de tests, l'affinage des recherches pourra rentrer dans le cadre de la maintenance évolutive et non corrective. Car si tu souhaites quelques choses de beaucoup plus souple avec par exemple la possibilité de donner à l'utilisateur de pondérer les critères, ce sera tout de suite beaucoup plus compliqué

    Et comme je suis trop aimable je te colle même en lien une fonction de recherche phonétique qui va déjà te permettre de donner du poids à des recherches avec exactitude ou similitude phonétique :

    http://access.developpez.com/sources...quete#Soundex1

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut
    Bonjour,
    Merci beaucoup. Tu es vraiment aimable

    Ca marche pour calculer le matching level variable par variable. Comme tu l'as très bien expliqué.
    Mais si je veux combiner plusieurs variables, qui peuvent être discrètes (Département / Secteur d'activité) ou continues (durées de collaboration en mois) pour calculer un rang pour chaque cas, puis utiliser ce rang pour calculer le matching level en divisant le rang du nouveau cas par les rangs de chacun des anciens cas et retenir les minima comme les cas les plus proches.

    J'ai commencé à travaillé dans ce sens, c'est clair en théorie mais la pratique est loin de suivre.

    Des idées ?

    Merci.

  4. #4
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    En fait, il va falloir dans un premier temps chargé dans une requête toutes les données à "évaluer" et ce pour chaque incident. Evidemment, à priori ce sera sur plusieurs table puisque par exemple la durée de collaboration d'un intervenant n'est pas présente dans la table incident mais dans la table intervenant.

    Une fois que tu as ce "tableau", il faut faire appel pour chaque colonne à une fonction VBA qui sera chargée de comparer les données de la ligne courante par rapport à celle que tu viens d'ajouter (passée en paramètre).

    Evidemment, les fonctions peuvent être plus ou moins complexe, mais elles ne peuvent traiter que des éléments comparables.

    A toi de faire en sorte que ces données comparables soient présentes dans la requête de base. Si la requête devient trop complexe, les temps de traitement seront peut être trop long auquel cas il faudra peut être délégué certaines recherches aux fonctions VBA ou bien passer par plusieurs niveau.

    Je m'explique :

    Niveau 1:

    Une requête qui compare les éléments de la table incident. Si le matching level est à 0 pour certains enregistrements, il n'est peut être pas nécessaire d'aller plus loin pour ceux là.

    Niveau 2:

    Une requête un peu plus complexe sur le résultat de niveau 1 qui a été retenu. Là encore si des matching levels restent très faible, peut être les retirés.

    Niveau N :

    Les calculs les plus complexe et les plus pertinents.

    Imaginons par exemple que ton projet soit internationnal et que l'on sait que d'un continent à l'autre les décisions ne seront pas les mêmes (ou plutôt qu'il est inutile de se baser sur leur expérience puisque cet argument te sera réfuté) et bien si au niveau 1 on a des incidents Africain, on peut les retirer pour le niveau2 et ainsi de suite.

    Le plus dur n'est pas le codage de la solution finalement. Mais plutot la détermination des critères et leurs poids dans l'ordre de tri. Il ne faut pas que la somme de petits critères vienne cacher un critère beaucoup plus déterminant.

    A coup sûr, ce n'est pas une fonctionnalité qui sera opérationnelle dès le départ mais qui va demander pas mal de réajustement. Une comparaison par exactitude serait opérationnelle rapidement : ça marche ou ça marche pas. Mais une recherche par similitude repose sur des notions trop floues pour être efficace sans réglage (ou alors tu peux jouer au loto )

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    salut Tofalu et bienvenu Madimed,

    voici l'analyse que j'en fais:
    tu as n variables, il faut s'assure qu'ils sont indépendant, autrement déterminer s'il ne peuvent pas se réduire p variables p<n sans en changer l'information.
    chacune de ces variables vont décrire un axe qui va décrire l'univers à p dimensions.
    il va falloir pour chaque donnée la transcrire sur son axe, la difficulté sera donc d'établir une notion de distance pour les valeurs discrètes.
    chaque fonction de transposition n'est pas forcément linéaire, au plus simple il peuvent prendre un facteur mais cela peut être plus compliqué et tenir compte d'autres facteurs et cela peut devenir rapidement un fonction mathématique très complexe.
    car effectivement il faut pour une variable lui faire corresponde cette même echelle/critère d'importance sur une autre variable: rendre comparable deux univers.
    par exemple:
    1 pain = 10 sms critère financier.
    paris = brest critère nb caractère.
    ...
    de là avec ces p axes dans un univers ayant un seul critère unique de correspondance tu peux déterminer ton matching level comme étant la distance entre chaque position.
    ex: (échelle d'importance: nb caractère)
    1. paris, 15:10, 5€ => (5, 5, 2)
    2. perpignan, 10:30, 5.32€ => (9, 4, 5)
    distance entre 1. et 2. (norme du vecteur) = sqrt(4²+0²+3²)=5
    si chaque axe est borné entre 0 à 100 on aura: 5/100 donc ces deux enregistrement sont très proche.

    bien sur lorsque l'échelle de mesure est elle même subjective la difficulté reste à faire les bons choix.

    une idée parmi d'autre...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/01/2008, 18h21
  2. calculer la distance qu'il y a entre une div et le bas de page
    Par Henry9 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2007, 00h33
  3. Réponses: 4
    Dernier message: 21/06/2007, 14h14
  4. Réponses: 7
    Dernier message: 05/07/2006, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo