InstaLOC – Sichtung und Abfragen bzgl. der „Themenweltdatenbank“

Für die Prüfung und auch „Eichung“ der erweiterten Datenquelle (hier: Tagsearch mit Ergänzung zu den Locations) wurde eine Themenweltdatenbank angelegt, welche auch durch aktuelles Zeitgeschehen inspiriert ist.

Der Scraper benötigte 20 Stunden für die Erfassung der Daten, wobei diese Zeit auf 2 Tage verteilt und eine Liste mit ca. 6000 „Spezialterms“ abgearbeitet wurde.

Datenbankstatistik:
Anz. Einträge: 1238290
Anz. Filter: 45
Anz. Tagsclouds: 1011505
Anz. Locations: 110648
Anz. Accounts: 553799
Anz. Posting/Zeitstempel: 806680
Dateigröße (Byte): 689319936

Beispielabfragen:
(1) select location, erstellzeit from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXXX%22′) and (location <> ’null‘);

Übersetzung:
Hole alle Locations und Erstellzeitpunkte (Zeitstempel) aus der Datenbank, wo die „tag like“ Bedingungen zutreffen und eine Location hinterlegt ist.
Ergebnisse:
771 Einträge

(2) select count(distinct(location)) from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXXX%22′) and (location <> ’null‘);
Übersetzung:
Hole Locations aus der Datenbank, wo die „tag like“ Bedingungen zutreffen und eine Location hinterlegt ist.
Ergebnisse:
99 Einträge (für count(distinct(location)),
Liste (PDF, Locations, für „select location“)
Liste (PDF, Erstellzeit + Location, für „select location, erstellzeit“)

(3) select count(username) from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXX%22‘);
Übersetzung:
Zähle die Accounts zusammen, wo in den Tagwolken die 2 abgefragten Terms vorkommen.
Ergebnisse:
3077 Einträge

Projekt „InstaLOC“ – Datenbankbefüllung auf Basis der Tagsuche

(1) Vorbereitung
Im ersten Schritt wird die Datenbank angelegt.

with sql_befehle do
begin
clear;
lines.Add('drop table if exists locations;');
lines.Add('CREATE TABLE `locations` (');
lines.Add(' `id` integer primary key AUTOINCREMENT,');
lines.Add('`url` varchar(400),');
lines.Add('`tag` varchar(2000),');
lines.Add('`likes` varchar(400),');
lines.Add('`comments` varchar(400),');
lines.Add('`erstellzeit` varchar(400),');
lines.Add('`post_id` varchar(1600),');
lines.Add('`username` varchar(400),');
lines.Add('`location` varchar(400),');
lines.Add('`filter` varchar(400),');
lines.Add('`pruefzeit` varchar(400)');
lines.Add(');');
lines.Add('vacuum;');
end;
fdquery3.ExecSQL(sql_befehle.text);

Die Datei umfasst folgende Spalten:
ID -> Nummerierung der Einträge (Zeilen)
URL -> erfasste Beitragsurl
Tag -> erfasste Tagwolke
Likes -> erfasste Likes als Zahl
Comments -> erfasste Comments als Zahl
Post_ID -> per Instagram vergebene Medien/Beitrags-ID
Username -> Username: Wer hat den Beitrag veröffentlicht?
Location -> Location des Beitrages, falls vom User freigegeben (GeoCode + Name)
Filter -> Fotofilter des veröffentlichten Beitrages
Erstellzeit -> Wann wurde der Beitrag veröffentlicht?
Pruefzeit -> Wann wurde der Beitrag vom Scraper erfasst UND in die Datenbank gespeichert?

(2) Scrapingvorgang
for lauf := strtoint(uebertrag.Text) to memo8.Lines.Count-1 do
begin
randomize;
token.Text:=token.Items[random(token.Items.Count-1)];
getmedia_db(locmedia,memo8.Lines[lauf],200);
end;

(3) Scrapingprozedur

procedure TForm1.getmedia_db(mytable: TStringGrid; tagsearch: string; rounds: integer);
var
JSONArray: tJSONArray;
JSONValue,jvalue: tJSONValue;
JSONPair: TJSONPair;
JSON, json_sub: TJSONObject;
size: integer;
j_array: tJSONArray;
s: string;
i,j: integer;
next_id: string;
zaehl: integer;
url,tag,likes,comments,post_id,username,location,filter,pruefzeit: widestring;
erstellzeit: string;
begin
sql_befehle.Clear;
memo3.Lines.Add('url => https://api.instagram.com/v1/tags/'+escape(tagsearch)+'/media/recent?access_token='+token.text);
try
debug.text:=idhttp1.Get('https://api.instagram.com/v1/tags/'+escape(tagsearch)+'/media/recent?access_token='+token.text);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
end;
for i := 0 to JSONArray.Size - 1 do
begin
url:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
tag:=escape(s);
memo7.Lines.Add(unescape(tag));
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
likes:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
comments:=s;
erstellzeit:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
erstellzeit:=datetimetostr(UnixToDateTime(strtoint(erstellzeit)));
post_id:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
username:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
location:=s;
filter:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
pruefzeit:=datetimetostr(now);
with sql_befehle.Lines do
begin
add('INSERT INTO `locations` (`url`, `tag`, `likes`, `comments`, `erstellzeit`, `post_id`, `username`, `location`, `filter`, `pruefzeit`) Values ('''+url+''', '''+tag+''', '''+likes+''', '''+comments+''', '''+erstellzeit+''', '''+post_id+''', '''+username+''', '''+location+''', '''+filter+''', '''+pruefzeit+''');');
end;
end;
fdquery3.ExecSQL(sql_befehle.text);
sql_befehle.Clear;
except
end;
if next_id<>'N/A' then
begin
repeat
// -> tiefenpruefung
if next_id='N/A' then
break;
delay(strtoint(frequenz1.Text));
try
debug.text:=idhttp1.Get(next_id);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
break;
end;
for i := 0 to JSONArray.Size - 1 do
begin
url:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
tag:=escape(s);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
likes:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
comments:=s;
erstellzeit:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
erstellzeit:=datetimetostr(UnixToDateTime(strtoint(erstellzeit)));
post_id:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
username:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
location:=s;
filter:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
pruefzeit:=datetimetostr(now);
with sql_befehle.Lines do
begin
add('INSERT INTO `locations` (`url`, `tag`, `likes`, `comments`, `erstellzeit`, `post_id`, `username`, `location`, `filter`, `pruefzeit`) Values ('''+url+''', '''+tag+''', '''+likes+''', '''+comments+''', '''+erstellzeit+''', '''+post_id+''', '''+username+''', '''+location+''', '''+filter+''', '''+pruefzeit+''');');
end;
end;
fdquery3.ExecSQL(sql_befehle.text);
sql_befehle.Clear;
except
break;
end;
// -> tiefenpruefung, ende
zaehl:=zaehl+1;
until zaehl=rounds;
end;
end;

Prozeduraufruf.

getmedia_db(locmedia,memo8.Lines[lauf],200);

Erklärung, Prozedurlogik:

Die Variable „locmedia“ ist für das Szenarium relativ uninteressant und wird aktiviert, wenn bspw. die gescrapten Daten in ein Stringgridobjekt zwecks Gegensichtung übergeben werden müssen. Die Variable „memo8.lines[X]“ beschreibt den Zwischenspeicherort der Tagliste(n), wobei „X“ oder „lauf“ die Position des Terms / Tags in der Liste beschreibt. Die Variable „200“ sagt aus, wie tief die Scrapingprozedur forschen soll. In dem Fall handelt es sich um 200×20 (-> 4000) Beiträge je Suchanfrage.

Projekt „InstaLoc“ – Wechsel der Datenscrapertechnologie

Nach diversen Gesprächen, Socialmediabeobachtungen usw. entschied ich mich zur festen Einbindung eines weiteren Datenscraperansatzes.
Dieser interpretiert nun die Stadt nicht als Konstruktion mit einer Grenze, sondern als „Gegend“ mit der Stadt als Mittelpunkt.

Konkrete Beispiele können sein:

Datenbank „Mainz“ -> Mainz + Wiesbaden
Datenbank „Apolda“ -> Apolda + Weimar + Jena + div. Dörfer (falls auslesbar)
Datenbank „Leipzig“ -> Leipzig + Halle + Merseburg

Der Testlauf zum Raum „Mainz“ ergab ca. 25.700 auslesbare Locations zu max. 2000 Beiträge und ein Datenerfassungsdurchlauf beansprucht etwas um die 24 Stunden.

Im Zuge der nächsten Updates werden weitere Erhebungsmethoden getestet und ggf. in die Prozeduren eingebaut.

Die massive Datenausweitung und das feinmaschig erfasste Locationnetz erlaubt nun (auch nach Rückmeldung der Kolleg_innen) die Beantwortung folgender Fragen:

(1) Wo befinden sich ansprechbare (!) Zielgruppen?
(2) Was machen die ansprechbaren Zielgruppen an welchen Orten (gez. durch die Tagwolken, Fotofilter, Emotionsäußerungen etc.)=
(3) Wie sind die Bewegungsstrecken von ansprechbaren Zielgruppen gestaltet? (Hotel->Bar, Hotel->Museum, FashionStore->Bar->Club usw.)
(4) …

Anwendungsszenarien der interpretierbaren Rohdaten / Analysedaten können auch sein:
(1) Genauere Auswahl von Plakatplätzen in Städten
(2) Genauere Auswahl und Briefings von Promotiontrupps (Flyerverteilungen, Werbegeschenkeverteilungen)
(3) div. politische Analysen, pol. Trendanalysen
(4) Trendanalysen in Bezug auf Orte und Ortsverbindungen für Auf- und Abbau v. lokalen Geschäften
(5) Konkurrenzanalysen auf Locationbasis (hier: Sprache und Interaktionen)
(6) Möglichkeiten: Verkauftrigger / Lead- und Saleunterstützungen
(7) Kundengruppen: Interessensschwerpunktanalyse- und reportings (Freizeitverhalten u.a.)

An der Stelle bedanke ich mich bei Georg Grohs, Dr. Klaus Holthausen / Andrea Fetzer (Roland Berger), Lars Heinemann, Mitossi und Dirk Schumann für die treibende und kreative Beurteilung des Projektes.

InstaLOC-Projekt, Freigabe der Version 0.10 Beta

Ich habe soeben die Freigabe für die Versionsnummer 0.10Beta erteilt. Die entsprechende Datei befindet sich in dem – intern geteilten – Dropboxordner und trägt den Namen „insta_loc_15082018_010Beta.zip“.

Bedienungsanleitungsvideos:
InstaLoc-Forschungsprojekt/Software (Basisfunktionen – Likes): https://youtu.be/CkZSVPC8KJY
InstaLoc-Forschungsprojekt/Software (Basisfunktionen – Accountebene): https://youtu.be/VXPzhanL-vw
InstaLoc-Forschungsprojekt/Software (Filter: Tagwolkenanalyse, Locations): https://youtu.be/qh2bowhnMbI
InstaLoc-Forschungsprojekt/Software (Tagwolkenanalyse, Locations): https://youtu.be/5aefOGaGy-o
InstaLoc-Forschungsprojekt/Software (Tagwolkenanalyse): https://youtu.be/Ey9B6Skm9Y4

Wir vergeben an 2 besondere und ausgewählte Kolleg_innen jeweils eine Kopie der Auswertungssoftware und sind offen für entsprechende Gespräche, Anfragen und Nachfragen.

Datenfreigabe 2_3 (Quelle: Postingelemente aus Instagram in Verbindung mit Locations)

URL: https://www.pontipix.de/datenbank_downloads/instaloc_clean.zip 

Hinweis (1): 

Die Datenbank ist gepackt 13GB und entpackt 41GB.

Sie umfasst nur einen Teil unseres Datenbestands und ich gab hier eine zufällig ausgewählte Datenmenge je erfassten Länder frei. Technisch wurde der Datenübertrag über einen Zufallsgenerator gelöst, wobei hier kein Themenschwerpunkt gesetzt wurde. 

Die Freigabe erfolgte unter der Bedingung: die Datenbank darf ausschließlich für Weiterbildung- u. Ausbildungszwecke genutzt werden und bei Publikation erwarte ich selbstverständlich eine Namensnennung inkl. Link auf https://www.pontipix.de/.

Hinweis (2):

Die Datenquelle ist Instagram via Instagram-API in der jeweils gültigen Fassung unter Beachtung der jeweils aktiven Richtlinien. 

Die DB-Tabelle beinhaltet folgende Spalten:

id, url, tags, likes, comments, erstellzeit, contentinfo, country, country_code, city, county, state_district, suburb, city_district, pub, cafe, hotel, college, town_hall, florist, arts_centre, public_building, hospital, sport_centre, swimming_pool, travel_agency, community_centre, playground, clinic, books, pedestrian, chemist, car_wash, fort, golf_course, theme_park, water, castle, picnic_site, pharmacy, fast_food, track, garden, locality, residental, adress29, wood, retail, town, industrial, cycleway, village, guest_house, artwork, bus_stop, bar, bakery, fuel, zoo, car, university, neigbourhood, viewpoint, bank, stadium, hairdresser, place_of_worship, beach, mall, school, memorial, attraction, supermarket, footway, restaurant, theatre, parking, clothes, hamlet, raceway, aerodome, library, museum, commercial, ruins, building, PLZ, road

#1 Abfragebeispiele -> Bezug auf Land / Stadt etc. 

select * from locations where country_code = ‚de‘; 

select * from locations where country_code = ‚de‘ and city = ‚Berlin‘; 

select * from locations where country_code = ‚de‘ and city = ‚München‘; 

select * from locations where country_code = ‚de‘ and state = ‚Sachsen‘; 

select distinct country_code from locations;

select distinct city from locations where country_code = ‚de‘;

#2 Abfagebeispiele -> Bezug auf Locationtypen

select * from locations where country_code = ‚de‘ and restaurant <> “; 

select * from locations where country_code = ‚fr‘ and restaurant <> “

select * from locations where country_code = ‚us‘ and school <> “; 

#3 Abfragebeispiele -> Bezug auf Inhalte

select * from locations where country_code = ‚de‘ and school <> “ and contentinfo like ‚%1 person%‘

select * from locations where country_code = ‚de‘ and contentinfo like ‚%1 person%‘

select distinct(contentinfo) from locations where country_code = ‚de‘;

select distinct(tags) from locations where country_code = ‚de‘ and city = ‚Leipzig‘;

Weitere Abfragevarianten ergeben sich aus der Tabellenstruktur, den Spalten und der konkreten Fragestellung. Denkbar sind Verbindungen zwischen Tags, Taggruppen, den Bildinhalten („Contentinfo“) und konkreten Ländern. 

Experiment: Revitalisierung einer alten Domain – Schwerpunkt: Fotografie, Kunst

In irgendeiner Diskussion genoss ich Tipps, Ausführungen und Diskussionen rund um Marketingautomatisierungsansätze und sonstigen „hochmodernen“ Buzzwords, wie Bigdata, Datadriven-Marketing und sogar auch Künstliche Intelligenzen. Wie erwartet: ich regte mich über inkompetente Betrachtungsweisen zu Algorithmus vs. Algorithmen auf und dachte mir zu dem Zeitpunkt, dass ich doch einmal die Zielgruppen- u. Marktanalysemechaniken der Wobus & Lehmann GbR gegen eines der Projekte laufen lassen könnte.

Hier die relevanten Ergebnisse „Trafficvolumina“.

Zur Erklärung: Sinn und Ziel einer datengetriebenen Markforschung ist und bleibt die Klärung der Frage: „Wer ist wann und wo und mit welchem Hintergrund für meine Informationen / Produkte / Dienstleistungen WIE ansprechbar?“. Diese obligatorischen Rechercheaufgaben kann man mit den üblichen Tools, mit Baugefühl und sog. „Erfahrung“ durchführen, oder eben über den Weg der Beobachtung(en) des öffentlichen Raums gehen. Wie das technisch funktioniert, habe ich auf diesem Blog einige Male erklärt. Hinweise sind InstaLOC, Interessensmatrixen oder eben Twitterloc. Daher: ich halte mich hier ein wenig zurück, weil ich kein Interesse an endlosen Wiederholungen habe. Ein Hinweis jedoch: die KWD u. WDF*IdF-Analyse auf usergenerierte Meinungsäußerungen (hier: Tweets, Postings auf Instagram usw. usf.) von zwischen 5 und 12 Mio aktiven Accounts aus DE / DACH erlaubt nun folgende Erkenntnisse zu:

  • Inhalte der zu generierenden Informationen / Beschreibungen.
  • Wording / Sprache der Zielgruppe(n)
  • Millieus der Zielgruppe(n) (liberal, links-liberal, grün, konservativ)
  • pot. Budget der Zielgruppe(n)
  • Postingzeitpunkt
  • ggf. Ortsbezug (interessant für Hyperlocal)
  • generell: Keywords nach typischen SEO-Gesichtspunkten

Mit den generierten Erkenntnissen lassen sich nun die typischen, bekannten und eingespielten Strategien hochfahren. Vorab: es wurden hier KEINE Artikel und KEINE Links eingekauft. Persönlich empfinde ich das Medium Kauf -> Artikel/Links als lächerlich, profan und untauglich für die Erwirtschaftung von nachhaltigen organischen Ergebnissen. Grundsätzlich verstehe ich nicht, warum die Suchmaschinenoptimierung / das organische (!) Internetmarketing auf der einen Seite Einkaufvarianten verteufelt und als Blackhat darstellt, aber auf der anderen Seite mit einem Lächeln auf den Lippen selbstverständlich Gastartikel und Links kauft. Für mich ist das keine relevante Kunst und erst recht kein Handwerk.

Nunja. Das Beispiel hier beweist, dass man auch auf spannenderen Wegen und deutlich kosteneffizienter Traffic und Reichweite erzeugen kann, WENN man denn das feine Zusammenspiel mit den Märkten und Zielgruppen versteht.

Hier die relevanten Ergebnisse zu den Konversionen:

Die Konversionen sind keine Konversionen, wie man sie von Webshops kennt. Nein: sie zielen auf bestimmte und gesondert beworbene Unterseiten ab. Das sind werthaltige Informationen, spezielle Downloads und Ankündigungen, die alle analog zu den Zielgruppenidentifikationen aufgebaut und beworben wurden.

Fazit:

  • Marketing, welches auf die Meinungsbekundungen mehrere Mio User:innen ausgerichtet ist, funktioniert perfekt.
  • Die Datenquellen Socialmedia, Trends und APIs liefern bessere Einblicke, als die üblichen Tools (Xovi, Sistrix & Co.).
  • KatalogSEO hat keine Zukunft

Fragen? Anmerkungen? Gerne privat oder in den Kommentaren!

Google-Trends, Auslesen: Update

https://trends.google.com/trends/api/widgetdata/multiline/csv?req={"time":"2019-01-27 2020-01-27","resolution":"WEEK","locale":"de","comparisonItem":[{"geo":{"country":"DE"},"complexKeywordsRestriction":{"keyword":[{"type":"BROAD","value":"hannes"}]}}],"requestOptions":{"property":"","backend":"IZG","category":0}}&token=[DeinToken]&tz=-60

Die URL lässt sich bei GTrends nach entsprechender Analyse des Downloads via G-Chrome -> Netzwerk nachvollziehen. Eine quasi-dynamische Generierung entsprechender URL-Listen via Quelle „Keywords“ ist möglich und ich denke heute über eine Integration in das InstaLOC-Reportingsystem nach.

Hinweis(e):

csv? -> json? entspricht dem Exportformatwechsel.

Mini-„Recap“ zur OTMR2019

Am 11. 10. besprach ich mit interessierten Teilnehmer_innen einige Aspekte der Arbeiten an den Datenbanksystemen rund um „InstaLoc2.0“.

Die Veranstaltung wurde von der sympathischen Kanzlei „Spirit Legal“ organisiert und meine anfängliche Skepsis (Inhalte, hoher Verkaufsdruck) wurde durch diverse Vorabgespräche und die Speakerliste beseitigt.

Aber nun zu den Eindrücken.

Die Veranstaltung startete mit einer Keynote von Glacier Kwong und hier wurde das interessierte Publikum über die aktuelle Situation in HongKong und Überwachungstendenzen seitens der staatlichen Obrigkeit(en) und Konzernen via Daten/BigData informiert. Obwohl die dargebotenen Informationen für mich (privat+geschäftlich) nicht neu waren, passte diese Keynote sehr gut. Der Grund ist: man muss permanent auch in der professionellen Benutzung und Verwertung der Plattformen auf die Gefahren des Mißbrauchs hinweisen.

Wegen meinem Interesse an u.a. konkreten Einsatzszenarien der Ergebnisse aus dem Feld der datengetriebenen Marktforschung schaute ich mir die Session von Petra Lukaschewski und Michael Benz an.

Michael Benz stellte in einem ca. 30 Minuten-Slot die Funktionsweise(n) und Logiken von „Whyapply“ vor. Es geht hierbei um eine besondere Form der Mitarbeiter_innen-Akquise via Einholen von groben Projektideen zwecks Vorabsichtung potentiell interessanter Köpfe. Soweit ich das System verstanden habe, veröffentlichen pot. Arbeitgeber_innen bei Whyapply eine besondere Form der Wettbewerbe um Ideen zur Lösung aktueller (Mini)probleme.

Petra Lukaschewski klärte das interessierte Publikum zum nachhaltigen Teamaufbau auf. Mich faszinierte hier, dass offensichtlich ein enormer Nachholebedarf beim Management konkreter Arbeits+Gehaltsverhandlungen existiert und die Gesprächspartner_innen gerade auch im Kampf um die besten Köpfe (offensichtlich) externe Hilfe zwingend notwendig eingekauft werden muss.

Ganz kurz schaute ich in den Vortrag von Dr. Jonas Kahl und Thomas Busch rein. Beide sprachen erstaunlich praxisnah über die Arbeit am Problem der Sperr- u. Löschpraxis von u.a. Tweets u. Twitteraccounts. Mir wurden hier einige Beispiele präsentiert und wir diskutierten auch über technische Muster und das Problem, dass engagierte Anwält_innen (leider) wenig Zugang zu uns Nerds haben. Vielleicht ergeben sich hier in den eventuellen Nachgesprächen weitere Kommunikationskanäle?

Fazit:

Wenn ich mir den üblichen Szene/Branche-Veranstaltungskatalog anschaue, sticht die OTMR durch den klaren Bezug auf einen richtigen Austausch von Expertenwissen hervor. Branchentypische Verkaufsgespräche entdeckte ich nicht und ich kann den Besuch dieser Veranstaltung definitiv empfehlen. Zielgruppen wären: Entscheidungsträger_innen aus sämtlichen Marketingsparten, Geschäftsführer_innen mit Bezug u./o. Entscheidungsbedarf rund um die Marketingstrategien und sämtliche Marketingdienstleister_innen inkl. Agenturen.

Ein Engagement bei der OTMR2020 ist für mich aktuell denkbar. :-)

SQLite: Distinct auf mehrere Spalten?

Im Laufe der Arbeiten am Konzept des Projektes „InstaLOC 2.0“ suchte ich nach einer Distinctausgabe über >1 Spalten. Konkret ging es hier um eine nachträgliche Ausgabe von Location-IDs zwecks Nachcrawling kompletter Länder.

Die Abfrage auf die Datenbankdatei „locplain_big.db“ lautet:

select distinct name, lat, long from locations where country_code = 'cn';

„cn“ lässt sich beliebig austauschen.