Videre nørd i R

Nå. Jeg har høstet data fra Twitter ved hjælp af Python.
Og jeg har visualiseret ved hjælp af Googles visualiserings API. Lækkert.
Jeg har endda fundet ud af kombinere det basale forespørgsels sprog i samme API med Highcharts, så jeg kan lave
live-visualiseringer. Der er lidt der skal pusles med endnu før jeg vil vise det frem. Og det giver også mest
mening i et eksempel hvor der opsamles live-data.

Men kan jeg også visualisere i R? Det er jo også et nyttigt værktøj, som jeg skal lære at kende.

Vi starter med at exportere data i CSV-formatet fra Google spreadsheet.
Dernæst importerer jeg det i R:

twitterdata <- read.csv(file="C:\\Users\\mrk718\\Desktop\\twitterdata.csv",head=FALSE, sep = ",")

Der er dobbelt backslashs fordi backslash bruges til at escape tegn med i R. Derfor skal backslash escapes med et
backslash. \\.
Jeg har ikke kolonneoverskrifter i regnearket. Det skal der nok være fremadrettet, da det gør det lettere at opstarte
en ny dataindsamling. Men derfor: head=FALSE. Og det er komma-separeret, så sep=",".

Så er det inde. Der kan let laves et plot af punkterne.

plot(twitterdata$V1,twitterdata$V2)

Kedeligt plot. primært fordi datoerne ikke er der, så de står som et eller andet i 12.

Efter en hurtig googling af hvordan man konverterer sådan et timestamp til en dato:

plot(as.POSIXct(twitterdata$V1, origin = "1970-01-01" ), twitterdata$V2)

Nu står der mindre, men stadig mærkelig datoer i X-aksen. 48138, 48140 osv.

Men hov! Mon ikke as.POSIXct tager udgangspunkt i UNIX-tidsstempler?
Javascript bruger millisekunder, UNIX nøjes med sekunder.

plot(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" ), twitterdata$V2)

Meget bedre. Nu står der godt nok "to" og "fr" på X-aksen. Det passer, men er ikke helt optimalt. I det mindste
har R her styr på at vi er i Danmark, og finder selv ud af at torsdag skal forkortes til to.

Navngivningen af x-aksen er heller ikke helt optimal. Der står

as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" 

Y-aksen er ikke meget bedre.
plot(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" ), twitterdata$V2, xlab = "Tid", ylab = "Antal")

Hep, xlab="hvad jeg vil kalde min x-akse"

Så ylab = "Antal"

type = "l", og jeg har et line-plot. Ikke de pæne splines fra mine tidligere visualiseringer, men vi nærmer os.

Så tilføjer vi format="%d-%m %H:%M:%S" til POSIXct delen:

plot(as.Date(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01", format="%d-%m %H:%M:%S" )), twitterdata$V2, xlab = "Tid", ylab = "Antal")

Og så crasher det... Jeg får at vide at "need finite 'xlim' values". der er nok noget der har vanskeligt ved at
håndtere max og min af datoer...

Hm. Jeg kunne sagtens får "to" og "fr" på akserne. Men så snart jeg begynder at formattere det - så går det galt. hvorfor mon det.

Google viz 2


lorem ipsum

Det er formentlig den her vi skal have fat på. var formatter = new google.visualization.PatternFormat( '{0}' ); formatter.format(data, [0]);

Google visualiseringstest.

OK. Vi kom et stykke ad vejen. Der er lang vej igen.

  1. Pythonscriptet skal gøres mere robust overfor netudfald. Også gerne strømudfald.
  2. Setuppet skal kunne håndtere at jeg lige pludselig på arbejdet finder på at et hashtag skal følges og visualiseres. Uden at jeg skal hjem og kode først.
  3. Visualiseringerne skal generelt gøres lækrere.

Vi starter med 3.

Nu med klikbare navne! (åbner i enten ny fane eller vindue, afhængig af din browser opsætning)
Jeg har søreme også fået styr på problemerne med at wordpress gør grimme ting ved javascriptet. Der skal "blot" installeres et plugin (text control), der kan slå den automatiske karakterencoding fra.

Jeg har fået styr på farverne. Jeg har fået gjort navnene klikbare. Og så faldt jeg over at det her:

var formatter = new google.visualization.PatternFormat( '{0}' );
formatter.format(data, [0]);

ville kunne bruges til at gøre endnu mere avancerede ting med indholdet af de enkelte kolonner i datasættet.

Twitternetværk

Twitter er ikke specielt stort i Danmark. Men det er der dog. Det lader til primært at være brugt af politikere, der ønsker at kommunikere til journalister, journalister og andre kommmunikationsfolk der ønsker at kommunikere med andre journalister og kommunikationsfolk. Og bibliotekarer, der desperat forsøger at kommunikere med hvem som helst. Det er i høj grad ikke et folkeligt medie, men snarere det LinkedIn godt ville være.

Ønsker man en faglig selvpromovering kan det derfor, specielt når man er i biblioteksbranchen, være en rigtig god ide at være på Twitter. Så det er jeg. Det er sat i system. Jeg sætter tid af hver weekend til kvidren – de lagres i tweetdeck, og spredes ud over ugen, og hver mandag går jeg lige efter og sikrer mig at jeg har til resten af ugen. Dertil kommer en række løse tweets i løbet af ugen. Men der kvidres hver dag.

Jeg går også semiseriøst efter flere følgere. Der er optimeringspotentialer: Hvem fulgte jeg hvornår, og hvis de ikke har fulgt tilbage, var det så ikke på tide at affølge dem. Hvem har unfollowed mig i dag? Skal jeg blive ved at følge dem? Og så videre. Jeg trækker ved hjælp af et pythonscript på en Raspberry Pi oplysninger om hvor mange følgere jeg har en gang i timen, og trækker de samme oplysninger på et antal kolleger i branchen. Skal jeg udbygge det netværk til noget der kan bruges (og det kan det!) i mit arbejde, skal jeg have et synligt mål og kunne følge udviklingen. Jeg skal have flere følgere end Knut – ikke fordi jeg konkurrerer med ham, men fordi jeg skal have et mål, gerne et der bevæger sig lidt (men ikke for meget) , som jeg kan gå efter.

Så langt så godt, der har været andre indlæg der har omtalt det. De burde opdateres, for jeg har omsider fået adgang til Twitters API, og kan nu trække data langt hurtigere, elegantere og legalt, end jeg kunne før.

Men det virker, og selvom jeg skal have migreret et script til python3.4, er det ikke noget der haster.

Så ud over de mindre potentielle indsatsområder, så er der en anden ting der kunne være interessant. Også for andre end mig. Nemlig: Hvordan ser netværkene ud? Hvordan er de danske bibliotekarer forbundet på dette, i en dansk kontekst trods alt relativt begrænsede økosystem?

Der er nogle trin på vejen. Nogen af dem har jeg styr på.

Jeg skal bruge oplysninger om hvem der følger hvem. Lad os bare nøjes med Knut og mig. Hvem følger mig? Hvem følger Knut? Hvem følger vi hver især? Er der nogen vi begge følger? Hvor er de gensidige forbindelser?

Det er trivielt. Der er lidt udfordringer i at jeg ikke kan trække mere end 200 følgere ad gangen, og at jeg ikke kan gøre det mere end en gang i minuttet. Det er der veje uden om.

Hvad jeg har lidt flere problemer med, er at få styr på hvordan jeg vil visualisere det. Der er fine frameworks derude. Det ender nok med D3 til det her formål, den kan også lave fine animationer. Traditionelt gøres den slags med bobler, og det er vel oplagt at min bobbel i grafen har en størrelse der er proportional med det antal følgere jeg har. Derfor vil Knuts også være større.

Så har jeg nogen der følger mig, uden at jeg følger dem. Der skal være en linie af en eller anden art mellem deres bobbel, og min bobbel. Det betyder også at jeg skal have en ide om hvor stor deres bobbel er – jeg skal have trukket oplysninger om hvor mange følgere de har.

Så er der dem som jeg følger, og som også følger mig. der skal også være en linie af en art mellem os.

Endelig er der dem jeg følger, som ikke følger mig. Der skal ligeledes være en linie.

Boblerne er simple. Eller, det er de nok ikke, men det er ikke det jeg har svært ved at folde hjernen om. Det der udfordrer mig er linierne (eller kanterne) i netværket. Der er tre typer. Hvordan skelner jeg mellem dem?

Farver? Det ender det nok med.

Man kunne også overveje om det kunne gøres enklere. Der findes værktøjer derude til den slags. Twecoll for at være mere præcis.

Well. D3. Farver på de forskellige kanter. Så skal der trækkes data. I et eksempel jeg har fundet, tager D3 en JSON fil, med nodes og links. Disse nodes har en source og et target. Det giver god mening for alle andre end de links der er gensidige.

Jeg tager lige et kig på denne her: http://bl.ocks.org/mbostock/4062045

Det er en lidt kølig visualisering af hvilke karakterer der optræder sammen i Les Miserables. Selve koden tror jeg at jeg starter med at kopiere. Så skal jeg generere en JSON-fil. Den har en source et target og en value i link-delen. Hvad der forvirrer mig er, at dens nodes liste har navne og “gruppe”. Gruppe kan man lege med. Men der er ikke et ID der matcher source i links. Der lader det til at være således, at ID’erne matcher positionen i listen i nodes. Hm. Jeg ville klart foretrække at ID’et var et sted i Nodes. Det skal jeg nok tænke lidt mere over.

Rambling on. Vi gør det som D3 vil ha’ det. Så skal jeg bare have det genereret.

Jeg har en liste i json-formatet med de enkelte nodes. De har et navn. Og kan have andre atributter også. I det eksempel jeg tager udgangspunkt i, har de en gruppe. Og det er det. Jeg skal bruge deres index i en liste. Så det første jeg skal er at få genereret den. Jeg trækker alle som følger Knut. Og alle som følger mig. Det giver to lister med twitter-id. Dem gemmer vi i hver sin fil. Hvert eneste ID i den liste er karakteriseret af at de følger Knut eller mig.

Det ville altså være lettere hvis jeg kunne bruge twitter-ID direkte. Det sparer et opslag i node-listen hver gang.

Og det kan man: http://plnkr.co/edit/20t4F02vsM1U55ktCv66?p=preview

Også:

http://stackoverflow.com/questions/23986466/d3-force-layout-linking-nodes-by-name-instead-of-index

Godt. Så vender vi tilbage til at generere listen over edges… Helt så trivielt er det heller ikke.

Følgere



endnu et forsøg med highcharts


Timer pr uge version 2016




Timer om ugen




Visualisering af diverse data

Nørd-nørd-nørd. Og den mere detaljerede beskrivelse er, af hensyn til min faglige selvpromovering, publiceret andetsteds. Så her napper vi bare en gauge på noget data der ligger i et Google Spreadsheet. Mest for lissom at have det liggende så jeg kan finde koden igen.




tea