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

Calcul scientifique Python Discussion :

Calculer et automatiser le V de Cramer sur plusieurs couples de variables


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Statisticienne
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Statisticienne
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Calculer et automatiser le V de Cramer sur plusieurs couples de variables
    Bonjour !

    J'ai une base de données contenant une soixantaine de variables, et je souhaite éliminer les variables trop liées entre elles en testant leur indépendance grâce au V de Cramer. Le test compare les variables 2 à 2 (manuellement, c'est long).

    Deux questions :
    1/ Comment calculer le V de Cramer sous Python ?
    2/ Comment automatiser le calcul de sorte à obtenir un tableau de ce type (bien que je sois preneuse d'une solution alternative) :

    Tableau des V de Cramer entre les variables

    ---|-A-|--B-|--C-|--D-|

    A | 1 | 0.8 | 0.6 | 0.3 |

    B | 0.8 | 1 | 0.5 | 0.2 |

    C | 0.6 | 0.5 | 1 | 0.4 |

    D | 0.3 | 0.2 | 0.4 | 1 |

    Pour 1/, j'ai ce code pour le moment (construit à partir de deux sources, dont 1 sur un autre forum). A priori, il ne fonctionne pas, car il me donne des résultats supérieurs à 1 alors que le V de cramer devrait se situer entre 0 et 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import scipy.stats as ss
    import numpy as np
    import pandas as pd
     
    #Création d'un tableau croisé
    crosstab = pd.crosstab(variableA, variableB, rownames=['variableA'], colnames=['variableB'])
     
    #Test de cramer
    def cramers_stat(crosstab):
        chi2 = ss.chi2_contingency(crosstab)[0]
        n = crosstab.sum()
        return np.sqrt(chi2 / (n*(min(crosstab.shape)-1)))
     
    result = cramers_stat(crosstab)
    print(result)
    Pour 2/... je ne vois pas du tout comment automatiser tout ça


    Merci pour votre aide, je bloque depuis un bon moment

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 27
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    tout d'abord, pour essayer de vous aider au mieux, j'ai deux questions à vous poser :

    Tout d'abord, le tableau que vous nous avez inscrit correspond à des calculs que vous avez fait manuellement pour vérifier la justesse des résultats pour ces quatre variables ou un exemple quelconque?

    Ensuite, dans votre code se trouve un pd.crosstab. Est-ce une erreur de copie, une classe personnelle non marqué dans vos import, ou un import du module panda réduit en pd?

    Pour le premier point, je ne vois pas d'où peut venir l'erreur, mais pourriez-vous donner vos sources, afin que je puisse voir exactement la manière dont ils avaient fait leurs implémentations?

    Pour le second point, je ne vois qu'une double boucle parcourant l'ensemble de votre tableau de valeur.

  3. #3
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour répondre à la question 1

    Pour automatiser les traitements sur des Frames, j'utiliserai la librairie Pandas de python comme il est noté sur Stackoverflow. Elle facilite les traitements.

    Au plaisir de te lire.

  4. #4
    Candidat au Club
    Femme Profil pro
    Statisticienne
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Statisticienne
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour, merci pour vos retours,

    @bobnolit

    - Le tableau inscrit est un pur exemple de ce que j'aimerais obtenir in fine.

    - Pour le module, j'ai oublié d'écrire l'importation de pandas dans le code (comme je suis sur Jupyter, le code s'exécute par blocs, j'ai oublié d'ajouter celui-ci). Je vais corriger ça. La documentation de pandas.crosstab() se trouve ici. Il permet de faire un tableau croisé qui compte le nombre d'apparitions de combinaisons de modalités (comme on peut faire avec les tableaux dynamiques dans excel). Par exemple, 5 bruns ont les yeux bleux, 9 blonds ont les yeux marrons, etc.

    - Pour le calcul du V de cramer, j'ai utilisé la source sur ce lien. Deux réponses sont proposées, l'une que j'ai utilisée, et aussi un V de cramer corrigé. Les deux me fournissent exactement les mêmes résultats, c'est à dire des chiffres compris entre 0 et 18... alors qu'ils ne devraient pas excéder 1. Je ne vois pas ce qui cloche

    - Sauriez-vous comment faire cette double boucle ? Il faudrait pour cela "décaler" l'une des boucles de 1 case, pour que le code calcule des combinaisons de variables différentes au lieu des deux mêmes. Je n'ai pas encore trouvé comment faire ce décalage
    Et le plus dur, parvenir à enregistrer chaque résultat dans un tableau...


    @dev_ggy

    Merci pour le lien, c'est justement celui-ci que j'ai utilisé pour mon code. J'obtiens des résultats, mais non cohérents car supérieurs à 1. Il me manque probablement quelque chose entre le tableau croisé et le V de cramer, je ne vois pas quoi

    Pour la 2/, Je vais regarder sur Stackoverflow mais j'ai déjà parcouru un bon nombre de forum/tutoriels sans trouver de sujet similaire au mien

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par Seika Voir le message
    - Sauriez-vous comment faire cette double boucle ? Il faudrait pour cela "décaler" l'une des boucles de 1 case, pour que le code calcule des combinaisons de variables différentes au lieu des deux mêmes. Je n'ai pas encore trouvé comment faire ce décalage

    Et le plus dur, parvenir à enregistrer chaque résultat dans un tableau...
    La structure est de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> def calculer(a, b):
    ...     return '%sx%s' % (a, b)
    ...
    >>> tableau = [ [0,] * 4 for _ in range(4) ]
    >>> base = ord('A')
    >>> for i in range(4):
    ...     tableau[i][i] = 1
    ...     for j in range(i+1, 4):
    ...         tableau[i][j] = tableau[j][i] = calculer(chr(base+i), chr(base+j))
    ...
    >>> for row in tableau:
    ...     print(row)
    ...
    [1, 'AxB', 'AxC', 'AxD']
    ['AxB', 1, 'BxC', 'BxD']
    ['AxC', 'BxC', 1, 'CxD']
    ['AxD', 'BxD', 'CxD', 1]
    >>>
    rien de bien méchant si vous avez pris le temps d'apprendre à programmer avec Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Candidat au Club
    Femme Profil pro
    Statisticienne
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Statisticienne
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour wiztricks,

    Merci pour ta réponse. Malheureusement parfois il nous faut savoir faire dans un temps limité avant de savoir faire tout court. Je ne suis néanmoins venue ici qu'après plusieurs heures de recherches de mon côté.

    Je suis parvenue à résoudre le premier problème. Il fallait faire la somme de la somme crosstab.sum() pour que python calcule l'ensemble des chiffres du tableau, et non chaque colonne une à une. J'ai testé ce code corrigé sur un petit tableau de test, le V de cramer calculé est bon. Voici le code :

    Calcul du V de cramer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import scipy.stats as ss
    import numpy as np
    import pandas as pd
    #Création d'un tableau croisé
    crosstab = pd.crosstab(variableA, variableB, rownames=['variableA'], colnames=['variableB'])
     
    #Test d'indépendance de cramer
    def cramers(crosstab):
        chi2 = ss.chi2_contingency(crosstab)[0]
        n = sum(crosstab.sum())
        return np.sqrt(chi2 / (n*(min(crosstab.shape)-1)))
     
    result = cramers(crosstab)
    print(result)
    La question 2/ reste toujours d'actualité, j'essaye d'appliquer ta structure, merci. Je reviens vers vous si j'ai du nouveau.

Discussions similaires

  1. [XSL] Filtre sur plusieurs champs par variable
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/09/2012, 20h37
  2. Réponses: 3
    Dernier message: 13/04/2008, 10h52
  3. Réponses: 2
    Dernier message: 07/08/2007, 16h24
  4. Proramme qui calcul l'espace que prend un fichier sur le HDD
    Par snoopy69 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 26/01/2007, 17h05
  5. Calcul sur plusieurs champs similaires
    Par Zebulonn dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2005, 14h24

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