Eine kleine Essensumfrage – Ergebnisse

Ende letzten Jahres haben wir eine kleine (nicht-repräsentative) Essensumfrage gestartet: Welche Essen sind besonders beliebt, gibt es verschiedene “Esstypen” und korrelieren Essvorlieben mit Reisezielen?

Die Ergebnisse

Nun präsentieren wir die Ergebnisse. Es haben 60 Personen teilgenommen, von denen die meisten 20 – 40 Jahre alt waren. Ein erstaunlich hoher Anteil von über 15 % gab an, sich vegan zu ernähren. Das Verhältnis zwischen weiblichen und männlichen Teilnehmenden war ausgeglichen. Im Mittel wurden etwa 60% der abgefragten Lebensmittels gerne gegessen.

Körnerbrötchen, Orangen und Schokolade gehörten zu den beliebtesten Essensgegenständen. Alge hatten immerhin 17 % noch nie gegessen. Bei einigen der abgefragten Essensgegenständen hat sich eine Abneigung im Laufe des Lebens in eine Zuneigung gewandelt. Hier wurden auffällig viele Gemüse genannt, allen voran Oliven. Insgesamt mochten vegan lebende Menschen mehr der abgefragen Essen als die restlichen Teilnehmenden.

Schließlich gab es gewisse Zusammenhänge zwischen den Essensvorlieben und demographischen Merkmalen, wie besuchten Kontinenten, Lieblingsfarben und genutzten Betriebssystemen. Beispielsweise zeigte sich, dass Inwger besonders bei den Teilnehmenden beliebt war, die auch Nordamerika besucht hatten. Andererseits waren z.B. weiße Brötchen besonders bei Südamerika-Reisenden unbeliebt. Weitere Ergebnisse und Erklärungen gibt es über die Links.

Bis bald und liebe Grüße!

dqrng v0.1.0: breaking changes

Eine neue Version des dqrng Pakets ist auf den CRAN Servern verfügbar. Diese Version bringt zwei Änderungen des bisherigen Verhaltens:

  • Ein int-Vektor wird an Stelle eines einzelnen int als Seed verwendet (Aaron Lun in #10). Verwendung eines einzelnen int führt zu einem anderen Zustand als zuvor.

  • Der Mersenne-Twister Generator wurde entfernt. Xoroshiro128+ ist nun der default.

Die erste Änderung ist durch den Wunsch motiviert mehr als 32 bits an Zufall
als Seed verwenden zu können. Damit wurde das zuvor genutzte “scrambling” des einzelnen int überflüssig. Die neue Methode generateSeedVectors() nutzt R's RNG um eine Liste an int-Vektoren zu erzeugen, die als Seed verwendet werden könnnen.

Die zweite Änderung bezieht sich auf einen Satz aus der Anleitung zu R: Nor should the C++11 random number library be used …. I vermute, dass sich das auf die impementierungs-abhängigen Verteilungen und nicht die Generatoren bezieht, aber grundsätzloch sollte man WRE möglichst genau folgen. Also muss std::mt19937_64 gehen und kann wegen eines nicht gemerged pull requests nicht durch boost::random::mt19937_64 ersetzt werden. Statt eine gefixte Versio auszuliefern entschied ich mich MT zu entfernen da:

  • MT einige statistische Tests nicht besteht.
  • MT langsammer ist als die anderen Generatoren.
  • MT der einzige Generator war, der keine Unterstützung für parallele Verarbeitung mitbringt.

Daneben wurde noch std::random_device aus random von C++11 während der Initialisierung genutzt. Dies ist nun unnötig, da der initiale Zustand des default RNG über die Techniken von generateSeedVectors() bestimmt wird.

dqrng v0.0.5: Neue und aktualisierte RNGs

Eine neue Version des dqrng Pakets ist auf den CRAN Servern verfügbar. Vielen Dank an die CRAN Maintainer im Allgemeinen und Uwe Ligges im Besonderen für ihren Einsatz.

In dieser Version gibt es einen neuen Zufallszahlengenerator, der zusammen mit den Verteilungsfunktionen benutzt werden kann: Die 64 bit Version des Threefry Engines mit 20 Runden (Salmon et al., 2011 <doi:10.1145/2063384.2063405>, http://www.thesalmons.org/john/random123/) aus dem sitmo Paket. Vielen Dank an James Balamuta für das Bereitstellen der C++11 Version von Threefry in seinem Paket.

Zusätzlich wurden die PCG-Header auf die neueste Version aktualisiert. Vielen Dank an Aaron Lun für die Erinnerung und den Hinweis auf zwei BioConductor-Pakete die dgrng nutzen: DropletUtils und scran.

Daneben gab es noch zwei technische Änderungen: Einerseits ist das Paket nun vorbereitet für die Zukunft, nachdem -DSTRICT_R_HEADERS in src/Makevars zu PKG_CPPFLAGS hinzugefügt wird.

Andererseits gibt es nun Unit-Tests für die C++ Schnittstelle. Zunächst hatte ich Catch probiert, nachdem ich bereits testthat nutze. Allerdings gefiel es mir nicht Testcode in die endgültige Bibliothek zu integrieren. Stattdessen gibt es nun C++ Dateien, die während des Tests durch Rcpp::sourceCpp() kompiliert und danach ausgeführt werden. Das ist zudem ein realistischerer Test der C++ Schnittstelle.

Eine kleine Essensumfrage

In diesem Beitrag geht es um ein kleines Seitenprojekt: Eine (nicht-repräsentative) Essensumfrage um einen Eindruck zu bekommen, welches Essen wie (un-)beliebt ist, ob Essvorlieben mit Reisezielen korrelieren, ob es verschiedene “Esstypen” gibt und vieles mehr.

Die Idee

Während des Mittags reden wir oft über Essen. Über verschiedene Geschmäcker, wie (un-)beliebt bestimmte Essen sind und ob es vielleicht verschiedene Esstypen gibt (Leute, die Lakritze mögen, essen ungern XY?). Um etwas Licht in diese Fragen zu bringen, weil wir keine zugänglichen Studien finden konnten, und mit allen Werkzeugen der Web-Entwicklung und Statistik im Handgepäck, entschlossen wir uns für ein Seitenprojekt.

Nun präsentieren wir eine kleine Essensumfrage! Da wir keine repräsentative Stichprobe auswählen, lassen sich die Ergebnisse nicht verallgemeinern. Die Ergebnisse sagen nur etwas über die teilnehmenden Personen aus, nicht über Deutschland, sicher nicht über die ganze Welt. Wir hoffen, dass die Ergebnisse uns und dir trotzdem Freude bereiten und einige interessante Zusammenhänge liefern.

Weitere Infos

Nachdem du dich durch drei mittelkurze Seiten mit Fragen geklickt hast, gibt es außerdem einige vorläufige Ergebnisse zu sehen und wie die Anderen im Vergleich zu dir geantwortet haben. Außerdem gilt selbstverständlich:

  • Alle Ergebnisse sind vollständig anonym und werden nicht kommerziell genutzt.
  • Über den Verlauf unserer kleinen Umfrage werden wir hier in diesem Blog-Beitrag informieren.
  • Wenn du die Umfrage weitergeben möchtest, bist du herzlich dazu eingeladen.

Wir freuen uns über Kommentare und Fragen. Viel Spaß!

dqsample: Eine faire Alternative zu ‚base::sample‘

Das Erzeugen von zufälligen Stichproben eines Datensatzes wird in der Statistik oder Data Science oft angewendet. Für diese Aufgabe gibt es in R die Funktion base::sample. Leider ist der dabei verwendete Algorithmus nicht vollständig fair. Dies wurde zuletzt auf R-devel diskutiert, was auch die Motivation für das dqsample Paket darstellt. Derzeit ist dqsample nicht auf CRAN, kann aber über drat installiert werden:

Beispiel

Wählt man viele Zahlen zufällig aus, so sollten die Dichten der geraden und ungerade Zahlen in etwa gleich und konstant sein. Mit base::sample ist dies jedoch nicht er Fall:

plot of chunk base

Oder mit verändertem Parameter:

plot of chunk base-oszi

Dieses spezielle Beispiel stammt von Duncan Murdoch.

Daniel Lemire (2018, <arXiv:1805.1094>) hat einen alternativen Algorithmus vorgeschlagen, der in dqsample verwendet wird. Mit diesem Algorithmus gibt es keine Asymmetrie zwischen geraden und ungeraden Zahlen:

plot of chunk dqsample

Ursachenforschung

Intern benötigt die base::sample() Funktion zufällige ganze Zahlen die gleichmäßig in dem halb-offenen Bereich [0, n) verteilt sind.Um diese zu erzeugen, verwendet R zufällige Gleitkommazahlen aus [0, 1), multipliziert mit n und schneidet den Nachkommateil ab. Mit reellen Zahlen im mathematischen Sinn wäre das korrekt. Aber das ist hier nicht der Fall.

Standardmäßig verwendet R einen 32 bit Mersenne-Twister zum Erzeugen von Zufallszahlen. Dieser erzeugt ganze Zahlen aus [0, 2^32), die durch 2^32geteilt werden um Gleitkommazahlen aus [0, 1) zu erhalten.Wenn wir das oben beschriebene Verfahren invertieren, so können wir sehen wie viele mögliche Zufallszahlen zu einem Ergebnis gehören.  Mit sample(6, 10, replace = TRUE) kann man zum Beispiel den Wurf von zehn Würfeln simulieren. Da 2^32 kein Vielfaches von sechs ist, kann die Verteilung aber nicht gleichverteilt sein:

Eins und vier haben eine minimal geringere Wahrscheinlichkeit als die übrigen Zahlen. Dieser Effekt steigt mit der Größe des Datensatzes, aus dem gewählt wird. Verwenden wir das oben definierte m so können wir sehen, woher die ungleiche Verteilung gerader und ungerader Zahlen herkommt:

Während jeweils zwei Zahlen auf eine der ungeraden Zahlen abgebildet werden, sind es drei Zahlen für jede gerade Zahl. Dieses Muster verschiebt sich bei der Hälfte der möglichen Ergebnisse, was das erste Bild oben erklärt. Das Muster verschiebt sich öfter, wenn man sich von m entfernt, was die Oszillationen im zweiten Bild erklärt. Irgendwann werden die Oszillationen zu schnell, um sie in der Dichte sehen zu können. Das bedeutet aber nicht, dass die Verteilung fair ist. Für m - 2^20verschiebt sich das Muster beispielsweise zwischen 982 und 983:

Vorher sind gerade Zahlen wahrscheinlicher als ungerade Zahlen. Danach ist es umgekehrt.

Zusammenfassung

Der von base::sample verwendet Algorithmus ist nicht fair, was zusammen mit großen Datenmengen einen merkbaren Effekt haben kann. Das dqsample Paket stellt für die wichtigsten Anwendungsfälle einen fairen Algorithmus bereit. Es kann als direkter Ersatz für base::sample verwendet werden.