Öppna data 2 – Replikerbarhet av figurer om livstillfredsställelse baserade på data från Eurobarometer och SOM

Ett argument för öppen vetenskap är att replikerbarheten ökar. När data ligger ute så kan vem som helst med tillräckliga kunskaper kontrollera och återskapa de analyser som ligger till grund för forskningsresultaten.

Jag tänkte att det hela kunde prövas. Vissa talar nämligen om en replikationskris.

Häromdagen läste jag en intressant artikel av Brülde och Nilsson (2010) som innehåller följande figur:


I förra bloggposten skrev jag om hur man kan analysera data från SOM-institutets stora enkäter. Figuren ovan innehåller dock även data från Eurobarometern. Dessa data är öppet tillgängliga från EU-kommissionens hemsida. Jag skrev en liten Jupyter-anteckningsbok med Pythonkod som beskriver hur man kan analysera den lätt.

Det intressanta med figuren är att den visar på en ganska stor skillnad mellan Eurobarometerns besöksintervjuer och SOM-institutets postalenkäter, trots att man ställer samma fråga. Brülde och Nilsson skriver:

Att besöksintervjuer tenderar att generera mer positiva svar blir särskilt tydligt i en jämförelse av utfallet i SOM-undersökningen och Eurobarometern (EB) över tid (figur 1). Det ska emellertid noteras att även svarsskalan skiljer sig åt i dessa undersökningar; där SOM på den ”missnöjda sidan” använder sig av ’inte särskilt nöjd’ och ’inte alls nöjd’ har EB lite starkare formuleringar – ’ganska missnöjd’ och ’mycket missnöjd’ – något som rimligen också det bidrar till den genomgående mer nöjda svenska befolkningen i EB:s mätning. (s. 5)

Jag tog således resultaten från SOM och Eurobarometern, bakade ihop dem till en csv-fil och skrev några rader kod. Viktigt är att man bara tar de mätningar från Eurobarometern som är genomförda på hösten (samma tid som SOM går i fält). Så här blev min figur (har lagt till några extra år som bonus):

Det ser ju bra ut. Eller… vänta nu. Min figur har 39% mycket nöjda år 2000 medan Brülde och Nilsson bara har 35%. Det kan knappast vara ett avrundningsfel. Tillbaka till källdatan från Eurobarometern:

Det ser ut som att Brülde och Nillson har tagit data från mätningen den fjärde maj istället för den fjortonde november (men det kan likagärna vara jag som har blandat ihop korten).

Öppna data 1 – SuperSOM med Python och Pandas

I en ‘post factual’ demokrati tror vissa att öppen vetenskap kan ge människor förnuftet tillbaka. Om detta vet vi mycket lite, eftersom vi inte har så mycket fakta att gå på (vilket kan betraktas som lite ironiskt).

Men, något kan man ändå veta. För att öppen vetenskap ska bli användbar av både forskare och allmänhet (framförallt då öppna data) så måste den göras begripbar. När det kommer till kvantitativa data så underlättar det om man antingen har kunskap och licenspengar att köpa och lära sig Excel eller SPSS. Men, om man istället vill vara öppen hela vägen så är det mycket bättre att köra helt med open source. Och om man dessutom vill slå flera flugor i en smäll tar man och lär sig ett programmeringsspråk. Då kan man göra tusen andra saker än bara analysera data.

Ett bra programmeringsspråk för statistik är R eftersom det i standardutförande gör allt man behöver för att använda sig av de datastrukturer som är bra för att analysera statistisk data.

Själv använder jag Python. Det är ett mera generellt språk, men med biblioteket Pandas får man enkla färdiga datastrukturer som är väldigt lätta att använda.

I denna lilla anteckning tänkte jag lägga ut lite kodsnuttar för att analysera SOM-institutets långa tidsserie 1986-2014, även kallad ”SuperSOM”, med Python/Pandas. Det är en guldgruva för samhällsvetare och det är svårt att hitta enkätdata med högre kvalitet i Europa. Dock innehåller denna datamängd mer än 93 tusen enkätsvar, så man får ha lite tålamod och RAM-minne till hands.

SuperSOM1 är öppen data, men den är inte superöppen. Man måste beställa den från Svensk Nationell Datatjänst och tillgängligheten bestäms av ”primärforskaren”. Så man måste ange vad man ska ha datamängden till och sedan får man en nedladdningslänk. Man får inte sprida den vidare.

Tyvärr levererar inte SND i csv-format utan bara i statistikprogramformat. Så jag beställde Excel-format (som smidigt kan konverteras till csv, se nedan).

Först konvertering från Excel till csv med två enkla rader:

import pandas as pd
df = pd.read_excel('data/SND 0905-004 Super-Riks-SOM 1986-2014.xlsx') # öppna Excelfil
df.to_csv("SuperSOM1986-2014.csv", sep='\t', encoding='utf-8') # skriv till csv-fil

 

Observera att det kan ta lite tid att konvertera. Excel-formatet är lite långsamt av sig. Men när det är klart kan man läsa in csv-filen på några sekunder (tar ca. 2 Gb i minne, så bör funka på vanlig dator).

df = pd.read_csv('data/SuperSOM1986-2014.csv', sep='\t', encoding='utf-8')

Nu är hela SuperSOM inläst som en ”dataframe” och allokerad som variabeln df. För att kolla att all data är med i leken kan vi göra en enkel graf år för år med det lättanvända biblioteket Seaborn.

import seaborn as sns
years = sns.factorplot('year', data=df, kind='count', size=8, aspect=2)
years.set_xticklabels(rotation=30)

Japp, SOM-enkäten blir mycket större med åren. Däremot minskar svarsfrekvensen, något man får ha i bakhuvudet.

Därefter kan man ta fram kodboken man får med och sedan börja analysera datan. Som exempel tänker jag ta fråga md10 som frågar hur nöjd man är med livet (det man kallar för ”Life satisfaction” i internationell forskning). Om man vill få ut data i procent för varje år i en tabell får man göra lite handpåläggning (tar gärna emot tips på hur man kan göra detta med mindre kod).

Så här gjorde jag (med lite hjälp av biblioteket tabulate)

from tabulate import tabulate

def lstimeseries():
    tsresults = []
    for y in range(1996, 2015):
        year = y
        md10table = df['md10'].loc[df['year'] == year]
        #md10table = df['md10']
        md10total = 0
        mycketnojd = 0
        ganskanojd = 0
        intesarskiltnojd = 0
        inteallsnojd = 0 
        nan = 0
        for t in md10table:
            if pd.isnull(t):
                nan += 1
            elif t == 98:
                nan += 1
            elif t == 99:
                nan += 1
            elif t == 96:
                nan += 1
            elif t == 1:
                mycketnojd += 1
                md10total += 1
            elif t == 2:
                ganskanojd += 1
                md10total += 1
            elif t == 3:
                intesarskiltnojd += 1
                md10total += 1
            elif t == 4:
                inteallsnojd += 1
                md10total += 1
        # Append the data to a lis of lists that can be tabulated:
        # add , 2 to the round method to get some decimals e.g. round((mycketnojd/md10total * 100), 2)
        tsresults.append([year, round((mycketnojd/md10total * 100)),   
                           round((ganskanojd/md10total * 100)),
                           round((intesarskiltnojd/md10total * 100)),
                           round((inteallsnojd/md10total * 100))])
    return(tsresults)

print("Nöjd med livet, nationella SOM-undersökningen\n")
# For html, add , tablefmt="html"
print(tabulate(lstimeseries(), headers=["Year", "Mycket nöjd", "Ganska nöjd", 
                                        "Inte särskilt nöjd", "Inte alls nöjd"])) 

Vilket ger:

Year Mycket nöjd Ganska nöjd Inte särskilt nöjd Inte alls nöjd
1996 30 64 6 0
1997 30 61 8 2
1998 28 63 8 1
1999 29 62 8 1
2000 31 61 7 1
2001 32 60 8 1
2002 29 62 8 1
2003 33 58 8 1
2004 33 59 7 1
2005 32 59 7 1
2006 35 57 7 1
2007 35 58 7 1
2008 34 58 7 2
2009 36 57 7 1
2010 36 57 6 1
2011 37 56 6 1
2012 35 58 6 1
2013 36 57 7 1
2014 37 56 6 1

För säkerhets skull kan man kolla att man har räknat rätt genom att kontrollera mot någon av alla de rapporter som SOM-institutet publicerat. Exempelvis en intressant studie av Brülde och Nilsson från 2010.

Det verkar alltså som att vi blir allt mer ”intensivt nöjda” med livet för varje år som går. Missnöjdheten är däremot stabilt låg.

Således har vi tagit fram lite data som vi kan visa för alla kommentatorer  ”känner” det ena och det andra i samtiden. Samtidigt har vi replikerat SOM-institutets mätningar, något som är viktigt för att öka den vetenskapliga kvaliteten. Ju fler ögon desto färre buggar.


  1. Göteborgs universitet, SOM-institutet. (2016). Super-Riks-SOM 1986-2014. Version 1.0. Svensk Nationell Datatjänst. http://dx.doi.org/10.5878/002826 

Mårdhunden, Judasdjuret och Människan

Racoondogskull

I helgen har jag testat att analysera biodiversitetsdata från Analysportalen från Svenska Lifewatch. Analysportalen innehåller enorma mängder artobservationer från bland annat det stora medborgarforskningsprojektet Artportalen.

Mårdhunden är en invasiv art. Den introducerades under perioden 1928-1950 i Ukraina för att jagas för pälsens skull. Människans fåfänga har ofta ekologiska konsekvenser och så även i detta fall. Mårdhunden etablerade sig och spred sig, från post-Sovjet hela vägen över Finland, till Sverige.

För att få bukt med spridningen av mårdhundarna använder man sig av ”Judasdjur”. I Jägareförbundets rapport 2015 kan man läsa följande mycket poetiska stycke:

Sändarmärkta mårdhundar (Judasdjur) letar dygnet runt efter  nya  mårdhundar  som de sedan  leder  oss  till.  Mårdhunden  är  monogam  och  dess  första  prioritet  förutom  egen  överlevnad är att finna en partner som den sedan aldrig lämnar förrän en av dem dör, då den  återigen  börjar leta en ny  partner.  Sterilisering av  sändardjuren  utförs  innan de släpps så att de inte ska kunna reproducera sig om vi skulle förlora dem genom sändarfel.Båda  könen  fungerar  lika  bra  som  Judasdjur.  Sändardjuren  fungerar  effektivare  ju  lägre  täthet det är eftersom det då är mycket svårt för oss människor att ens hitta ett spår. En annan  mårdhund  kommer  dock  att  förr  eller  senare  finna  sin  artfrände.  De  ägnar  all  sin  tid åt detta och vandrar över mycket stora områden (ibland långt över 100 000 hektar) i sitt  sökande.  I  figur  1  ser  vi  området  en  mårdhund  har  täckt  under  två  år  i  sitt  sökande  efter  en  partner,  området  är  större  än  de  flesta  län  i  landet.  När  de  finner  en  partner  avslutas  vandringen  och  paret  stannar  därefter  inom  ett  mycket  begränsat  område,  det  är också så vi ser att de har funnit en partner.

Framtiden ser inte ljus ut för mårdhunden.

screen-shot-2016-12-05-at-09-53-15

Mårdhundsobservationer per län, se källkod.

Men vad har vi för data på mårdhundens utbredning? Analysportalen är ett fantastiskt verktyg för öppna data, och man kan med enkla medel ladda hem alla observationer. Med lite helghackande lyckades jag få till lite kod som kan användas på lite olika sätt. All kod och data som behövs för att replikera figurerna finns här.

Med lite kod kan man skapa en karta över de inrapporterade observationerna (klicka för att få fram info om varje observation).

Se kartan i större format.

Men hur ska vi förstå mårdhunden och dess relation till territoriet, människan och ett processfilosofiskt tänkande?

Deleuze och Guattari’s berömda passage i Tusen platåer ger oss ett tankeuppslag:

Orkidén avterritorialiseras genom att skapa en bild, en kalkering av en geting; men getingen återterritorialiseras på denna bild. Getingen avterritorialiseras emellertid, i det att den själv blir en del av orkidéns reproduktionsapparat; den återterritorialiserar orkidén genom att transportera pollen. Getingen och orkidén bildar ett rhizom just därför att de är heterogena. (s. 27)

Människans fåfänga skapade en bild av mårdhundens päls i relation till hur människans semiotiska signaler (pälskläder) territorialiserar ett socialt stratum (jag är rik, jag har ”stil”). Detta ledde till att fåfängans logik översattes en kapitalistisk utbyteslogik av de Sovjetiska(!) aktörerna som gjorde vad de kunde för att introducera mårdhunden i östra Europa och västra Asien. Det var främst i Baltikum som mårdhunden kunde återterritorialisera sig i de födorika skogarna. Men den skulle sakta men säkert börja vandra norrut genom Karelen, samtidigt som den avterritorialiserade de djupa skogarna och kastade om den ekologiska balansen. I mårdhundarnas magar skapade dvärgbandmaskar och parasiter kalkeringar av en mårdhund och gjorde denna plats till sin reproduktionsapparat. I detta moment skapade människan en ny bild av mårdhunden som en invasiv art. Man uppfann Judasdjuret, som med avsaknad av reproduktionsapparat (steriliserad) kunde röra sig över hundratals hektar av skog i jakt på en förvildad mårdhund.

Människan, Judasdjuret, mårdhunden och dvärgbandmasken bildar ett rhizom, vars utbredning är en ständig kamp om territorium.