Finding conjunctions in groups of interest on Facebook

I recently wanted to mine data from Facebook to find out how many people are liking in different groups of interest on Facebook. Let’s say you want to know how many people give likes to different political parties or different companies. The following blog post shows how to use the Rfacebook package, which provides an interface to the Facebook API, to find those conjunctions. I never encountered a limit for requests to the API, my biggest run with the script were about 12 hours. I mined 10 million likes from 73.000 posts in this time. For the reader interested in german politics: I used this script to find conjunctions between the political parties of the current parliament (+ a party called AfD) and right-wing extremists. You can find the (german) blog post here.

Get the pages

To get access to the API you need to register to the Facebook developer program and create a dummy application. Here you can find a very good tutorial on how to get R connected to Facebook including a workaround for recent changes Facebook made to the API. In this tutorial you are going to generate a token for authentication (fb_token). I would recommend to save this token so you can use it just by loading the file. I saved the token with save(fb_token, file = 'home/MyFolder'). Ok, so first let’s load the packages we need for the analysis and define our working directory.

For each group of interest I created a file in a folder which contains the URL’s for one group line wise. Make sure to use the top level domain of the sites which is usually: https://www.facebook.com/SiteName. In my project I wanted to check political parties in Germany and I decided to use the sites from all party associations of our federal states and the capitals of those states. That’s adding up to 32 sites for each party. In the next step we are defining this folder and load the above mentioned authentication token. Additionally we are defining the time span from which we want to collect the likes given to the posts of each page.

The Last step before we connect to facebook is to read the names of the sites from the URL’s in our files. In the next code chunk we are going through each file and each URL in this file and extract the name of the site. It also handles the encoding of german mutated vowels. Facebook adds an ID to names with those vowels to avoid them in the URL.

Get the post IDs and likes

So let’s start mining some data from Facebook! The next code chunk goes through each group and each site within this group and extracts all the posts of this site in the given time span. As you can see I limited the maximum number of posts in the getPage call to n = 1000. I’m also dumping the console output, because I wanted to have a simple status print out for each site. Since at this point I just want to look up who liked the posts I’m only extracting the IDs of the post. The rest of the post is dumped after that.

PagePosts contains the IDs now in the following form: Groups –> Sites –> PostIDs. I only wanted to find links between the complete groups, so I collapsed this list to Groups –> PostIDs with the following line:

With the IDs we can extract all the likes given to each post. For each like I’m going to extract the unique user ID of the person who liked the post. Again I’m dumping the console output and generate a custom message for each post.

For each group of sites PostLikes now contains all the ID’S of the users that liked a post in our previously defined time span. Currently those ID’s are stored in lists for each post. So we again have to collapse those lists to get all the ID’s for each group in one list per group. I’m also going to delete duplicate ID’s that occur in one group, because I want to find out if someone liked posts in more than one group and not how often. The remaining code in the next chunk calculates some aggregated values like the overall number of acquired posts.

Find the conjunctions

The last thing to do is to find the intersection between the groups. Who liked in more than one of the groups? To find that out I simply concatenate two groups and count duplicated ID’s. The result is a diagonal square matrix with the number of intersecting ID’s.

Plot the results

A very nice way to show the intersections between the groups are chord diagrams. The package chorddiag provides interactive D3 chord diagrams. The diagram under the next code chunk is the diagram I created for my project.

Please keep in mind that it is very hard to tell if the data gathered for a certain group is representative for this group. It really depends on how you collect the sites to represent the groups. Also there is certainly more stuff one could do with the collected data!

Sag mir, wer dich liked und ich sag dir, wer du bist

Eigentlich hatte ich nur nach einem Beispiel für ein kleines Coding-Project Projekt gesucht. Ich wollte mal schauen was die Facebook Graph-API so hergibt und wie viele Daten man über die Schnittstelle abgreifen kann. Daraus ist geworden, dass ich 10 Mio. Likes von offiziellen Beiträgen politischer Parteien und  rechtsradikalen Facebookseiten gemined habe. Als ich mir die Überschneidungen angeschaut habe, war mir klar, dass ich dem Ergebnis einen eigenen Blog-Post widme.

Die Situation

Die Welt hat sich verändert. Es ist etwas passiert, das viele von uns nicht für möglich gehalten haben: Die Welle des konservativen, nationalen und rechten Populismus ist auf dem Vormarsch. Plötzlich hört man die Menschen sagen, dass Angela Merkel für ihre Politik erhängt gehört und das man die Flüchtlingswelle dadurch erhöht, dass man in Seenot geratene Menschen rettet. Nicht einfach irgendwo, sondern in deinem unmittelbaren Umfeld.

Rechtspopulistische Meinungsbilder, mit denen man sich noch vor ein paar Jahren ins Abseits gestellt hätte, prasseln heute wie selbstverständlich auf uns ein. Wie oft habe ich schon Menschen sagen gehört: “Ich bin kein Rassist, aber …”. Das Bedürfnis der Menschen, unfassbar komplexe Zusammenhänge in einfache kleine Schächtelchen zu verpacken, in Kombination mit Hetzern, die sich genau das zunutze machen, resultiert in einer brandgefährlichen Mischung. Dabei geht es Deutschland doch gut! Die Wirtschaft boomt, die Arbeitslosenzahlen sind rekordverdächtig niedrig. Natürlich gibt es auch Missstände, an denen gearbeitet werden muss. Die gab es aber immer und die wird es auch immer geben. Was passiert, wenn wir wirklich mal vor Problemen stehen?

Das Schüren von Ängsten ist der Motor rechtspopulistischer Meinungsmache. Und genau das ist heute durch die Verbindung der Menschen durch soziale Netzwerke unglaublich einfach geworden. Dabei ist es vollkommen egal, ob eine Meldung stimmt oder nicht. Die persönliche Echokammer bestätigt deine Wahrnehmung und lässt keinen Raum für Zweifel oder kritisches Hinterfragen. Die Geschichte hat uns doch eindrücklich gezeigt, dass sich auch viele Menschen gemeinsam irren können. Populisten teilen erfundene Nachrichten, erfinden sie selbst, dramatisieren und überspitzen alles, was ihnen hilft, die Menschen aufzuhetzen. Die AfD hat immer wieder gezeigt, dass sie kein Problem hat, sich solcher Mittel zu bedienen. Sie haben eine perfide Systematik der Angstkommunikation entwickelt, bei der im schnellen Wechsel Ängste geschürt werden, um ihnen dann mit einfachen Lösungen entgegenzutreten.

Data Science

Ich beschäftige mich beruflich mit dem Fachgebiet Data Science, bei dem es darum geht, aus Daten Wissen zu extrahieren. Ironischerweise kommen genau aus diesem Fachgebiet auch die Algorithmen, die für Filterblasen und Echokammern in sozialen Netzwerken verantwortlich sind. Vor einiger Zeit hat mich der Hasskommentar eines Facebook Users dazu gebracht tief in seine ultra rechte Filterblase abzutauchen. Ich habe einen fürchterlichen Sumpf aus Propaganda und Hetze vorgefunden. Und eine interessante Tatsache: Immer wieder wurden mir auch Seiten der AfD vorgeschlagen.

Diese Vorschläge kommen zustande, wenn sich die Gruppe der likenden Menschen überschneidet. Mich hat brennend interessiert, wie groß diese Überschneidung ist. Zwar bestimmt die AfD natürlich nicht selbst, wer ihre Beiträge liked, aber eine große Überschneidung zwischen rechtsradikalen Seiten und offiziellen Seiten der AfD offenbart meiner Einschätzung zumindest eine inhaltliche Nähe.

Facebook bietet mit seiner sogenannten Graph API eine Schnittstelle an, mit der auf alle öffentlichen Daten zugegriffen werden kann. Ich habe also ein kleines Programm geschrieben, das sich durch Gruppen von Facebook-Seiten hangelt und dabei von allen Posts dieser Seiten extrahiert, wer sie geliked hat. Jeder von uns hat bei Facebook eine eindeutige ID, sodass einwandfrei feststellbar ist, auf welcher der gescannten Seiten jemand einen Beitrag geliked hat. Den wirklich nicht komplizierten Code des Programmes habe ich für jeden, den es interessiert, hier veröffentlicht. Die Süddeutsche Zeitung hat in einem ihrer Artikel untersucht, wie die AfD in der politischen Welt eingebettet ist. Dazu wurde eine sehr ähnliche Untersuchung wie diese hier mit politisch aktiven Personen durchgeführt, um zu zeigen, dass die AfD im parteipolitischen Spektrum isoliert dasteht. Mich hat eher die breite Masse derjenigen interessiert, die den Inhalten der AfD zustimmt, und wie stark sie wirklich mit der rechtsradikalen Szene zusammenhängt.

Die Analyse

Die Frage war also klar: Wie groß ist die Überschneidung derjenigen, die sowohl rechtsradikale Inhalte als auch die AfD liken? Als Kontrollgruppe habe ich alle im heutigen Bundestag vertretenen Parteien hinzugenommen. Untersucht wurden pro Partei die Seiten aller Landesverbände und der Landeshauptstädte und die Seite der jeweiligen Bundespartei. Dazu etwa 120 Seiten aus der rechten Szene. Hier finden sich z.B. Seiten der NPD und der Identitären. Schaut euch die Seiten hier an, ich bin mir sicher, dass die große Mehrheit nichts mit dieser Gesinnung zu tun haben will. Nach etwa 15 Stunden hat das Programm von all diesen Seiten jeden Like aller Posts eines Jahres ermittelt. Insgesamt waren das knapp 73.000 Beiträge und etwa 10.000.000 Likes von ca. 1.000.000 unterschiedlichen Facebook Usern.

Die folgende Grafik zeigt die Anzahl der geposteten Beiträge aus dem Zeitraum von Mai 2016 bis Mai 2017. Die AfD hat in diesem Zeitraum über 13.000 Beiträge gepostet, während z.B. die Grünen in diesem Zeitraum nur knapp über 4.500 Beiträge gepostet haben. Auch bei der Anzahl der Likes, die ein Beitrag bekommt, ist die AfD weit vorne. So bekommt ein Beitrag der AfD im Durchschnitt fast die siebenfache Menge der Likes der Union. Die Größe der Kreise gibt an, von wie vielen Menschen diese Likes gegeben wurden. Aus dem Rahmen fällt hier die Union, deren Likes aus einer deutlich kleineren Gruppe von Menschen kommt als bei den anderen Parteien. Den größten Kreis hat auch hier die AfD. Die AfD und ihre Anhänger sind auf Facebook also um ein vielfaches aktiver als das gesamte restliche Parteienspektrum.

 

Die nächste Grafik visualisiert die Überschneidung zwischen den Parteien und nun auch der Gruppe der rechtsradikalen Seiten. Über den Umfang des Kreises sind alle Personen dargestellt, die erfasst wurden. Hat ein User z.B. Beiträge der Grünen und der SPD geliked, taucht er in der Verbindungslinie zwischen Grünen und SPD auf. Bei der Gruppe der rechtsradikalen Seiten ist eine Aufteilung in Landesverbänden und Hauptstädten nicht möglich, deswegen habe ich einfach alles gesammelt, was ich finden konnte. Nur aus diesem Grund ist der Gesamtanteil der rechtsradikalen im Diagramm so groß. Die Überschneidung von SPD, Union, Grünen und Linken mit den rechtsradikalen Seiten liegt zwischen 1 – 3%, der Anteil der AfD Gruppe liegt bei über 17%. Bei vorherigen Untersuchungen, bei denen ich mich nicht nur auf die offiziellen Landesverbände beschränkt habe, konnte ich Anteile über 40% ermitteln.

Auch wenn eine sehr große Anzahl von Likes und Personen erfasst wurde, hat diese Analyse keinen repräsentativen Anspruch. Auch ist fraglich, wie gut die ermittelten Daten die Parteibasis widerspiegeln. Eines ist jedoch klar: Ein so großer Unterschied und eine so große Zahl aus der AfD-Gruppe, die auch rechtsradikale Inhalte liken (ca. 120.000 Personen), ist enorm. Alle von euch, die die AfD wählen wollen, um zu protestieren, um gegen das Establishment zu sein oder weil sie die derzeitige Politik nicht gut finden, sollten sich überlegen, ob sie die AfD wirklich zusammen mit rechtsradikalen in unsere Parlamente bringen wollen.