Exploration du Dataset

In [1]:
import pandas as pd
In [3]:
filePath = "../Datasets/advertising.csv"
df = pd.read_csv(filePath)
In [81]:
df.shape
Out[81]:
(200, 5)
In [6]:
df.head()
Out[6]:
TV Radio Newspaper Sales
0 230.1 37.8 69.2 22.1
1 44.5 39.3 45.1 10.4
2 17.2 45.9 69.3 9.3
3 151.5 41.3 58.5 18.5
4 180.8 10.8 58.4 12.9
In [7]:
import matplotlib.pyplot as plt
%matplotlib inline
In [79]:
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.

In [78]:
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

In [34]:
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})
Out[34]:
<matplotlib.axes._subplots.AxesSubplot at 0x1231fcbe0>

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'

In [64]:
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

In [82]:
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()
In [89]:
print(lmTV.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.612
Model:                            OLS   Adj. R-squared:                  0.610
Method:                 Least Squares   F-statistic:                     312.1
Date:                Wed, 26 Sep 2018   Prob (F-statistic):           1.47e-42
Time:                        15:32:09   Log-Likelihood:                -519.05
No. Observations:                 200   AIC:                             1042.
Df Residuals:                     198   BIC:                             1049.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      7.0326      0.458     15.360      0.000       6.130       7.935
TV             0.0475      0.003     17.668      0.000       0.042       0.053
==============================================================================
Omnibus:                        0.531   Durbin-Watson:                   1.935
Prob(Omnibus):                  0.767   Jarque-Bera (JB):                0.669
Skew:                          -0.089   Prob(JB):                        0.716
Kurtosis:                       2.779   Cond. No.                         338.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
In [90]:
print(lmRadio.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.332
Model:                            OLS   Adj. R-squared:                  0.329
Method:                 Least Squares   F-statistic:                     98.42
Date:                Wed, 26 Sep 2018   Prob (F-statistic):           4.35e-19
Time:                        15:32:14   Log-Likelihood:                -573.34
No. Observations:                 200   AIC:                             1151.
Df Residuals:                     198   BIC:                             1157.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      9.3116      0.563     16.542      0.000       8.202      10.422
Radio          0.2025      0.020      9.921      0.000       0.162       0.243
==============================================================================
Omnibus:                       19.358   Durbin-Watson:                   1.946
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               21.910
Skew:                          -0.764   Prob(JB):                     1.75e-05
Kurtosis:                       3.544   Cond. No.                         51.4
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
In [91]:
print(lmNewspaper.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.052
Model:                            OLS   Adj. R-squared:                  0.047
Method:                 Least Squares   F-statistic:                     10.89
Date:                Wed, 26 Sep 2018   Prob (F-statistic):            0.00115
Time:                        15:32:16   Log-Likelihood:                -608.34
No. Observations:                 200   AIC:                             1221.
Df Residuals:                     198   BIC:                             1227.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     12.3514      0.621     19.876      0.000      11.126      13.577
Newspaper      0.0547      0.017      3.300      0.001       0.022       0.087
==============================================================================
Omnibus:                        6.231   Durbin-Watson:                   1.983
Prob(Omnibus):                  0.044   Jarque-Bera (JB):                5.483
Skew:                           0.330   Prob(JB):                       0.0645
Kurtosis:                       2.527   Cond. No.                         64.7
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
  • D'après les valeurs de R^2, des pvalues et de la MSE, on remarque qu'il n'y a pas de relation significante entre la variable 'Newspaper' et la variable 'Sales'.
  • Le meilleur modèle est celui de la variable 'Sales' en fonction de la variable 'TV'. Alors TV est plus corrélé à Sales que Radio parsque le publicité audiovisuelles sont plus captives que les publicité par radio.
  • Pour que le coefficient de la regression linéaire refléte l'importance de la variable par rapport aux autres, on doit normaliser les variables
  • Dans le modele Sales ~ TV, l'intercept représente le nombre d'unité de Sales si le budget TV est nul, qui est entre 6 et 8 dans une 95% d'intervale

Modele multi variables

In [92]:
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + Newspaper ', data=df).fit()
print(lmMultiVariables.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.897
Model:                            OLS   Adj. R-squared:                  0.896
Method:                 Least Squares   F-statistic:                     570.3
Date:                Wed, 26 Sep 2018   Prob (F-statistic):           1.58e-96
Time:                        15:36:14   Log-Likelihood:                -386.18
No. Observations:                 200   AIC:                             780.4
Df Residuals:                     196   BIC:                             793.6
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      2.9389      0.312      9.422      0.000       2.324       3.554
Radio          0.1885      0.009     21.893      0.000       0.172       0.206
TV             0.0458      0.001     32.809      0.000       0.043       0.049
Newspaper     -0.0010      0.006     -0.177      0.860      -0.013       0.011
==============================================================================
Omnibus:                       60.414   Durbin-Watson:                   2.084
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              151.241
Skew:                          -1.327   Prob(JB):                     1.44e-33
Kurtosis:                       6.332   Cond. No.                         454.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
  • La première remarque à propos de ce modèle, est que la pvalue de la variable 'Newspaper' est très grande (0.86) avec un coefficient qui est très petit, alors ce n'est pas la peine de laisser cette variable dans le modèle. On observe aussi que la valeur de R-squared est très élevée (0.897), ce montre que notre modèle performe bien
  • Si on augmente de 50 les sommes allouées au média TV, les ventes augmentent de 0.229
  • Le coefficient pour Newspaper est presque nul, légérement négatif, dans le modèle complet tandis qu'il est positif lorsque pris en compte individuellement parseque dans le premier modèle, on n'avait pas de coefficients significatifs à part de celui de l'intercept qui affectaient les résulats. Donc je pense que le fait le coefficient est négatif est juste par hasard, c'est à dire, qu'un simple de changement dans la valeurs de la base de données ou des coefficient des autre variable peut résulter en un coefficient positif
In [93]:
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV', data=df).fit()
print(lmMultiVariables.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.897
Model:                            OLS   Adj. R-squared:                  0.896
Method:                 Least Squares   F-statistic:                     859.6
Date:                Wed, 26 Sep 2018   Prob (F-statistic):           4.83e-98
Time:                        15:40:54   Log-Likelihood:                -386.20
No. Observations:                 200   AIC:                             778.4
Df Residuals:                     197   BIC:                             788.3
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      2.9211      0.294      9.919      0.000       2.340       3.502
Radio          0.1880      0.008     23.382      0.000       0.172       0.204
TV             0.0458      0.001     32.909      0.000       0.043       0.048
==============================================================================
Omnibus:                       60.022   Durbin-Watson:                   2.081
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              148.679
Skew:                          -1.323   Prob(JB):                     5.19e-33
Kurtosis:                       6.292   Cond. No.                         425.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

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

In [ ]:
Modèle multiplicatif :
In [94]:
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + TV*Radio', data=df).fit()
print(lmMultiVariables.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.968
Model:                            OLS   Adj. R-squared:                  0.967
Method:                 Least Squares   F-statistic:                     1963.
Date:                Wed, 26 Sep 2018   Prob (F-statistic):          6.68e-146
Time:                        15:53:44   Log-Likelihood:                -270.14
No. Observations:                 200   AIC:                             548.3
Df Residuals:                     196   BIC:                             561.5
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      6.7502      0.248     27.233      0.000       6.261       7.239
Radio          0.0289      0.009      3.241      0.001       0.011       0.046
TV             0.0191      0.002     12.699      0.000       0.016       0.022
TV:Radio       0.0011   5.24e-05     20.727      0.000       0.001       0.001
==============================================================================
Omnibus:                      128.132   Durbin-Watson:                   2.224
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             1183.719
Skew:                          -2.323   Prob(JB):                    9.09e-258
Kurtosis:                      13.975   Cond. No.                     1.80e+04
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.8e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

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

In [95]:
lmMultiVariables = smf.ols(formula='Sales ~ Radio + TV + TV*Radio + TV*TV ', data=df).fit()
print(lmMultiVariables.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  Sales   R-squared:                       0.968
Model:                            OLS   Adj. R-squared:                  0.967
Method:                 Least Squares   F-statistic:                     1963.
Date:                Wed, 26 Sep 2018   Prob (F-statistic):          6.68e-146
Time:                        15:54:16   Log-Likelihood:                -270.14
No. Observations:                 200   AIC:                             548.3
Df Residuals:                     196   BIC:                             561.5
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      6.7502      0.248     27.233      0.000       6.261       7.239
Radio          0.0289      0.009      3.241      0.001       0.011       0.046
TV             0.0191      0.002     12.699      0.000       0.016       0.022
TV:Radio       0.0011   5.24e-05     20.727      0.000       0.001       0.001
==============================================================================
Omnibus:                      128.132   Durbin-Watson:                   2.224
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             1183.719
Skew:                          -2.323   Prob(JB):                    9.09e-258
Kurtosis:                      13.975   Cond. No.                     1.80e+04
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.8e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

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é