Belgen op Titanic deel 1: de data masseren

Als er al één scheepsramp is die tot de verbeelding spreekt dan is het de Titanic. Een onzinkbaar schip op de eerste reis al te pletter vaart op een ijsrots... Het was een grote ramp, maar wel een erg mediagenieke. En dat betekent dat er veel info over te vinden is. De passagiersdata van de Titanic worden zelfs standaard meegeleverd Seaborn, een statistisch pakket in Python. Per passagier weet je met deze dataset of ie het overleefd heeft, in welke klasse hij reisde, het geslacht, de leeftijd, of ie alleen reisde en waar ie is opgestapt.

Maar ik laat deze kant-en-klare dataset links liggen, want één essentiel stuk info ontbreekt: de nationaliteit van de passagiers. En dat is net boeiend, want ik zou graag zien hoe de Belgische passagiers het ervanaf hebben gebracht in vergelijking met de rest van de Titanicreizigers. En dus moeten we op zoek naar een andere dataset.

Wikipedia to the rescue

Op Wikipedia vinden we een passagierslijst van de Titanic die ook de herkomst van de passagiers benoemt. Dat is al een goed vertrekpunt.

Maar er zijn een aantal problemen met deze dataset:

  • De overlevenden in deze dataset zijn aangeduid met een kleurtje. Dat is geen werkbaar formaat. We gaan een aparte kolom moeten maken met geëncodeerd 0=overleden, 1=overlevend.
  • Er is geen aparte kolom met het geslacht van de passagiers. Nochtans een belangrijke variabele in een omgeving waar de wet ‘vrouwen en kinderen eerst’ geldt. In de kolom ‘Name’ staat wel een aanspreking zoals ‘Mr’, ‘Miss’ en ‘Mrs’. Dus met een beetje werk kunnen we wel het geslacht afleiden.
  • De herkomst is inconsistent geëncodeerd. Bij de passagiers van derde klasse is er een kolom ‘hometown’ en ‘home country’, terwijl die gegevens bij de andere passagiers allemaal samen in één kolom staan.

Zoals je ziet: de dataset bevat alle nodige gegevens, maar er is wat masseerwerk nodig voor ze werkbaar zijn.


De dataset in de juiste vorm masseren

1. Kleurcodes van HTML omzetten in een kolom

We zitten dus met een html-tabel die de overlevenden aanduidt in het blauw en de dodelijke slachtoffers in het wit. Hoe kan je dat in godesnaam omzetten in een kolom met nullen en enen? We gaan het onszelf niet moeilijk maken en laten Excel deze zooi opkuisen. We kopiëren en plakken alles in een spreadsheet en laten Excel sorteren op kleur. Excel kan dat. En als ik dan alles opsla als csv-bestand, kan ik het daarna met Python gaan inlezen.

In Excel kan je sorteren op celkleur. Dan kan je makkelijk naast alle blauwe rijen een 1 zetten en naast alle wite cellen een 0. Een beetje handwerk, maar niets te moeilijk.

2. Gegevens van de Belgen updaten

Het is altijd goed om sanity checks te doen op je data. En de gegevens van de Belgen kunnen we vergelijken met de gegevens die journalisten al verzameld hebben over de Belgen aan boord van de Titanic. En ook die data vinden we gewoon op Wikipedia. En blijkt dat er toch een aantal discrepanties in zitten. Zo is de woonplaats van alle De Messemaekers fout. Mathilde Pede staat er niet in als een Belg en de leeftijd van Theodoor De Mulder verschilt. Dus die gegevens vervangen we door de Belgische gegevens.

3. Leeftijden met een ‘m’ fatsoeneren

Milvina Dean (rechts), de jongste passagier van Titanic, was 2 maand oud. Ze overleefde.

Er waren ook kleine kinderen aan boord van de Titanic. In de kolom met de leeftijden staat er daarom hun leeftijd uitgedrukt in maanden, met een ‘m’ erachter. We maken even een nieuwe kolom maanden, zetten daarin alle waarden met een ‘m’ over en veranderen de leeftijd in jaren in nul.

Zo, nu is onze Excel handmatig opgekuist. Omdat elke van die bewerkingen maar over een klein aantal subjecten ging, was dat werk nog behapbaar. Maar voor de heavy lifting van onze datamassage gaan we verdergaan met Python. En dus slaan we het Excel-bestand op als een csv. Die laden we in mat Pandas.

En zo ziet de dataframe er nu uit. Of toch de eerste vijf lijnen:

Het dataframe zoals het eruit ziet in Pandas

4. Geslacht van de passagiers afleiden

We hebben dus geen kolom met geslacht. Jammer, want in de tijd van de Titanic was de regel bij scheepsrampen dat vrouwen en kinderen eerst van boord mogen. En dan is het wel belangrijk om te weten welk geslacht iemand heeft.

Gelukkig kunnen we het geslacht afleiden uit de aanspreektitel. Het veld ‘Name’ heeft volgende vorm: ‘achternaam, titel voornaam’.

Uit de naam ‘Abbing, Mr. Anthony’ kunnen we het geslacht van de passagier herkennen.

Met een simpele regex-zoekfunctie kunnen we die aanspreektitels uitpuren en in een aparte kolom dumpen. En we pakken dat aan in verschillende stappen:

  • Sanity check: heeft iedereen zo’n aanspreektitel?
  • Welke zijn de verschillende aanspreektitels die er zijn?
  • Van alle verschillende aanspreektitels bepalen we of ze mannelijk zijn of vrouwelijk.
  • We voegen een nieuwe kolom toe die de aanspreektitel omzet in een waarde ‘Male’ of ‘Female’.

Er blijken nogal wat verschillende aanspreektitels in de dataset te zitten: Mr, Mrs, Miss, Master, Doña, Colonel, Reverend, Dr, Major, Father, Captain, Lady, Sir, Countess en Don. Mensenlief, dat zijn er veel! Maar niets onoverkomelijk.

Toch is er één probleem: die dokterstitel, dat kunnen even goed vrouwen als mannen zijn. Dus moeten we alle dokters manueel bekijken. Bij de enige vrouwelijke dokter veranderen we de aanspreking naar ‘drmrs’. Dat is een aanspreking die niet bestaat, maar goed. Duidelijk is het wel.

Van de lijst die we nu hebben, maken we een lijstje met de aanspreektitels in een kolom en het label ‘Male’ of ‘Female’ in de tweede kolom.

Het geslacht dat bij elke van de 16 aanspreking hoort.

En nu brengen we alles samen in ons oorspronkelijke dataframe. We maken een nieuwe kolom met geslachten. Dat doen we met een ‘merge’-commando in Pandas. In SQL heet dat een ‘join-operation’ en de Excelfans onder u noemen het een ‘VLOOKUP’. En zo bepalen we het geslacht van meer dan 1.000 passagiers in een fractie van een seconde.

5. Land van herkomst extraheren

Enkel van de passagiers in derde klasse hebben we het land van herkomst in een aparte kolom. Voor alle andere passagiers staat die info mee verwerkt in de kolom ‘Hometown’, zoals bijvoorbeeld ‘Vancouver, British Columbia, Canada’. De gegevens zijn er, maar ze moeten er gewoon uitgepuurd worden met een regex.

Bij een sanity ckeck blijkt deze automatische conversie mislukt te zijn bij een 75-tal passagiers van Rusland en New York City. Maar eens ook die aangepast zijn, is de dataset helemaal klaar.

Wil je zelf ook eens met deze opgekuiste dataset aan de slag? Dan kan je hier de CSV downloaden. Doe gerust.

De Belgen op deTitanic

Zo, we hebben nu alle gegevens van alle passagiers op de Titanic in een vorm waarmee we aan de slag kunnen. En uit die gegevens, kunnen we deze (eerder trieste) feiten halen:

  • Er waren 25 Belgische passagiers aan boord. Zes ervan overleefden de ramp.
  • De jongste was een meisje van 10. Ze is niet geregistreerd op een van de reddingssloepen en heeft de ramp niet overleefd.
  • Geen enkele van de drie minderjarige Belgen overleefde.
  • De oudste Belgische passagier was 46 jaar. Hij heeft het ook niet gehaald.
  • De Belgen reisden vooral in derde klasse. Er waren twee eersteklassepassagiers, een tweedeklassereiziger en 22 derdeklassepassagiers.

In een volgende blogpost gaan we uitzoeken of we zinnige conclusies kunnen trekken als we de gegevens uitsplitsen naar klasse, geslacht en leeftijd. En we vergelijken de overlevingskansen van de totale reizigerspopulatie met die van de Belgen. Eens zien of de Belgen betere overlevingskansen hadden dan de anderen aan boord.