Kapitel 6 Visualisering

“En bild säger mer än tusen ord” är ett vanligt förekommande ordspråk som innehåller mycket sanning. Speciellt när det kommer till information och data används visualiseringar i olika former för att på ett effektivt och tydligt sätt förmedla stora mängder siffror som hade varit svårare att uppfatta i andra former. Om du ska presentera något banbrytande för dina kollegor eller chefer måste du på något sätt kunna sammanfatta resultatet på ett lättförståeligt och tydligt sätt. Visualiseringar är ett verktyg som ger många möjligheter att komprimera informationen som ska förmedlas.

Visualisering ger också en analytiker möjlighet att lära känna sitt datamaterial innan mer djupgående analys påbörjas. Med mycket data är det oftast svårt få grepp om sina variabler och observationer. Frågor som; “vad är sambandet mellan mina variabler?” eller “finns det några felaktigheter i materialet?” blir mycket enklare att besvara med hjälp av visualiseringar. Ett första steg i vilken undersökning som helst är därför ett explorativt steg med beskrivande mått och lämpliga visualiseringar.

6.1 Grundläggande begrepp

Ett diagram innehåller olika delar som kommer refereras i resterande text. Här följer en kortare ordlista:

  • Diagramyta: Det område som innehåller all information tillhörande en visualisering
  • Rityta: Det område som innehåller det faktiska data som visualiseras
  • Axel: Kanterna som begränsar ritytan, ofta benämnt som x- och y-axel för den vågräta ( - ) respektive lodräta ( | ) axeln
  • Axelförklaring: En rubrik som beskriver vad den angivna axeln visar för information
  • Skalvärden: Steg som anger specifika värden på den angivna axeln
  • Stödlinjer: Linjer vilka agerar som en förlängning av axlarnas skalvärden i bakgrunden av ritytan
  • Titel/rubrik: En rubrik för diagrammet
  • Källhänvisning: En text placerade i någon av de nedre hörnen som anger en källa för det visualiserade datamaterialet om sådan finns

6.2 Ett diagram av hög kvalité

För att skapa ett bra diagram behöver man tänka på några olika saker bland annat vilken typ av variabel som ska visualiseras. En sorts diagram kan mycket enkelt och tydligt visualisera en kvalitativ variabel men visualiserar kvantitativa variabler värdelöst…

Ett stapeldiagram lämpar sig för att visualisera fördelningen av kvalitativa variabler. Eftersom en kvantitativ variabel omfattar många olika värden kommer frekvenserna aldrig bli nog stora, och antalet värden som variabeln kan anta vara alltför många.

Exempel på stapeldiagram för en kvalitativ (t.vä.) och kvantitativ (t.hö.) variabel

Figur 6.1: Exempel på stapeldiagram för en kvalitativ (t.vä.) och kvantitativ (t.hö.) variabel

Ritytan innehåller den information som ska förmedlas och bör därför få ta upp majoriteten av platsen i ett diagram. Om man anger för stora rubriker blir det lätt att man inkräktar på ritytan. Detsamma gäller om y-axeln innehåller långa skalvärdesnamn. I följande diagram är ritytan allting inom det rödmarkerade området.

Exempel på diagram med bra rityta (t.vä.) och för liten rityta (t.hö.)

Figur 6.2: Exempel på diagram med bra rityta (t.vä.) och för liten rityta (t.hö.)

Stödlinjer bör finnas för att underlätta att läsa av information långt från respektive axel. Dessa bör dock inte ta över diagrammet utan enbart finnas i bakgrunden. Notera att stödlinjer kan behöva justeras beroende på vilket sammanhang diagrammen används till. Beroende på upplösning, ljusstyrka eller andra skärmegenskaper kan ibland ljusa och smala linjer försvinna in i den vita bakgrunden och då är tjockare och starkare stödlinjer befogat.

Exempel på stödlinjer som ligger i bakgrunden (t.vä.) och stödlinjer som tar onödig fokus från informationen (t.hö.)

Figur 6.3: Exempel på stödlinjer som ligger i bakgrunden (t.vä.) och stödlinjer som tar onödig fokus från informationen (t.hö.)

Ett bra diagram har också läsbar text oavsett storleken på diagrammet. En bra referens kan vara att förhålla den minsta texten i diagrammet till ungefär samma storlek som brödtexten i rapporten eller presentationen. Försök att alltid tänka på att underlätta för läsaren!

Exempel på läsbar text (t.vä.) och på gränsen till för liten text (t.hö.)

Figur 6.4: Exempel på läsbar text (t.vä.) och på gränsen till för liten text (t.hö.)

Källhänvisning bör finnas i alla diagram där informationen är hämtat från någon annan källa än oss själva.

Exempeldiagram med källhänvisning

Figur 6.5: Exempeldiagram med källhänvisning

Följande kapitel kommer visa hur vi skapar dessa olika diagram och vilka möjlighetervi har att förändra deras egenskaper.

6.3 Visualisering av beskrivande statistik

Ett utav de vanligaste visualiseringarna är att visualisera fördelningen av en enskild variabel. Det ger oss möjligheten att för kvantitativa variabler identifiera både läges- och spridningsmått samtidigt som vi kan identifiera extremvärden.

6.3.1 Stapeldiagram

Den absolut enklaste formen av visualisering är stapeldiagram. På x-axeln hittas de enskilda värden som variabeln innehåller och höjden på respektive stapel styrs utav antalet eller andelen observationer som har respektive värde.

Ett stapeldiagram som visar en fördelning av en kvalitativ variabel

Figur 6.6: Ett stapeldiagram som visar en fördelning av en kvalitativ variabel

Ett stapeldiagram kan också skapas när en kvantitativ variabel grupperas på en eller flera nivåer av en kvalitativ variabel, men då visualiseras inte längre en fördelning.

Ett stapeldiagram som visar ett aggregerat kvantitativt värde grupperat på en kvalitativ variabel

Figur 6.7: Ett stapeldiagram som visar ett aggregerat kvantitativt värde grupperat på en kvalitativ variabel

Olika programvaror kräver olika mycket bearbetning av datamaterialet innan diagrammet kan skapas. Vissa kräver att du själv skapar en frekvenstabell och anger att höjden av respektive stapel ska bestämmas av den tillhörande frekvensen, medan andra kan göra dessa beräkningar direkt på rådata. R och paketet ggplot2 kan skapa diagram baserat på båda formaten.

ggplot2 är ett paket som formaliserar ett eget språk för hur man enhetligt bör skapa visualiseringar genom något som kallas “grammar of graphics”. Det första steget för att få ta del av funktionerna är att ladda paketet till din R-session genom eller om du redan laddat in tidyverse kommer även detta paket ha laddats in.

require(ggplot2)

Paketets visualiseringar utgår ifrån en tibble som vi antingen skapat själv eller laddat in från en fil från hårddisken. Vi kommer utgå ifrån penguins som laddades in i detta kapitel. Glöm inte att rensa bort de saknade värdena i materialet med hjälp utav filter().

6.3.1.1 Grundkomponenter

Vi kan nu börja med att skapa figur 6.6. Vi börjar med de tre grundkomponenterna av ett ggplot-diagram; ggplot(), aes() och geom_x(). Alla diagram måste innehålla dessa tre komponenter i någon form för att vi ska kunna producera något överhuvudtaget, sen kan vi lägga till andra instruktioner för att ändra diagrammet utseende.

I ggplot() anges vilket datamaterial vi vill använda för visualiseringen:

## Anger vilket datamaterial som ska användas i visualiseringen
ggplot(penguins)

Som vi ser skapas inget utifrån denna kod, vi har bara sagt åt R att använda datamaterialet men inte vad den ska göra med det.

Fördelen med att använda ggplot2 är att alla dessa funktioner i bakgrunder skapar en mängd instruktioner som vi kan utöka med hjälp utav +. Vi kan också spara ner instruktioner i objekt för att senare slå de samman eller förändra vissa delar av visualiseringen.

Nästa steg är att ange vilka variabler vi vill använda för axlarna i diagrammet. När det kommer till stapeldiagram finns två olika sätt att göra; antingen har vi rådata och låter R räkna ut frekvensen av de olika kategorierna själv eller har vi data med två variabler varav den ena visar höjden på stapeln och den andra visar grupperingen. Vi kommer först börja med exemplet utifrån rådata:

## Anger vilka variabler som ska användas till axlarna
ggplot(penguins) + aes(x = species)

I kodexemplet lägger vi alltså till instruktionerna för aes() till instruktionerna för ggplot() med hjälp av +. Nu ser vi att R ritat ut de olika arterna som finns i materialet på x-axeln, men vi har fortfarande inte sagt åt R vad vi vill att den ska göra med informationen.

Den sista grundkomponenten är den som styr vilken diagramtyp vi skapar och i ggplot2 finns många olika som kommer till användning för olika ändamål. För ett stapeldiagram anger vi geom_bar() från engelska termen bar chart.

## Anger vilken sorts geometriskt objekt som ska skapas, ett stapeldiagram
ggplot(penguins) + aes(x = species) + geom_bar()

Tips!
För att y-axeln ska visa relativa frekvenser istället för absoluta, kan vi i
geom_bar()
lägga till argumentet
mapping = aes(y = (count/sum(count)) %>% after_stat())
. Diagrammet ändrar sig inte i sin form, staplarna är fortfarande lika höga i relation till varandra, men tolkningar av detta diagram kan nu göras i andelar (procent) istället för antal.

Med dessa grundkomponenter får vi fram ett diagram, men vi kan väl alla hålla med om att det i detta läge inte ser särskilt snyggt och tydligt ut. Ett snabbt och enkelt sätt att få till lite snyggare diagram är att använda någon utav ggplots teman som finns tillgängliga genom theme_X(). Exempelvis är ett stilrent tema att utgå ifrån theme_bw() likt:

## Skriver ut visualiseringen med ett standard-tema
ggplot(penguins) + aes(x = species) + geom_bar() + theme_bw()

Det är nu den största funktionaliteten med ggplot2 kommer in. Vi kan spara instruktionerna vi gett åt R för att skapa diagrammet och senare lägga till fler instruktioner genom att använda + på samma sätt som koderna ovan är skrivna. Vi sparar därför de nuvarande instruktionerna i ett objekt som vi kallar för p (vi kan döpa denna till vad som helst) likt:

## Sparar instruktionerna för hur visualiseringen ska skapas
p <- ggplot(penguins) + aes(x = species) + geom_bar() + theme_bw()

Nu ligger alla instruktioner för hur R ska rita upp diagrammet sparat i p men för att R också ska producera diagrammet måste vi också säga det likt:

## Skriv ut visualiseringen utifrån de sparade instruktionerna
p

Vi kan nu lägga till ytterligare instruktioner exempelvis att rotera diagrammet med coord_flip().

## Lägger till instruktioner för att rotera diagrammet p
p + coord_flip()

Eller förändra den kontinuerliga y-axelns slutvärde med scale_y_continuous() och argumentet limits = c(min, max).

## Anger att y-axeln ska gå mellan 0 och 300
p + scale_y_continuous(limits = c(0, 300))

Notera att diagrammet inte roterades efter den andra raden kod när vi ändrade y-axeln Detta är för att vi endast sagt åt R att rita diagrammet med vardera tillagda instruktion vid två olika tillfällen utan att ha sparat dessa någonstans. För att R ska spara dessa instruktioner tillsammans med grundinstruktionerna måste vi spara om instruktionerna till ett nytt (eller skriva över) objekt.

## Skriver över instruktionerna i p med p + ytterligare instruktioner
p <- p + scale_y_continuous(limits = c(0, 300))

p

6.3.1.1.1 Sammanställd data

Om vi istället för rådata har sammanställd eller aggregerad data kan vi ändå skapa ett stapeldiagram. Till exempel skulle vi kunna ha beräknat medelvikten av de tre olika arterna pingviner enligt:

## Skapar ett nytt material med aggregerad information om pingvinerna
aggPenguins <- 
  penguins %>% 
  group_by(species) %>% 
  summarize(
    meanWeight = mean(body_mass_g)
  ) 
## # A tibble: 3 × 2
##   species   meanWeight
##   <fct>          <dbl>
## 1 Adelie         3706.
## 2 Chinstrap      3733.
## 3 Gentoo         5092.

För att skapa diagrammet som vi sett tidigare måste vi lägga till några argument i aes() och geom_bar() som speglar den nya strukturen. Vi anger att y-axeln nu kommer från en specifik variabel och att höjden på staplarna ska styras utav det uppmätta värdet från variabeln. Det sista kräver att argumentet stat = "identity" anges i geom_bar().

ggplot(aggPenguins) + aes(x = species, y = meanWeight) + geom_bar(stat = "identity") + theme_bw()

6.3.1.2 Färger

Om vi vill ändra färgen på olika delar av diagrammet exempelvis staplarna kan vi göra detta inuti geom_bar() med argumenten color för kantlinjerna och fill för fyllnadsfärgen. För att se vilka färger som går att ange kan man köra funktionen colors() för deras namn eller hämta hem följande PDF som har färgerna utskrivna. Vi kommer senare titta närmare på färger och dess funktion i visualiseringar.

p <- ggplot(penguins) + aes(x = species) + 
  geom_bar(fill = "dark orange",
           color = "black",
           aes(y = after_stat(count/sum(count)))) +
  theme_bw()

p

6.3.1.3 Stödlinjer

Nu vill vi ändra lite stödlinjer så att de syns och hjälper till att förtydliga informationen vi vill visa. När det kommer till stapeldiagram behövs inte stödlinjer på x-axeln då staplarna sträcker sig hela vägen ner till dess skalvärden. Däremot behöver vi förtydliga skalvärdena på y-axeln. För att ändra utseendet på olika delar i ett diagram används theme() och diverse olika argument däri. Titta i dokumentationen för funktionen för att få en inblick i vad som kan ändras i diagrammet. Oftast ska dessa delar anges med en utav element-funktioner, beroende på typen som ska ändras. Text ändras med element_text(), linjer med element_line() och delar kan helt och hållet tas bort genom element_blank(). Nedanstående kod ändrar stödlinjerna på y-axelns färg till lite mörkare grå än standardvärdet (panel.grid.major för stödlinjerna som följer skalvärdena, panel.grid.minor för stödlinjer emellan skalvärdena) och tar bort stödlinjerna från x-axeln.

p <- p + theme(panel.grid.major.x = element_blank(),
               panel.grid.minor.x = element_blank(),
               panel.grid.major.y = element_line(color = "gray70"),
               panel.grid.minor.y = element_line(color = "gray80"))

p

6.3.1.4 Text

Det som saknas just nu i diagrammet är tydligare (och större) text som förklarar de olika delarna av diagrammet för läsaren. De olika etiketterna kan alla anges i samma funktion genom olika argument likt:

p <- p + labs(x = "Art", y = "Andel", caption = "Källa: Gorman, Williams, Fraser (2014)")

p

Det vi kan förhålla oss till när vi anger titeln för y-axeln är att den beskriver enheten som används för att mäta axelns skalvärden. Då vi i detta fall har värden mellan \(0\) och \(1\) bör vi ange Andel som titel. Om vi skulle haft absoluta frekvenser skulle en lämplig titel varit Antal. Om vi istället för andelar anger skalan i procent likt tidigare diagram kan det diskuteras huruvida det behövs en y-axeltitel eftersom enheten redan är angiven på skalan. Diagrammet skulle då kunna se ut som:

p + scale_y_continuous(labels = scales::percent) + labs(y = "")

Vi kan även ändra andra aspekter av textens utseende i diagrammet, exempelvis hur stor den är, dess rotation eller position. Detta görs med olika argument i theme(). Vi kan ändra utseendet på axeltexter med axis.title, skalvärden med axis.text och källhänvisningen med plot.caption. Alla dessa delar kräver instruktioner från element_text()-funktionen och där kan argument som:

  • angle styra rotationen,
  • hjust och vjust styra placeringen horisontellt respektive vertikalt,
  • size styra textstorleken,
  • font styra typsnittet,
  • face ange en eventuell fet- eller kursivmarkering av texten
p <- p + theme(plot.caption = element_text(face = "italic"),
               axis.title.y = element_text(angle = 0, vjust = 0.5, size = 11),
               axis.title.x = element_text(size = 11),
               axis.text = element_text(size = 10, color = "black"))

p

6.3.1.5 Skalvärden

Ibland kan de automatiskt genererade axelskalorna medföra svårigheter att utläsa informationen som vi ska presentera. Därför är det sista vi kommer titta på funktioner för att ändra dessa skalor. Vilken funktion vi vill använda och hur man kan ändra utseendet påverkas av vilken sorts variabel som anges på den specifika axeln. Exempelvis kanske vi vill i diagrammet ändra så att den kontinuerliga y-axeln endast visar skalvärden var 10:e procent istället för var 5:e som nu sker. Detta gör vi då via:

p + scale_y_continuous(breaks = seq(from = 0, to = 1, by = .10))

Argumentet breaks = seq(from = 0, to = 1, by = .10) anger att vi vill att värden (breaks) ska visas på specifika ställen på axeln. seq()-funktionen är ett snabbare sätt att skapa en vektor med lika steglängd mellan värden som vi använder för att skapa c(0, 0.1, 0.2, 0.3, ..., 1). Notera att trots att vi anger värden som går hela vägen upp till 1, kommer inte diagrammet visa detta.

Om vi skulle vilja visa en större del av axeln kan vi ange skalans gränser med limits likt koden nedan. Risken med detta är att vi skapar för mycket onödig tom rityta som minskar utrymmet för den information som vi vill presentera.

p + scale_y_continuous(breaks = seq(from = 0, to = 1, by = .10), 
                       limits = c(0, 0.40))
## Warning: Removed 1 rows containing
## missing values (`geom_bar()`).

Något som dock är snyggt att göra med specifikt stapeldiagram är att ta bort den lilla yta som finns under alla staplar och låta y-axeln möta x-axeln vid y = 0. Detta kan vi göra med argumentet expand = c(0,0), men då måste vi ange gränserna på skalan.

p <- p + scale_y_continuous(breaks = seq(from = 0, to = 1, by = .10), 
                            limits = c(0, 0.4),
                            expand = c(0,0))
p
## Warning: Removed 1 rows containing
## missing values (`geom_bar()`).

6.3.2 Grupperat stapeldiagram

Om vi har ett datamaterial bestående av flera kvalitativa variabler kan vi ibland vilja visualisera fördelningen av en variabel grupperat på en annan, exempelvis “Hur ser fördelningen av bilmärken ut, uppdelat på civilstånd?”. Det kanske finns några intressanta relationer mellan dessa två variabler som vi skulle vilja undersöka vidare, men som tidigare sagt är visualisering alltid det första steget för att lära känna sitt datamaterial.

I vårt exempeldata har vi två kvalitativa variabler, art och island. För att visualisera ett grupperat stapeldiagram behöver vi välja en grupperings- och en fördelningsvariabel. Fördelninsgsvariabeln kommer grupperas över varje enskilda kategori från grupperingsvariabeln.

I R måste vi ange grupperingsvariabeln likt det vi gjort tidigare som x och fördelningsvariabeln som fill inuti aes(). Detta kommer säga åt R att vardera värde på species ska ha olika fyllnadsfärger. position = "dodge" bestämmer att staplarna ska ligga bredvid varandra och position = "stack" staplar de ovanpå varandra för ett s.k. stackat stapeldiagram.

p <- ggplot(penguins) + 
  aes(x = island, fill = species) + 
  geom_bar(position = "dodge") + 
  theme_bw()

p 

För relativa frekvenser i ett grupperat stapeldiagram kan vi summera de visualiserade staplarna på två olika sätt.

  1. Antingen visar vi relativa frekvenser utifrån hela datamaterialet. Detta diagram kommer se exakt likadan ut som den med absoluta frekvenser men med andelar istället för antal. Vi använder samma kod som för det enkla stapeldiagrammet: aes(y = after_stat(count/sum(count))).
ggplot(penguins) + aes(x = island, fill = species) + 
  geom_bar(aes(y = after_stat(count/sum(count))), 
           position = "dodge") + 
  theme_bw()
  1. Alternativet är att visa den relativa fördelningen grupperat på grupperingsvariabeln, alltså att vardera kategoris staplar summerar var för sig till 100 procent. Vi behöver då revidera koden som anger beräkningen till relativa frekvenser till: aes(y = after_stat(count/tapply(count, x, sum)[x])).
ggplot(penguins) + aes(x = island, fill = species) + 
  geom_bar(aes(y = after_stat(count/tapply(count, x, sum)[x])), 
           position = "dodge") + 
  theme_bw()
Grupperat stapeldiagram med enkel summering (t.vä.) och gruppvis summering (t.hö.) till 100 procent

Figur 6.8: Grupperat stapeldiagram med enkel summering (t.vä.) och gruppvis summering (t.hö.) till 100 procent

Tolkningarna på vardera av dessa diagram skiljer sig åt och valet styrs av vilken sorts frågeställning som vi vill besvara med visualiseringen. En jämförelse av gruppernas fördelning skulle bli tydlig med en gruppvis summering, medan presentation av fördelningen i materialet kan visualiseras med den enkla summeringen.

6.3.2.1 Förtydliga diagrammet

Oavsett vilket sätt att summera staplarna som används ser de inte alls tydliga ut. Vi förtydligar till diagrammet med liknande hjälpfunktioner som tidigare stapeldiagram. Vi lägger till tydligare kantlinjer på staplarna, lägger till stödlinjer och etiketter, samt justerar utseendet på diverse texter samt ändrar skalan för y-axeln.

p <- ggplot(penguins) + 
  aes(x = island, fill = species) + 
  geom_bar(aes(y = after_stat(count/sum(count))), 
           position = "dodge",
           color = "black") + 
  theme_bw() + 
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_line(color = "gray70"),
        panel.grid.minor.y = element_line(color = "gray80"),
        plot.caption = element_text(face = "italic"),
        axis.title.y = element_text(angle = 0, vjust = 0.5, size = 11),
        axis.title.x = element_text(size = 11),
        axis.text = element_text(size = 10, color = "black")) +
  labs(x = "Ö", 
       y = "Andel", 
       caption = "Källa: Gorman, Williams, Fraser (2014)") +
  scale_y_continuous(expand = c(0,0),
                     breaks = seq(0, 0.4, by = 0.05),
                     limits = c(0, 0.4))

p

6.3.2.2 Färger

Det som också urskiljer ett grupperat stapeldiagram med det skapades tidigare är att vi nu har en legend till höger av diagramytan som innehåller ytterligare information som krävs för att läsa av diagrammet. Vi har fått olika färger på den valda fördelningsvariabeln som kopplas samman till de olika kategorierna. Dessa vill vi nu ändra tillsammans med att ändra lite information i legenden för att göra den tydligare.

För att skapa ett diagram som har en enhetlig och tydlig färgpalett kommer paketet RColorBrewer till användning. Ladda paketet med require(RColorBrewer) och titta på de olika färgkategorierna som finns att använda genom display.brewer.all(). Det rekommenderas att välja någon av de monokromatiska färgskalorna likt "Oranges" eller "Purples".

För att revidera utseendet på legenden och de använda färgerna används funktionen scale_X_manual() där X ersätts med den sorts gruppering som har gjorts för att skapa legenden, i detta fall fill. I values anges vilka färger som ska användas i diagrammet och där vill vi då använda någon palett från RColorBrewer genom brewer.pal()-funktionen. Argumentet n anger hur många färger vi vill ha och name anger vilker palett vi vill ta färgerna från.

p <- p + scale_fill_manual(name = "Art",
                           values = brewer.pal(n = 3, name = "Oranges"))

p

6.3.3 Histogram

Om variabeln istället är kvantitativ och vi vill presentera fördelningen av denna variabel, är histogram (eller lådagram) lämpligt att använda.

Likt tidigare diagram i R behöver vi först ange vilket datamaterial samt vilken variabel som vi ska visualisera.

p <- ggplot(penguins) + aes(body_mass_g)

När väl det är gjort måste vi på samma sätt som tidigare ange vilken form av visualisering som ska göras. För histogram använder vi geom_histogram(), med argumentet bin som styr hur många klassintervall vi vill ha. Om vi istället vill ange hur breda intervallen ska vara kan vi använda argumentet binwidth.

p <- p + geom_histogram(fill = "orange", 
                        color = "black",
                        bins = 10)

p

Vi kan också snygga till diagrammet med alla funktioner som vi tidigare använt för stapeldiagram.

p <- p + scale_y_continuous(expand = c(0,0), limits = c(0, 20)) +
  theme_bw() + theme(axis.title.y = 
                       element_text(angle = 0, 
                                    hjust = 1, 
                                    vjust = 0.5), 
                     plot.title = 
                       element_text(hjust = 0.5),
                     panel.grid.major.x = 
                       element_blank(),
                     panel.grid.minor.x = 
                       element_blank(),
                     panel.grid.major.y = 
                       element_line(color = "dark gray")) + 
  labs(y = "Antal", 
       x = "Kroppsvikt (g)", 
       caption = "Källa: Gorman, Williams, Fraser (2014)")

p
## Warning: Removed 7 rows containing
## missing values (`geom_bar()`).

6.3.4 Lådagram

Ett alternativ att presentera fördelningen för en kvantitativ variabel är lådagram. Denna visualiseringstyp lämpar sig bättre om det finns extremvärden i materialet då diagrammet utgår ifrån kvartiler.

Vi börjar strukturera ett lådagram på samma sätt som vi gjorde med histogrammet, dock behöver vi använda ett knep för att R ska skapa ett snyggt diagram. I aes() måste x = factor(0) som är ett sätt för R att skapa en tom kategorisk variabel. Lådagrammet skapas med geom_boxplot().

För att ta bort onödiga skalvärden och axelförklaring för den tomma variabeln som vi skapat används värdet NULL på de argument som vi vill ta bort, exempelvis breaks i scale_x_discrete().

p <- ggplot(penguins) + aes(x = factor(0), y = body_mass_g) +
  geom_boxplot(fill = "orange") +
  scale_x_discrete(breaks = NULL)

p

Snyggar till diagrammet som tidigare.

p <- p + theme_bw() + theme(axis.title.y = 
                              element_text(angle = 0, 
                                           hjust = 1, 
                                           vjust = 0.5), 
                            plot.title = 
                              element_text(hjust = 0.5),
                            panel.grid.major.x = 
                              element_blank(),
                            panel.grid.minor.x = 
                              element_blank(),
                            panel.grid.major.y = 
                              element_line(color = "dark gray")) + 
  labs(y = "Kroppsvikt (g)", 
       x = NULL, 
       caption = "Källa: Gorman, Williams, Fraser (2014)")

p

6.4 Samband mellan variabler

6.4.1 Spridningsdiagram

När ett datamaterial innehåller flera variabler kan det vara intressant att undersöka vilka (om några) variabler har ett samband med varandra. Detta kan göras på olika sätt, men visualisering i ett spridningsdiagram är ett sätt som möjliggör att se många olika typer av samband mellan två variabler.

Vi utgår ifrån tidigare datamaterial och fokuserar på de två kvantitativa variablerna alder och lon i aes(). Här bör vi välja variabler till de olika axlarna som medför en logisk tolkning av vilken variabel som förklarar den andra. Den förklarande variabeln, x, anser vi förklara responsvariabeln, y, och med dessa variabler är det mer logiskt att alder förklarar lon för en individ.

För att skapa ett spridningsdiagram används geom_point(). Argument som kan vara av intresse i denna funktion är color, shape eller size.

p <- ggplot(penguins) + aes(x = bill_length_mm, y = bill_depth_mm) + geom_point()

p

Som vanligt lägger vi till lite extra kod för att ändra utseendet av diagrammet. När det kommer till stödlinjer och spridningsdiagram är syftet med diagrammet att se helheten, det generella sambandet mellan variablerna, mer än specifika värden för enstaka observationer. Detta betyder att stödlinjerna riskerar att ta för mycket fokus från diagrammet istället för att tillföra tydlighet. En lösning på detta är att försvaga styrkan på linjerna eller helt ta bort dem.

p <- 
  p + theme_bw() +
  theme(axis.title.y = 
          element_text(angle = 0, 
                       hjust = 1, 
                       vjust = 0.5), 
        plot.title = 
          element_text(hjust = 0.5),
        plot.subtitle = 
          element_text(hjust = 0.5),
        panel.grid.major.x = 
          element_line(color = "gray"),
        panel.grid.minor.x = 
          element_line(color = "light gray"),
        panel.grid.major.y = 
          element_line(color = "gray"),
        panel.grid.minor.y = 
          element_line(color = "light gray")) + 
  labs(x = "Näbblängd",
       y = "Näbbredd",
       caption = "Källa: Gorman, Williams, Fraser (2014)")
p

Då vi pratar om samband är det naturligt att gå vidare till en statistisk metod som kallas för regression som mer i detalj beskriver sambandet mellan variabler. Vi kommer inte gå igenom det så mycket i denna kurs men vi kan fortfarande visualisera den skattade regressionslinje som fås med hjälp av en metod som kallas minsta kvadrat skattning. I R lägger vi till ett till geom-objekt till samma diagram. method = lm anger att vi vill skatta en linjär modell (linear model) och se = FALSE anger att vi inte vill visa s.k. konfidensband.

p + geom_smooth(formula = y~x,method = lm, se = FALSE)

6.4.1.1 Visualisering av olika datamaterial i samma diagram

Om extremvärden skulle finnas i datamaterialet kommer sambandet (och en inritad regressionslinje) riskera att förskjuta det generella samband som finns. Observera att det i praktiken inte är så lätt att bara plocka bort extremvärden från datamaterialet utan en djupare dykning i orsakerna till detta värde. Är extremvärden en felinmatning eller är det ett riktigt värde som är en del av målpopulationen? För att visa hur vi kan använda olika datamaterial i samma diagram kommer vi göra det naïva och plocka bort dessa.

I detta skede av er utbildning rekommenderas att ni identifierar dessa punkter i diagrammet och manuellt tar bort dessa ur data i Excel, sparar en ny fil med nytt namn, och importerar detta nya material till R och sparar det som ett nytt objekt.

Det första vi måste göra för att diagrammet ska bli tydligt är att skapa en grupp (och tillhörande legendrad) för vardera regressionslinje. Detta görs genom att använda aes(color = "gruppnamn") inuti geom_smooth(formula = y~x,). Vi ser nu att en legend lagts till i diagrammet med det angivna namnet på linjen som vi skrivit.

p <- 
  p + geom_smooth(formula = y~x,aes(color = "med_extrem"), 
                  method = lm, 
                  se = FALSE)

p 

För att lägga till den nya regressionslinjen utan extremvärden anges i geom_smooth(formula = y~x,) ett nytt data-objekt. Linjen kommer då ritas med samma variabler som angivits innan men utgå från detta materials värden, som saknar de extremvärden som man kan urskilja i materialet.

p <- 
  p + geom_smooth(formula = y~x,data = penguins_extrem,
                  aes(color = "utan_extrem"),
                  method = lm,
                  se = FALSE)
p

Legenden kan behöva förtydligas lite och här får vi återigen användning av de gruppnamn som angetts tidigare i koden. Argumentet name ger en bättre titel på legenden och i values kan vi i vektorn säga specifikt vilka grupper som vi vill ha vissa färger likt "gruppnamn" = "färg". Vi vill också ange bättre etiketter på dessa grupper och detta görs med labels-argumentet.

p <- 
  p + scale_color_manual(name = "Datamaterial",
                         values = c("med_extrem" = "black",
                                    "utan_extrem" = "orange"),
                         labels = c("med_extrem" = "Hela materialet",
                                    "utan_extrem" = "Utan extremvärden"))

p

6.4.1.2 Extra visualisering

Det kanske också kan vara intressant att peka ut vilka observationer som plockas bort vilket kan göras genom att skapa ytterligare ett datamaterial med enbart de valda extremvärdena. Vi kan då lägga till ett till geom_point() till diagrammet där vi ändrar shape till någon annan symbol som tydliggör att dessa har plockats bort.

p + geom_point(data = penguins_extrem_points,
               shape = "x",
               size = 4)