import pandas as pa
dic ={ 'CA' : [220, 280, 250, 170, 150, 340, 310, 210, 180, 190],
'Frais' : [2.6, 2.6, 2.4, 1.5, 0.9, 3.0, 2.7, 2.3, 1.7, 1.9]}
df = pa.DataFrame(data=dic)
df.head()
import matplotlib.pyplot as plt
%matplotlib inline
figure, axes = plt.subplots()
axes.scatter(df['Frais'],df['CA'], color='r', marker='x')
axes.set_xlabel('Frais')
axes.set_ylabel('CA')
from scipy.stats import pearsonr
X = df['Frais']
Y = df['CA']
coeff_pearson,_ = pearsonr(X,Y)
print("coefficient de Pearson = {}".format(coeff_pearson))
#Plus simplement :
df.corr()
Les deux variables sont fortement corrélées
from scipy import stats
slope, intercept, r_value, p_value, _ = stats.linregress(X,Y)
Yhat = slope * X + intercept
print('(D) : Yhat = ',slope,' * X + ', intercept )
figure, axes = plt.subplots()
axes.scatter(X,Y, color='r', marker='x')
axes.scatter(X,Yhat, color='b', marker='o')
plt.plot(X,Yhat,c='m')
axes.set_xlabel('Frais')
axes.set_ylabel('CA')
Le modèle que l'on cherche s'écrit : $$ CA = \beta_0 + \beta_1 Frais $$ On pose l'hypothèse :
$$ H_0 : \beta_1 = 0 $$print('p_value = ', p_value)
On observe que p_value << 5%.
$\Rightarrow$ On rejette donc $H_0$ au risue $5%$.
La régression est bien pertinenete.
Le facteur de détermination est de :
print('R^2 = ', r_value)
$\Rightarrow$ 89% de la variation du CA est expliquées par les Frais
def predict(x):
return slope * x + intercept
print('Le CA mensuel pour un budget publicitaire mensuel de 4OO € serait de : ', predict(400))
print('Le CA mensuel pour un budget publicitaire mensuel de 4OO0 € serait de : ', predict(4000))
data = pa.read_csv('https://www.labri.fr/~zemmari/datasets/proprietes.csv',delimiter=';')
data.head()
data.info()
On voit qu'il n'y a pas de donnnées manquantes.
data.corr()
Seule la première ligne de la matrice ci-dessus est intéressante pour nous.
On y voit que la valeur totale est corrélée avec toutes les autres variables. En effet, tous les facteurs se corrélation sont > 0.5 (sauf Sbains)
On peut aussi afficher les figures pour visualiser les données et voir s'il y a des liens :
X1 = data['Valeur Terrain']
X2 = data['Pied2']
X3 = data['Pièces']
X4 = data['Chambre']
X5 = data['SbainsC']
#X6 = data['Sbains']
X7 = data['Foyers']
Y = data['Valeur Totale']
axes = plt.subplot(2, 3, 1)
axes.scatter(X1,Y, color='r', marker='x')
axes.set_xlabel('Valeur Terrain')
axes.set_ylabel('Valeur Totale')
axes = plt.subplot(2, 3, 2)
axes.scatter(X2,Y, color='r', marker='x')
axes.set_xlabel('Pied2')
axes.set_ylabel('Valeur Totale')
axes = plt.subplot(2, 3, 3)
axes.scatter(X3,Y, color='r', marker='x')
axes.set_xlabel('Pièces')
axes.set_ylabel('Valeur Totale')
axes = plt.subplot(2, 3, 4)
axes.scatter(X4,Y, color='r', marker='x')
axes.set_xlabel('Chambre')
axes.set_ylabel('Valeur Totale')
axes = plt.subplot(2, 3, 5)
axes.scatter(X5,Y, color='r', marker='x')
axes.set_xlabel('SbainsC')
axes.set_ylabel('Valeur Totale')
axes = plt.subplot(2, 3, 6)
axes.scatter(X7,Y, color='r', marker='x')
axes.set_xlabel('Foyers')
axes.set_ylabel('Valeur Totale')
Y = data['Valeur Totale']
columns = ['Valeur Terrain','Pied2','Pièces','Chambre','SbainsC','Sbains','Foyers']
for j in range(len(columns)-1):
axes = plt.subplot(2, 3, j+1)
axes.scatter(data[columns[j]],Y, color='r', marker='x')
axes.set_xlabel(columns[j])
axes.set_ylabel('Valeur Totale')
Y = data['Valeur Totale']
columns = ['Valeur Terrain','Pied2','Pièces','Chambre','SbainsC','Sbains','Foyers']
couleurs = ['r', 'b', 'g', 'm', 'y', 'b', 'r', 'b']
figure = plt.figure(figsize=(20,10))
for j in range(len(columns)-1):
axes = plt.subplot(2, 3, j+1)
axes.scatter(data[columns[j]],Y, color=couleurs[j], marker='x')
axes.set_xlabel(columns[j])
axes.set_ylabel('Valeur Totale')
data.describe()
from scipy import stats
for j in range(len(columns)-1):
slope, intercept, r_value, p_value, _ = stats.linregress(data[columns[j]],Y)
print('Modèle ', j+1)
print('------- Valeur Totale = ', intercept, ' + ', slope, ' * ', columns[j])
print('------- R^2 = ', r_value)
print(' Donc {:2.2f}% de la variabilité de la valeur totale est expliquée par {:s}'.format(
r_value *100,columns[j]))
print('------- p_value = ', p_value)
print(' H0: beta_1 = 0')
if p_value < 0.05 :
print(' ', p_value, '<= 5%', '==> on rejette H0, au risque alpha = 5%')
print(' le modlèle ', j+1, ' est bien pertinent.')
else:
print(' ', p_value, '> 5%', '==> on accepte H0, au risque alpha = 5%')
print(' le modlèle ', j+1, ' n''est pas pertinent car pas statistiquement significatif.')
Si on doit choisir un modèle et un seul, le meilleur est le modèle 1.
Y = data['Valeur Totale']
X = data[columns]
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, Y)
print(model.intercept_)
print(model.coef_)
print('Modèle de régression : ')
m = 'Valeur Totale = ' + str(model.intercept_) + ' + '
for i in range(len(model.coef_)-1):
m = m + str(model.coef_[i]) + ' * ' + columns[i] + ' + '
m = m + str(model.coef_[i+1]) + ' * ' + columns[i+1]
print(m)
import warnings
warnings.filterwarnings("ignore")
import numpy as np
from statsmodels.regression.linear_model import OLS
X['Ones'] = np.ones(len(Y))
m = OLS(Y,X)
results = m.fit()
su = results.summary()
su
$R^2 = 0.878$ $\Rightarrow$ 88% de la variabilité de Valeur Totale est expliquée par les variables considérées.
On pose : $$ H_0 : \beta_1 = \beta_2 = \beta_3 = \beta_4 = \beta_5 = \beta_6 = \beta_7 = 0, $$ où $\beta_1, \beta_2, \beta_3, \beta_4, \beta_5, \beta_6, \beta_7$ correspondent aux coefficients de Valeur Terrain, Pied2, Pièces, Chambre, SbainsC, Sbains , et Foyers respectivement.
On observe que p_value = 6.98e-30, ce qui est très petit comparé seuil $\alpha = 5%$. On rejette donc $H_0$ et on considère que la variation de Valeur Totale est explicable par au moins une des autres variables.
Pour chacune des variables, on pose l'hypothèse : $$ H_0 : \beta_i = 0, $$ On analyse la deuxième partie du rapport de la régression. On voit que toutes les p_value, exeptées celles de Pièces et de Foyers sont < au seuil $5%$. On rejette donc toutes les hypothèses sauf celles concernant ces deux variables.
On refait la régression en éliminant les deux varaibles Pièces et Foyers :
X_cols = X.columns.drop(['Pièces', 'Foyers'])
print(X_cols)
X = X[X_cols]
m = OLS(Y,X)
results = m.fit()
su = results.summary()
su
La variable Chambre a un p_value > 5%. On l'élimine :
X_cols = X.columns.drop(['Chambre'])
X = X[X_cols]
m = OLS(Y,X)
results = m.fit()
su = results.summary()
su
La toutes les variables ont une p_value <= 5%. On garde donc ce modèle.