Übersetzungen dieser Seite:
 

Quotierung

Bei der Zusammenarbeit mit Panel-Anbietern werden oft quotierte Stichproben gebucht. Der Fragebogen ist dann für den Quotenstopp verantwortlich: Liegen für eine demografische Gruppe also genug Fragebögen vor, werden weitere Teilnehmer dieser Gruppe an eine Quotafull-Adresse des Panel-Anbieters zurück geschickt.

Hinweis: Für andere Formen der Rekrutierung ist ein Quotenstopp i.d.R. nicht sinnvoll. Die Folge wäre, dass man die Mehrheit der interessierten Teilnehmer abweist – zugleich aber noch rekrutieren muss, damit man die fehlenden demografischen Gruppen vervollständigt.

Tipp: Verwenden Sie den Debug-Modus und sehen Sie die Debug-Informationen an, um die Funktion des Quotenstopps zu prüfen und wenn dieser im Test (z.b. mit sehr kleinen Quoten) nicht sofort funktioniert (Problemlösung bei Filterfragen).

Minimal-Quotierung

Mitunter soll eine Erhebung mit dem Erreichen einer bestimmten Anzahl von Fällen beendet werden.

Legen Sie im Fragenkatalog einen Text an, welcher nach Erreichen der Fallzahl angezeigt werden soll und fügen Sie auf der ersten Seite des Fragebogens ganz oben folgenden PHP-Code ein. Der Beispiel-Code geht davon aus, dass der Text die Kennung „QS01“ hat und die Erhebung nach 250 ausgefüllten Fragebögen enden soll.

// Abgeschlossene Fragebögen zählen
$finished = statistic('count', 'FINISHED');
// Filter zum Quotenstopp
if ($finished >= 250) {
  // Text anzeigen
  text('QS01');
  // Weiter-Knopf ausblenden
  buttonHide();
  // Keine weiteren Inhalte dieser Seite zeigen
  pageStop();
}

Hinweis: Dieser PHP-Code zähle alle Fälle mit MODE „interview“ und FINISHED 1. Dies können auch Fälle sein, bei denen mittels redirect() ein Screenout erfolgt. Im Debug-Modus werden die Fälle unabhängig von der Variable MODE gezählt.

Filterung

Falls Sie sicherstellen möchten, dass nur Fälle mit bestimmten Eigenschaften gezählt werden, legen Sie eine interne Variable an (im folgenden Beispiel „QS02_01“) und geben Sie dieser Variable nur dann den Wert 2, wenn ein Fall die gewünschten Kriterien erfüllt. Wenn zum Beispiel der folgende PHP-Code auf der vorletzten Seite des Fragebogens platziert wird, dann werden nur Fälle gezählt, welche die vorletzte Seite erreichen und bis dorthin mindestens 10 Minuten (600 Sekunden) benötigt haben.

$time = caseTime('hitherto');
if ($time >= 600) {
  put('QS02_01', 2);
}

Der eigentliche Quotestopp bezieht sich dann nicht mehr auf die Variable „FINISHED“, sondern auf die interne Variable. Auf der ersten Seite des Fragebogens würde dann z.B. der folgende PHP-Code platziert.

// Gültige Fragebögen zählen
$valid = statistic('count', 'QS02_01', 2);
// Filter wie oben
if ($valid >= 250) {
  text('QS01');
  buttonHide();
  pageStop();
}

Funktionsweise Quotierung

Die Quotierung nach demografischen Gruppen erfolgt in folgenden Schritten:

  1. Abfrage der Quoten-Merkmale einer Person mittels value().
  2. Zählung, wie viele Personen mit dieser Merkmalsausprägung bzw. mit dieser Kombination von Merkmalsausprägungen bereits befragt wurden, mittels statistic().
  3. Vergleich der Zählung mit einer Quotentabelle, wie viele Personen pro demografischer Zelle benötigt werden.
  4. Abweisen von Personen, wenn für eine demografische Zelle bereits ausreichend Fälle vorliegen, mittels redirect().

Mit „demografische Zelle“ oder „demografische Gruppe“ ist jeweils eine Kombination der zu quotierenden Merkmale gemeint (z.B. „männliche Teilnehmer zwischen 15 und 25 Jahre“, wenn Alter und Geschlecht quotiert werden).

Prinzipiell kann man unverbundene und verbundenen Quoten prüfen. Bei der unverbundenen Quotierung werden die Merkmale einzeln nacheinander geprüft („Liegen schon genug Fragebögen von männlichen Teilnehmern vor?“ „Liegen schon genug Fragebögen von jungen Teilnehmern vor?“). Hier werden die Randsummen der Verteilung überprüft. Entsprechend wäre es bei der unverbundenen Quotierung möglich, die Quoten mit jungen Frauen und alten Männer zu füllen – ganz ohne junge Männer.

Bei der verbundenen Quotierung werden die demografischen Zellen überprüft („Liegen schon genug Fragebögen von jungen männlichen Teilnehmen vor?“). Die verbundene Quotierung ist damit weniger anfällig für systematische Verzerrungen (Konfundierung zwischen den demografischen Merkmalen) – allerdings werden auch mehr potenzielle Teilnehmer abgewiesen.

Beim Zusammenspiel von statistic() und redirect() zu beachten: Der Befehl redirect() markiert die Fragebögen von abgewiesenen Teilnehmern als „abgeschlossen“ (FINISHED=1), sodass sie von statistic() gezählt werden. Um falsche Zählungen zu vermeiden, werden nicht direkt die Variablen gezählt, welche im Fragebogen abgefragt wurden: Stattdessen werden beim Complete-Redirect die Quotenmerkmale mittels put() in interne Variablen kopiert, die dann gezählt werden können. Für die Quotierung sind demnach 2 getrennte PHP-Codes erforderlich.

  1. Nach Abfrage der Quotenmerkmale (auf der darauf folgenden Seite) wird die vom Teilnehmer angegeben Ausprägung gegen die Anzahl vorhandener Fälle geprüft.
  2. Direkt vor dem Complete-Redirect wird die Ausprägung des Quoten-Merkmals in eine interne Variable kopiert.

Sofern das Quotenmerkmal zunächst umkodiert werden muss, wird dieser PHP-Code in beiden Teilen verwendet.

Technische Umsetzung (unverbundene Quoten)

Die technische Umsetzung erfolgt mittels PHP-Code und umfasst mehrere Schritte. Diese werden hier zunächst für die Überprüfung von unverbundenen Quoten erklärt.

Im folgenden werden exemplarisch zwei Merkmale quotiert: Alter (offen abgefragt in Variable „SD01_01“) und das Geschlecht (geschlossen abgefragt in Variable „SD02“). Es ist zweckmäßig, Qutotenfragen als Pflichtfragen zu definieren.

Definition der Quoten

Zunächst wird eine Liste (Array) benötigt, welches für jede Ausprägung des Merkmals die gewünschte Teilnehmerzahl vorgibt. Bei unverbundenen Quoten ist eine Quotentabelle pro Merkmal erforderlich.

Im folgenden Beispiel wird der Screenout direkt in der Quotenprüfung integriert. Es wäre aber genauso ein vorgelagerter Screenout möglich.

$quotaAge = [
  2 => 200,  // 200 Personen in Altersgruppe 2 (18-30 Jahre)
  3 => 250,  // 250 Personen in Altersgruppe 3 (31-50 Jahre)
  4 => 150   // 150 Personen in Altersgruppe 4 (51-68 Jahre)
];
$quotaGender = [
  1 => 300,  // 300 Frauen (Code 1)
  2 => 300   // 300 Männer (Code 2)
];

Beachten Sie, dass für die Altersgruppen 1 (Personen unter 18 Jahre) und 5 (Peronen älter als 68 Jahre) keine Einträge in der Tabelle vorliegen. Ebenso für das Geschlecht 3 (Personen, sie sich einem sonstigen Geschlecht zuordnen). Dies wird im Screenout (unten) durch die Funktion array_key_exists() abgebildet.

Merkmale auslesen und umkodieren

Die Merkmalsausprägung des aktuellen Teilnehmers wird mittels value() ausgelesen und bei Bedarf mit einer IF-Konstruktion umkodiert. Im vorliegenden Fall muss das Alter (offene Eingabe) umkodiert werden.

// Geschlecht wird direkt ausgelesen
$gender = value('SD02');
// Das Alter wird umkodiert
$age = value('SD01_01');
if ($age < 18) {
  $ageGroup = 1;
} elseif ($age <= 30) {
  $ageGroup = 2;
} elseif ($age <= 50) {
  $ageGroup = 3;
} elseif ($age <= 68) {
  $ageGroup = 4;
} else {
  $ageGroup = 5;
}

Zählung der vorliegenden Fälle

Nun wird mitels statistic() überprüft, wie viele Datensätze mit der Ausprägung der Quotenmerkmale bereits im Datensatz vorliegen. Dieser Wert wird dann mit den oben definierten Quoten verglichen.

Wichtig: Damit der PHP-Code korrekt funktioniert, müssen alle Teile im selben PHP-Code Block stehen. PHP-Variablen wie $quotaAge und $ageGroup sind nur jeweils innerhalb eines Code-Blocks gültig.

Im folgenden Code werden nicht die Variablen gezählt, mit denen die Quotenmerkmale abgefragt wurden („SD01_01“ und „SD02“), sondern interne Variablen („SD03_01“ und „SD03_02“).

Wichtig: Die internen Variablen müssen im Fragenkatalog vorab manuell angelegt werden.

// Abruf der vorliegenden Fälle für diese Merkmalsausprägung
$casesAge    = statistic('count', 'SD03_01', $ageGroup);
$casesGender = statistic('count', 'SD03_02', $gender);
 
// Screenout
if (!array_key_exists($ageGroup, $quotaAge) || !array_key_exists($gender, $quotaGender)) {
  redirect('https://www.panelanbieter.de/?xyz=screenoutGHIJKI&uid=%reference%');
}
 
// Auslesen der Quoten für die angegeben Merkmale
$maxPerAge    = $quotaAge[$ageGroup];
$maxPerGender = $quotaGender[$gender];
 
// Quotenstopp
if (($casesAge >= $maxPerAge) || ($casesGender >= $maxPerGender)) {
  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
}

Der Bool'sche Operator || ist eine ODER-Verknüpfung zwischen den zwei Bedingungen. Wenn also entweder genug Fälle für das Alter vorliegen oder genug Fälle für das Geschlecht, dann erfolgt ein QuotaFull-Redirect.

Den Redirect-Link erhalten Sie vom Panel-Anbieter. Wichtig ist, dass Sie die Teilnehmer-ID übermitteln. Im Beispiel kommt der Platzhalter %reference% zum Einsatz. Details dazu lesen Sie hier: Mit externen Panel-Anbietern arbeiten.

Wichtig: Die Antwort des Teilnehmers wird erst zum Server übermittelt, wenn sie der Teilnehmer mittels „Weiter“ abgeschickt hat. Wenn die Fragen „SD01“ und „SD02“ auf Seite 2 des Fragebogens steht, kann value() und damit der obige PHP-Code frühestens auf Seite 3 platziert werden.

Kopieren der Quotenmerkmale

Zuletzt müssen die Quoten-Merkmale noch in die internen Variablen kopiert werden. Das heißt, direkt vor dem Complete-Redirect, welches üblicherweise auf der vorletzten Seite des Fragebogen platziert wird.

Hierzu benötigen Sie erneut den PHP-Code aus dem Abschnitt Merkmale auslesen und umkodieren (oben) und im selben PHP-Code Block direkt darunter die Funktion put() zum Setzen der internen Variablen.

put('SD03_01', $ageGroup);
put('SD03_02', $gender);

Danach folgt üblicherweise der Complete-Redirect.

redirect('https://www.panelanbieter.de/?xyz=completeDEFGHI&uid=%reference%');

Verbundene Quoten

Quotenprüfung zu Beginn

Wenn Sie mit verbundenen Quoten arbeiten, müssen Sie eine größere Anzahl an Quoten definieren: Ein Grenzwert pro demografischer Zelle. Bei 3 Ausprägungen für das Alter und 2 Ausprägungen für das Geschlecht sind das insgesamt 6 Quoten.

Im folgenden PHP-Code wird eine demografische Zelle durch einen Code aus Altersgruppe (2-4) und Geschlecht (1-2) definiert. Die 6 Quoten sind der Übersichtlichkeit halber in 3 Zeilen mit jeweils 2 Quoten notiert – technisch macht es keinen Unterschied, ob nach dem Komma ein Zeilenumbruch folgt.

$quota = [
  '2-1' => 100, '2-2' => 100,  // 100 Personen pro Geschlecht für die Altersgruppe 1
  '3-1' => 125, '3-2' => 125,  // 125 Personen pro Geschlecht für die Altersgruppe 2
  '4-1' => 75,  '4-2' => 75    //  75 Personen pro Geschlecht für die Altersgruppe 3
];

Das Auslesen der quotenrelevanten Ausprägungen und das Umkodieren erfolgt zunächst genauso wie bei den unverbundenen Quoten.

// Geschlecht wird direkt ausgelesen
$gender = value('SD02');
// Das Alter wird umkodiert
$age = value('SD01_01');
if ($age < 18) {
  $ageGroup = 1;
} elseif ($age <= 30) {
  $ageGroup = 2;
} elseif ($age <= 50) {
  $ageGroup = 3;
} elseif ($age <= 68) {
  $ageGroup = 4;
} else {
  $ageGroup = 5;
}

Allerdings wird zusätzlich noch eine Variable definiert, welche den Code der demografischen Zelle beinhaltet. Der Punkt (.) dient in PHP zum Aneinanderfügen von Texten (Verketten von Strings).

// Definition einer Variable mit Altesgruppe und Geschlecht
// Aus 3 und 2 wird hier '3-2'
$demGroup = $ageGroup.'-'.$gender;

Die Quotenprüfung erfolgt nun für dieses (kombinierte) Merkmal. Erneut wird eine interne Variable (SD04_01) verwendet, die vorab im Fragenkatalog definiert werden muss.

// Abruf der vorliegenden Fälle für diese Merkmalsausprägung
$cases = statistic('count', 'SD04_01', $demGroup);
 
// Screenout
if (!array_key_exists($demGroup, $quota)) {
  redirect('https://www.panelanbieter.de/?xyz=screenoutGHIJKI&uid=%reference%');
}
 
// Auslesen der Quote für die demografische Gruppe
$maxPerGroup = $quota[$demGroup];
 
// Quotenstopp
if ($cases >= $maxPerGroup) {
  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
}

Speicherung des Zellen-Codes

Vor dem Complete-Redirect muss der Code für die demografische Zelle in die interne Variable gespeichert werden.

// Speichern der Gruppenzugehörigkeit in der internen Variable SD04_01
put('SD04_01', $demGroup);

Damit dieser Code funktioniert, müssen auch hier die Quotenausprägungen abgerufen und umkodiert werden. Und natürlich müssen sie zum Zellen-Code $demGroup verkettet werden. Der vollständige Code für die vorletzte Fragebogen-Seite einschließlich Complete-Redirect sieht demnach wie folgt aus.

// Geschlecht wird direkt ausgelesen
$gender = value('SD02');
// Das Alter wird umkodiert
$age = value('SD01_01');
if ($age < 18) {
  $ageGroup = 1;
} elseif ($age <= 30) {
  $ageGroup = 2;
} elseif ($age <= 50) {
  $ageGroup = 3;
} elseif ($age <= 68) {
  $ageGroup = 4;
} else {
  $ageGroup = 5;
}
 
// Definition einer Variable mit Altesgruppe und Geschlecht
// Aus 3 und 2 wird hier '3-2'
$demGroup = $ageGroup.'-'.$gender;
 
// Speichern der Gruppenzugehörigkeit in der internen Variable SD04_01
put('SD04_01', $demGroup);
 
// Complete-Redirect
redirect('https://www.panelanbieter.de/?xyz=completeDEFGHI&uid=%reference%');

Fehlersuche

Die Implementierung einer Quotierung ist im Moment nicht ganz trivial (Optimierung in Arbeit) – und es schleichen sich immer mal wieder Fehler im Code ein. Zum Beispiel werden Fälle abgewiesen, obwohl die Quoten noch nicht erfüllt sind.

Wir setzen voraus, dass Sie mir der Funktion der Debug-Information (siehe Fragebogen-Probleme lösen) vertraut sind.

Damit alle für die Fehlersuche notwendigen Informationen angezeigt werden, sind zwei Modifikationen sehr hilfreich.

(1) Redirect zweitweise deaktivieren

Deaktivieren Sie die Redirects, sodass die Debug-Informationen überhaupt angezeigt werden. Sie können das redirect() mit zwei Schrägstrichen (//) auskommentieren und damit deaktivieren. Ergänzen Sie stattdessen ein pageStop(), damit auf der Seite keine weiteren Inhalte ausgeführt werden. Mittels html() können Sie auch noch eine kurze Information anzeigen. Wenn Ihr IF-Filter also im Produktiv-Betrieb wie folgt aussieht…

// Quotenstopp
if (($casesAge >= $maxPerAge) || ($casesGender >= $maxPerGender)) {
  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
}

… dann ändern Sie den Code zur Fehlersuche wie folgt.

// Quotenstopp
if (($casesAge >= $maxPerAge) || ($casesGender >= $maxPerGender)) {
  // redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
  html('<p>Redirect ausgelöst</p>');
  pageStop();
}

(2) Quoten-Zählung anzeigen

In der Debug-Information sehen Sie beriets, welche Werte statistic() liefert. Aber mit der Funktion debug() können Sie auch anzeigen, welche Werte Ihre Quotierung (das Array mit den Quoten) für den aktuellen Fall liefert.

Ergänzen Sie einfach für alle Filter-relevanten Variablen eine Zeile debug(). Für den obigen Filter würde das dann wie folgt aussehen.

// Zusätze Informationen anzeigen
debug($casesAge);
debug($maxPerAge);
debug($casesGender);
debug($maxPerGender);
 
// Quotenstopp
if (($casesAge >= $maxPerAge) || ($casesGender >= $maxPerGender)) {
  // redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
  html('<p>Redirect ausgelöst</p>');
  pageStop();
}

Damit können Sie unmittelbar nachvollziehen, warum ein Redirect ausgelöst wird. Wenn Sie dann noch nicht nachvollziehen können, warum diese (evtl. falschen) Werte wemittelt werden, lassen Sie sich weitere Variablen anzeigen, z.B. dort wo die Quotenlimits ausgelesen werden. Der Code oben im Beispiel lautet wie folgt.

// Auslesen der Quoten für die angegeben Merkmale
$maxPerAge    = $quotaAge[$ageGroup];
$maxPerGender = $quotaGender[$gender];

Wenn z.B. unklar ist, woher der Wert für $maxPerAge kommt, kann man sich das Array und die Alterskategorie anzeigen lassen.

// Auslesen der Quoten für die angegeben Merkmale
$maxPerAge    = $quotaAge[$ageGroup];
$maxPerGender = $quotaGender[$gender];
 
// Zusätzliche Informationen anzeigen
debug($ageGroup);
debug($quotaAge);
debug($maxPerAge);

Diese Informationen helfen auch im Online-Support, wenn Sie Unterstützung bei der Implementierung Ihrer Filter benötigen.

de/survey/quota.txt · Zuletzt geändert: 09.09.2022 21:11 von admin
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Share Alike 4.0 International
Driven by DokuWiki