Skip to content

Réseaux égocentrés : générateurs de noms, interpréteurs de noms, recensement des dyades et sociogrammes

Recueillez des réseaux personnels dans Potato avec des générateurs de noms, des interpréteurs de noms, un recensement des dyades et un sociogramme, importez des protocoles Network Canvas, et exportez en GraphML.

Nouveau dans la v2.12.0

ego_network recueille un réseau personnel (égocentré), un objet classique de l'analyse des réseaux sociaux. Le répondant, l'ego, nomme des personnes (les alters), répond à des questions sur chacune d'elles, indique lesquelles se connaissent entre elles, et les place sur une carte. Le schéma fonctionne sur une page de questionnaire, ce qui est la façon dont la plupart des études de réseaux personnels l'utilisent, et sur des items d'annotation, où un codeur enregistre le réseau décrit par un document.

Un schéma contient une liste ordonnée d'étapes. Toutes les étapes portent sur le même ensemble d'alters ; une personne nommée dans le premier générateur de noms apparaît donc dans toutes les étapes suivantes.

ÉtapeCe que fait le répondant
name_generatorSaisit des noms en réponse à une consigne, ou les choisit dans une liste
name_interpreterRépond aux mêmes questions sur chaque personne (radio, multiselect, number, text)
dyad_censusIndique, pour chaque paire de personnes, si elles se connaissent : n(n-1)/2 paires, une à la fois, avec une barre de progression
sociogramFait glisser les personnes sur un canevas et clique sur deux personnes pour ajouter ou supprimer une ligne entre elles

Par défaut, les étapes sont présentées une à la fois, chacune avec ses propres boutons Back et Next et une rangée de boutons d'étape. stage_layout: stacked les affiche toutes en même temps sur la page.

Configuration

Sur une page de questionnaire, listez la page sous phases et placez le schéma dans son fichier :

yaml
phases:
  order: [your_network, annotation]
  your_network:
    type: prestudy
    file: surveys/your-network.json

Le fichier de la page contient le schéma, présenté ici en YAML. Les mêmes clés fonctionnent dans annotation_schemes :

yaml
- annotation_type: ego_network
  name: personal_network
  description: People you talk to
  label_requirement:
    required: true
  stages:
    - type: name_generator
      id: discuss
      title: Important matters
      prompt: >-
        Looking back over the last six months, who are the people you talked
        to about matters that are important to you?
      min_alters: 1
      max_alters: 8
      sets: {discuss: true}
    - type: name_generator
      id: help
      title: Practical help
      prompt: Who would you ask for help if you were ill for a couple of weeks?
      sets: {help: true}
    - type: name_interpreter
      id: about
      title: About each person
      required: true
      questions:
        - name: closeness
          type: radio
          description: How close do you feel to {name}?
          labels:
            - {name: very, text: Very close}
            - {name: somewhat, text: Somewhat close}
            - {name: not, text: Not close}
        - name: years_known
          type: number
          description: About how many years have you known {name}?
          min: 0
          max: 100
          required: false
    - type: dyad_census
      id: know
      prompt: Do {a} and {b} know each other?
    - type: sociogram
      id: map
      rings: 3
OptionValeur par défautSignification
stagesobligatoireLes étapes, dans l'ordre. Un name_generator doit précéder toute autre étape
stage_layoutstepssteps affiche une étape à la fois, stacked les affiche toutes ensemble
label_requirementaucune{required: true} empêche la page de continuer tant que le réseau n'est pas complet

Chaque étape prend type, id (une lettre suivie de lettres, de chiffres, de _ ou de -, par défaut <type>_<n>), title, prompt et instructions.

Générateurs de noms

OptionValeur par défautSignification
min_alters0Nombre de personnes dont cette étape a besoin avant que le répondant puisse continuer
max_altersaucuneNombre maximal de personnes acceptées par cette étape
rosteraucuneNoms à choisir au lieu de les saisir : des chaînes, ou {id, name}
roster_fieldaucuneUn champ de l'item contenant la liste (items d'annotation uniquement)
setsaucuneAttributs attribués à toutes les personnes nommées dans cette étape, comme {support: true}
placeholderFirst name or nicknameTexte indicatif du champ de nom

Saisir un nom déjà présent dans la liste est refusé avec un message, pour qu'une même personne ne soit pas enregistrée deux fois. Un générateur de noms ultérieur liste les personnes nommées auparavant sous "Named earlier", et le répondant ajoute d'un clic celles qui y ont aussi leur place. L'alter conserve un identifiant unique et enregistre chaque générateur qui l'a nommé. Retirer une personne du seul générateur qui l'a nommée la retire du réseau, avec ses réponses et ses liens.

Interpréteurs de noms

Une étape name_interpreter prend questions (obligatoire) et required, la valeur par défaut pour ses questions. Chaque question comporte name (unique dans tout le schéma), type (radio, multiselect, number ou text), description ({name} est remplacé par le nom de la personne), labels pour radio et multiselect (des chaînes ou {name, text}, où name est ce qui est stocké), required, et min, max et step pour les nombres. La page affiche une carte par personne avec toutes les questions.

Recensement des dyades

OptionValeur par défautSignification
promptDo {a} and {b} know each other?{a} et {b} sont remplacés par les deux noms
relationaucuneNom de la relation, quand une étude enregistre plus d'un type de lien
yes_label, no_labelYes, NoLibellés des réponses
strength_labelsaucuneDemande la force du lien au lieu de oui, avec un bouton par libellé plus no_label
strength_variablestrengthAttribut du lien sous lequel la réponse sur la force est stockée

Le recensement présente une paire à la fois et passe à la paire suivante sans réponse après chaque réponse. "All pairs" liste toutes les paires avec leur réponse, et cliquer sur l'une d'elles y revient.

Sociogramme

OptionValeur par défautSignification
relationaucuneLa relation enregistrée par les lignes
allow_tiestruefalse pour un canevas de placement uniquement
rings3Cercles concentriques tracés derrière les personnes, de 0 à 6

Les positions sont enregistrées en fractions de la largeur et de la hauteur du canevas. Une ligne tracée sur le sociogramme et une réponse du recensement pour la même relation sont un seul et même enregistrement ; tracer une ligne entre deux personnes met donc leur réponse de recensement à oui, et la supprimer la met à non.

Chaque commande est un bouton ou un champ de texte accessible avec Tab. Sur le sociogramme, Tab passe d'une personne à l'autre, Entrée en sélectionne une et ouvre la liste de toutes les autres pour ajouter ou supprimer des liens, les touches fléchées déplacent la personne qui a le focus (Maj la déplace davantage), et Échap ferme la liste.

Format des données

La réponse est stockée sous forme d'une chaîne JSON :

json
{
  "alters": [{"id": "a1", "name": "Ann", "named_in": ["discuss", "help"]},
             {"id": "a2", "name": "Bob", "named_in": ["discuss"]}],
  "attributes": {"a1": {"discuss": true, "help": true, "closeness": "very"}},
  "ties": [["a1", "a2"]],
  "positions": {"a1": [0.42, 0.31], "a2": [0.7, 0.55]},
  "census": {"a1|a2": true},
  "tie_attributes": {}
}

Les identifiants des alters sont a1, a2 et ainsi de suite, dans l'ordre où les personnes ont été nommées, et un identifiant supprimé n'est pas réutilisé. Un lien s'écrit [a, b], ou [a, b, relation] quand l'étape nomme une relation.

Export

bash
python -m potato.export --config config.yaml --format ego_network --output out/
FichierContenu
egos.csvUne ligne par réseau : network_size, n_ties, possible_ties, density, isolates, components, relations, et complete avec incomplete_reason, vérifiés selon les règles propres au schéma
alters.csvUne ligne par alter : alter_id, named_in, x, y, degree, et une colonne attr_<name> par attribut
edges.csvUne ligne par lien : source_alter, target_alter, relation (tie quand elle n'est pas nommée), et des colonnes tie_<name> comme tie_strength
graphml/<user>__<item>.graphmlUn fichier GraphML par réseau, avec les alters comme nœuds et les liens comme arêtes non orientées

L'ego n'est pas un nœud dans ces fichiers. La densité, les composantes et le degré sont calculés sur les liens entre alters, et deux personnes liées par deux relations comptent comme une seule paire connectée.

Noms des alters

Les noms que saisissent les répondants identifient des personnes qui n'ont pas accepté de participer à l'étude ; l'export ego_network les laisse donc de côté et n'écrit que les identifiants pseudonymes. --option export_names=true les inclut.

Les noms restent présents dans la sortie brute (annotation_output/) et dans les exports généraux (csv, jsonl), qui écrivent le JSON stocké tel quel. Demandez aux répondants des prénoms ou des surnoms, et traitez ces fichiers comme des données identifiantes.

Complétude

Avec label_requirement: {required: true}, la page ne continue pas tant qu'un générateur de noms compte moins de min_alters personnes, qu'une question obligatoire d'interpréteur de noms reste sans réponse pour quelqu'un, ou qu'un recensement des dyades comporte des paires sans réponse, et elle indique lequel. À l'intérieur du widget, Next reste sur un générateur de noms tant qu'il ne compte pas min_alters personnes, que le schéma soit obligatoire ou non.

Importer un protocole Network Canvas

potato import -f network_canvas -i my-study.netcanvas -o my-study/ lit un protocole Network Canvas, soit le fichier .netcanvas enregistré dans Architect, soit un simple protocol.json. Les formulaires ego deviennent des pages de questions ordinaires, et les étapes de réseau de chaque type de nœud deviennent une seule question ego_network :

Network CanvasPotato
EgoFormUne page de questionnaire, avec le panneau d'introduction comme titre
Information (éléments de texte)Une page pure_display, avec le Markdown réduit à du texte brut
NameGenerator, NameGeneratorQuickAddDes étapes name_generator, une par consigne
NameGeneratorRostername_generator avec un roster lu depuis la ressource CSV ou JSON du protocole
additionalAttributes sur une consignesets sur ce générateur de noms
Champs supplémentaires du formulaire d'ajout de personneUne étape name_interpreter juste après le générateur de noms
AlterFormname_interpreter
OrdinalBin, CategoricalBinname_interpreter avec une question radio par consigne
DyadCensus, OneToManyDyadCensusdyad_census, avec relation tiré du type d'arête
TieStrengthCensusdyad_census avec strength_labels tirés des options de la variable d'arête
Sociogramsociogram, avec concentricCircles comme rings
minNodes, maxNodesmin_alters (première consigne), max_alters (chaque consigne)

Les valeurs des options sont conservées comme réponses stockées ; les exports portent donc les mêmes codes que le protocole. La logique de saut sur les variables ego devient un show_when de page, et un saut vers une étape FinishSession devient un exit_when sur la page précédente, de sorte qu'un participant qui refuse le consentement quitte l'étude à cet endroit. Les protocoles comportant des traductions s'importent en anglais, sauf si vous passez --survey-language.

Certaines choses changent. Toutes les étapes de réseau d'un même type de nœud partagent une seule page, placée à l'endroit de la première d'entre elles ; une étape de réseau qui venait après d'autres pages passe donc avant elles, et l'import émet un avertissement pour chacune. Le glissement de personnes dans des cases devient un choix par personne, avec les mêmes valeurs stockées. La logique de saut qui teste des données de nœuds ou d'arêtes, AlterEdgeForm, Narrative, Geospatial et les étapes de généalogie, les sélecteurs de date, les éléments multimédias et les notes de l'enquêteur sont listés dans IMPORT_REPORT.md et ne sont pas importés.

Exemple

examples/advanced/ego-network/ utilise le schéma deux fois : comme page de questionnaire avant la tâche, pour le réseau propre du participant, et comme tâche d'annotation, où des codeurs enregistrent le réseau décrit par chaque extrait d'entretien.

bash
python potato/flask_server.py start examples/advanced/ego-network/config.yaml -p 8000

Mettez "Yes" et "No" entre guillemets dans les listes d'étiquettes, car YAML les lit sans guillemets comme des booléens, et écrivez stage_layout: stacked, et non layout: stacked, puisque layout est le mapping de placement dans la grille que tout schéma accepte.

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.