BrandnoozMining

Abstract

In diesem Artikel werde ich einige verschiedene Analysen über frei verfügbare Daten einer Social Community vornehmen. Es soll untersucht werden, ob und ggf. welche weiteren Informationen man aus den bereits vorhandenen Daten gewinnen kann.
Inspiriert ist das Ganze von einem großartigen 33c3 Talk namens SpiegelMining des Data Scientists David Kriesel.

Prolog

Ich bin seit geraumer Zeit Abonnent der sogenannten “Brandnooz Classic Box”. Dabei handelt es sich um eine art monatlich verschickte Wundertüte für den Preis von 12.99€, welche neue Produkte und Innovationen im Wert von >= 12.99€ enthält.

Da mein Bedarf an Essig nicht ganz dem entspricht was brandnooz für mich als angemessen ansieht, sah ich mich nach der letzten Box genötigt, einen Blick auf die sonst eher von mir vernachlässigte Webseite zu werfen. Begrüßt wird man mit einem den Newsletter bewerbenden Banner gefolgt von einem Popup für die “Freunde Werben” Funktion. Das passiert bei jedem Aufruf der Startseite.

Auf magische Art und Weise habe ich dann doch irgendwie die Rezensionen zur aktuellen Box gefunden und war sehr erfreut darüber, dass nicht nur ich absolut keinen Bedarf an Essig habe. Dabei ist mir dann auch die Communityfunktion der Webseite aufgefallen. Mit einem Klick auf den Benutzernamen des Rezensenten gelangt man auf dessen Profilseite, welche neben Nickname, Registrierungsdatum, Punktestand und was auch immer auch noch das Geburtsdatum enthält.

An diesem Punkt wurde ich dann sehr schnell sehr aufmerksam und sah mir erstmal mein eigenes Profil an.

© 2017 brandnooz Media GmbH (Andere Nutzerdaten wurden durch mich entfernt und durch Platzhalter ersetzt)

Guck an. Das Geburtsdatum ist öffentlich. Nein es gibt keinen Switch um das auszuschalten. Aber immerhin könnte man wenn es funktionieren würde seine Abzeichen für alle anderen Nutzer verstecken..
Nächster Schritt: Blick in die URL
brandnooz.de/user/999999999 (ID geändert)
Hm. Okay. Sag mal was gibts denn unter der 999999998?
Oh ein Benutzerprofil. Und unter der 999999997?

Ctrl+Shift+N (Neuer Privater Tab)
WTF. Das Profil ist noch immer selbst ohne Login inkl. Geburtsdatum einsehbar

Gut. Nächster Schritt erstmal schnell irgendeinen Müll dort eintragen, denn es ist ein Pflichtfeld………
Hm. Was nun? Richtig! Einen Crawler schreiben der mal eben über die NutzerIDs drüberiteriert und die Daten in eine Datenbank wirft.

Was für ne Datenbank? MongoDB. Warum? Webscale.
Und wozu? Big Data.

Auf dem 33c3 hielt David Kriesel einen äußerst interessanten Vortrag namens SpiegelMining. Dieser findet sich hier und ist auch für Menschen ohne engeren Kontakt zu IT äußerst interessant. Anschauen. Jetzt.
Inspiriert davon schauen wir mal was wir interessantes aus den Daten für Erkenntnisse gewinnen können. Wohlgemerkt frei für jedermann ohne Umgehung von Sicherheitsvorkehrungen verfügbare Daten.

Rechtliches

Strafgesetzbuch (StGB)
§ 202a Ausspähen von Daten

(1) Wer unbefugt sich oder einem anderen Zugang zu Daten, die nicht für ihn bestimmt und die gegen unberechtigten Zugang besonders gesichert sind, unter Überwindung der Zugangssicherung verschafft, wird mit Freiheitsstrafe bis zu drei Jahren oder mit Geldstrafe bestraft.
(2) Daten im Sinne des Absatzes 1 sind nur solche, die elektronisch, magnetisch oder sonst nicht unmittelbar wahrnehmbar gespeichert sind oder übermittelt werden.
  1. Unbefugt
    ✘ Nein, bin befugt denn ich bin Teil der Community
  2. Nicht für ihn Bestimmt
    ✘ Nein, sind für mich bestimmt denn ich bin Teil der Community
  3. Gegen unberechtigten Zugang gesichert
    ✘ Nein, ist alles öffentlich
  4. Unter Überwindung der Zugangssicherung
    ✘ Nein, es gibt keine Zugangssicherung

Der Crawler

Bei dem Crawler handelt es sich um eine schön aus den Beispielen der genutzten libraries zusammengepastete Anwendung in der besten Programmiersprache die diese Welt zu bieten hat.
Grässlich aber zweckdienlich. Das Javascript tut eigentlich nichts weiter als über die UserIDs zu iterieren, sich die relevanten Daten aus dem HTML irgendwie herauszupicken und diese in die MongoDB zu schmeißen.

Analyse

Es folgt die Analyse der verfügbaren Daten. Zum Einstieg etwas ganz simples.

Nutzerbasis

Insgesamt gibt es (stand 8.10. 17:30) 202.340 existierende Nutzerkonten von denen einige jedoch anonymisiert wurden. Die reale Zahl liegt also darunter. Von diesen existierenden Konten haben 28.754 einen Punktestand von unter 400, weshalb man vermuten könnte, dass diese Konten niemals verwendet wurden. Weiterhin haben nur 173.301 der Nutzer ein halbwegs plausibles Geburtsdatum.

Der Altersdurchschnitt liegt bei 37,8607 Jahren. Das jüngste und älteste Mitglied ist jeweils bzw. 116 Jahre alt. Nicht unbedingt plausible oder überhaupt aussagekräftige Werte. Also plotten wir das mal:
Deutlich besser. Jetzt wissen wir einiges über die Altersverteilung der Kundenbasis. Alle Werte > 100 habe ich in diesem Diagramm bewusst nicht plotten lassen.

Wie steht es eigentlich um das Unternehmen? Stagnation? Wachstum?
Zur Beantwortung dieser Frage schauen wir uns die Anzahl Neuanmeldungen pro Tag an und zeichnen um es leichter zu machen eine Trendlinie ein.
Schaut recht konstant aus. Wenn die bestehenden Kunden auch ihre Abos halten ist das wohl ein akzeptables Wachstum.

Auch ganz interessant:
72079 Nutzer haben eine Zahl am Ende des Nicknames.

Emails

Weiter gehts:

Wie viele Nutzer sind auf die Idee gekommen, ihre E-Mail Adresse auch als Nutzernamen zu verwenden?

$ db.getCollection('users').count({name: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ig})

Zu viele. 4.555 um genau zu sein. Glückwunsch, eure Adresse ist nun public hier nehmt doch noch etwas von diesem besonders günstigen Viagra.
Die Email Regex stammt natürlich nicht von mir sondern ist der erste Treffer auf Stackoverflow. :^)

Aktivität

Zur Langzeitmotivation™ werden vom System für verschiedene Aktivitäten innerhalb der Community Punkte vergeben. Die Menge der Aktivitäten setzt sich unter anderem sowohl aus Kommentaren und Rezensionen als auch dem einfachen Ansehen von Produktinformationen zusammen.
Der Graph sieht dem der Nutzerzahlen nach Alter recht ähnlich.

Karten

Neben den Geburtsdaten sind weiterhin auch die Wohnorte von 1.549 Nutzern der Webseite öffentlich. Wie? Nunja. Der Screenshot weiter oben war nicht ganz vollständig.

© 2017 brandnooz Media GmbH (Andere Nutzerdaten wurden durch mich entfernt und durch Platzhalter ersetzt)

Zu jedem “Noozie nach meinem Geschmack” ist neben der NutzerID auch der Wohnort verfügbar.
Somit ist der Wohnort von jedem Nutzer, der bei auch nur einem einzigen anderen Nutzer in den Vorschlägen auftaucht, öffentlich einsehbar. Hm.

Nächster Schritt also die Städtenamen mithilfe des Nominatim Service des OpenStreetMap Projekts geocoden sprich mit Längen- und Breitengrad versehen. Dann export, import in das freie Geoinformationssystem QGIS und heatmaps erstellen.

Zunächst eine Heatmap der Nutzerverteilung in Deutschland:

Kartenmaterial © OpenStreetMap contributors

Interessant hierbei ist, dass Saarbrücken stärker leuchtet als z.B. Göttingen.

Die zweite von mir erstellte Heatmap zeigt die Nutzeraktivität anhand der Punktzahl nach Region.

Kartenmaterial © OpenStreetMap contributors

Wir sehen eine leichte Verschiebung von den großen Städten weg. Ich nehme an, dass die Nutzerzahlen aufgrund der Bevölkerungsdichte in den Großstädten natürlich höher ist, die Aktivität sich aber nicht zwangsläufig ähnlich verhält.
Gerade auf dem Dorf ist man wohl eher gewillt mehr Zeit in so einer Social Community zu verbringen, denn sonst gibt es dort nicht unbedingt viel Entertainment. Wissenschaftliche Interpretation™

Schlusswort

Ja was nimmt man da jetzt draus mit?
Zunächst sollte mindestens mal ein Login vor die Profilansicht. Ebenfalls sollten persönliche Daten definitiv aus dem Profil ausblendbar sein.
Die wichtigste Lektion sollte jedoch sein, dass man generell keine erratbaren IDs nutzen sollte. UUIDs existieren. Man muss sie nur nutzen.

Dazu gabs einen in meinen Augen recht interessanten Einblick in den Kundenstamm der Firma und dazu einen Hauch von Informationen darüber wie sich das Unternehmen schlägt.
Theoretisch müsste man das ganze weiter verfolgen um aus der Entwicklung der Punktestände einzelner Nutzer raten zu können wie viele von ihnen tatsächlich aktiv sind. Daraus könnte man dann zum Beispiel äußerst grob versuchen abzuleiten wie viele der Kunden denn ihr Abo halten.
Praktisch ist es dann aber auch doch nicht so spannend und zudem möchte ich keine Geburtsdaten, Wohnorte und Emailadressen von fremden Menschen auf meinem Computer gespeichert haben.
Die Rohdaten sind dementsprechend nach /dev/null gewandert und was bleibt sind nur die hier festgehaltenen Auswertungen.
Datensparsamkeit™

In jedem Fall war es ein nettes Experiment was hoffentlich auch interessant zu lesen war 🙂

Zur zeitlichen Einordung
  1. Aufgefallen ist mir dieses Informationsleck am 7.10.
  2. Die Auswertung + der Artikel wurden dann am 8.10. geschrieben.
  3. Am 9.10. habe ich mich an Brandnooz gewandt das doch bitte fixen und nachgefragt ob sie OK damit sind wenn ich dazu diesen Text veröffentliche.
  4. Am 27.10. erhielt ich eine Antwort. Es sei gerade viel los, aber das Problem sei an die IT-Abteilung weitergegeben worden.
  5. Am 13.11. fragte ich mich was jetzt eigentlich los ist und prüfte, ob die Probleme weiterhin vorliegen.
    Erkenntnis:
    Das Geburtsdatum ist vom nun nicht mehr öffentlich einsehbaren Profil verschwunden.Eine Rückmeldung dazu gab es natürlich nicht. Warum auch.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.