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.
| Étape | Ce que fait le répondant |
|---|---|
name_generator | Saisit des noms en réponse à une consigne, ou les choisit dans une liste |
name_interpreter | Répond aux mêmes questions sur chaque personne (radio, multiselect, number, text) |
dyad_census | Indique, pour chaque paire de personnes, si elles se connaissent : n(n-1)/2 paires, une à la fois, avec une barre de progression |
sociogram | Fait 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 :
phases:
order: [your_network, annotation]
your_network:
type: prestudy
file: surveys/your-network.jsonLe fichier de la page contient le schéma, présenté ici en YAML. Les mêmes clés fonctionnent dans annotation_schemes :
- 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| Option | Valeur par défaut | Signification |
|---|---|---|
stages | obligatoire | Les étapes, dans l'ordre. Un name_generator doit précéder toute autre étape |
stage_layout | steps | steps affiche une étape à la fois, stacked les affiche toutes ensemble |
label_requirement | aucune | {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
| Option | Valeur par défaut | Signification |
|---|---|---|
min_alters | 0 | Nombre de personnes dont cette étape a besoin avant que le répondant puisse continuer |
max_alters | aucune | Nombre maximal de personnes acceptées par cette étape |
roster | aucune | Noms à choisir au lieu de les saisir : des chaînes, ou {id, name} |
roster_field | aucune | Un champ de l'item contenant la liste (items d'annotation uniquement) |
sets | aucune | Attributs attribués à toutes les personnes nommées dans cette étape, comme {support: true} |
placeholder | First name or nickname | Texte 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
| Option | Valeur par défaut | Signification |
|---|---|---|
prompt | Do {a} and {b} know each other? | {a} et {b} sont remplacés par les deux noms |
relation | aucune | Nom de la relation, quand une étude enregistre plus d'un type de lien |
yes_label, no_label | Yes, No | Libellés des réponses |
strength_labels | aucune | Demande la force du lien au lieu de oui, avec un bouton par libellé plus no_label |
strength_variable | strength | Attribut 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
| Option | Valeur par défaut | Signification |
|---|---|---|
relation | aucune | La relation enregistrée par les lignes |
allow_ties | true | false pour un canevas de placement uniquement |
rings | 3 | Cercles 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 :
{
"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
python -m potato.export --config config.yaml --format ego_network --output out/| Fichier | Contenu |
|---|---|
egos.csv | Une 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.csv | Une ligne par alter : alter_id, named_in, x, y, degree, et une colonne attr_<name> par attribut |
edges.csv | Une 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>.graphml | Un 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 Canvas | Potato |
|---|---|
EgoForm | Une 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, NameGeneratorQuickAdd | Des étapes name_generator, une par consigne |
NameGeneratorRoster | name_generator avec un roster lu depuis la ressource CSV ou JSON du protocole |
additionalAttributes sur une consigne | sets sur ce générateur de noms |
| Champs supplémentaires du formulaire d'ajout de personne | Une étape name_interpreter juste après le générateur de noms |
AlterForm | name_interpreter |
OrdinalBin, CategoricalBin | name_interpreter avec une question radio par consigne |
DyadCensus, OneToManyDyadCensus | dyad_census, avec relation tiré du type d'arête |
TieStrengthCensus | dyad_census avec strength_labels tirés des options de la variable d'arête |
Sociogram | sociogram, avec concentricCircles comme rings |
minNodes, maxNodes | min_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.
python potato/flask_server.py start examples/advanced/ego-network/config.yaml -p 8000Mettez "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
- Import de questionnaires - Network Canvas et six autres formats de questionnaire
- Flux de travail multi-phases - Pages de questionnaire avant et après la tâche
- Analyse de domaines culturels - Listes libres et tests de triades pour les mêmes répondants
Pour les détails d'implémentation, consultez la documentation source.