In februari 2021 publiceerde het CIBG (Centraal Informatiepunt Beroepen Gezondheidszorg -> uitvoeringsorganisatie ministerie VWS) een aantal bestanden met daarin o.a. de winsten van de Wmo en Jeugd aanbieders. Het tv-programma Pointer besteedde in februari 2021 aandacht aan de hoge zorgwinsten binnen de Jeugdzorg. Op de site van Pointer staat het overzicht met de organisaties die meer dan 3% maken (zie Pointer link). De reden om zelf de analyse uit te voeren is voor filtering op winstpercentage en aanpassingen naar zorgsoorten, waaronder de gehandicapten- en thuiszorg.

De meest in het oog springende conclusie - voorlopig - is dat 3.7% van de aanbieders meer dan 10% winst heeft gemaakt (met minimaal 1 ton omzet in 2019). Hierbij zitten ook uitschieters van meer dan 50% (zie hiervoor de grafieken bij stap 3). Dit kan natuurlijk normaal zijn, want een aanbieder kan bv. in 2019 een hoge winst hebben terwijl de jaren daarvoor verlies is gedraaid. Echter kan ook jaren achter elkaar exorbitant hoge winsten zijn gemaakt. In dat geval is verdiepend onderzoek naar deze aanbieder interessant.

In onderstaande code zijn de eerdere analyses uitgebreid en visuals toegevoegd die ingaan op de relatie tussen winstpercentage en omzet.

Mede dankzij de opzet van de data-journalisten van Pointer (zie aflevering) voor de ’17 & ’18 analyse op de CIBG bronbestanden:

Stap 1: Inlezen bestanden en uitvoeren transformaties

Maken van de noodzakelijke dataframes gebaseerd op de 4 CIBG bestanden

Geen VOF-bedrijven (Vennootschap Onder Firma) in de lijst, omdat tien procent winst daar geen opvallend gegeven is. Eenmanszaken maken wel deel uit van de selectie

df_1 <- df_1[- grep("V.O.F.", df_1$c_naam),]
df_1 <- df_1[- grep("VOF", df_1$c_naam),]
df_1 <- df_1[- grep("vof", df_1$c_naam),]
df_1 <- df_1[- grep("VoF", df_1$c_naam),]

Verder zonder de 325 VOF’s

Aanbieders (bedrijfsnamen) koppelen dmv concerncode uit de 4 hierboven ingeladen tabbladen.

df <- df_1 %>% 
  left_join(df_2, by = "ConcernCode") %>% 
  left_join(df_3, by = "ConcernCode") %>% 
  left_join(df_4, by = "ConcernCode") %>% 
  select(concerncode = ConcernCode, 
         bedrijfsnaam = c_naam,
         plaats = c_plaats,
         jeugdzorg = `Q_TypeJZ_Ans_TypeJZ#51`,
         jeugdzorgJBR = `Q_TypeJZ_Ans_TypeJZ#52`,
         geestelijkegezondheidszorg = `Q_TypeWTZi_Ans_TypeWTZi#8`,
         gehandicaptenzorg = `Q_TypeWTZi_Ans_TypeWTZi#10`,
         thuiszorg = `Q_TypeWTZi_Ans_TypeWTZi#13`,
         omzet2019 = jeu10900_jeu10900,
         winst2019 = jeu11500_jeu11500,
         personeelskostentotaal2019 = jeu10900_jeu10900,
         personeelskostenoverig2019 = jeu13241_jeu13241,
         omzet2018 = jeu10800_jeu10801,
         winst2018 = jeu11500_jeu11501)

1307 aanbieders binnen 5 sectoren blijven over van de in totaal 4607 ingeladen aanbieders (28,4%). Na matchen en selectie op 5 sectoren blijkt dus dat 3300 aanbieders bijvoorbeeld actief zijn binnen Wlz of Zvw.

Aanmaken kolommen met percentages (1) winst, (2) kosten inhuur als deel van totale personeelskosten en (3) deel personeelskosten van totale omzet. Aanbieders die verlies hebben gemaakt (negatieve winst) of een ongeldige winstpercentages hebben (bv. meer dan 100% winst) zijn verwijderd.

df1 <- df %>% 
  mutate(perc_winst2019 = round(winst2019 / omzet2019 * 100, 1),
         perc_winst2018 = round(winst2018 / omzet2018 * 100, 1),
         perc_ingehuurd2019 = round(personeelskostenoverig2019 / personeelskostentotaal2019 * 100, 1),
         perc_personeel2019 = round(personeelskostentotaal2019 / omzet2019 * 100, 1)) %>% 
  filter(perc_winst2019 > 0 & perc_winst2019 <= 100) %>% 
  arrange(desc(perc_winst2019))

df1 <- df1 %>% 
  mutate(soortzorg =
           case_when(jeugdzorg== "ja" ~ "JZ-algemeen",
                     geestelijkegezondheidszorg == "ja" ~ "JGGZ",
                     jeugdzorgJBR == "ja" ~ "JBR",
                     gehandicaptenzorg == "ja" ~ "gehandicaptenzorg",
                     thuiszorg == "ja" ~ "thuiszorg")
  )

Er blijven 1214 aanbieders over

Selectie gehandicapten- en thuiszorg met zelfde omzet- en winstdrempel.

Reden: Een van de belangrijkste criteria van professor Accountancy Jeroen Suijs van Tilburg University voor mogelijke zorgcowboys is de grens van tien procent winst: zodra de winst ten opzichte van de omzet boven die tien procent zit, dan is dat een goede indicatie om dieper in dat bedrijf te duiken.

df_GT <- df1 %>% 
  select(bedrijfsnaam,
         perc_winst2019,
         perc_winst2018,
         plaats, 
         gehandicaptenzorg, 
         thuiszorg, 
         perc_ingehuurd2019, 
         perc_personeel2019, 
         omzet2019, 
         omzet2018, 
         winst2019, 
         winst2018, 
         personeelskostentotaal2019, 
         personeelskostenoverig2019) %>% 
  arrange(desc(perc_winst2019))

df_GT <- df_GT %>% 
  filter(omzet2019 >= 100000 & perc_winst2019 > 10) %>% 
  arrange(desc(perc_winst2019))

df_GT <- df_GT %>% 
  mutate(soortzorg = 
           case_when(gehandicaptenzorg== "ja" ~ "gehandicaptenzorg",
                     thuiszorg== "ja" ~ "thuiszorg")
         )

df_GT <- df_GT %>% 
  filter(!is.na(soortzorg))

Totaal 145 aanbieders met meer dan 100.000 omzet en 10% winst.

Selectie JZ incl.jeugdbescherming & -reclassering (JBR) met dezelfde omzet- en winstdrempel.

df_JZ <- df1 %>% 
  select(bedrijfsnaam, 
         perc_winst2019,
         perc_winst2018,
         omzet2019, 
         plaats, 
         jeugdzorg, 
         geestelijkegezondheidszorg, 
         jeugdzorgJBR, 
         perc_ingehuurd2019, 
         perc_personeel2019, 
         omzet2018, 
         winst2018, winst2019) %>% 
  arrange(desc(perc_winst2019)) %>% 
  filter(!is.na(jeugdzorg) |
           !is.na(geestelijkegezondheidszorg) |
           !is.na(jeugdzorgJBR))

df_JZ <- df_JZ %>% 
  filter(omzet2019 >= 100000 & omzet2019 <= 2000000 & perc_winst2019 > 10 & perc_winst2019 < 100) %>% 
  arrange(desc(perc_winst2019))

df_JZ <- df_JZ %>% 
  mutate(winst2018_absoluut = winst2018 * 1,
         winst2019_absoluut = winst2019 *1)

df_JZ <- df_JZ %>% 
  mutate(winst2019 = perc_winst2019 / 100,
         winst2018 = perc_winst2018 / 100)

df_JZ_18_19_meerdan10 <- df_JZ %>% 
  filter(omzet2019 >= 100000 & omzet2019 <= 2000000 & perc_winst2019 > 10 & perc_winst2019 < 100 & perc_winst2018 > 10) %>% 
  arrange(desc(perc_winst2018))

Uitsplitsing binnen JZ naar zorg soorten en overzicht maken voor: (1) JZ-algemeen, (2) jGGZ en (3) JBR (jeugdbescherming & - reclassering)

## # A tibble: 7 x 4
##   plaats         n mean_winst std.dev
##   <chr>      <int>      <dbl>   <dbl>
## 1 Eindhoven      5       29.7   21.5 
## 2 Nijmegen       4       15.7    2.14
## 3 Rotterdam      4       16.7    6.10
## 4 Amstelveen     3       14.6    4.87
## 5 AMSTERDAM      3       26.6   19.4 
## 6 Groningen      3       40.7   40.1 
## 7 Leeuwarden     3       16.3    3.82
df_GT_summary <- df_GT %>% 
  dplyr::group_by(soortzorg) %>% 
  dplyr::summarize(
    aantal_aanbieders = n(),
    gemiddelde_winst = mean(perc_winst2019), 
    std_afwijking = sd(perc_winst2019)
  ) 


df_GT_summary %>% 
  knitr::kable(caption = "Samenvatting", digits = 2) %>% 
  kableExtra::kable_styling(bootstrap_options = "striped", "hover")
Samenvatting
soortzorg aantal_aanbieders gemiddelde_winst std_afwijking
gehandicaptenzorg 47 23.53 14.86
thuiszorg 89 21.46 11.16

Stap 2: Lijst en tabellen

JZ-aanbieders in 2018 en 2019 met winstpercentages van meer dan 10% met omzet van meer dan 1 ton. Lijst van 50 aanbieders met hoogste % winst in 2019 en per totaalaantal per plaats

De 10 gehandicapten en thuiszorgaanbieders met in 2018 en 2019 de hoogste winsten (aflopend gesorteerd op 2019)

Lijst van gehandicapten en thuiszorg aanbieders >10% winst, aflopend gesorteerd op winst% 2019
bedrijfsnaam perc_winst2019 perc_winst2018 plaats winst2018 winst2019
Perspectief GZ b.v. 48.0 26.1 AMSTERDAM 574068 660604
Bijzonder Zorgenkind B.V. 43.2 28.8 SURHUISTERVEEN 418041 570844
Poetszorg, poetsen met een praatje 40.9 32.1 Deurne 309908 665079
Centrum Zorg en Welzijn B.V. 28.3 42.7 DEN HAAG 1139722 493757
Rosorum Zorgexploitatie B.V. 26.0 11.2 ARNHEM 767627 1081601
Verpleeghuis Salem (Stichting) 20.3 13.6 RIDDERKERK 2298676 2634915
Alkcare (Stichting) 19.7 14.3 OUDORP NH 1841129 1828811
Kind In Ontwikkeling / KIO (Stichting) 14.5 10.1 LEWEDORP 436368 455896
Oranjeborg (B.V). 11.9 21.4 Meppel 1930539 675134
Breederzorg B.V. 11.5 15.3 Uden 800096 549759

Gemiddelde winstpercentage en standaard afwijking voor de 3 Jeugdzorg soorten

Tabel 1: Overzicht Jeugdzorg
soortzorg n mean std.dev
JBR 2 34.7 10.5
JZ-algemeen 155 29.2 19.3
JGGZ 21 22.5 12.0
Per plaats aantal aanbieders uit de lijst
Tabel 2: Per plaats aantal Jeugdaanbieders >10% winst
plaats n mean_winst std.dev
Eindhoven 5 29.7 21.5
Nijmegen 4 15.7 2.1
Rotterdam 4 16.7 6.1
Amstelveen 3 14.6 4.9
AMSTERDAM 3 26.6 19.4
Groningen 3 40.7 40.1
Leeuwarden 3 16.3 3.8
Overzichtstabel voor gehandicapten- en thuiszorg
Tabel 3: Overzicht gemiddelde winst thuiszorg en gehandicaptenzorg
soortzorg aantal_aanbieders gemiddelde_winst std_afwijking
thuiszorg 89 21.5 11.2
gehandicaptenzorg 47 23.5 14.9

Stap 3: basis visualisaties

Jeugd - plot winstpercentage per aanbieder voor drie Jeugdzorg soorten

ggplot(data = df_JZ, mapping = aes(omzet2019, winst2019)) +
  geom_point(mapping = aes(color = soortzorg)) +
  scale_x_continuous(labels = scales::number) +
  scale_y_continuous(labels = scales::percent) +
  labs(x='omzet 2019', y='% winst 2019')

Jeugd - zelfde plot als (1.) maar met geschatte lijn door de datapunten

ggplot(data = df_JZ, mapping = aes(omzet2019, winst2019), color = "blue") +
  geom_point(mapping = aes(color = soortzorg)) +
  geom_smooth() +
  scale_x_continuous(labels = scales::number) +
  scale_y_continuous(labels = scales::percent)

Jeugd - alleen GGZ en Jeugdbescherming en -reclassering

df_JZ_JBR_GGZ %>% 
  drop_na(soortzorg) %>% 
  ggplot(aes(omzet2019, winst2019)) +
  geom_point(aes(color = soortzorg)) +
  geom_smooth() +
  geom_hline(yintercept = 0.12) +
  scale_x_continuous(labels = scales::number) +
  scale_y_continuous(labels = scales::percent,limits = c(0,1), expand=c(0,0)) +
  labs(x='omzet in 2019', y='% winst in 2019',
       title ='Relatie omzet en winst',
       subtitle = 'aanbieders Jeugdzorg NL in 2019',
       caption=expression(paste(italic(CIBG),
                                '2019 datasets uit',
                                ' open data')))

Gehandicapten en thuiszorg - overzicht gemiddelde winstpercentages en omzet voor gehandicapten en thuiszorg met verdeling winstpercentage in 2019

view(df_GT)

df_GT <- df_GT %>% 
  mutate(winst2019 = perc_winst2019 / 100)

df_GT <- df_GT %>% 
  filter(omzet2019 <= 400000000) %>% 
  mutate(winst2019 = perc_winst2019 / 100)

mean(df_GT$perc_winst2019) #15.2% gemiddelde winst 
## [1] 22.17426
median(df_GT$perc_winst2019)
## [1] 17.15
mean(df_GT$omzet2019) #18 mln gemiddelde omzet
## [1] 5455749
#histogram waaruit blijkt dat winst% bij aantal aanbieders meer dan 10% zijn
ggplot(df_GT, aes(perc_winst2019)) +
  geom_histogram(alpha=0.3, fill='blue', colour='blue', binwidth = .04) +
  geom_density(aes(y=0.045*10), colour="black", adjust=4)

Stap 4: Volledige lijst gehandicapten en thuiszorg (Jeugd is beschikbaar via https://pointer.kro-ncrv.nl/zorgbestuurders-keren-251-miljoen-euro-aan-winst-uit#gs.5r7n4j )

#Gehandicapten en thuiszorg

df_GT_lijst %>% 
  arrange(desc(perc_winst2019)) %>% 
  filter(perc_winst2019 > 10 & perc_winst2018 > 10 & winst2018 > 100000 & winst2019 > 100000) %>%
  knitr::kable(caption = "Lijst van gehandicapten en thuiszorg aanbieders >10% winst, aflopend gesorteerd op winst% 2019", digits = 2) %>% 
  kableExtra::kable_styling(bootstrap_options = "striped", "hover")
Lijst van gehandicapten en thuiszorg aanbieders >10% winst, aflopend gesorteerd op winst% 2019
bedrijfsnaam perc_winst2019 perc_winst2018 plaats winst2018 winst2019
Het Houvast B.V. 53.0 20.0 Tilburg 482248 448475
Felay Thuiszorg (B.V.) 48.0 32.5 Maassluis 378990 376069
Perspectief GZ b.v. 48.0 26.1 AMSTERDAM 574068 660604
DPC Thuiszorg B.V. 47.6 33.6 Almere 248127 192194
De Vossenburght (Eenmanszaak) 47.0 17.4 WINSCHOTEN 166816 212861
Duozorg Verpleegkundige Thuiszorg (Eenmanszaak) 45.4 28.1 KRIMPEN AAN DEN IJSSEL 133338 132326
Bijzonder Zorgenkind B.V. 43.2 28.8 SURHUISTERVEEN 418041 570844
Poetszorg, poetsen met een praatje 40.9 32.1 Deurne 309908 665079
Ilyada 39.3 21.4 Rotterdam 253858 373678
Thuiszorg Anahid B.V. 39.3 36.6 Almelo 565512 265690
Bea B.V. 38.5 13.8 Amsterdam 130636 220061
LucVal Care B.V. 36.9 27.6 ’s-Gravenhage 288307 338610
Dala Zorg B.V. 35.2 31.8 AMSTERDAM 450673 294041
Parelhoenderhoeve B.V. 33.7 25.5 Slootdorp 386184 310748
Thuiszorg Multicare Utrecht B.V. 30.4 26.3 Utrecht 347561 299975
Centrum Zorg en Welzijn B.V. 28.3 42.7 DEN HAAG 1139722 493757
Nedereind (Stichting) 27.7 21.5 NIEUWEGEIN 325358 220924
Thuiszorg Mozaiek B.V. 27.7 21.3 DEN HAAG 268433 228014
Rosorum Zorgexploitatie B.V. 26.0 11.2 ARNHEM 767627 1081601
Altenastaete Thuiszorg B.V. 25.9 41.4 NIEUWENDIJK 949457 450437
Stichting De Keerderberg 25.2 11.4 Cadier en Keer 263892 370354
Zuidam Beheer B.V. 23.9 20.6 DEN HAAG 307693 235364
Stichting Actolei 23.5 10.6 Zenderen 264342 345237
Bakx Zorg-professionals B.V. 23.1 18.5 Krimpen aan den IJssel 436882 163156
Woonzorgvoorziening de Meerenburgh 21.8 18.2 LEUR 130165 100571
De Steenuil Zorg B.V. 21.4 25.0 Enkhuizen 267164 157120
Yalisco Thuiszorg Groot Brabant B.V. 21.2 14.9 Bavel 298268 375829
Verpleeghuis Salem (Stichting) 20.3 13.6 RIDDERKERK 2298676 2634915
Het Naoberhuis B.V. 20.3 14.3 Eerste Exloërmond 148032 179764
Alkcare (Stichting) 19.7 14.3 OUDORP NH 1841129 1828811
ROZA Zorg (Stichting) 18.2 14.5 AMSTERDAM 252735 239590
Thuiszorg Slippens B.V. 17.5 17.0 SNEEK 233095 176645
Kleurrijk Zorg B.V. 17.4 20.7 UTRECHT 359540 283858
Bos en Meerzicht Verzorgd Wonen B.V. 16.0 23.5 OUDEMIRDUM 456472 176918
Exploitatie Hospice Alkmaar (Stichting) 15.6 15.4 ALKMAAR 267014 176519
Herman Frantsenhuizen (Stichting) 15.1 13.4 VLAARDINGEN 476748 405761
Fleurage Residence Bloemendaal B.V. 15.0 17.9 BLOEMENDAAL 308744 199793
Kind In Ontwikkeling / KIO (Stichting) 14.5 10.1 LEWEDORP 436368 455896
JonkersZorg (Stichting) 14.3 15.1 HOOGWOUD 239870 139277
Zorghuys Steenbergen B.V. 13.6 10.6 Steenbergen 124749 103866
Elzeneindhuis Oss(Stichting) 13.4 18.1 Heesch 487541 321553
Onvergetelijk Leven B.V. 12.9 15.8 HILVERSUM 185912 103070
De Baander B.V. 12.6 10.5 Hollandscheveld 101260 117179
Oranjeborg (B.V). 11.9 21.4 Meppel 1930539 675134
Good4Life (Stichting) 11.8 16.6 Utrecht 504666 380743
Breederzorg B.V. 11.5 15.3 Uden 800096 549759
Lentekind (Stichting) 10.9 17.4 Middelburg 301583 139831
DT::datatable(df_GT_lijst, filter = "top")