Fra SSB til SVG

I denne posten viser jeg hvordan du lager et fargerikt kart, som fargelegges med data fra data.ssb.no.

jupyter bare dukket opp. Jeg brukte Ipython tidligere, og har hatt et øye på utviklingen, men plutselig ble det like naturlig å skrive python i jupyter som noe annet sted. Hovedgrunnen tror jeg er fordi det er så interaktivt. Hver celle kan evalueres. Det er lett å «flytte ballen» framover, ved å sjekke at alt fungerer opp til punktet jeg jobber nå, og eksperimentere derfra. Det låner seg god til eksperimentell analyse, men også til å lære kode.

En annen ting jupyter gjør elegant er å vise fram datastrukturene. Pandas kanskje mer enn alt annet. Bilde under viser toppen av en dataframe, som hentet fram med df.head()

pandas dataframe i jupyter
pandas dataframe i jupyter

Andre strukturer er ikke like elegant, men som open source programvare, er det bare å utvide der du trenger. Det er det noen som har gjort med geografi. Jeg snubla over dette lille rammeverket chorogrid, som lager SVG-kart over USA, som kan farges av data du trenger å se som bilde. Canada og Europa-kartet kan chorogrid også tegne. Den kan gjøre statene om til firkanter, og heksagoner også. Dette er nyttig når areal og avstand ikke er viktig.

Chorogrid eksempler
Chorogrid eksempler

Så jeg brukte (alt for mye) tid på å legge til Norge i Chorogrid. Knota masse rundt og lærte nye ting (f.eks. måtte jeg legge til støtte for viewBox i SVG, som var tungt). Jeg fant ingen elegant måte å legge lat/long over i en grid som ser ut som Norgeskartet, selv om dette sikkert finnes. Jeg løste det ved å gjøre hver kommune om til en firkant, og deretter sortere de fra øst til vest og nord til sør. Så manuelt bygge opp noe som likner på Norge. Dermed ligger kommunene bare omtrent der de skal være, ikke perfekt. Gi meg en lyd om dette er noe du ønsker å fikse, så kan jeg peke. Versjonen som er ute nå har 426 kommuner, som er riktig antall kommuner just nå. Det sagt, så måtte jeg justere inn litt da det originale Norgeskartet som jeg bruker er fra wikipedia, og det hadde de 429 kommunene vi hadde for kun kort tid siden..

Inn og utflytting i kommune-Norge 2017K1.
Inn og utflytting i kommune-Norge 2017K1.

SSB på kartet

Bildet over viser et utsnitt av et kart der jeg henter data fra SSB (inn og utflytting av Norske kommuner første kvartal 2017), lager en metric for flytting gitt innbyggertall, slik at Oslo og Utsira (størst og minst i folketall) blir sammenliknbare, og plotter på firkant-Norgeskartet. Du finner en jupyter notatbok med hele leksa her.

Det er snart valg, da kan vi fargelegge med velgresultater :)
Det er snart kommunereform, da må hele kartet lages på nytt :/

Dopplrs farge-algoritme

At literatur er fargerikt er gitt. At enhver tekst også kan få sin egen, ufravikelige, farge i web-vennlige heksadesimalfarger var derimot en utenkt tanke i mitt hode. Fram til for en tid tilbake, da jeg snublet over optional.is som tok opp materiale (som nå er offline, lenken til optional.is funker dog) som Dopplr’s farge-algoritme.

Tanken er like enkel som den er genial:
$hex_color = sub-string(md5($original_string), 0, 6)
Ta en rekke bokstaver («Oslo», «Roser er røde», ect), lag en md5-hash av denne strengen, spar på de første seks karakterene i denne hash’n og legg på et numbertegn først i den forkortede hash’n. Da har vi en heksadesimalfarge som alltid vil være den samme, med samme streng som input. På den måten vill fargen for «Oslo», «Bergen», «Risør» og «Eirik Stavelin» være ulik hverandre, men alltid den samme uansett hvem som beregner den.

Her er et skjermbilde av noen sitater kjørt gjennom algoritmen, med fargen brukt som bakgrunnsfarge:

dopplrs farge-algoritme i bruk på sitater
Sitater kjørt gjennom farge-algoritmer

For at tekst skal kunne stå samme med fargen sin trengs det kontrast, og også dette har optional.is tenkt ferdig for oss: maximum-color-contrast.
Blant løsningen foreslått fikk jeg best resultater med 50%-kontrast-løsningen, og har brukt den.

Her er snuttene i PHP:
// dopplr color algorithm from: http://optional.is/required/2010/12/13/hls-world-map/
function str2hex($string){
$hex_color = substr(md5($string), 0, 6);
return "#".$hex_color;
}

// Contrast function: http://optional.is/required/2011/01/12/maximum-color-contrast/
// 50% function
function getContrast50($hexcolor){
return (hexdec($hexcolor) > 0xffffff/2)?'black':'white';
}

I javascript ser ting omtrent helt likt ut:
function str2hex(string){
var hex_color = md5(string).substring(0,6);
return "#"+hex_color;
}

men fordrer da et en implementering av md5 er tilgjengelig. Jeg brukte denne etter stackoverflows brukeres anbefalinger.

var partifarger = {} // krangle kan vi gjøre siden

Partier har farger, og det gjør det lettere for oss alle å skille dem fra hverandre. Det er lurt. Problemer finnes også, partiene henter seg nye farger og andre farger, bryter ut i nye partier og trenger flere farger. Så gir media partiene tydelige farger for å lage lekker grafikk med alle fargene, men som ikke er de helt samme som partiene selv valgte.
Så, det er rom for en krangle for de som vil. De som heller vil ha en hashtable i javascript for rask look-up for å fargelegge ting med partier i, her er en sånn:

var partifarger = {} // aka new Object()
partifarger['A'] = '#da383f'; //'#fd0000' fra logo
partifarger['ALP'] = '#f6f6f6'; // finnes ikke lenher
partifarger['B'] = '#008140'; // samme som Sp
partifarger['DNF'] = '#f6f6f6'; // finnes ikke lenger. Det Nye Folkepartiet het også det liberale forlepartiet og nye venste.
partifarger['FFF'] = '#f6f6f6'; // finnes ikke lenger
partifarger['FrP'] = '#393d87';
partifarger['H'] = '#0f658d';
partifarger['Kp'] = '#286d6d'; //'#f6f6f6' // finnes ikke lenger, stilte dog til valg i 2011 ...
partifarger['KrF'] = '#efae52';
partifarger['NKP'] = '#e40202'; // fra logo
partifarger['RV'] = '#a61e20';
partifarger['SF'] = '#f6f6f6'; // finnes ikke lenger
partifarger['Sp'] = '#008767'; //'#008140'
partifarger['SV'] = '#bb234a'; //'#cf0036'
partifarger['SVf'] = '#f6f6f6'; // finnes ikke lenger
partifarger['TF'] = '#f6f6f6'; // finnes ikke lenger
partifarger['Uav'] = '#f6f6f6'; // finnes ikke lenger
partifarger['V'] = '#81b45f'; //'#006c6e'
// de under her hadde NRK med i 2011-valget, selv om de ikke kom inn
partifarger['DEMN'] = '#003366'; // demokratene er ikke inne
partifarger['PP'] = '#000000'; // pensjonistpartiet er ikke inne
partifarger['MDG'] = '#3b7346'; // miljøpartiet de grønne er ikke inne
partifarger['R'] = '#7c2629'; // rødt er ikke inne

Stort sett basert på NRKs fargevalg fra lokalvalget 2011.

Spillanmeldere – kritiker eller entusiast? Eller begge?

Webscraping anser jeg som et metodisk verktøy som burde brukes mer. Ikke fordi det er den beste måten å gjøre ting på, lagt der i fra, men fordi det er enkelt, nyttig og relativt raskt. Et verktøy for scraping jeg har lekt med er scraperwiki.

Ikke bare kan du lage scrapers (skrapere?) med scraperwiki, du kan også lage views (presentasjonslag). Etter litt leking kom jeg fram til dette:

NRK P3s spillanmeldelser bruker 3 av 6 terningsider til 75% av sine anmeldelser. De har kun brukt terningkast 1 én eneste gang, og da til å feilkategorisere en film. Hva betyr det?

Betyr det at spill, som en relativt ny kulturform, trenger evangelister og entusiaster til å pushe spillets utmerkede egenskaper på oss? Anmelder de ikke de dårlige spillene? (jeg har selv spilt flere spill jeg kunne gitt terningkast 1 og 2 de siste årene, skriver ikke P3 om disse?) Har spillanmeldere noen insentiv for å vurdere «snilt»? Eller har de lave forventninger?

Tja, jeg som gjorde dette av metodisk interesse får vel innse at kvantitative mål ikke besvarer disse spørsmålene, men; det viser at terningkast ikke hverken er normalfordelt eller jevnt distribuert.

.. kanskje jeg får en jevn distribusjon hvis jeg gjør dette på popmusikk eller amerikanske filmer?