Ego-Netzwerke: Namensgeneratoren, Namensinterpretatoren, Dyadenzensus und Soziogramme
Persönliche Netzwerke in Potato mit Namensgeneratoren, Namensinterpretatoren, einem Dyadenzensus und einem Soziogramm erheben, Network-Canvas-Protokolle importieren und GraphML exportieren.
Neu in v2.12.0
ego_network erhebt ein persönliches (egozentriertes) Netzwerk, einen Standardgegenstand der sozialen Netzwerkanalyse. Die befragte Person, das Ego, nennt Personen (Alteri), beantwortet Fragen zu jeder von ihnen, gibt an, welche von ihnen einander kennen, und platziert sie auf einer Karte. Das Schema funktioniert auf einer Umfrageseite, wie die meisten Studien zu persönlichen Netzwerken es einsetzen, und auf Annotationsitems, wo eine codierende Person das Netzwerk erfasst, das ein Dokument beschreibt.
Ein Schema enthält eine geordnete Liste von Stufen. Jede Stufe arbeitet mit derselben Menge von Alteri, sodass eine im ersten Namensgenerator genannte Person in jeder späteren Stufe erscheint.
| Stufe | Was die befragte Person tut |
|---|---|
name_generator | Tippt Namen als Antwort auf eine Aufforderung ein oder wählt sie aus einer Liste |
name_interpreter | Beantwortet zu jeder Person dieselben Fragen (radio, multiselect, number, text) |
dyad_census | Gibt für jedes Personenpaar an, ob die beiden einander kennen: n(n-1)/2 Paare, eines nach dem anderen, mit einem Fortschrittsbalken |
sociogram | Zieht Personen auf einer Zeichenfläche umher und klickt auf zwei Personen, um eine Linie zwischen ihnen hinzuzufügen oder zu entfernen |
Standardmäßig werden die Stufen einzeln angezeigt, jede mit eigenen Schaltflächen Back und Next und einer Reihe von Schrittschaltflächen. stage_layout: stacked zeigt alle zugleich auf der Seite.
Konfiguration
Führen Sie auf einer Umfrageseite die Seite unter phases auf und legen Sie das Schema in ihre Datei:
phases:
order: [your_network, annotation]
your_network:
type: prestudy
file: surveys/your-network.jsonDie Seitendatei enthält das Schema, hier in YAML gezeigt. Dieselben Schlüssel funktionieren in 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 | Standard | Bedeutung |
|---|---|---|
stages | erforderlich | Die Stufen in ihrer Reihenfolge. Ein name_generator muss vor jeder anderen Stufe kommen |
stage_layout | steps | steps zeigt jeweils eine Stufe, stacked zeigt alle zugleich |
label_requirement | keiner | {required: true} verhindert das Weitergehen, bis das Netzwerk vollständig ist |
Jede Stufe nimmt type, id (ein Buchstabe, gefolgt von Buchstaben, Ziffern, _ oder -, standardmäßig <type>_<n>), title, prompt und instructions.
Namensgeneratoren
| Option | Standard | Bedeutung |
|---|---|---|
min_alters | 0 | Personen, die diese Stufe braucht, bevor die befragte Person weitergehen kann |
max_alters | keiner | Höchstzahl der Personen, die diese Stufe annimmt |
roster | keiner | Namen zur Auswahl statt zum Eintippen: Strings oder {id, name} |
roster_field | keiner | Ein Item-Feld, das die Liste enthält (nur Annotationsitems) |
sets | keiner | Attribute, die alle in dieser Stufe genannten Personen erhalten, etwa {support: true} |
placeholder | First name or nickname | Platzhalter des Namensfelds |
Wird ein Name eingetippt, der schon auf der Liste steht, wird er mit einer Meldung abgewiesen, damit eine Person nicht doppelt erfasst wird. Ein späterer Namensgenerator listet die früher genannten Personen unter "Named earlier" auf, und die befragte Person fügt mit einem Klick alle hinzu, die auch dorthin gehören. Der Alter behält eine ID und verzeichnet jeden Generator, der ihn genannt hat. Wird eine Person aus dem einzigen Generator entfernt, der sie genannt hat, verschwindet sie samt ihren Antworten und Beziehungen aus dem Netzwerk.
Namensinterpretatoren
Eine Stufe name_interpreter nimmt questions (erforderlich) und required, den Standard für ihre Fragen. Jede Frage hat name (eindeutig im gesamten Schema), type (radio, multiselect, number oder text), description ({name} wird durch den Namen der Person ersetzt), labels für radio und multiselect (Strings oder {name, text}, wobei name das Gespeicherte ist), required sowie min, max und step für Zahlen. Die Seite zeigt eine Karte pro Person mit allen Fragen darauf.
Dyadenzensus
| Option | Standard | Bedeutung |
|---|---|---|
prompt | Do {a} and {b} know each other? | {a} und {b} werden durch die beiden Namen ersetzt |
relation | keiner | Name der Relation, wenn eine Studie mehr als eine Art von Beziehung erfasst |
yes_label, no_label | Yes, No | Antwortlabels |
strength_labels | keiner | Fragt statt nach Ja, wie stark die Beziehung ist, mit einer Schaltfläche pro Label plus no_label |
strength_variable | strength | Beziehungsattribut, unter dem die Stärkeantwort gespeichert wird |
Der Zensus zeigt jeweils ein Paar und geht nach jeder Antwort zum nächsten unbeantworteten Paar. "All pairs" listet alle Paare mit ihrer Antwort auf, und ein Klick auf eines führt dorthin zurück.
Soziogramm
| Option | Standard | Bedeutung |
|---|---|---|
relation | keiner | Die Relation, die die Linien erfassen |
allow_ties | true | false für eine Zeichenfläche, auf der nur platziert wird |
rings | 3 | Konzentrische Kreise hinter den Personen, von 0 bis 6 |
Positionen werden als Bruchteile von Breite und Höhe der Zeichenfläche gespeichert. Eine im Soziogramm gezeichnete Linie und eine Zensusantwort für dieselbe Relation sind derselbe Datensatz, sodass das Zeichnen einer Linie zwischen zwei Personen ihre Zensusantwort auf Ja setzt und das Entfernen auf Nein.
Jedes Bedienelement ist eine Schaltfläche oder ein Textfeld, das mit Tab erreichbar ist. Im Soziogramm wechselt Tab zwischen Personen, Enter wählt eine aus und öffnet eine Liste aller anderen, um Beziehungen hinzuzufügen oder zu entfernen, die Pfeiltasten bewegen die fokussierte Person (mit Shift weiter), und Escape schließt die Liste.
Datenformat
Die Antwort wird als ein einziger JSON-String gespeichert:
{
"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": {}
}Alter-IDs sind a1, a2 und so weiter, in der Reihenfolge, in der die Personen genannt wurden, und eine gelöschte ID wird nicht wiederverwendet. Eine Beziehung ist [a, b] oder [a, b, relation], wenn die Stufe eine Relation nennt.
Export
python -m potato.export --config config.yaml --format ego_network --output out/| Datei | Inhalt |
|---|---|
egos.csv | Eine Zeile pro Netzwerk: network_size, n_ties, possible_ties, density, isolates, components, relations und complete mit incomplete_reason, geprüft anhand der eigenen Regeln des Schemas |
alters.csv | Eine Zeile pro Alter: alter_id, named_in, x, y, degree und eine Spalte attr_<name> pro Attribut |
edges.csv | Eine Zeile pro Beziehung: source_alter, target_alter, relation (tie, wenn unbenannt) und Spalten tie_<name> wie tie_strength |
graphml/<user>__<item>.graphml | Eine GraphML-Datei pro Netzwerk, mit Alteri als Knoten und Beziehungen als ungerichteten Kanten |
Das Ego ist in diesen Dateien kein Knoten. Dichte, Komponenten und Grad werden über Beziehungen zwischen Alteri berechnet, und zwei Personen, die über zwei Relationen verbunden sind, zählen als ein verbundenes Paar.
Namen der Alteri
Die Namen, die Befragte eintippen, identifizieren Personen, die der Teilnahme an der Studie nicht zugestimmt haben. Der Export ego_network lässt sie daher weg und schreibt nur die pseudonymen IDs. --option export_names=true nimmt sie mit auf.
Die Namen stehen weiterhin in der Rohausgabe (annotation_output/) und in den allgemeinen Exporten (csv, jsonl), die das gespeicherte JSON unverändert schreiben. Fragen Sie Befragte nach Vornamen oder Spitznamen und behandeln Sie diese Dateien als identifizierbare Daten.
Vollständigkeit
Mit label_requirement: {required: true} lässt die Seite kein Weitergehen zu, solange ein Namensgenerator weniger als min_alters Personen hat, eine erforderliche Frage eines Namensinterpretators für jemanden unbeantwortet ist oder ein Dyadenzensus unbeantwortete Paare hat, und sie gibt an, was fehlt. Innerhalb des Widgets bleibt Next auf einem Namensgenerator stehen, bis dieser min_alters Personen hat, unabhängig davon, ob das Schema erforderlich ist.
Ein Network-Canvas-Protokoll importieren
potato import -f network_canvas -i my-study.netcanvas -o my-study/ liest ein Network Canvas-Protokoll, entweder die in Architect gespeicherte .netcanvas-Datei oder eine bloße protocol.json. Ego-Formulare werden zu Seiten mit gewöhnlichen Fragen, und die Netzwerkstufen für jeden Knotentyp werden zu einer ego_network-Frage:
| Network Canvas | Potato |
|---|---|
EgoForm | Eine Umfrageseite, mit dem Einleitungsbereich als Überschrift |
Information (Text-Items) | Eine pure_display-Seite, wobei Markdown auf reinen Text reduziert wird |
NameGenerator, NameGeneratorQuickAdd | name_generator-Stufen, eine pro Aufforderung |
NameGeneratorRoster | name_generator mit einem roster, gelesen aus dem CSV- oder JSON-Asset des Protokolls |
additionalAttributes an einer Aufforderung | sets an diesem Namensgenerator |
| Zusätzliche Felder im Formular zum Hinzufügen einer Person | Eine name_interpreter-Stufe direkt nach dem Namensgenerator |
AlterForm | name_interpreter |
OrdinalBin, CategoricalBin | name_interpreter mit einer Radio-Frage pro Aufforderung |
DyadCensus, OneToManyDyadCensus | dyad_census, mit relation aus dem Kantentyp |
TieStrengthCensus | dyad_census mit strength_labels aus den Optionen der Kantenvariable |
Sociogram | sociogram, mit concentricCircles als rings |
minNodes, maxNodes | min_alters (erste Aufforderung), max_alters (jede Aufforderung) |
Optionswerte werden als gespeicherte Antworten beibehalten, sodass Exporte dieselben Codes wie das Protokoll tragen. Skip-Logik auf Ego-Variablen wird zu show_when der Seite, und ein Sprung zu einer Stufe FinishSession wird zu exit_when auf der vorherigen Seite, sodass eine teilnehmende Person, die die Einwilligung ablehnt, die Studie dort verlässt. Protokolle mit Übersetzungen werden auf Englisch importiert, sofern Sie nicht --survey-language übergeben.
Manches ändert sich. Alle Netzwerkstufen für einen Knotentyp teilen sich eine Seite, die dort steht, wo die erste von ihnen war, sodass eine Netzwerkstufe, die nach anderen Seiten kam, vor diese rückt, und der Import warnt bei jeder. Das Ziehen von Personen in Bins wird zu einer Auswahl pro Person, mit denselben gespeicherten Werten. Skip-Logik, die Knoten- oder Kantendaten prüft, AlterEdgeForm, Narrative, Geospatial und die Stammbaumstufen, Datumsauswahlen, Medien-Items und Notizen für Interviewende werden in IMPORT_REPORT.md aufgeführt und nicht importiert.
Beispiel
examples/advanced/ego-network/ führt das Schema zweimal aus: als Umfrageseite vor der Aufgabe, für das eigene Netzwerk der teilnehmenden Person, und als Annotationsaufgabe, in der Codierende das Netzwerk erfassen, das jeder Interviewausschnitt beschreibt.
python potato/flask_server.py start examples/advanced/ego-network/config.yaml -p 8000Setzen Sie "Yes" und "No" in Labellisten in Anführungszeichen, weil YAML sie ohne Anführungszeichen als Booleans liest, und schreiben Sie stage_layout: stacked, nicht layout: stacked, da layout die Zuordnung für die Rasterplatzierung ist, die jedes Schema akzeptiert.
Weiterführende Informationen
- Umfrageimport - Network Canvas und sechs weitere Fragebogenformate
- Mehrphasige Workflows - Umfrageseiten vor und nach der Aufgabe
- Kulturelle Domänenanalyse - Freie Listen und Triadentests für dieselben Befragten
Implementierungsdetails finden Sie in der Quelldokumentation.