import warnings
def fxn():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
fxn()
# importations de modules "local"
import sys
sys.path.append('functions/')
import base_notebook_light
import css_base_light
import fonctions_perso
import css_regression
import fonction_regression_lineaire
# import des librairies et des paramètres
from base_notebook_light import *
from css_base_light import *
from css_regression import *
# repère de début de traitement pour calculer le temps tital d'exécution du notebook
start_time_m4 = time.time()
# import des données
dcf = pd.read_csv("data/exports/dc_anova.csv")
# taille du df
dcf.shape
# préparation des données
dcf = dcf[['code_pays', 'pays', 'pop', 'Gj', 'gdp', 'income_avg', 'y_child', 'pj', 'c_i_parent']]
dcf.columns = ['code_pays', 'pays', 'pop', 'gini', 'gdp', 'y_child_avg', 'y_child', 'elas', 'c_i_parent']
dcf['ln_y_child'] = np.log(dcf['y_child'])
dcf['ln_y_child_avg'] = np.log(dcf['y_child_avg'])
# affichage aléatoire de 2 observations
dcf.sample(2)
(5750000, 11)
code_pays | pays | pop | gini | gdp | y_child_avg | y_child | elas | c_i_parent | ln_y_child | ln_y_child_avg | |
---|---|---|---|---|---|---|---|---|---|---|---|
2486982 | ISL | Islande | 310856.0 | 0.2851 | 36527.0 | 26888.511518 | 30282.238 | 0.200000 | 98.0 | 10.318317 | 10.199454 |
2595861 | ITA | Italie | 58922109.0 | 0.3173 | 28170.0 | 14925.214922 | 26592.664 | 0.487737 | 89.0 | 10.188391 | 9.610807 |
code_pays
: code international iso-3pays
: nom du pays en françaispop
: nombre d'habitants du paysgini
: indice de gini du paysgdp
: PIB/hab en $PPAy_child_avg
: revenu moyen des enfantsy_child
: revenu enfant par quantile c_i_parentelas
: coef d'élasticité du paysc_i_parent
: centile de revenu parentln_y_child
: logarithme de y_childln_y_child_avg
: logarithme de y_child_avgOn applique la même logique que pour la régression à 2 variables explicatives :
-> on teste la performance des 2 modèles (modèle linéaire et modèle logarithmique) et on choisit celui qui explique le plus la variance totale
--> donc celui qui a le $R^2$ le plus élevé
Remarque :
fonction_regression_lineaire
présent dans le dossier 'functions'hypotheses_regression_lineaire
qui permet de vérifier les hypothèses d'application d'une régression linéaire :analyse_reg
qui test le modèle et évalue sa performanceoutliers
qui permet de déterminer les valeurs atypiques et influentes :Equation du modèle dans le cadre linéaire :
$$\large \text{y_child}_j\: = \: \beta_0\: +\: \beta_1\, \text{y_child_avg}_j\: +\: \beta_2\, \text{gini}_j\: +\: \beta_3\, \text{c_i_parent}_j\: + \epsilon_j$$
Equation du modèle dans le cadre logarithmique :
$$\large \text{log(y_child)}_j\: = \: \beta_0\: +\: \beta_1\, \text{log(y_child_avg)}_j\: +\: \beta_2\, \text{gini}_j\: +\: \beta_3\, \text{c_i_parent}_j\: + \epsilon_j$$
avec :
# import des fonctions du module de régression
from fonction_regression_lineaire import *
# copie du df principal
df = dcf.copy()
# modèle linéaire
y_lin = 'y_child'
X_lin = ['y_child_avg', 'gini', 'c_i_parent']
xlin = "+".join(X_lin)
mod_lin=y_lin+"~"+xlin
# modèle log
y_log = 'ln_y_child'
X_log = ['ln_y_child_avg', 'gini', 'c_i_parent']
xlog = "+".join(X_log)
mod_log=y_log+"~"+xlog
version_log="3_var_explicatives_log"
# modèle linéaire
y_lin = 'y_child'
X_lin = ['y_child_avg', 'gini', 'c_i_parent']
xlin = "+".join(X_lin)
mod_lin=y_lin+"~"+xlin
# regression
res_model_lin = ols(mod_lin, data=df).fit()
# test et analyse de la régression
res_reg_lin = analyse_reg(res_model_lin, details=None)
Dep. Variable: | y_child | R-squared: | 0.523 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.523 |
Method: | Least Squares | F-statistic: | 2.098e+06 |
Date: | Fri, 18 Jun 2021 | Prob (F-statistic): | 0.00 |
Time: | 22:21:41 | Log-Likelihood: | -5.8603e+07 |
No. Observations: | 5750000 | AIC: | 1.172e+08 |
Df Residuals: | 5749996 | BIC: | 1.172e+08 |
Df Model: | 3 | ||
Covariance Type: | nonrobust |
La p_value est inférieure au seuil de 5% => Le modèle est significatif au niveau global
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | -2606.6932 | 14.383 | -181.237 | 0.000 | -2634.883 | -2578.503 |
y_child_avg | 1.0000 | 0.000 | 2291.830 | 0.000 | 0.999 | 1.001 |
gini | -1.1524 | 32.091 | -0.036 | 0.971 | -64.050 | 61.745 |
c_i_parent | 51.6295 | 0.093 | 552.970 | 0.000 | 51.447 | 51.813 |
Certaines p_values sont supérieures ou égales à 0.05 => certaines variables ne sont donc significatives
df | sum_sq | mean_sq | F | PR(>F) | |
---|---|---|---|---|---|
y_child_avg | 1.0 | 2.496311e+14 | 2.496311e+14 | 5.986933e+06 | 0.0 |
gini | 1.0 | 6.139245e-13 | 6.139245e-13 | 1.472383e-20 | 1.0 |
c_i_parent | 1.0 | 1.274962e+13 | 1.274962e+13 | 3.057757e+05 | 0.0 |
Residual | 5749996.0 | 2.397518e+14 | 4.169599e+07 | NaN | NaN |
=> comme pour la régression précédente avec 2 variables explicatives, la variable indice de Gini
n'est pas significative
Le modèle explique 53% de la variance totale des revenus
On va effectuer une nouvelle régression linéaire, en utilisant les logarithmes
# modèle logarithmique
y = 'ln_y_child'
X = ['ln_y_child_avg', 'gini', 'c_i_parent']
xlog = "+".join(X)
mod_log=y+"~"+xlog
# regression
res_model_log = ols(mod_log, data=df).fit()
# test et analyse de la régression
res_reg_log = analyse_reg(res_model_log, details=None)
Dep. Variable: | ln_y_child | R-squared: | 0.781 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.781 |
Method: | Least Squares | F-statistic: | 6.836e+06 |
Date: | Fri, 18 Jun 2021 | Prob (F-statistic): | 0.00 |
Time: | 22:21:44 | Log-Likelihood: | -5.6312e+06 |
No. Observations: | 5750000 | AIC: | 1.126e+07 |
Df Residuals: | 5749996 | BIC: | 1.126e+07 |
Df Model: | 3 | ||
Covariance Type: | nonrobust |
La p_value est inférieure au seuil de 5% => Le modèle est significatif au niveau global
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | -0.0999 | 0.003 | -38.349 | 0.000 | -0.105 | -0.095 |
ln_y_child_avg | 0.9861 | 0.000 | 4046.589 | 0.000 | 0.986 | 0.987 |
gini | -1.6351 | 0.003 | -526.227 | 0.000 | -1.641 | -1.629 |
c_i_parent | 0.0112 | 9.32e-06 | 1200.661 | 0.000 | 0.011 | 0.011 |
Toutes les p_values sont inférieures à 0.05 => toutes les variables sont significatives
df | sum_sq | mean_sq | F | PR(>F) | |
---|---|---|---|---|---|
ln_y_child_avg | 1.0 | 7.800125e+06 | 7.800125e+06 | 1.879052e+07 | 0.0 |
gini | 1.0 | 1.149342e+05 | 1.149342e+05 | 2.768768e+05 | 0.0 |
c_i_parent | 1.0 | 5.984170e+05 | 5.984170e+05 | 1.441588e+06 | 0.0 |
Residual | 5749996.0 | 2.386878e+06 | 4.151096e-01 | NaN | NaN |
print(*res_reg_log)
regression_summary regression_test_global synth_perf_glob regression_test_variables synth_perf_var anova_decomposition_variance synth_var_expl coef equation_lineaire
res_reg_log['synth_var_expl']
'Le modèle de régression linéaire explique plus de 78% de la variance totale'
Toutes les variables explicatives sont significatives et ce modèle explique près de 78% de la variance totale
version_name = "3_var_log"
hyp_reg_log = hypotheses_regression_lineaire(y, X, df, version_name, details=None)
valeurs_reelles | valeurs_predites | residus | |
---|---|---|---|
705507 | 5.004370 | 5.598458 | -0.594088 |
4248006 | 9.863347 | 7.925396 | 1.937951 |
491434 | 9.156045 | 8.991307 | 0.164739 |
1327638 | 9.662478 | 9.418913 | 0.243564 |
1367283 | 7.371434 | 7.645321 | -0.273887 |
=> si linéarité, alors les points de la droite "prédictions / valeurs réelles" devraient suivre la droite d'équation y=x
pearson | p-value | |
---|---|---|
gini__c_i_parent | 0.000015 | 0.971967 |
ln_y_child_avg__c_i_parent | 0.000055 | 0.894622 |
ln_y_child_avg__gini | -0.261327 | 0.000000 |
feature | VIF | |
---|---|---|
0 | ln_y_child_avg | 1.073297 |
1 | gini | 1.073297 |
2 | c_i_parent | 1.000000 |
Interprétation des tests :
Jarque-Bera test ---- statistic: 1805609.6352, p-value: 0.0 Kolmogorov-Smirnov test ---- statistic: 0.1277, p-value: 0.0000
Les 2 tests conduisent à rejeter H0 : on en conclue que les données ne suivent pas une loi normale
Interprétation des tests :
Breusch Pagan test ---- p-value: 0.0
La p_value est inférieure au seuil de signification de 5% : on rejette l'hypothèse H0 d'homoscédasticité des résidus => les variances ne sont pas constantes
print(*hyp_reg_log)
res_modelisation df_y_y_pred_residus graph_hyp_linearite synth_linearite paires_corr_croisees r2 VIF synth_coli synth_normalite graph_distribution_residus graph_prediction_vs__residus synth_homo
res_outlier_log = outliers(y, X, df, res_model_log, version_name, details=None, nb_pays_graph=2, graph_france=False)
code_pays | pays | pop | gini | gdp | y_child_avg | y_child | elas | c_i_parent | ln_y_child | ln_y_child_avg | obs | levier | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3534451 | MLI | Mali | 14113577.0 | 0.3303 | 929.52966 | 681.075039 | 739.58075 | 0.713953 | 91.0 | 6.606083 | 6.523672 | 3534452 | 9.995673e-07 |
2213918 | IDN | Indonésie | 235469762.0 | 0.3721 | 3689.00000 | 1334.618297 | 724.11096 | 0.500000 | 75.0 | 6.584945 | 7.196401 | 2213919 | 4.222380e-07 |
5280957 | TZA | République-Unie de Tanzanie | 41853944.0 | 0.3757 | 1201.00000 | 588.766986 | 539.94430 | 0.511973 | 91.0 | 6.291466 | 6.378030 | 5280958 | 9.445830e-07 |
pays Afrique du Sud 50000 Honduras 31943 Colombie 7967 République Centrafricaine 5965 République Démocratique du Congo 5941 Guatemala 4005 Kenya 3991 États-Unis 3949 Bolivie 2973 Chili 1984 dtype: int64