Wie kann man Trends und Flops in der IT-Industrie analysieren? Diese Frage ist der Aufhänger für mein kleines Data-Science Hobby-Projekt. Um sie zu beantworten habe ich einen großen Datensatz von Marktdaten von der *Freelancermap* abgefragt. Mit über 2 Millionen Inseraten ist Freelancermap seit 15 Jahren die größten Plattformen für IT-Freiberufler im europäischen Raum. Mit diesen Daten lassen sich spannende Insights zum IT-Projektmarkt des letzten Jahrzehnts gewinnen. In diesem Artikeln erkläre ich, wie ich die Daten gesammelt und analysiert habe.
Das Leben und Arbeiten als Informatiker kann ich für mich wie folgt zusammenfassen: Du läufst stets den neusten Technologien und Trends hinterher. Einholen kann man sie nicht. Stattdessen versucht man den Abstand zu verkürzen, so gut es geht. Weit hinter einem näherst sich ein dritter Akteur: Legacy-Tools und -Technologien. Wenn du zu langsam läufst, wirst du irgendwann eingeholt.
Cutting Edge oder Legacy?
Gut, ich hatte im Studium genug Kontakt mit Cobol, Pascal und Delphi. Hin und wieder hatte ich auch viel Spaß dabei, mit der Borland-IDE schöne Oberflächen für meine Delphi-Anwendungen zu entwickeln. Aber ganz ehrlich, wer will sich heute noch freiwillig und tiefgründig mit Legacy-Sprachen beschäftigen?
Damit mich die Legacy-Falle nicht einholt, lese ich regelmäßig Blog-Posts oder schaue Videos zu aktuellen Web- und Infrastruktur-Themen. Das ist nach der Arbeitszeit ein unheimlicher Zeitaufwand. Diese Zeit würde ich ungern mit Technologien vergeuden, die sich in der IT-Landschaft nie durchsetzen. Stattdessen sucht man nach der hippen Cloud-Technologie oder dem neusten Web-Framework, was sich in den nächsten Jahren am Markt durchsetzt. Das ist natürlich nicht einfach. Einige Fragen stellten sich:
Glücklicherweise schrieb zu dem Zeitpunkt an meiner Diplomarbeit und lernte Plotly kennen, dass ich zur Visualisierung meiner Messdaten genutzt hatte. Meine Problemstellung zum IT-Markt lässt sich bestimmt auch mit Daten lösen!
Die Idee für mein kleines Freelancer-Mining-Projekt war geboren.
Zuerst dachte ich nicht daran, eine eigene Lösung für das Problem zu entwickeln. Stattdessen habe ich das Internet nach existierenden Lösungen zur IT-Trendanalyse durchkämmt. Dort habe einige Werkzeuge gefunden, die ich hier nicht vorenthalten möchte.
Etwa 220 Millionen Suchanfragen werden stündlich mit Google ausgeführt. Einige Insights zur relativen Anzahl der gesuchten Begriffe erhalten wir mit Google Trends. Dort kann man verschiedene Suchbegriffe vergleichen und erkennt, was die Menschen auf der Welt googeln. Die Statistiken sind spannend und man kann mit verschiedenen Suchbegriffen experimentieren.
Leider beantworten die Statistiken meine Fragestellung nicht. Kann man marktrelevante Technologien daran erkennen, wie oft sie gegoogelt werden? Sicherlich nicht. Anschaulich sieht man das an folgendem Beispiel mit JavaScript. Spätestens seit ihrem Durchbruch bei der Entwicklung im Backend mit NodeJS und Multiplattformapps, wächst die Verbreitung von JavaScript. Das zeigt sich in den Trend-Statistiken von Google jedoch nicht.
Ähnlich wie Google, bietet StackOverflow ebenfalls Trendstatistiken. Dabei kann man die Häufigkeit von Tags in Fragen vergleichen, die auf SO gepostet wurden. Das Problem mit den Statistiken ist, dass Technologien dominieren, die überproportional häufig in Fragen vorkommen. Das kann bedeuten, dass sie beliebt und gefragt sind. Es kann aber auch bedeuten, dass es viele Unklarheiten gibt oder die Dokumentation der Tools unzureichend ist. Eine richtige Aussage zur Marktrelevanz lässt sich nur bedingt ableiten.
Neben StackOverflow und Google Trends gibt es auch Unternehmen, die Marktforschung am IT-Markt betreiben. Allen voran gehört dazu Gartner mit strategischen Analysen zur Entwicklung verschiedener Bereiche in der IT-Landschaft. Auch Unternehmen wie Puppet veröffentlichen regelmäßige Reports. Im Fall von Puppet sind das jährliche DevOps-Berichte. Beide Berichte sind spannend und geben einen guten Marktüberblick.
TODO Mehr Text
Der gesamte IT-Markt ist unheimlich riesig und schwer zu definieren. Ihn vollständig zu analysieren und erfassen ist unmöglich. Als Informatiker interessiert mich vor allem die Nachfrage: Welche Kenntnisse und Technologien werden von Unternehmen nachgefragt? Plattformen wie Xing oder LinkedIn betrachte ich daher nicht, weil sie hauptsächlich die Angebotsseite für Arbeitnehmer repräsentieren. Mit über 200 Millionen Nutzern in Europa ist LinkedIn auch ziemlich groß für ein kleines Hobbyprojekt.
Nach einiger Zeit stoß ich auf Freelancermap. Mit über 2 Millionen Inseraten ist Freelancermap seit 15 Jahren die größten Plattformen für IT-Freiberufler im europäischen Raum. Die Plattform bot einige entscheidende Vorteile: Die Menge der Inserate ist groß genug, aber überschaubar. Freelancermap bietet genug historische Daten um den aktuellen, aber auch den historischen Markt zu betrachten. Wichtig für die Datenerfassung ist außerdem, dass alle Inserate ohne Anmeldung oder Registrierung, öffentlich abrufbar sind. Wäre das nicht gegeben, dürfte man die Daten nicht abfragen und erfassen. Werfen wir nun einen Blick auf die Daten, die wir erfassen können.
Inserate werden von Freelancermap mit einer ID getaggt. Schauen wir uns nun das Inserat mit der ID 2180060 an:
Das Inserat ist eine Stellenausschreibung für einen Cloud-Engineenier vom Personaldienstleister Hays AG (Den Rechtschreibfehler aus dem Inserat Engineenier habe ich bewusst nicht korrigiert). Anhand der Tags erkennt man, dass es sich wohl um eine Automatisierungslösung mit Microsoft Azure handelt. Die Stellenbeschreibung habe ich aufgrund des Urheberrechts nicht übernommen. Folgt dazu dem Link zum Inserat.
Neben der Jobbezeichnung, dem Beschreibungstext und der Tag-Liste gibt es einige Metadaten zum Anstellungsverhältnis. Das Einstellungsdatum ist besonders spannend, um Inserate historisch einzuordnen. Bei der Betrachtung des HTML-Markups viel zudem noch ein weiteres verstecktes Attribut auf:
<div id="project" itemscope itemtype="http://schema.org/JobPosting">
<meta itemprop="title" content="Data Engineenier-Cloud, Machine Learning (m/f/d)">
<meta itemprop="validThrough" content="2021-11-05">
<div class="project-details">
Das Attribute validThrough
gibt an, wie lange die Anzeige geschaltet wird. In diesem Fall ist die Anzeige bis zum 05.11.2021 aktiv. Das sind etwa 3 Monate.
Später, bei der Datenanalyse werden wir noch mehr zu den Attributen erfahren. Dazu müssen wir die Daten erstmal erfassen.
Frei nach dem Motto Learning by Doing entwickelte ich ein Python-Skript, dass die Attribute aus den Inseraten ausliest. Für das Parsen von HTML-Dateien bietet sich XPath mit Scrapy an. Da die IDs der Inserate aufsteigende Nummern sind, konnte ich in einer einfachen Zählschleife alle Inserate der von Freelancermap abfragen. Dazu habe ich mit folgendem URL-Schema alle Inserate, angefangen mit ID=0
abgefragt:
https://www.freelancermap.de/?module=projekt&func=show&ref=rss&id=<ID>
In der Theorie war es bis hierhin sehr einfach. In der Praxis sah das (wie so oft) anders aus.
Ich startete das Skript und saß gespannt vor meinem Bildschirm. Nachdem ich für 50 Inseraten etwa 3 Minuten vor dem Bildschirm saß, trat die erste Enttäuschung ein. Für alle 2 Millionen Einträge von Freelancermap müsste mein Skript weitere 119.997 Minuten laufen. Das sind 2.000 Stunden und damit über 80 Tage.
So geduldig war ich nicht. Kurzerhand habe ich mein Skript parallelisiert und auf 16 logischen Prozessorkernen zeitgleich ausführen lassen. Einige kleine Verbesserungen am Skript verkürzten die Ausführungszeit ebenfalls. Zufriedenheit stellte sich bei mir ein, als ich sah wie die ersten 1000 Inserate in 2 Minuten abgefragt wurden. Nach etwa 5000 weiteren Abfragen brach das Skript ab: IP-Ban 😱
Freelancermap erkannte natürlich, dass besonders viele Anfragen in kürzester Zeit von meiner IP-Adresse ausgingen. Vermutlich wurde mein Skript als DDoS-Angriff eingestuft. In meinem anfänglichen Enthusiasmus hatte ich mir darüber keine Gedanken gemacht. Nun hatte ich (notgedrungen) genug Zeit, um mein Vorgehen zu überarbeiten bis der Provider mir eine neue IP-Adresse zuteilt.
Zuerst musste ich einen Interessenkonflikt lösen: Einerseits möchte ich die Intervalle zwischen den Anfragen reduzieren um den Webserver weniger zu belasten und um nicht geblockt zu werden. Mit meinem Projekt möchte ich der Webseite nicht schaden. Andererseits wollte ich ungern drei Monate warten, bis die Daten gesammelt sind.
Ich entschied mich für einen dynamischen Ansatz und modifizierte mein Skript. Die Anfragen gelangen nun über Proxy-Server an die Plattform. Wenn der Webserver die Anfragen blockiert, reduziere ich das Abfrageintervall mit einem Sleep: time.sleep(wait_time)
. Danach wechselt das Skript den Proxy-Server und sendet weitere Anfragen mit dem reduzierten Intervall. Zusätzlich nutzte ich zufällige Timer, die das Skript kurze Zeit stoppen.
Die Änderungen haben sich gelohnt. Das Skript lief eine Wochen auf meinem Raspberry bis er am 26.04.2021 stoppte. Bis dahin hatte ich alle Inserate der Plattform in einer SQLite-Datenbank gespeichert. Die Datenbank ist zu diesem Zeitpunkt überschaubare 4,4 GB groß.
In folgendem Diagram seht ihr die Anzahl der Inserate im Zeitverlauf seit 2006. Bereits auf dem ersten Blick wird deutlich, dass sich die Anzahl während der Corona-Pandemie im März 2020 halbiert hat. Auffallend ist außerdem, dass im Dezember durch die Weihnachtsfeiertage generell weniger Inserate erstellt werden. Eine Anomalie in den Daten die ich mir noch nicht erklären kann, ist die Zunahme der Einträge ab Mitte 2011.
Das Erstellen des Datensatzes ist erst der Anfang des Mining-Projektes.
Im nächsten Beitrag starten wir mit der Analyse des Datensatzes. Dabei validieren wir den Datensatz anhand einiger allgemeiner Problemstellungen. Wir werden einige spannende Insights zu der Plattform Freelancermap erhalten und unter anderem folgende Fragen beantworten: