I många av exemplen på den här sajten jobbar vi med landsdata. Många variabler är där naturligt kontinuerliga, till exempel när det gäller makroekonomiska indikatorer som BNP eller arbetslöshet.
När man jobbar med enkätdata ser data lite annorlunda ut. De fleseta frågor har bara ett fåtal svarsalternativ, istället för att vara långa skalor. I många fall saknas värden, när folk låtit bli att svara på hela eller delar av en fråga. Kodningen av svarsalternativen är inte heller alltid helt intuitiv.
I den här guiden kommer vi gå igenom några typiska problem man kan stöta på när man jobbar med enkätdata, och vad man kan göra åt dem:
Problem 1: Missing-koder i datan
Problem 2: Skalor vända åt fel håll
Problem 3: Sambandsanalyser fungerar inte på grund av "no observations"
Problem 4: Scatterplots blir till konstiga rutnät
Problem 5: R2-värdet blir lågt
Datan vi använder är SOM-institutets nationella undersökning från 2016. Den är tyvärr inte fritt tillgänglig, men om man vill använda den i en uppsats eller forskningsrapport kan man beställa den från Svensk Nationell Datatjänst.
use "Riks-SOM 2016-swe.dta", clear
Ett vanligt problem är att det finns värden i datan som indikerar ogiltiga svar, men ändå har riktiga sifferkoder. Om vi inte tar bort dem kommer de snedvrida våra analyser.
I SOM-undersökningarna har personer som låtit bli att svara på frågorna fått värden som 96, 97, 98 eller 99, medan de "riktiga" svarsalternativen vanligtvis har värden i spannet 1-5. Vi kan till exempel titta på variabeln "f10a", som är en fråga om förtroende för innehållet i Sveriges Television. Vi gör det med kommandot codebook
.
codebook f10a
De intressanta svaren har värdena 1-5, från "Mycket stort förtroende" till "Mycket litet förtroende". Sen har vi 6, "Ingen uppfattning", och de tre felkoderna 97, 98 och 99. Utöver det har vi 8136 observationer som har värdet ".", vilket är Statas kod för att värde saknas.
Vi vill här ta bort 6, 97, 98 och 99 för att få en "ren" skala.
recode
för att koda bort missing-värden¶Vi använder oss av kommandot recode
(se också annan guide här) för att göra en ny variabel där de här värdena tas bort. Principen är då att vi skriver recode
följt av variabelns namn, och därefter de omkodningar vi vill göra. Vi vill nu bara ta bort de dåliga värdena, och de ska då få värdet ".". Värden som inte nämns förblir oförändrade. Vi avslutar sedan med ett option generate()
där vi anger vad vår nya variabel ska heta, till exempel "fortroende_svt".
recode f10a (6 96 97 98 99 = .), generate(fortroende_svt)
Det som hände nu var alltså att vi tog bort värdena 6, 96, 97, 98 och 99. Övriga värden stod kvar. Om vi nu tittar på den nya variabeln ser vi att den nu bara har värdena 1-5, och den kan nu lättare användas i analyser.
tab fortroende_svt
Ett problem kvarstår dock. Om man kollar på informationen som vi fick med codebook
tidigare kunde vi se att de som hade "Mycket stort förtroende" på variabeln har värdet 1. De som har "Mycket litet förtroende" har värdet 5. Det känns för mig väldigt krångligt. En ökning på variabeln betyder att förtroende minskar.
Rent statistiskt spelar det ingen roll, men risken för missförstånd och feltolkningar ökar. Jag tycker att det är mycket bättre att höga värden på en variabeln indikerar "mer" och "högt". Vi gör därför en ny variant av "f10a", med hjälp av recode
där vi också säger att de riktiga värdena ska ändras.
recode
för att vända på skalan¶Vi kopierar koden från ovan, men lägger till fem nya parenteser, där varje gammalt värde får ett nytt. De gamla 1 får värdet 5, de gamla 2 får värdet 4, osv. Det gamla värdet står först i parenteserna.
recode f10a (6 96 97 98 99 = . ) (1=5) (2=4) (3=3) (4=2) (5=1), generate(fortroende_svt_vand)
tab fortroende_svt_vand
De som har en femma på variabeln är nu de som har högst förtroende. Fem plus. Mycket lättare att förstå, tycker i alla fall jag!
Säg nu att vi vill undersöka sambandet mellan förtroende för Svt och hur ofta man uttrycker en åsikt på sociala medier. Det finns en sådan variabel, "f89e":
tab f89e
Nästan 1500 personer har gett giltiga svar på frågan. Här bör man visserligen först koda bort felkoderna "Ej svar" med hjälp av recode
som ovan, men vi struntar i det just nu. När vi nu tar ut till exempel en korrelation mellan fortroende_svt_vand och f89e får vi följande resultat:
pwcorr fortroende_svt_vand f89e
No observations - ingen data. Hur kan det komma sig? Ca 1500 personer hade ju svarat på SVT-frågan, och ca 1500 på sociala medier-frågan. Problemet är att det inte är samma personer. SOM-institutet skickar ut flera olika versioner av enkäten, och de flesta frågor ställs bara i någon enstaka version, för att inte göra formuläret alldeles för långt.
För att veta om de som har högt förtroende för SVT är mer eller mindre benägna att uttrycka sin åsikt på sociala medier måste just de som svarat på förtroendefrågan också ha svarat på sociala medier-frågan. Om man tittar i kodboken så ser man vanligtvis vilka frågor som ingår vilka versioner av enkäten.
Här finns ingen teknisk lösning. Finns inte datan så finns inte datan. Om det är en stor enkät kan det dock hända att det finns andra variabler som har ställts tillsammans, och som kanske fångar upp liknane saker. Till exempel finns det en variabel som frågar om hur ofta man använder mobilen för att kolla sociala medier. Såklart inte samma sak som att uttrycka sin åsikt, men kanske fångar det ändå upp något.
Vi vill nu titta på sambandet mellan personens placering på den ideologiska vänster-högerskalan och förtroendet för SVT. Vi gör först en ny variabel för vänster-högerplacering ("f45"), där vi tar bort felkoderna:
recode f45 (96 97 98 99 = .), generate(vhskala)
Nu gör vi ett spridningsdiagram, en scatterplot där vi sätter vhskala på x-axeln och förtroende för SVT på y-axeln:
twoway (scatter fortroende_svt_vand vhskala)
Grafen ser väldigt märklig ut, men är logisk. Tänk på att det är enkätfrågor, med ett antal fasta svarsalternativ. Man kan inte svara att man är 2,7 på den ideologiska skalan, eller 3,2 på förtroende-skalan. Eftersom båda variablerna har fem alternativ blir det 25 kombinationer av svar, och det är 25 prickar vi ser i diagrammet. Dock kan det vara flera hundra personer gömda bakom en prick. De är lagrade ovanpå varandra i diagrammet. Men det ser vi inte, vilket gör det väldigt svårt att se om det finns något samband.
En halvbra lösning är att göra punkterna mestadels genomskinliga. När man då placerar många punkter ovanpå varandra får de en mörkare färg. Vi kommer då tydligare se vart det är många personer i diagrammet Vi gör detta med ett option inne i scatter-parentesen, mcolor()
. Vi väljer då en färg, och anger med en procentsiffra hur synlig den ska vara.
twoway (scatter fortroende_svt_vand vhskala, mcolor(purple%1))
Lite bättre! Vi kan nu se att det i princip inte är någon som står längst till vänster som har riktigt lågt förtroende för SVT. Inte heller på högerkanten är det jättemånga, men något fler, vad det verkar.
Ännu bättre är dock oftast att göra ett stapeldiagram som visar medelvärdet på den beroende variabeln för varje kategori på den oberoende variabeln. Vi gör det med hjälp av kommandot graph bar
.
graph bar (mean) fortroende_svt_vand, over(vhskala)
Sambandet är inte jättetydligt. Men vi kan ändå se att värdena är något lägre bland de som har högre värden på vh-skalan, alltså är längre till höger. Vi kan också fixa till diagrammet mer, till exempel genom skriva ut vad de faktiska medelvärdena är. Se separat guide för det.
R2-värdet är ett mått i regressionsanalys som visar modellens passning, eller med andra ord, hur bra vi kan gissa värdet på den beroende variabeln, utifrån den oberoende variabelns värde. Ett högt R2-värde (närmare 1) omtalas ibland som "bättre".
När man jobbar med enkätdata kan dock R2-värdet ofta bli väldigt lågt. Om vi till exempel gör en regressionsanalys med förtroende för SVT som beroende variabel och Vänster/höger-skalan som oberoende så märker vi att R2 bara blir 0.0203, alltså 2 procent ungefär!
reg fortroende_svt_vand vhskala
Det är dock inget man ska bli särskilt förvånad över. Man måste tänka på att datan utgörs av enkätsvar. Många tänker inte så noga när de svarar på enkäten, och svaren blir därför mer eller mindre slumpmässiga. Sådan slump kan inte förklaras av någon variabel, vilket drar ner R2.
Med enkätdata av den här typen är det därför inte ovanligt att R2 är några få procent, som i det här exemplet. Men det betyder alltså inte att hypotesen är fel, eller att data inte gäller, bara att det är svårt att gissa exakt vad folk känner. R2-värden på 20-30% blir det oftast bara när man samkör variabler som har en närmast trivial koppling, som sambandet mellan förtroende för en partiledare och förtroende för dennes parti.
Det var några vanliga problem som kan dyka upp när man jobbar med enkätdata. Tänk på att ta det långsamt, och dubbelkolla alla eventuella omkodningar så att det är rätt antal personer i varje kategori.