benno-mueller/survey-analysis

Évaluez les résultats d'enquête comme un statisticien spécialiste des enquêtes : nettoyage, distributions, tris croisés, significativité, pondération, rapports par sous-groupes, anonymat, résumé de gestion. Statistique uniquement.

Qu'est-ce que survey-analysis ?

Cette compétence transforme un export brut d'enquête en résultats dignes d'un chercheur professionnel : chaque chiffre a sa base, l'incertitude est exprimée honnêtement, les différences ne sont affirmées que lorsqu'elles sont robustes, et aucun répondant ne peut être identifié. Elle est agnostique en termes d'outil et de sujet, et toute spécificité d'une enquête est traitée comme un paramètre (Phase 0), non comme une hypothèse codée en dur. La compétence est disponible pour les agents utilisant Python avec les bibliothèques pandas/scipy, ou R. Elle se déroule en 10 phases : paramètres, ingestion et codebook, nettoyage des données, inference et pondération, distributions, tris croisés et significativité, rapports par sous-groupes, échelles et indices, réponses ouvertes, non-réponse et représentativité, et enfin interprétation et rapport. Les règles fondamentales imposent une interprétation strictement statistique, l'utilisation de poids égaux par défaut, et l'interdiction de fournir des explications causales. Des fichiers de référence et des scripts Python sont fournis pour les calculs, et une configuration YAML permet de paramétrer l'enquête.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/benno-mueller/survey-analysis/tree/HEAD

Installed? Explore more Recherche et analyse de données skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Analyse d'Enquête

Transformez un export brut d'enquête en résultats qu'un chercheur professionnel en enquête signerait : chaque chiffre a sa base, l'incertitude est exprimée honnêtement, les différences ne sont affirmées que lorsqu'elles sont robustes, et aucun répondant ne peut être identifié.

La compétence est agnostique en termes d'outil et de sujet. Tout ce qui est spécifique à une enquête est un paramètre (Phase 0), non une hypothèse codée en dur.

Règles fondamentales (s'appliquent à chaque enquête, prévalent sur toute autre demande d'"aperçu")

  1. Interprétation strictement statistique. Décrivez ce que les données montrent : taille, précision, robustesse, différences, cohérence. Ne proposez jamais d'explications, de causes, de motifs ou d'hypothèses sur pourquoi un résultat est ce qu'il est – même pas sous forme prudente ("peut-être parce que...", "cela pourrait indiquer..."). Les raisons énoncées par les répondants eux-mêmes (réponses ouvertes) peuvent être rapportées comme ce que les répondants ont dit.
  2. Pondération égale par défaut. Chaque réponse compte une fois. Les pondérations ne sont utilisées que si la conception de l'enquête l'exige (par exemple, échantillonnage disproportionné, variable de poids fournie avec les données) ou si les paramètres les spécifient. Ne pondérez jamais de votre propre initiative ; signalez plutôt les déséquilibres comme une limitation.
  3. Tris croisés et rapports par sous-groupes uniquement là où ils sont autorisés. Que les résultats puissent être décomposés, par quelles variables, et sous quelles limites est une décision du propriétaire de l'enquête (paramètres crosstabs, subgroup_reports, anonymity). Sans autorisation : totaux seulement.
  4. Tous les calculs dans le code (Python avec pandas/scipy, ou R). N'estimez jamais un chiffre en prose. Travaillez sur une copie ; ne modifiez jamais les données originales de l'utilisateur.

Fichiers inclus

FichierUtilisation dans
references/methods.mdPhases 3-9 : formules, sélection des tests, pondération, contrôle de divulgation, exemple détaillé
references/reporting.mdPhase 10 : résumé de gestion, champs d'action, structure, formulation, graphiques
references/data-sources.mdPhase 1 : formats d'export (LimeSurvey, MS Forms, Google Forms, SurveyMonkey, SPSS/R)
scripts/survey_stats.pyToutes les phases : fonctions d'aide testées – IC avec correction pour population finie, bornes de non-réponse dans le pire des cas, tests et tailles d'effet, ajustement de la valeur p, tableaux de bannières avec lettres de significativité, différence minimale détectable, repondération et effet de plan, plan de divulgation de groupe, suppression de cellule, alpha de Cronbach, indicateurs de qualité
assets/survey-config.template.yamlPhase 0 : le fichier de paramètres

Si seul ce SKILL.md est installé, la section Règles fondamentales à la fin est le minimum dont vous avez besoin ; implémentez les formules vous-même dans le code.


Phase 0 – Paramètres

Cherchez un fichier survey-config.yaml rempli (modèle dans assets/). Sinon, collectez les paramètres ci-dessous. Les faits qui peuvent être lus à partir des données ou des fichiers, lisez-les vous-même ; les décisions appartiennent à l'utilisateur. Posez les décisions ouvertes en un seul tour (max. 4 questions), chacune avec votre recommandation par défaut. Si personne n'est là pour répondre, utilisez les valeurs par défaut et listez-les sous "Hypothèses" dans le rapport. Les valeurs par défaut sont délibérément restrictives : pas de décompositions, pas de pondération.

ParamètreSignificationSourceDéfaut
population.definitionÀ qui s'adresse l'enquêtedemander- (obligatoire)
population.size_NTaille de la population cibledemandernull = inconnue/très grande
population.designcensus, simple_random, stratified, quota, self_selecteddemanderself_selected (le plus conservateur)
population.known_marginsEffectifs connus de la population par caractéristiquedemander / fichiersaucun
fieldwork.invited / completes / partials / ineligibleEffectifs de résultatsdonnées + demandercompletes = enregistrements avec une date de soumission
purposedescribe, compare_groups, test_hypotheses, track_waves, benchmarkdemanderdescribe
hypothesesComparaisons statistiques pré-spécifiées (confirmatoires)demanderaucune -> toutes les comparaisons exploratoires
crosstabs.modenone, specified (variables listées), banner (tableau de bannière complet)demandernone
crosstabs.variablesVariables de décomposition pouvant être utiliséesdemander[]
crosstabs.forbidden_combinationsPaires de variables qui ne doivent jamais être croiséesdemandertoutes les combinaisons de deux variables démographiques
subgroup_reports.enabledRapports séparés par unité (site, service, ...)demanderfalse
subgroup_reports.unit_variable / min_n / min_response_rate / compare_to_totalLimites pour les rapports d'unitédemander- / anonymity.min_group_n / aucun / true
anonymity.min_group_nNombre minimum de répondants pour tout groupe rapportédemander / accord5
anonymity.min_cell_nSupprimer les cellules avec 0 < nombre < valeurdemander / accordnull (désactivé)
weighting.modenone, design (variable de poids dans les données), rakingconception de l'enquête / paramètresnone
weighting.variable / margins / trimDétails pour design / rakingparamètres- / - / [0.3, 3]
analysis.confidence_level / alpha / powerdéfaut0.95 / 0.05 / 0.80
analysis.multiple_testingholm, bh, nonedéfautholm confirmatoire, bh bannière/exploratoire
analysis.dont_know / dont_know_codesTraitement des "ne sait pas / sans réponse"défautexclu de la base, rapporté séparément
analysis.likert_top_boxCatégories comptées comme accorddéfaut2 sur les échelles 4-6 pts, 3 sur 7+ pts
analysis.item_polarityQuel pôle de chaque item est favorablecodebook + demanderà partir des étiquettes
analysis.quality_rulesRatio de rapidité, nombre minimum d'items pour réponse en lignedéfaut0,4 x médiane ; 5 items
open_text.quotesnone, paraphrase, anonymized_verbatimdemanderparaphrase
recommendations.modenone, action_fields, action_fields_with_measuresdemanderaction_fields
recommendations.measuresMesures fournies par l'utilisateur à associer aux résultatsdemander[]
benchmarksVagues antérieures / études externes avec formulation identiquedemanderaucun
output.audience / format / languagedemander / conversationlay / défaut de l'environnement / langue de l'utilisateur

La Phase 0 se termine par un court résumé des paramètres que l'utilisateur peut corriger.

Phase 1 – Ingestion et codebook

Lisez references/data-sources.md pour l'export concerné. Ensuite :

  1. Chargez les données ; supprimez immédiatement les identifiants directs (IP, e-mail, nom, jeton, URL de référence, horodatages exacts si non nécessaires) et dites-le.
  2. Construisez un codebook : variable, texte de la question, type (choix unique, choix multiple, Likert k-points, numérique, texte ouvert, ligne de matrice, métadonnées), étiquettes de valeurs, direction et polarité de l'échelle, items inversés, codes manquants/"ne sait pas", condition de filtre (à qui la question a été posée).
  3. Déduisez la direction de l'échelle et les items inversés à partir des étiquettes, jamais par hypothèse. Si les étiquettes manquent, demandez.
  4. Recodez dans un fichier d'analyse ; conservez la correspondance dans le journal.

Phase 2 – Nettoyage des données

Signalez, documentez, puis décidez seulement. Ne supprimez jamais silencieusement.

  • Complets vs. partiels ; définissez l'échantillon d'analyse (défaut : complets ; partiels uniquement pour les items auxquels ils ont répondu, si l'utilisateur est d'accord). Abandons par page.
  • Doublons (même jeton, ou vecteurs de réponses identiques avec des horodatages quasi-identiques).
  • Répondants trop rapides : durée totale < ratio x médiane. Réponses en ligne dans les matrices d'au moins min_items items. Excluez seulement après avoir montré à l'utilisateur le nombre et le motif ; n'excluez jamais sur un seul indicateur lorsque n est petit.
  • Non-réponse partielle par item ; signalez > 10 %.
  • Valeurs hors plage, violations de filtre, combinaisons impossibles.

Sortie : un journal de nettoyage des données (vérification, nombre, décision, raison).

Phase 3 – Cadre d'inférence et pondération

Lisez references/methods.md, sections 1 et 7. La conception détermine quelles déclarations d'incertitude sont légitimes :

SituationCe qu'il faut rapporter
Recensement ou quasi-recensement d'une population connue et petite (n/N > 5 %)IC avec correction pour population finie (FPC) plus bornes de non-réponse dans le pire des cas pour les chiffres clés. Formulez les résultats comme "parmi les répondants" à moins que les contrôles de non-réponse ne soutiennent une généralisation.
Échantillon probabilisteIC standard (FPC si n/N > 5 %) ; poids de sondage si la conception a des probabilités de sélection inégales.
Auto-sélectionné / lien ouvert / commoditéAucune inférence de population. Parts de manière descriptive ; les IC, s'ils sont montrés, uniquement comme "précision statistique", avec une mise en garde explicite.

La pondération suit uniquement weighting.mode (règle fondamentale 2). Si des poids sont utilisés : rapportez les chiffres clés pondérés et non pondérés côte à côte, l'effet de plan Kish et le n effectif (kish_deff, effective_n), et utilisez le n effectif pour les IC et les tests.

Phase 4 – Distributions de toutes les réponses

  • Chaque item, chaque chiffre avec sa base (n) après filtres et exclusions.
  • Choix unique : effectifs et parts ; IC (Wilson, avec FPC si applicable) pour les chiffres clés.
  • Likert : distribution complète d'abord, puis top-box / bottom-box avec IC, médiane. Moyennes +/- ET uniquement en complément, et seulement pour les items à >= 5 points ou les échelles multi-items.
  • Choix multiple : part de répondants par option ; les totaux dépassent 100 %.
  • Numérique : médiane et IQR d'abord, puis moyenne/ET ; vérifiez les valeurs aberrantes.
  • Arrondi : pourcentage entier lorsque n < 200. Les totaux peuvent ne pas additionner à 100 % – dites-le une fois.
  • Chiffres clés vs. 50 % (ou une autre valeur de référence) uniquement en gardant à l'esprit mdd_one_proportion : une part dans l'IC de 50 % est "environ la moitié".

Phase 5 – Tris croisés et significativité

Régi par crosstabs.mode. Avec none, sautez cette phase entièrement et dites-le dans l'encadré méthodologique.

  1. Divulgation d'abord. Utilisez uniquement crosstabs.variables ; ne croisez jamais forbidden_combinations. Exécutez reportable_groups() pour chaque décomposition : les groupes en dessous de anonymity.min_group_n sont supprimés, plus la suppression secondaire lorsque le reste supprimé pourrait être dérivé du total. Appliquez anonymity.min_cell_n si défini.
  2. Puissance. Pour chaque décomposition, calculez la différence minimale détectable (mdd_two_proportions, 80 % de puissance). Rapportez-la, afin que "aucune différence significative" soit interprétée correctement ("les différences inférieures à x points ne peuvent pas être détectées").
  3. Tests. Choisissez selon le type de données (references/methods.md, section 3) : chi-deux / Fisher pour les catégories, Mann-Whitney / Kruskal-Wallis pour les items ordinaux, Welch pour les scores d'échelle métrique. Toujours avec la taille d'effet et son libellé ; une valeur p seule n'est jamais un résultat.
  4. Tableaux de bannières (crosstabs.mode: banner) : banner_table() / format_banner() pour chaque item x variable autorisée – pourcentages en colonne, ligne de base, lettres de significativité (une lettre marque une part significativement plus élevée que la colonne avec cette lettre), lettres basées sur les valeurs p ajustées dans la ligne. La bande est exploratoire : avant qu'une différence n'aille dans le texte, ajustez toutes les valeurs p de la bande ensemble avec Benjamini-Hochberg (p_adjust sur les tests retournés). Les tableaux de bannières vont en annexe ; seules les différences robustes (significatives après ajustement sur l'ensemble de la bande et avec au moins un petit effet) vont dans le texte.
  5. Séparez les résultats confirmatoires (hypothèses hypotheses pré-spécifiées) des résultats exploratoires.
  6. Une différence qui n'est pas significative est "aucune différence fiable", jamais une tendance.

Phase 6 – Rapports par sous-groupes

Uniquement si subgroup_reports.enabled. Pour chaque unité de unit_variable :

  1. reportable_groups(sizes, min_n, total_published=True, invited, min_response_rate) décide quelles unités obtiennent un rapport. La règle du reste est importante : si une petite unité est retenue mais que toutes les autres et le total sont publiés, son résultat peut être calculé par soustraction – la fonction retient d'autres unités jusqu'à ce que le reste retenu soit lui-même >= min_n. Listez les unités retenues et la raison (sans leurs chiffres) pour le propriétaire de l'enquête, pas dans les rapports publiés.
  2. Chaque rapport d'unité utilise la même structure que le rapport principal, la propre base et les IC de l'unité (FPC avec le nombre d'invités de l'unité comme N), et – si compare_to_total – le total comme référence. Ne comparez pas les unités entre elles à moins que crosstabs ne permette cette variable.
  3. À l'intérieur d'un rapport d'unité, pas d'autres décompositions, sauf autorisation explicite et si tous les groupes passent les seuils.

Phase 7 – Échelles et indices

Uniquement pour les ensembles d'items conçus comme une échelle (ou des instruments validés). Recodez les items inversés, calculez l'alpha de Cronbach (et l'oméga de McDonald si un package factoriel est disponible), les corrélations item-reste, l'alpha si supprimé. Construisez un score d'échelle uniquement si alpha >= .70 (>= .60 pour les échelles courtes à 3 items, avec une mise en garde).

Phase 8 – Réponses ouvertes

Voir references/methods.md, section 6. Lisez chaque réponse, construisez un cadre de codage inductif, codez avec plusieurs codes autorisés, rapportez les thèmes comme "x répondants sur n ont mentionné ...". Deuxième passage de codage sur >= 20 %, rapportez l'accord. Indiquez que le codage a été effectué par une IA en tant que codeur unique. Citations uniquement comme autorisé par open_text.quotes, dépouillées de tout élément d'identification. Rapportez ce que les répondants ont écrit ; n'ajoutez pas votre propre explication.

Phase 9 – Non-réponse et représentativité

  • Taux de réponse (RR1 / RR2, response_rates()), global et par groupe connu.
  • Comparez la composition des répondants avec known_margins (test d'adéquation). Les taux de réponse différant de plus de 15 points entre les groupes sont rapportés comme une limitation (et, si les rapports par sous-groupes sont autorisés, les chiffres clés par groupe). Pas de pondération sauf si weighting.mode le dit.
  • Modèles de non-réponse partielle ; répondants précoces vs. tardifs si les horodatages existent.
  • Concluez explicitement à qui les résultats s'appliquent et avec quelles limites.

Phase 10 – Interprétation, résumé de gestion et rapport

Lisez references/reporting.md.

  • Interprétation = lecture statistique uniquement (règle fondamentale 1) : quelle ampleur, quelle précision, quelle robustesse (IC, bornes dans le pire des cas), quelle cohérence entre les groupes autorisés, comment cela se compare aux benchmarks de formulation identique.
  • Résumé de gestion (première page) : 3 à 7 résultats clés avec n et incertitude, puis champs d'action.
  • Champs d'action (recommendations.mode) : classez les items ou sujets par critères statistiques uniquement – part de réponses défavorables, robustesse sous les bornes dans le pire des cas

Skills associés