Exploratie met Pandas en visualisaties
# Begin je notebook altijd met het importeren van reeds geïnstalleerde relevante
packages
import pandas as pd #Pandas
import numpy as np #Numpy
from pydataset import data #In deze package staan voorbeeld datasets zoals deze ook beschikbaar zijn in R
import matplotlib #Matplotlib is een package waar je makkelijk veel verschillende soorten plots mee maakt
import matplotlib.pyplot as plt #Meest gebruikte onderdeel uit de matplotlib package
#specifieke line code om output van matplotlib te plotten in je notebook
%matplotlib inline
0- We gebruiken de beschikbare dataset airquality, die eerst ingeladen moet worden.
df = data("airquality")
1- Validatie van de data
Bekijk de afmetingen van het dataframe
df.shape
Bekijk hoe de data er uit zie
df.head(5)
Wat voor datatypen zitten er in de ingeladen dataset
df.dtypes
Bekijk expliciet hoeveel missende waarden er voorkomen in de dataset
df.isnull().sum()
Ozone 37
Solar.R 7
Wind 0
Temp 0
Month 0
Day 0
dtype: int64
Soms is het handiger om te kijken hoeveel procent van elke kolom leeg is. Dit geeft een beter beeld
print df.isnull().sum()/len(df)* 100
Algmene beschrijvende statistieken van de dataset
df.describe()
2- Exploratie
Bekijk als er datumranges in een dataset zitten, of deze compleet zijn
Dit kan visueel:
df.groupby('Month')['Day'].size()
Of meer gestandaardiseerd
- Maak een datum van de aanwezige datum-onderdelen in de dataset
- Maak met pandas een range van de minimale datum tot maximale datum (deze is dus volledig)
- Vergelijk de lengtes van deze twee variabelen om te concluderen of de range compleet is
df_dat =pd.to_datetime('2016/'+df['Month'].map(str)+'/'+df['Day'].map(str),format='%Y/%m/%d')
range_dat = pd.date_range(min(df_dat),max(df_dat))
print 'Is the time line complete?',len(df_dat) == len(range_dat)
Krijg een idee van wat de ranges in de dataset zijn en ook voor hun extreme waarden
df.boxplot(['Solar.R','Ozone','Wind','Temp'],return_type='axes');
Bepaal een aanpak voor de missende waarden, door de features met missende waarden te plotten en naar hun distributies te kijken
plt.figure(figsize=(15, 10))
plt.subplot(221)
plt.title('Lijn Grafiek Ozone')
plt.plot(df['Ozone']);
plt.subplot(222)
plt.title('Histogram Ozone')
plt.hist(df['Ozone'].dropna(),bins=30);
plt.subplot(223)
plt.title('Lijn Grafiek Solar')
plt.plot(df['Solar.R']);
plt.subplot(224)
plt.title('Histogram Solar')
plt.hist(df['S
olar.R'].dropna(),bins=30);
Aanpak 1: Interpoleren
plt.figure(figsize=(15, 10))
plt.subplot(211)
plt.title('Ozone')
a = df['Ozone'].interpolate()[df['Ozone'].isnull()]
plt.plot(df.index, df['Ozone'],'k',a.reindex(df.index) , 'r.');
plt.subplot(212)
plt.title('Solar.R')
b = df['Solar.R'].interpolate()[df['Solar.R'].isnull()]
plt.plot(df.index, df['Solar.R'],'k',b.reindex(df.index) , 'r.');
Aanpak 2: Gemiddelde gebruiken
plt.figure(figsize=(15, 10))
plt.subplot(211)
plt.title('Ozone')
a = df['Ozone'].fillna(np.mean(df['Ozone'].dropna()))[df['Ozone'].isnull()]
plt.plot(df.index, df['Ozone'],'k',a.reindex(df.index) , 'r.')
plt.subplot(212)
plt.title('Solar.R')
b = df['Solar.R'].fillna(np.mean(df['Solar.R'].dropna()))[df['Solar.R'].isnull()]
plt.plot(df.index, df['Solar.R'],'k',b.reindex(df.index) , 'r.')
Aanpak 3: Vorige waarden nemen -> Pad
plt.figure(figsize=(15, 10))
plt.subplot(211)
plt.title('Ozone')
a = df['Ozone'].fillna(method = 'pad')[df['Ozone'].isnull()]
plt.plot(df.index, df['Ozone'],'k',a.reindex(df.index) , 'r.')
plt.subplot(212)
plt.title('Solar.R')
b = df['Solar.R'].fillna(method = 'pad')[df['Solar.R'].isnull()]
plt.plot(df.index, df['Solar.R'],'k',b.reindex(df.index) , 'r.')
Er
is niet 1 juiste manier om missende waarden in te vullen. Vaak kun je
op basis van domeinkennis van de data het beste beslissen wat de beste
manier is. Anders is het visueel inspecteren van manieren zoals
hierboven een goede methodiek
df['Ozone'] = df['Ozone'].interpolate()
df['Solar.R'] = df['Solar.R'].interpolate()
Correlatie, plots en density bekijken
df[['Ozone','Solar.R','Wind','Temp']].corr()
pd.tools.plotting.scatter_matrix(df[['Ozone','Solar.R','Wind','Temp']], figsize=(15, 15), diagonal='kde');