Geo-soziale Netzwerke
Heinrich Berger | Maksymilian Feruga |
---|---|
RWTH Aachen University | RWTH Aachen University |
heinrich.berger@rwth-aachen.de | maksymilian.feruga@rwth-aachen.de |
Abstract
Für Unternehmen ist das Lokalisieren und anschließende Erreichen der besten Zielgruppen für ihr Produkt, eine der wichtigsten und schwierigsten Fragen zugleich. Um Communities zu finden, welche bestimmte Interessen (z.B. Fashion, Tech oder Sport etc.) haben kann man Beitragsanalysen auf Sozialen Netzwerken wie Instagram durchführen. Uns interessiert hierbei vor allem der Standort dieser Gruppen und wie die Verteilung von Präferenzen über verschiedene Länder bzw. Städte aussieht. Zu diesem Zweck benutzen wir Standortdaten von der Plattform Instagram. Jeder User wird durch einen Knoten auf einer Weltkarte dargestellt, wobei die jeweilige Farbe eines Knotens für ein bestimmtes Interesse steht.
Die Idee ist hierdurch visuelle Ballungen zu schaffen, welche das Entdecken solcher Interessengruppen vereinfachen. Tragen wir dies auf eine Weltkarte ein, können wir „Interessen-Communities“ entdecken. Ballungen dieser Art zu finden, kann helfen Marketingentscheidungen zu treffen, Trends zu entdecken und zu erkennen, wo es sich lohnt für bestimmte Produkte Werbung zu machen (z.B. Sportaccessoires, neueste Tech-Gadgets etc.). Für unsere Analyse schauen wir uns „Fashion“, „Tech“ und „Fitness“ assoziierte Hashtags auf Instagram an. Dabei beschränken wir uns jeweils auf die neusten Beiträge. Ziel ist es einen „Instagram-Bot“ zu bauen, welcher uns für einen Interessen-Hashtag (bspw. „fashion“) die letzten 1000 – 5000 Postings zurückgibt. Wir schreiben den Bot in Python, mithilfe der open-source Bibliothek „instaloader“. Die anschließende Darstellung auf Karten wird mithilfe von geopandas und geoplot umgesetzt.
Inhaltsverzeichnis
1. Einleitung
Um ein Produkt verkaufen zu können, braucht es Menschen, die es kaufen möchten. Nahrungsmittel, Klamotten, Werkzeuge, aber auch Veranstaltungen und Bildung können Produkte sein. Dabei ist es wichtig zu wissen, wer, wo, wann, was braucht. Beispielsweise macht es deutlich mehr Sinn, Wasser in der Wüste zu verkaufen als an einem sauberen Fluss. Bei Wasser mag dies klar sein, bei abstrakteren Produkten wie Designerklamotten ist es meist etwas schwerer. In den letzten Jahrzenten gingen Unternehmen deswegen bei solchen Gütern meist den entgegengesetzten Weg. Statt Kunden gezielt anzusprechen, wurden Einkaufsstraßen gebaut und Kaufhäuser eingerichtet, wo alles zu finden ist was sich lohnt zu verkaufen. Wer etwas gesucht hat, konnte also an einen zentralen Ort gehen und fand dort meist was er gesucht hat. Dieser Trend geht in den letzten Jahren dank Online-Shops, oder großen Plattformen wie Amazon und co. stark zurück.
Heutzutage gibt es für fast jede Nische eine spezifische Webadresse, auf der man genau das findet, was man sucht. Das hat Vor- und Nachteile. Auf der einen Seite finden potenzielle Käufer wirklich genau das, was sie sich wünschen, auf der anderen Seite müssen Verkäufer immer mehr um die Aufmerksamkeit und Gunst der Kunden kämpfen. Jedoch haben sich fast zeitgleich mit der rasanten Etablierung von Online-Shops, auch die Marketing-Strategien verändert.
„Half the money I spend on advertising is wasted; the trouble is, I don’t know which half. “ - John Wanamaker
So kann man beispielsweise auf Plakatwerbung setzen, welche zwar eine hohe Reichweite hat (Anzahl an Menschen, die mit der Werbung konfrontiert werden), aber ebenfalls eine hohe Variabilität besitzt (Menschen mit verschiedenen Interessen), was zur Folge hat das oft mehr als die Hälfte der konfrontierten Menschen allgemein kein Interesse an dem beworbenen Produkt haben.
Mit dem Aufkommen von Sozialen-Netzwerken und dem damit einhergehenden gigantischen Datenvorrat der dahinterstehenden Unternehmen, ist es möglich geworden Zielgruppen exakt anzusprechen. Will man also beispielsweise ein T-Shirt verkaufen, auf dem ein Informatiker Witz steht, macht es wahrscheinlich Sinn, Werbung für dieses Shirt an Informatiker zu richten. Mit Plattformen wie Facebook, Instagram oder Twitter, kann man auf den Plattformen selbst genauso solch zielgerichtete Werbung schalten. Was jedoch, wenn man trotz Online Shops, jetzt doch einen Laden aufmachen wollen würde, der nur T-Shirts für Informatiker verkauft? Wo würde man diesen aufmachen? Oder wo würde man eine Party für Informatiker schmeißen?
Mit dieser Frage beschäftigen wir uns in dieser Arbeit. Bei Informatikern könnte man beispielsweise davon ausgehen, dass in großen Universitätsstädten mit technischen Hochschulen, größere Ballungen herrschen als in solchen mit geistes-wissenschaftlichen Universitäten. Mit unserem Bot wollen wir aus Unwissenheit, Gewissheit machen. Neben der Entdeckung von neuen Geschäfts-Standorten weltweit, kann unser Analysetool dabei helfen, Künstlern die Wahl von Konzertstandorten zu vereinfachen, neue Markenbotschafter (Influencer) für Unternehmen zu entdecken, Ausstellungsorte festzulegen, oder auch Online-Shops Hilfestellungen bei der Wahl von standortbasierte Online-Werbung zu geben.
2. VERWANDTE ARBEITEN
Da es sich bei unserer Arbeit um das Erstellen eines Analysetools handelt, zur Entdeckung von standort-basierten Interessen-Gruppen, haben wir uns hauptsächlich von bereits vorhandenen kommerziellen Analysetools und Bots inspirieren lassen. Da diese kommerziellen Bots/Tools jedoch kein Paper veröffentlicht haben, geschweige denn Einblick in ihren Code geben, haben wir alles von der Pike auf selbst geschrieben. Den initialen Funken für die Idee hat jedoch das Paper: „Filtering Instagram Hashtags through Crowdtagging and the HITS Algorithm” von Stamatios Giannoulakis und Nicolas Tsapatsoulis, über das Erkennen von relevanten Hashtags für ein gepostetes Bild auf Instagram gegeben.
3. METHODIK
Unsere Arbeit wurde in der Programmiersprache Python geschrieben, wobei wir vorzugsweise die IDE Jupyter Notebook verwendet haben. Für die Erstellung der anschließend erklärten Funktionen, benutzen wir die Python-Bibliotheken auf Figur 0.
Fig. 0: Verwendete Python-Bibliotheken.
Um Interessengruppen finden zu können, müssen wir erst einmal sinnvolle Daten finden. Zu diesem Zweck haben wir mithilfe der open-source Bibliothek instaloader, eine Scrape-Funktion namens \(postScraper(keyword,limit)\) geschrieben. Diese ermöglicht es uns für einen/mehrere spezifische/n Hashtag/s, die Standortdaten der letzten \(n\) Beitrage zusammenzutragen, zum Zeitpunkt der Anfrage. Zusätzlich speichern wir zu jedem Beitrag weitere Meta-Daten, wie den jeweiligen Username, die Anzahl der Likes, Kommentare, Follower und Anzahl der Hashtags. Mit diesen könnte man gegebenenfalls auch noch eine erweiterte Analyse durchführen, worauf wir im folgenden jedoch keinen großen Fokus legen.
Der Parameter \(keyword\) ist ein String Array und enthält die zu scrapenden Hashtags/Interessen. Das Limit \(n\) kann man selbst festlegen, mithilfe des Parameters \(limit\). Dabei speichern wir die Daten in einen Dataframe (Tabelle) der Bibliothek pandas und exportieren diesen anschließend in eine csv-Datei.
Fig. 1: Funktion zum scrapen der beschriebenen Datensätze.
Fig. 2: Beispiel Datensatz nach erfolgreichem Scrape für den hashtag „fashion“.
Das Ergebnis ist eine Tabelle mit \(n\) Reihen und \(7 + AZDH\) Spalten, wobei \(AZDH = Anzahl der Hashtags\) und 7 der vorgegebenen Anzahl von zusätzlichen Meta-Daten, inklusive der Standortdaten entspricht.
Anschließend „reinigen“ wir den erstellten Datensatz mit einer weiteren Funktion \(clearDataSet(path,filename)\). In dieser suchen wir uns nur solche Beiträge aus, welche auch einen Standort angegeben haben (wir entfernen also alle Zeilen \(i\), für die \(x_{ij}) = None\)). Danach wählen wir nur solche Standorte aus, die eine Stadt/Region und ein Land angegeben haben. Zur Unterscheidung helfen hier Standorte die ein Komma enthalten, da Instagram keine Fantasie- bzw. Unternehmensstandorte (beispielsweise ein Restaurant) mit Komma erlaubt. Anschließend sortieren wir alle Postings alphabetisch, aufsteigend nach Standort. Dies ermöglicht es uns schon in der Tabelle mögliche Ballungen zu erkennen. Der Paramter \(path\) gibt den Pfad zum erstellten Datensatz an. \(Filename\) gibt den Dateinamen des neu zurückgegebenen, „gereinigten“ Datensatzes als .csv Datei an.
Fig. 3: Funktion zum „reinigen“ eines gescrapten Datensatzes.
Fig 4.: Beispiel Datensatz nach erfolgreichem „reinigen“ von „fashion“ Datensatz.
Nachdem wir jetzt also unseren gereinigten Datensatz erlangt haben, wollen wir die erlangten Standorte auf eine Karte zeichnen. Dabei ist das Hauptziel, auf einer Weltkarte die Verteilung von Postings erkennen zu können. Anschließend kann man verschiedene Interessen mit verschiedenen Farben kenntlich machen.
Standortdaten der Form: \(„Stadt,Land“\), werden von den meisten gängigen Geo-Bibliotheken nicht verstanden und können daher nicht zur korrekten Lokalisierung unserer Beiträge verwendet werden. Was man stattdessen braucht, sind Breiten – und Längengrade (latitudinal , longitudinal). Wir benutzen die Python Bibliothek \(geopandas\), welche Datensätze in der Form von \(GeoDataFrames\) (sehr ähnlich zu Dataframes in pandas) bearbeitet. „Geometrische Daten“ für zweidimensionale Karten werden dabei in der Datenstruktur eines \(POINT(x,y)\) dargestellt, wobei x und y jeweils den Breiten- und Längengrad darstellen. \(POINT\) ist eine geopandas interne Datenstruktur, welche die übergebenen x-Werte und y-Werte auf den internen Karten darstellt.
Wir müssen also unsere Daten umwandeln. Dazu haben wir eine Funktion \(getLatLon(address)\) geschrieben, wobei der Parameter adress einen String der Form \(„Stadt,Land“\) übergeben bekommt. Innerhalb der Funktion machen wir mit dieser Adresse eine Anfrage an die openstreetmap \(nominatim\), welche uns den Breiten- und Längengrad zurückgibt, falls die Adresse existiert - sonst None.
Fig. 4: Funktion zum generieren der Breiten- und Längengrade.
Jetzt, wo wir die Standorte unser gescrapten Beiträge in einem geopandas lesbaren Format besitzen, können wir dazu übergehen die Beiträge auf einer Karte zu plotten. Mit der Funktion \(preProcessGeoDf(df)\) nehmen wir einem gereinigten Datensatz und geben einen GeoDataFrame zurück, der nur noch eine Spalte für die Adressen der Form \(„Stadt,Land“\) enthält, sowie eine Spalte mit den Breiten- und Längengraden, der Form \(POINT(x,y)\). Dabei bleiben die Reihen (und damit Beiträge) von der Formatierung unberührt.
Fig. 5: Finaler Datensatz mit nutzbaren Standortdaten.
Fig. 5: Funktion zum erstellen eines GeoDataFrame.
In diesem Fall verzichten wir darauf, die zusätzlich vorhandenen Meta-Daten die in unseren Datensätzen vorhanden sind weiterzuverarbeiten. Dies würde den Rahmen des Papers sprengen. Jedoch wird am Ende, im Ausblick, auf Möglichkeiten der Verwendung solcher Daten im Bezug auf die Standorte eingegangen. Hier beschränken wir uns wie gesagt auf die Darstellung der Standorte.
Final, können wir eine Weltkarte mit unseren gefundenen Standorten plotten.
Fig. 6: Code für das Plotten der finalen Daten.
Fig. 7: Beispiel von Beiträgen zum Zeitpunkt t, die mit dem Hastag „fashion“ auf Instagram gepostet wurden.
4. EXPERIMENTE, PROBLEME, RESULTATE UND DISKUSSION
Mit unserem Scraping-Tool haben wir am 16.01.2020 versucht, jeweils die letzten 5000 Beiträge zu den Hashtags: „fashion“, „tech“ und „fitness“ zu sammeln (Also insgesamt 15.000 Beiträge). Um Standortdaten abfragen zu können, muss man sich vorher mithilfe der Bibliothek (instaloader) in einen bereits vorhandenen Instagram Account einloggen. Für den ersten Durchlauf haben wir einen privaten Account benutzt. Wir haben schnell bemerkt, dass es sehr lange dauern würde, so viele Beiträge zu sammeln. Meistens wurde von der Bibliothek selbst eine Anfragenpause eingeleitet, um nicht von Instagram blockiert zu werden. Dies passierte im Durchschnitt meist nach 50-60 Beiträgen.
Fig. 8: Beispiel von Timeouts, bei Anfragen an Instagram.
Jedoch wurde sogar trotz Anfrage-Pause, der verwendete Account meist nach 200-400 Anfragen für eine Weile geblockt. Man musste sich neu einloggen, ein neues Passwort setzen und bestätigen, dass man kein Roboter ist. Nach weiteren Versuchen, wurde jede Anfrage mit Verifzierungsanfragen, oder BadResponseExceptions von Instagram’s Seite aus blockiert.
Fig. 8: BadResponseException nach 234 Anfragen.
Um trotzdem an genug Daten zu kommen, haben wir für jeden Durchlauf einen neuen Instagramaccount erstellt. Jedoch wurden diese Instagramaccounts, da sie keinerlei menschliche Interaktion besaßen, geschweige denn Verifizierungen, im Durchschnitt bereits nach 200 Anfragen blockiert. Um diese Accounts zu entsperren musste man Roboter-Tests machen, Mail-Adressen bestätigen und nicht bereits vergebene Telefonnummern angeben. Da wir nur im Besitz von zwei Mobil-Telefonnummern zu diesem Zeitpunkt waren, konnten wir also zwei mal verifizieren mithilfe von privaten Accounts und jeweils einmal zusätzliche Accounts einrichten.
Fig. 9: Verifizierungsanfrage von Instagram, nach Blockierung von Anfragen.
Am Ende waren wir in der Lage, 481 Beiträge zum Thema „fashion“, 363 Beiträge zum Thema „fitness“, sowie 242 Beiträge zum Thema „tech“ zu sammeln. Davon hatten 81 „fashion“-Beiträge, 55 „fittness“-Beiträge und 22 „tech“-Beiträge, nutzbare Breiten- und Längengrade, bei denen wir in der Lage waren, diese auf die Weltkarte zu plotten.
Die finale Verteilung kann man auf Figur 10 betrachten.
Fig. 10: Verteilung aller nutzbaren Beiträge auf einer Weltkarte.
Auch wenn die Anzahl der Daten offensichtlich ungenügend ist, um ernsthafte Schlüsse daraus zu ziehen, kann man mehrere Phänomene beobachten und neue Hypothesen erstellen, welche mit Hilfe von weiteren Daten bestätigt werden könnten. Zum einen, ist es auffällig, dass der Hashtag „tech“, vermehrt im amerikanischen Raum vorzufinden ist, vor allem in Nordamerika. Dies kann natürlich daran liegen, dass andere Länder das Wort „tech“ nicht verwenden und auf Wörter aus der eigenen Sprache zugreifen. Da jedoch auch die Wörter „fashion“ und „fitness“, englische Wörter sind und diese weltweit vorzufinden sind, kann man die Annahme treffen, dass dies bei „tech“ wahrscheinlich auch der Fall sein dürfte. Desweiteren gibt es eine Ballung für „fitness“ im europäischen und nord-amerikanischen Raum. Auffällig ist, dass Beiträge aus dem chinesischen, australischen, sowie russischem Raum gar nicht auftauchen. Wenn man bedenkt, dass diese Länder einen großen Teil der Weltbevölkerung ausmachen, erscheint dies als sehr unwahrscheinlich.
Gründe hierfür könnten Restriktionen in den gegebenen Ländern sein, jedoch auch die Voreinstellung der jeweils benutzten Instagramaccounts, welche genutzt wurden. Deutschen Accounts/IP-Adressen wird somit wahrscheinlicher europäischer-und amerikanischer content vorgeschlagen, als asiatischer oder afrikanischer content. Der einzige Hashtag, der eine größere Verteilung (im Bezug auf die Welt) zu besitzen scheint, ist „fashion“. Hier besitzen wir jedoch auch deutlich mehr Datenpunkte als für die anderen beiden Interessen.
5. ZUSAMMENFASSUNG & AUSBLICK
Grundsätzlich haben wir einen funktionierenden Instagram-„Scraper“ geschrieben, welcher uns - wie gewollt - Standortdaten zu gewünschten Interessen(hashtags) liefert. Der Code ist wiederverwendbar und die Ergebnisse reproduzierbar. Menschen die ähnliche Datensätze erstellen möchten, könnten unseren Code hierfür benutzen. Ebenso waren wir in der Lage die Standortdaten in geografische Breiten- und Längengrade umzuwandeln und diese auf einer Karte zu visualisieren. Ein Punkt an dem man jedoch wirklich noch arbeiten müsste, wäre das Problem der Fülle an Daten, die man in der Lage ist mithilfe unseres Programms zu erhalten. Ansätze hierhingehend wären folgende: man könnte versuchen mit VPN-Netzwerken seine IP-Adresse zu verschleiern, ebenso könnte man nach einer gewissen Zeit die Accounts wechseln, oder längere Pausen erzwingen. Die einfachste, jedoch zugleich aufwändigste Möglichkeit, wäre die offizielle Graph-API von Instagram zu verwenden. Hierfür braucht man jedoch zum einen einen professionellen Instagramaccount und muss Token bei der Plattform anfragen. Zusätzlich muss man in einem langen Prozess, der Firma Facebook erklären, zu welchem Zweck und wie man die Daten nutzen möchte. Desweiteren müsste man ein neues framework erlernen und mehrere Verifizierungsprozesse durchlaufen. Neben diesen Vorraussetzungen, wären auch noch kommerzielle Kosten entstanden, was den Rahmen dieses Proseminars gesprengt hätte. Eine weitere Unannehmlichkeit ist, dass man aktuell nicht erkennt, dass ein Punkt mehrmals vorkommt. So trat die Stadt New York beispielsweise 4-mal im „fashion“-Datensatz auf. Auf der Karte ist dies jedoch nicht zu erkennen. Eine Zahl innerhalb der Punkte
Grundsätzlich könnte man in Zukunft das Programm dahingehend ausbauen, die Meta-Daten die zusätzlich gesammelt wurden, genauer zu analysiesen. Man könnte die durschnittliche Anzahl von Likes pro Stadt/Land angeben, oder sogar für jeden einzelnen Beitrag Metadaten anzeigen, plus durchschnittliche Daten der dahinterstehenden User. Dies könnte dabei helfen, Influencer für eine Marke zu entdecken. Ebenso, wäre eine Karte auf der man interaktiv reinzoomen könnte, eventuell hilfreich um spezifischere Cluster zu entdecken. Um noch aussagekräftigere Daten zu bekommen, könnte man für jeden Beitrag die Follower des Users betrachten. Hier könnte man bei jedem User nach den selben Hashtags in Beiträgen suchen und dann gegebenenfalls eine Kante zwischen diesen ziehen. Man hätte also zusätzlich zu den Interessengruppen auch solche, die persönlich miteinander verknüpft sind.
6. REFERENZEN
I. Bi, Xiaoyan; Qiu, Tie; Qu, Wenyu; Zhao, Laiping; Zhou, Xiaobo; Wu, Dapeng Oliver (2020): Dynamically Transient Social Community Detection for Mobile Social Networks. w: IEEE Internet Things J., s. 1. DOI: 10.1109/JIOT.2020.3001309.
II. Giannoulakis, Stamatios; Tsapatsoulis, Nicolas (2019): Filtering Instagram Hashtags Through Crowdtagging and the HITS Algorithm. w: IEEE Trans. Comput. Soc. Syst. 6 (3), s. 592–603. DOI: 10.1109/TCSS.2019.2914080.
III. Kim, Jungeun; Lee, Jae-Gil; Lee, Byung Suk; Liu, Jiajun (2020): Geosocial Co-Clustering. w: ACM Trans. Intell. Syst. Technol. 11 (4), s. 1–26. DOI: 10.1145/3391708.
IV. Nguyen, Nam P.; Shen, Yilin; Dinh, Thang N.; Thai, My T. (2011): The evolution of overlapping communities in dynamic mobile networks. w: IEEE Transaction on Mobile Computing.
V. Ruan, Mengni; Zhou, Huan; Li, Dawei; Liu, Xuxun; Deng, Qingyong (2020): Detection of Temporal Communities in Mobile Social Networks, w: IEEE INFOCOM 2020 - IEEE Conference on Computer Communications Workshops (INFOCOM WKSHPS). IEEE INFOCOM 2020 - IEEE Conference on Computer Communications Workshops (INFOCOM WKSHPS). Toronto, ON, Canada, 7/6/2020 - 7/9/2020: IEEE, s. 1021–1026.
VI. Sammarco, Matteo; Campista, Miguel; Dias de Amorim, Marcelo (2015): Scalable Wireless Traffic Capture Through Community Detection and Trace Similarity. w: IEEE Trans. on Mobile Comput., s. 1. DOI: 10.1109/TMC.2015.2477809.