Exploration du Dataset
import pandas as pd
filePath = "../Datasets/advertising.csv"
df = pd.read_csv(filePath)
df.shape
df.head()
import matplotlib.pyplot as plt
%matplotlib inline
plt.subplot(2, 2, 1)
df['TV'].hist(bins = 100)
plt.subplot(2, 2, 2)
df['Newspaper'].hist(bins = 100)
plt.subplot(2, 2, 3)
df['Radio'].hist(bins = 100)
plt.subplot(2, 2, 4)
df['Sales'].hist(bins = 100)
plt.show()
On remarque que les variables 'Radio' et 'TV' sont distribuée d'une façon uniforme, tandis que la probabilité de la variable 'Newspaper' décroit d'une façon exponentielle. La variable 'Sales' semble avoir une distribution gaussienne.
plt.subplot(2, 2, 1)
plt.boxplot(df['Sales'])
plt.subplot(2, 2, 2)
plt.boxplot(df['Newspaper'])
plt.subplot(2, 2, 3)
plt.boxplot(df['TV'])
plt.subplot(2, 2, 4)
plt.boxplot(df['Radio'])
plt.show()
On remarque qu'il y a deux valeurs aberrantes dans la colonne 'Newspaper' Il n'ya pas de valeurs manquantes dans le dataset
Corrélations entre les variables
import seaborn as sns
import numpy as np
correlations = df.corr()
# Generate a mask for the upper triangle
mask = np.zeros_like(correlations, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(5, 4))
# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)
# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(correlations, mask=mask, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
On remarque qu'il y a une corrélation entre va variable 'Newspaper' et 'Radio' de 0.3. on remarque aussi que la variable 'Newspaper' est la moins correlée avec la variable 'Sales'
plt.subplot(2, 3, 1)
plt.plot(df['Newspaper'], df['Sales'], 'o', color='red');
plt.xlabel('Newspaper')
plt.ylabel('Sales')
plt.subplot(2, 3, 2)
plt.plot(df['TV'], df['Sales'], 'o', color='blue');
plt.xlabel('TV')
plt.ylabel('Sales')
plt.subplot(2, 3, 3)
plt.plot(df['Radio'], df['Sales'], 'o', color='brown');
plt.xlabel('Radio')
plt.ylabel('Sales')
plt.subplot(2, 3, 4)
plt.plot(df['Radio'], df['Newspaper'], 'o', color='black');
plt.xlabel('Radio')
plt.ylabel('Newspaper')
plt.subplot(2, 3, 5)
plt.plot(df['TV'], df['Newspaper'], 'o', color='magenta');
plt.xlabel('TV')
plt.ylabel('Newspaper')
plt.subplot(2, 3, 6)
plt.plot(df['TV'], df['Radio'], 'o', color='green');
plt.xlabel('TV')
plt.ylabel('Radio')
plt.tight_layout()
plt.show()
On observe qu'il y a une corrélation entre la variables 'Sales' et les deux variables 'Radio' et 'TV' On observe aussi qu'il y a une relation presque quadratique entre la variable 'Sales' et 'TV'. Donc peut être ça serait mieux d'jouter un coefficient pour la variable 'TV'^2 en modèle de regression linéaire
Modeles univariables
import statsmodels.formula.api as smf
lmTV = smf.ols(formula='Sales ~ TV ', data=df).fit()
lmRadio = smf.ols(formula='Sales ~ Radio ', data=df).fit()
lmNewspaper = smf.ols(formula='Sales ~ Newspaper ', data=df).fit()
print(lmTV.summary())
print(lmRadio.summary())
print(lmNewspaper.summary())
Modele multi variables
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + Newspaper ', data=df).fit()
print(lmMultiVariables.summary())
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV', data=df).fit()
print(lmMultiVariables.summary())
On remarque que les valeurs de R-squared, Adj. R-squared et MSE n'ont pas changé après avoir enlevé la variable 'Newspaper', mais par contre le modèle est plus simple à interpréter
Modèle multiplicatif :
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + TV*Radio', data=df).fit()
print(lmMultiVariables.summary())
On remarque que l'ajout de la variable multiplicative TV * Radio a produit un modèle plus performant que l'ancien. On remarque aussi que le 'std err' du coefficient de cette nouvelle variable est très petit, ce qui montre la forte influence de cette variable sur le modèle. On peut interpréter cela par le fait qu'une publicité efficace, on doit intégrer le TV et la Radio en même temps, et ne pas négliger une par rapport à l'autre
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + TV*Radio + TV*TV ', data=df).fit()
print(lmMultiVariables.summary())
On ne remarque pas une amélioration dans la précision du modèle avec l'ajout de la variable 'TV'^2, donc ce n'est pas la peine d'ajouter cette variable au modèle et le rendre plus compliqué