You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Les exemples donnés dans la documentation (Exemple PySHS.ipynb) ne tirent pas partie de la fonction native de pandas qui permet de donner un ordre aux modalités d'une variable catégorielle.
Plutôt qu'ajouter un numéro devant les variables, on peut les trier explicitement selon un ordre qui sera pris en compte lorsqu'on fait un tableau croisé. Pour reprendre un des exemples de la doc, en l'adaptant :
data = pd.read_spss('bdd2011.sav')
data["genre"] = data["rs1"].astype("O")
reco = {'Assez':"Assez", 'Peu':"Peu ou pas du tout",
'Pas du tout':"Peu ou pas du tout", 'Beaucoup':"Beaucoup",
"Sans réponse":"Sans réponse"} #ici, plus besoin de mettre des numéros devant les noms des variables
data["interetscience"] = data['q2'].astype("O").fillna("Sans réponse").replace(reco)
data["interetscience"] = pd.Categorical(
data['interetscience'],
ordered=True, #ici on indique qu'on veut définir un ordre pour les catégories
categories=["Peu ou pas du tout",
'Assez', 'Beaucoup',"Sans réponse" ]) #et ici on liste toutes les catégories, dans l'ordre qu'on souhaite leur donner
Ce qui donne, quand on fait un tableau croisé avec la fonction pandas.crosstab : pd.crosstab(data["interetscience"], data["genre"])
interetscience
Femme
Homme
Peu ou pas du tout
270
196
Assez
205
208
Beaucoup
59
88
Sans réponse
0
1
Les modalités de interetscience sont bien triées selon l'ordre qu'on leur a donné, et non selon l'ordre alphabétique. Voir aussi la documentation officielle de pandas pour plus de détails sur cette fonction pour les variables ordinales.
Je ne sais pas si prendre cela en compte nécessite simplement une mise à jour de la documentation, ou si ça nécessite aussi de revoir la logique du code de la librairie, je n'ai pas fouillé.
Intérêt de cette méthode :
ça enlève le besoin d'ajouter manuellement un numéro en face de chaque modalité, et donc réduit le risque d'erreur humaine,
et d'autre part cela permet de faire des régressions ordinales avec statsmodels, qui peuvent être plus appropriées/plus précises qu'un test du chi2 dans le cas où la variable à expliquer est ordinale. Exemple avec interetscience en variable à expliquer et la variable genre comme variable explicative :
Tout à fait d'accord sur l'idée que s'appuyer sur les objets Pandas catégoriels pourraient faciliter ce traitement. Je vais voir à refactoriser le code autour de ça. Je l'avais pas initialement fait car certaines erreurs spécifiques peuvent arriver sur la gestion d'objet Categories qui sont peu utilisés par ceux qui débutent avec Pandas (ou du moins était-ce mon impression). Mais ça permettrait de renforcer la stabilité du code je pense, donc c'est l'occasion.
Les exemples donnés dans la documentation (Exemple PySHS.ipynb) ne tirent pas partie de la fonction native de pandas qui permet de donner un ordre aux modalités d'une variable catégorielle.
Plutôt qu'ajouter un numéro devant les variables, on peut les trier explicitement selon un ordre qui sera pris en compte lorsqu'on fait un tableau croisé. Pour reprendre un des exemples de la doc, en l'adaptant :
Ce qui donne, quand on fait un tableau croisé avec la fonction pandas.crosstab :
pd.crosstab(data["interetscience"], data["genre"])
Les modalités de
interetscience
sont bien triées selon l'ordre qu'on leur a donné, et non selon l'ordre alphabétique. Voir aussi la documentation officielle de pandas pour plus de détails sur cette fonction pour les variables ordinales.Je ne sais pas si prendre cela en compte nécessite simplement une mise à jour de la documentation, ou si ça nécessite aussi de revoir la logique du code de la librairie, je n'ai pas fouillé.
Intérêt de cette méthode :
interetscience
en variable à expliquer et la variablegenre
comme variable explicative :Résultat:
Voir la documentation de statsmodels pour plus d'informations sur la régression ordinale (mais ça sort un peu du cadre de ce ticket).
The text was updated successfully, but these errors were encountered: