Exploratory Data Analysis

Wat is EDA?

EDA is een stap in het gegevensanalyseproces, waarbij een aantal technieken worden gebruikt om de gebruikte gegevensset beter te begrijpen. ‘De dataset begrijpen’ kan verwijzen naar een aantal dingen, waaronder maar niet beperkt tot…

  • belangrijke variabelen extraheren

  • nutteloze variabelen achterlaten

  • outliers, ontbrekende waarden of menselijke fouten identificeren

  • relatie(s), of het gebrek daaraan, tussen variabelen begrijpen

Uiteindelijk, het maximaliseren van uw inzichten in een dataset en het minimaliseren van mogelijke fouten die later in het proces kunnen optreden.

Waarom EDA?

Heb je ooit gehoord van de uitdrukking “garbage in, garbage out”? Met EDA is het meer zoiets als “garbage in, uitvoeren van EDA, mogelijk garbage out.” Door EDA uit te voeren, kun je van een bijna bruikbare dataset een volledig bruikbare dataset maken.

Variabelen begrijpen

Aan de hand van enkele voorbeelden leggen we uit wat we hieronder verstaan.

 

#Import Libraries
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
import seaborn as sns
from sklearn import datasets
data =datasets.load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33

Met de head methode kunnen we snel de eerste rijen van een dataframe bekijken. Een dataframe kan je bezien als equivalent aan een databank tabel maar dan in memory.

 

We hebben ook nog de volgende eerste lijn hulp methodes om onze data beter te leren kennen.

.shape geeft het aantal rijen terug en het aantal kolommen .columns naam van alle kolommen

df.shape
(506, 13)
df.columns
Index(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX',
       'PTRATIO', 'B', 'LSTAT'],
      dtype='object')

Nu we ongeveer een zicht krijgen op het aantal kolomen en rijen kunnen we verder de data zelf gaan bekijken.

.nunique(axis=0) retourneert het aantal unieke waarden voor elke variabele.

.describe() geeft een samenvatting van het aantal, het gemiddelde, de standaarddeviatie, min en max voor numerieke variabelen.

df.nunique(axis=0)
CRIM       504
ZN          26
INDUS       76
CHAS         2
NOX         81
RM         446
AGE        356
DIS        412
RAD          9
TAX         66
PTRATIO     46
B          357
LSTAT      455
dtype: int64
# apply code is enkel voor formattering van het resultaat
df.describe().apply(lambda s: s.apply(lambda x: format(x, 'f')))
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000
mean 3.613524 11.363636 11.136779 0.069170 0.554695 6.284634 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 12.653063
std 8.601545 23.322453 6.860353 0.253994 0.115878 0.702617 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 7.141062
min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 1.730000
25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 6.950000
50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 11.360000
75% 3.677083 12.500000 18.100000 0.000000 0.624000 6.623500 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 16.955000
max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 37.970000
df.RAD.unique()
array([ 1.,  2.,  3.,  5.,  4.,  8.,  6.,  7., 24.])

Data relatie

We gaan kijken of er correlaties zijn de verschillende eigenschappen van de data. Sommige modellen zijn gevoelig als er bij de voorspellende eigenschappen een te hoge correlatie is. Er wordt dan aangeraden om kolommen die correleren te verwijderen. We gebruiken een correlatie matrix om een eerste zicht te krijgen op de correlaties tussen de features.

# calculate correlation matrix
corr = df.corr()
# plot the heatmap
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))
<AxesSubplot:>
_images/eda_13_1.png

Eens we een correlatie matrix hebben kunnen we verder kijken naar de relaties tussen de verschillende features.

df.plot(kind='scatter', x='LSTAT', y='RM')
<AxesSubplot:xlabel='LSTAT', ylabel='RM'>
_images/eda_15_1.png

We kunnen als we niet teveel dimensies hebben via tooling ook alles visualiseren.

sns.pairplot(df)
<seaborn.axisgrid.PairGrid at 0x7fd7742e9650>
_images/eda_17_1.png

Verder kunnen we ook nog naar de eigenschappen kijken van een feature op zichzelf

df['RM'].plot(kind='hist', bins=20, figsize=(12,6), facecolor='grey',edgecolor='black')
<AxesSubplot:ylabel='Frequency'>
_images/eda_19_1.png
df.boxplot('RM')
<AxesSubplot:>
_images/eda_20_1.png

Low code

Er zijn ook verschillende low code libraries die het EDA werk vergemakkelen. We demonstreren hier de library pandas-profiling.

# Standard Library Imports
from pathlib import Path

# Installed packages
import pandas as pd
from ipywidgets import widgets

# Our package
from pandas_profiling import ProfileReport
from pandas_profiling.utils.cache import cache_file

# Read the Titanic Dataset
file_name = cache_file(
    "titanic.csv",
    "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv",
)
df = pd.read_csv(file_name)

profile = ProfileReport(
    df, title="Titanic Dataset", html={"style": {"full_width": True}}, sort=None
)
profile