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:
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")
| soortzorg | aantal_aanbieders | gemiddelde_winst | std_afwijking |
|---|---|---|---|
| gehandicaptenzorg | 47 | 23.53 | 14.86 |
| thuiszorg | 89 | 21.46 | 11.16 |
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)
| 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
| soortzorg | n | mean | std.dev |
|---|---|---|---|
| JBR | 2 | 34.7 | 10.5 |
| JZ-algemeen | 155 | 29.2 | 19.3 |
| JGGZ | 21 | 22.5 | 12.0 |
| 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 |
| soortzorg | aantal_aanbieders | gemiddelde_winst | std_afwijking |
|---|---|---|---|
| thuiszorg | 89 | 21.5 | 11.2 |
| gehandicaptenzorg | 47 | 23.5 | 14.9 |
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")
| 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")