Inleiding: Data Verkennen

Het visueel verkennen van een dataset wordt vooraf gegaan door een inhoudelijke verkenning van de data. Wat zit er in de set? Wat is de context van de gegevens uit de set? Zijn er zaken die moeten worden opgeschoond of verwijderd? Zijn er lege cellen?

Context

De dataset is afkomstig van Kaggle.com

Kaggle Datasets

Deze dataset wordt gebruikt om te voorspellen of een patiënt waarschijnlijk/mogelijk een beroerte krijgt op basis van invoerparameters zoals geslacht, leeftijd, verschillende ziekten, rookstatus en woongebied *stedelijk of landelijk).

Attribuutinformatie (aangepast/opgeschoond):

  1. Geslacht: “Man”, “Vrouw”
  2. Leeftijd: leeftijd van de patiënt
  3. Hypertensie: 0 als de patiënt geen hypertensie heeft, 1 als de patiënt hypertensie heeft
  4. Hartziekte: 0 als de patiënt geen hartziekte heeft, 1 als de patiënt een hartziekte heeft
  5. Ooit getrouwd: “Ja” of “Nee”
  6. Werktype: “Overheidsbaan”,“Particulier” of “Zelfstandige”
  7. Woontype: “Landelijk” of “Stedelijk”
  8. Gemiddelde glucosegehalte: gemiddeld glucosegehalte in het bloed
  9. BMI: body mass index
  10. Rookstatus: “Ooit gerookt”, “Nooit gerookt”, “Rookt” of “Onbekend”*
  11. Herseninfarct: 1 als de patiënt een herseninfarct heeft (gehad) of 0 indien niet

In de oorspronkelijke dataset is “stroke” gebruikt als een overkoepelende term voor zowel een herseninfarct als een hersenbloeding.

Glucosegehalte is de hoeveelheid glucose (suiker) die in het bloed zit (patiënt is nuchter).

Omrekentabel

Bij een bloedsuikerwaarde:

        onder de 6,1 mmol/l - geen diabetes   (in de dataset 55 -108)
        tussen de 6,1 en 6,9 mmol/l - voorstadium van diabetes (in de dataset 108 -125 )
        boven de 6,9 mmol/l - diabetes (in de dataset >125)

In de dataset worden de gemiddelden waarden gegeven (55- 272).

Jongeren beneden 18 jaar zijn weggelaten uit de dataset. Zij worden met andere waarden (formule/berekeningen) ingedeeld bij de Body Mass Index, dat maakt ze onvergelijkbaar met de 18+ patiënten uit de dataset.

BMI is de verhouding van een (gezond) gewicht en de lengte van een persoon.

BMI grenzen (waarden):

        Lager dan 18,5 = Ondergewicht
        
        Vanaf 18,5 tot 25 = Gezond gewicht
        
        Vanaf 25 tot 30 = Overgewicht
        
        30 en hoger = Ernstig overgewicht (obesitas)

Niet-visuele Verkenning

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)
data <- herseninfarctdataset18jaar
  print(data)
## # A tibble: 4,158 × 11
##    Geslacht Leeftijd Hypertensie Hartziekte `Ooit Getrouwd` Werktype    Woontype
##    <chr>       <dbl>       <dbl>      <dbl> <chr>           <chr>       <chr>   
##  1 Vrouw          21           0          0 Nee             Particulier Landeli…
##  2 Man            42           0          0 Ja              Particulier Stedeli…
##  3 Man            66           0          0 Ja              Zelfstandi… Landeli…
##  4 Man            20           0          0 Nee             Particulier Stedeli…
##  5 Man            61           0          0 Ja              Particulier Landeli…
##  6 Vrouw          31           0          0 Ja              Overheidsb… Landeli…
##  7 Vrouw          39           0          0 Ja              Particulier Stedeli…
##  8 Man            78           0          0 Ja              Zelfstandi… Stedeli…
##  9 Vrouw          55           0          0 Ja              Particulier Stedeli…
## 10 Vrouw          55           0          0 Ja              Particulier Stedeli…
## # ℹ 4,148 more rows
## # ℹ 4 more variables: GemSuikerspiegel <dbl>, BMI <dbl>, Rookstatus <chr>,
## #   HersenInfarct <dbl>
  summary(data)
##    Geslacht            Leeftijd      Hypertensie       Hartziekte    
##  Length:4158        Min.   :18.00   Min.   :0.0000   Min.   :0.0000  
##  Class :character   1st Qu.:36.00   1st Qu.:0.0000   1st Qu.:0.0000  
##  Mode  :character   Median :51.00   Median :0.0000   Median :0.0000  
##                     Mean   :50.33   Mean   :0.1152   Mean   :0.0659  
##                     3rd Qu.:64.00   3rd Qu.:0.0000   3rd Qu.:0.0000  
##                     Max.   :82.00   Max.   :1.0000   Max.   :1.0000  
##  Ooit Getrouwd        Werktype           Woontype         GemSuikerspiegel
##  Length:4158        Length:4158        Length:4158        Min.   : 55.12  
##  Class :character   Class :character   Class :character   1st Qu.: 77.45  
##  Mode  :character   Mode  :character   Mode  :character   Median : 92.36  
##                                                           Mean   :108.24  
##                                                           3rd Qu.:115.90  
##                                                           Max.   :271.74  
##       BMI         Rookstatus        HersenInfarct    
##  Min.   :14.10   Length:4158        Min.   :0.00000  
##  1st Qu.:25.50   Class :character   1st Qu.:0.00000  
##  Median :29.20   Mode  :character   Median :0.00000  
##  Mean   :29.93                      Mean   :0.05916  
##  3rd Qu.:33.50                      3rd Qu.:0.00000  
##  Max.   :48.90                      Max.   :1.00000
  str(data)
## tibble [4,158 × 11] (S3: tbl_df/tbl/data.frame)
##  $ Geslacht        : chr [1:4158] "Vrouw" "Man" "Man" "Man" ...
##  $ Leeftijd        : num [1:4158] 21 42 66 20 61 31 39 78 55 55 ...
##  $ Hypertensie     : num [1:4158] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Hartziekte      : num [1:4158] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Ooit Getrouwd   : chr [1:4158] "Nee" "Ja" "Ja" "Nee" ...
##  $ Werktype        : chr [1:4158] "Particulier" "Particulier" "Zelfstandige" "Particulier" ...
##  $ Woontype        : chr [1:4158] "Landelijk" "Stedelijk" "Landelijk" "Stedelijk" ...
##  $ GemSuikerspiegel: num [1:4158] 55.1 55.2 55.2 55.2 55.3 ...
##  $ BMI             : num [1:4158] 21.8 27 28.9 20.4 33.2 32.5 31.5 29.6 27.1 24.8 ...
##  $ Rookstatus      : chr [1:4158] "Nooit gerookt" "Nooit gerookt" "Onbekend" "Nooit gerookt" ...
##  $ HersenInfarct   : num [1:4158] 0 0 0 0 0 0 0 0 0 0 ...

Visuele Verkenning

Kleur

Toegepast kleurpalet:
Figuur 2. Kleurpalet.

Figuur 2. Kleurpalet.

Figuur 3. Kleurpalet toegepast op illustratie.
Figuur 3. Kleurpalet toegepast op illustratie.

Stam- en Bladplotdiagram

## 
##   The decimal point is at the |
## 
##   14 | 12
##   15 | 07
##   16 | 001467799
##   17 | 0113334666667999
##   18 | 123333455667777888
##   19 | 1112222223333444444445555555666777788888888889999
##   20 | 00000001111111111112222222222233333334444444444444455555555555666666+11
##   21 | 00000000000001111111111112222222223333333333333444444444444444444555+50
##   22 | 00000000000011111111111111111111222222222222222222222222222333333333+75
##   23 | 00000000000000000000001111111111111111112222222222222223333333333333+115
##   24 | 00000000000000000000000011111111111111111111111111222222222222222222+149
##   25 | 00000000000000000000000001111111111111111111111111111111222222222222+140
##   26 | 00000000000000000000000001111111111111111111111111111111111222222222+206
##   27 | 00000000000000000000000000000000000111111111111111111111111112222222+210
##   28 | 00000000000000000000000000000000011111111111111111111111111111111222+232
##   29 | 00000000000000000000000000000111111111111111111111111111111112222222+211
##   30 | 00000000000000000000000000000000000001111111111111111111111111111111+185
##   31 | 00000000000000000000001111111111111111111111111222222222222222222222+165
##   32 | 00000000000000000000001111111111111111111111111112222222222222222222+135
##   33 | 00000000000000011111111111111111111111112222222222222222222333333333+96
##   34 | 00000000000000111111111111111222222222222222233333333333333333444444+77
##   35 | 00000000000111111112222222222222222333333333333444444444555555555555+58
##   36 | 00000000000111111122222222222233333333333334444444444555566666666666+27
##   37 | 00000000001111111222222222333333333333444444444445555555556666666667+14
##   38 | 00000000000111111111122222222233444444555555566666666677777777788888+1
##   39 | 00000001111111122222222233333344444444445555555566666666677777777888
##   40 | 00000011111111122222222233333333444444444555555678888888999999
##   41 | 0001111112222222233333444555555556666677777888888888899999
##   42 | 000111222222233333444445566667777888999
##   43 | 00000011112222333334444446666777777788888888899999999
##   44 | 00001222233345555667777788889
##   45 | 000001122233334444555577899
##   46 | 0000112234556899
##   47 | 1334555666889
##   48 | 0123345578999

Figuur 4.Een Stem and Leaf Plot of Stam- en Bladplotdiagram. Hoe moet deze visualisatie gelezen worden? De waarde links van de verticale lijn 14|12 is de BMI waarde als geheel getal, na de lijn is het getal achter de “komma”. Dus er is een waarde 14,1 en 14,2.

Beeswarm

Figuur 5. 4158 Personen in de dataset.

Figuur 5. 4158 Personen in de dataset.

Figuur 6. Verzameling Mannen en Vrouwen.

Figuur 6. Verzameling Mannen en Vrouwen.

Figuur 7. BMI waarden indeling,

Figuur 7. BMI waarden indeling,

De categorie “Gezond Gewicht” bevat minder personen, dan de categorie “Overgewicht” en “Obesitas”.

Verzameling Visualisaties

Figuur 8. Verdeling van het aantal mannen en vrouwen in de dataset.

Figuur 8. Verdeling van het aantal mannen en vrouwen in de dataset.

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)
data <- herseninfarctdataset18jaar
#library(dplyr)

par(las=1,bty="n")
hist(data$Leeftijd,labels=TRUE,breaks=3,ylim=c(0,1600),main= "Histogram met de Spreiding van Leeftijden (18 - 82 jaar)",
adj=0,col="#A4776450",ylab="Aantal Mensen", xlab="Leeftijd",xlim=c(0,100),yaxt="n",border="#A4776405")
rug(data$Leeftijd,col="#ff33a6",lwd=2) 
Figuur 9. Histogram met leeftijdsgroepen.

Figuur 9. Histogram met leeftijdsgroepen.

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)data <- herseninfarctdataset18jaar
library(dplyr)


histPercentage<-function(x,...) {
  H<-hist(x,plot=FALSE)
  H$density<-with(H,100 * density*diff(breaks)[1])
  labs<-paste(round(H$density), "%",sep="")
  plot(H,freq=FALSE, labels=labs, ylim=c(0,1.08*max(H$density)),...)
}

par(las=1,bty="n")
histPercentage(data$Leeftijd,col="#A4776450",main="Histogram met het percentage mensen per leeftijdsgroep",adj=0,
               ,ylab="", xlab="Leeftijd in jaren",border="#A4776405",yaxt="n",
               xaxp=c(0,100,10))
rug(data$Leeftijd,col="#ff33a6",lwd=2) # toont de datapunten 
Figuur 10. Histogram met percentages leeftijdsgroepen.

Figuur 10. Histogram met percentages leeftijdsgroepen.

par(las=1,bty="n")
hist(data$BMI,col="#A4776450",main="Histogram met BMI waarden",adj=0,
     ,ylab="", xlab="BMI waarden",yaxt="n",border="#33A8FF05",
     xaxp=c(0,100,50))
Figuur 11.Histogram van BMI waarden

Figuur 11.Histogram van BMI waarden

par(las=1,bty="n")
hist(data$BMI,main="Histogram en dichtheidsdiagram met BMI-waarde",adj=0,col="#A4776450",freq=FALSE,border="#33A8FF05")
rug(data$BMI,col="#ff33a6")
dx<-density(data$BMI)
lines(dx,lwd=2,col="#ff33a6")
Figuur 12. Standaard Histogram gecombineerd met een dichtheidsdiagram

Figuur 12. Standaard Histogram gecombineerd met een dichtheidsdiagram

Stripdiagram (stripchart)

  par(mfrow=c(1,2), bty="n") 
   stripchart(herseninfarctdataset18jaar$BMI, method = "jitter", col = "#A4776450",
               vertical = FALSE, pch = 19,cex=0.5,main="BMI waarden.")
    stripchart(herseninfarctdataset18jaar$GemSuikerspiegel, method = "jitter", col = "#A4776450",
              vertical = FALSE, pch = 19,cex=0.5,main="Gemiddelde Suikerspiegel.")
Figuur 13. Stripdiagrammen van de BMI waarden en de Gemiddelde Suikerspiegel.

Figuur 13. Stripdiagrammen van de BMI waarden en de Gemiddelde Suikerspiegel.

Een stripchart is een spreidingsdiagram met één variabele.

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)

bmi_categories<- cut(herseninfarctdataset18jaar$BMI,breaks = c(-Inf, 18.5, 25, 30, Inf), labels = c("<18.5", "18.5-25", "25-30", ">30"))
bmi_frequencies <- table(bmi_categories)
print(bmi_frequencies)
## bmi_categories
##   <18.5 18.5-25   25-30     >30 
##      38     883    1411    1826
  knitr::include_graphics("BMIwaarden.png")
Figuur 14. Stripdiagrammen van de BMI waarden.
Figuur 14. Stripdiagrammen van de BMI waarden.

Samenhang - Spreidingsdiagrammen

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)

#library(ContourFunctions)
x=(herseninfarctdataset18jaar$BMI)
y=(herseninfarctdataset18jaar$GemSuikerspiegel)

par(las=1,bty="n")
plot(x, y, main="Spreidingsdiagram van BMI waarde en\nGemiddelde Suikerspiegel",adj=0,ylim=c(50,300),
     xlab="BMI-waarde", ylab="Gemiddelde Suikerspiegel",cex=2,
     pch=19, col="#A4776450",)

# Toevoegen van een regressielijn
# abline(lm(y ~ x), col="#9a33fe", lwd=2)
abline(lm(y ~ x), col="#3285ff", lwd=2)
Figuur 15. Spreidingsdiagram: Samenhang (zwakke positieve) tussen BMI en Gemiddelde Suikerspiegel.

Figuur 15. Spreidingsdiagram: Samenhang (zwakke positieve) tussen BMI en Gemiddelde Suikerspiegel.

correlatie_spearman <-cor(herseninfarctdataset18jaar$BMI,herseninfarctdataset18jaar$GemSuikerspiegel,method="spearman")

#print(correlatie_spearman)
print(paste("De correlatie tussen BMI en de Gemiddelde Suikerspiegel is:", correlatie_spearman))
## [1] "De correlatie tussen BMI en de Gemiddelde Suikerspiegel is: 0.118738557927454"

Dit levert een zwakke positieve relatie op. Het ligt dicht bij 0, er bestaat vrijwel geen lineaire relatie tussen de variabelen. Ook als je de samenhang berekent van leeftijd, BMI waarde en Gemiddelde Suikerspiegel. In alle gevallen is er slechts sprake van een zwakke samenhang.

Mozaïekplot

De mozaïekplot is de grafische weergave van een kruistabel. En een uitbreiding van een stapeldiagram. Twee (kwalitatieve) variabelen worden met elkaar gekruist. De dikte en de hoogte van de stroken (segmenten) zijn evenredig met de aantallen in de bijhorende categorieën. Vaak gebruikt om “deel van een geheel” weer te geven.

library(readxl)
herseninfarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)

data <- data.frame(
  group = c(herseninfarctdataset18jaar$Geslacht),
  value = c(herseninfarctdataset18jaar$BMI)
)

data$group <- as.factor(data$group)
data$value <- as.numeric(data$value)

par(las=1)
mosaic_data <- table(data$group, data$value < 25) # gezond gewicht
mosaicplot(mosaic_data, main="BMI waarden lager dan 25 en Geslacht", xlab="Geslacht", 
           ylab="BMI waarde lager dan 25", color=TRUE)
Figuur 16. Mozaïekplot (marimekko chart).

Figuur 16. Mozaïekplot (marimekko chart).

knitr::include_graphics("Rplot04.png")

Figuur 16. Mozaïekplot (marimekko chart). R levert hier een te verbeteren grafiek op. De tweede versie van figuur 16 is beter (overzichtelijker) en van duidelijke annotatie voorzien.

Violinplot

infarctdataset18jaar <- read_excel("herseninfarctdataset18jaar.xlsx")
#View(herseninfarctdataset18jaar)

library(vioplot)

par(las=1,bty="n")
vioplot(herseninfarctdataset18jaar$BMI,col = "#33c3ff50", main="Violinplot BMI waarden",
        border = "NA", colMed = "#33c3ff", pchMed = 16,horizontal=FALSE,pch=19)
Figuur 17.Violinplot ( boxplot-variant).

Figuur 17.Violinplot ( boxplot-variant).

Bibliografie

Andrews, R. J. 2025a. “Don’t Say "Data Visualizations".” https://www.chartography.net/p/dont-say-data-visualizations.
———. 2025b. Info We Trust: How to Create Value with Data Graphics. Edited by Visionary Press. Second Edition, Remasatered Edition. San Francisco: Visionary Press.
Bethlehem, Jelke. 2022. Het Grafiekenboek. Amsterdam: Amsterdam University Press.
Kirk, Andy. 2025. Data Visualisation a Handbook Dor Data Driven Design. 3rd Edition. London: Sage.
Rennie, Nicola. 2025. “Working with Colours in r.” https://nrennie.rbind.io/blog/colours-in-r/.