Imports, inlezen en cleanen data

In [1]:
%matplotlib inline
import pandas as pd
import seaborn as sns
import numpy as np
In [50]:
! head -5 export.csv # hoe ziet het spreadsheet er uit?
2018-01-23;De Brug;IJsselstein;groep 6/7;22;Klas naar huis sturen;
2018-01-26;Montessori;Hilversum;groep 678;26;Klas verdelen;
2018-01-22;De Brug;IJsselstein;groep plusklas;20;Anders of combinatie;
2018-01-19;De Brug;IJsselstein;groep 3/4;25;Klas naar huis sturen;
2018-01-25;De kleine planeet;deventer;groep 3/4/5;27;Parttimer komt extra dag terug;
In [2]:
lt=pd.read_csv('export.csv', sep=';', 
               error_bad_lines=False,header=None)
lt.head()
b'Skipping line 9843: expected 7 fields, saw 8\n'
Out[2]:
0 1 2 3 4 5 6
0 2018-01-23 De Brug IJsselstein groep 6/7 22 Klas naar huis sturen NaN
1 2018-01-26 Montessori Hilversum groep 678 26 Klas verdelen NaN
2 2018-01-22 De Brug IJsselstein groep plusklas 20 Anders of combinatie NaN
3 2018-01-19 De Brug IJsselstein groep 3/4 25 Klas naar huis sturen NaN
4 2018-01-25 De kleine planeet deventer groep 3/4/5 27 Parttimer komt extra dag terug NaN
In [5]:
# Cleaning

for c in [1,2,3,5]:
    lt[c]=lt[c].str.strip().str.lower()  # namen schoonmaken
lt[0]=pd.to_datetime(lt[0])   # datums goed
lt=lt[(lt[0].dt.year==2018)&(lt[0] <pd.Timestamp.today()) ]  # restrictie tot data uit 2018
lt= lt.drop(6, axis=1)  # weg met die gekke kolom
lt.columns = ['datum','school','plaats','groep','AantalKinderen','oplossing'] # even goede namen geven

lt.head()
Out[5]:
datum school plaats groep AantalKinderen oplossing
0 2018-01-23 de brug ijsselstein groep 6/7 22 klas naar huis sturen
1 2018-01-26 montessori hilversum groep 678 26 klas verdelen
2 2018-01-22 de brug ijsselstein groep plusklas 20 anders of combinatie
3 2018-01-19 de brug ijsselstein groep 3/4 25 klas naar huis sturen
4 2018-01-25 de kleine planeet deventer groep 3/4/5 27 parttimer komt extra dag terug

Hoe vaak welke oplossing?

In [6]:
lt.oplossing.value_counts()
Out[6]:
klas verdelen                            2389
parttimer komt extra dag terug           2318
klas naar huis sturen                    2243
onbevoegde voor de klas                  2037
directie of ib-er etc...                 1798
anders of combinatie                     1760
invaller via detacheringsbureau           724
gepensioneerde voor de klas               363
ouder met lesbevoegdheid voor de klas      38
Name: oplossing, dtype: int64
In [12]:
lt.oplossing.value_counts().plot(kind='barh');

Hoe vaak welke oplossing per kind?

  • Dus we willen per oplossing het totaal (som) aantal kinderen weten.
  • Misschien geeft dat wel een heel ander beeld.
  • Hoe heet die operatie in Database jargon?
In [11]:
lt.groupby('oplossing')['AantalKinderen'].sum().sort_values().plot(kind='barh');

Grote stad versus de rest van het land

We kijken of de oplossingen verschillen in de grote stad van de oplossingen elders. We nemen Amsterdam als voorbeeld.

De grafiek laat voor elke oplossing zien hoe vaak die procentueel gekozen wordt als er een klas uitvalt.

We zien dat de "noodoplossingen" veel vaker voorkomen in Amsterdam dan elders.

In [16]:
lt_ams=lt[lt.plaats.str.contains('amsterdam')].groupby('oplossing')['AantalKinderen'].sum()
lt_not_ams=lt[~lt.plaats.str.contains('amsterdam')].groupby('oplossing')['AantalKinderen'].sum()
ams_vs_rest=pd.DataFrame([lt_not_ams ,lt_ams  ] ).T
ams_vs_rest.columns=['Rest', 'Amsterdam']
ams_vs_rest.index.name='Oplossing'
ams_vs_rest.sort_values('Amsterdam', ascending=False)
Out[16]:
Rest Amsterdam
Oplossing
klas naar huis sturen 54110 15712
klas verdelen 44090 9717
onbevoegde voor de klas 38997 7945
directie of ib-er etc... 39056 4417
invaller via detacheringsbureau 13336 3656
anders of combinatie 39847 3452
parttimer komt extra dag terug 53319 3258
gepensioneerde voor de klas 7778 1119
ouder met lesbevoegdheid voor de klas 847 103
In [18]:
title='Percentage oplossingen per kind in een uitgevallen klas in Amsterdam en in de rest van Nederland'
(ams_vs_rest/ams_vs_rest.sum()).sort_values('Amsterdam').plot(kind='barh',title=title , figsize=(15,7));

Exploratory data analysis

  • Zitten er vreemde uitschieters in?
    • Vooral in de kolom met het aantal kinderen.
In [19]:
sns.kdeplot(lt.AantalKinderen);
In [34]:
lt.sort_values('AantalKinderen', ascending=False).head(10)
Out[34]:
datum school plaats groep AantalKinderen oplossing
11775 2018-03-14 basisschool achthoek amsterdam groep hele school 831 klas naar huis sturen
11785 2018-03-14 basisschool de ark haarlem groep hele school 754 klas naar huis sturen
12055 2018-03-14 openbare daltonbasisschool de horizon amsterdam groep hele school 704 klas naar huis sturen
11783 2018-03-14 albert schweitzer school amsterdam groep hele school 702 klas naar huis sturen
5563 2018-02-08 jenaplan wittevrouwen utrecht groep ib 654 directie of ib-er etc...
11781 2018-03-14 5e montessorischool watergraafsmeer amsterdam groep hele school 617 klas naar huis sturen
11784 2018-03-14 basisschool alfons ariens harderwijk groep hele school 574 klas naar huis sturen
12107 2018-03-14 obs de compositie almere groep hele school 540 klas naar huis sturen
11865 2018-03-14 basisschool boven 't ij montessorischool amsterdam groep hele school 537 klas naar huis sturen
12028 2018-03-14 oranje nassauschool badhoevedorp groep hele school 527 klas naar huis sturen
In [43]:
pd.concat([lt[lt.AantalKinderen<0] , lt[lt.AantalKinderen>100 ]])
Out[43]:
datum school plaats groep AantalKinderen oplossing
2958 2018-02-02 de wynroas harkema groep 4 -24 invaller via detacheringsbureau
3790 2018-02-05 de zonnewijzer amersfoort groep 1/2 -27 invaller via detacheringsbureau
6784 2018-02-12 abbs het podium amsterdam groep 4 -26 directie of ib-er etc...
11468 2018-03-12 obs de burght amsterdam groep 7 -28 anders of combinatie
13744 2018-03-29 sbo de tandem uden groep 7 -4 klas naar huis sturen
257 2018-01-22 montessorischool houten houten groep 1-8 geen gym 275 klas verdelen
747 2018-01-29 kindcentrum moerschans hulst groep alle leerlingen vd school 150 klas naar huis sturen
844 2018-01-29 pr. cathariba amalia den haag groep 1/2, 5, 7, 8 109 anders of combinatie
1245 2018-01-29 st. antonius mariënheem groep alle kinderen (gymlessen) 108 parttimer komt extra dag terug
3406 2018-01-31 cbs prinses máxima berkel en rodernijs groep ib - werk ligt 3 dagen stil 260 anders of combinatie
5563 2018-02-08 jenaplan wittevrouwen utrecht groep ib 654 directie of ib-er etc...
5773 2018-02-08 de schouw nieuwegein groep 1,1,4,5,6,7,7 175 anders of combinatie
7238 2018-02-13 de odyssee amsterdam groep verschillende groepen gym 125 parttimer komt extra dag terug
7256 2018-02-14 de tweemaster huizen groep alle, vakleerkracht gym 175 anders of combinatie
9809 2018-02-26 dr. w. dreesschool arnhem groep 1-2-3/6-7-8 138 anders of combinatie
10160 2018-03-05 vbs de regenboog eindhoven groep 5,5,8,3 120 klas naar huis sturen
11775 2018-03-14 basisschool achthoek amsterdam groep hele school 831 klas naar huis sturen
11776 2018-03-14 basisschool leonardo da vinci amsterdam groep hele school 200 klas naar huis sturen
11781 2018-03-14 5e montessorischool watergraafsmeer amsterdam groep hele school 617 klas naar huis sturen
11783 2018-03-14 albert schweitzer school amsterdam groep hele school 702 klas naar huis sturen
11784 2018-03-14 basisschool alfons ariens harderwijk groep hele school 574 klas naar huis sturen
11785 2018-03-14 basisschool de ark haarlem groep hele school 754 klas naar huis sturen
11786 2018-03-14 basisschool boe amsterdam groep hele school 501 klas naar huis sturen
11807 2018-03-14 curtevenne kortenhoef groep hele school 250 klas naar huis sturen
11808 2018-03-14 kentalis signis amsterdam groep hele school 112 klas naar huis sturen
11820 2018-03-14 obs de bloeiende perelaar zuidoostbeemster groep hele school 250 klas naar huis sturen
11831 2018-03-14 14e montesorrischool amsterdam groep hele school 421 klas naar huis sturen
11832 2018-03-14 1e montessorischool amsterdam groep hele school 304 klas naar huis sturen
11833 2018-03-14 basisschool 2e dalton amsterdam groep hele school 455 klas naar huis sturen
11834 2018-03-14 2e montesorrischool amsterdam groep hele school 400 klas naar huis sturen
... ... ... ... ... ... ...
11842 2018-03-14 7e montessorischool amsterdam groep hele school 497 klas naar huis sturen
11843 2018-03-14 6e montesorrischool amsterdam groep hele school 342 klas naar huis sturen
11844 2018-03-14 gbs veerkracht amsterdam groep hele school 175 klas naar huis sturen
11845 2018-03-14 9e montesorrischool amsterdam groep hele school 219 klas naar huis sturen
11846 2018-03-14 basisschool admiraal de ruyter amsterdam groep hele school 218 klas naar huis sturen
11849 2018-03-14 basisschool aldoende amsterdam groep hele school 390 klas naar huis sturen
11853 2018-03-14 basisschool amstelmeerschool amsterdam groep hele school 368 klas naar huis sturen
11855 2018-03-14 amsterdamse montessorischool amsterdam groep hele school 300 klas naar huis sturen
11859 2018-03-14 basisschool de archipel amsterdam groep hele school 277 klas naar huis sturen
11861 2018-03-14 basisschool as-siddieq noord amsterdam groep hele school 258 klas naar huis sturen
11862 2018-03-14 basisschool as-siddieq oost amsterdam groep hele school 335 klas naar huis sturen
11863 2018-03-14 basisschool as-siddieq amsterdam groep hele school 372 klas naar huis sturen
11864 2018-03-14 basisschool asvo amsterdam groep hele school 343 klas naar huis sturen
11865 2018-03-14 basisschool boven 't ij montessorischool amsterdam groep hele school 537 klas naar huis sturen
11910 2018-03-14 pcb de ark almere groep hele school 176 klas naar huis sturen
11919 2018-03-14 hoflandschool mijdrecht groep hele school 180 klas naar huis sturen
11980 2018-03-14 14e montessorischool amsterdam groep hele school 456 klas naar huis sturen
11993 2018-03-14 dr.e.boekmanschool amsterdam groep hele school 420 klas naar huis sturen
12028 2018-03-14 oranje nassauschool badhoevedorp groep hele school 527 klas naar huis sturen
12055 2018-03-14 openbare daltonbasisschool de horizon amsterdam groep hele school 704 klas naar huis sturen
12062 2018-03-14 het kerspel hoogkarspel groep hele school 340 klas naar huis sturen
12096 2018-03-14 15e montessori maas&waal amsterdam groep hele school 325 klas naar huis sturen
12107 2018-03-14 obs de compositie almere groep hele school 540 klas naar huis sturen
12117 2018-03-14 pcbs de fontein den helder groep hele school 260 klas naar huis sturen
12337 2018-03-14 de wingerd zwaag groep hele school 371 klas naar huis sturen
12338 2018-03-14 de ichthus hoorn groep hele school 110 klas naar huis sturen
12447 2018-03-14 het mozaïek houten groep hele school 220 klas naar huis sturen
12500 2018-03-14 de zonheuvel driebergen groep alle 223 klas naar huis sturen
12637 2018-03-14 obs burght amsterdam groep hele school 497 klas naar huis sturen
12730 2018-03-14 boulevard410 amersfoort groep hele school 225 klas naar huis sturen

62 rows × 6 columns

2018-03-14 , wat is dat voor dag?

  • Is dat de dag met de meeste kinderen niet naar school?
  • heel veel hele scholen tegelijk, is dat soms een stakingsdag?
In [49]:
lt.groupby('datum')['AantalKinderen'].sum().sort_values(ascending=False).head(5)
Out[49]:
datum
2018-03-14    19963
2018-02-02    15317
2018-02-08    14831
2018-02-05    13896
2018-02-06    12625
Name: AantalKinderen, dtype: int64

Hetzelfde maar nu per uitgevallen klas

In [57]:
ams_vs_rest=pd.DataFrame([lt_not_ams[5].value_counts(),lt_ams[5].value_counts()] ).T
ams_vs_rest.columns=['Rest', 'Amsterdam']
ams_vs_rest.index.name='Oplossing'
ams_vs_rest.sort_values('Amsterdam', ascending=False)
Out[57]:
Rest Amsterdam
Oplossing
Klas verdelen 1971 435
Onbevoegde voor de klas 1709 347
Directie of IB-er etc... 1618 193
Klas naar huis sturen 2084 177
Invaller via detacheringsbureau 569 155
Anders of combinatie 1617 152
Parttimer komt extra dag terug 2215 125
Gepensioneerde voor de klas 318 47
Ouder met lesbevoegdheid voor de klas 34 4
In [59]:
title='Percentage oplossingen per uitgevallen klas in Amsterdam en in de rest van Nederland'
(ams_vs_rest/ams_vs_rest.sum()).sort_values('Amsterdam').plot(kind='barh',title=title );

Plotly opdracht

Maak een interactieve tabel waarin je een plaats (of een school) kunt kiezen, en die wordt dan vergeleken met de rest.

Hier zijn allerlei varianeten op te verzinnen.

  • regios tegen elkaar
  • soort klas tegen andere soort

Pas op, er zitten gekke waardes in het aantal leerlingen

In [67]:
lt_ams[4].plot()
lt_ams[4].describe()
lt[lt[4]>100].head()
Out[67]:
0 1 2 3 4 5 6
257 2018-01-22 Montessorischool Houten Houten groep 1-8 geen gym 275 Klas verdelen NaN
747 2018-01-29 Kindcentrum Moerschans Hulst groep alle leerlingen vd school 150 Klas naar huis sturen NaN
844 2018-01-29 Pr. Cathariba Amalia Den Haag groep 1/2, 5, 7, 8 109 Anders of combinatie NaN
1245 2018-01-29 St. Antonius Mariënheem groep alle kinderen (gymlessen) 108 Parttimer komt extra dag terug NaN
3406 2018-01-31 CBS Prinses Máxima Berkel en Rodernijs groep ib - werk ligt 3 dagen stil 260 Anders of combinatie NaN
In [76]:
sns.kdeplot( lt[4]);
In [ ]: