Introduction à la vérification de l'efficacité - Raisonnement causal pour une comparaison correcte / Bases de l'économie quantitative Reproduire le code source en Python Faire.
J'ai déjà un Exemple d'implémentation de grand ancêtre, mais je le laisserai comme mémo pour mon étude.
Cet article couvre le chapitre 2. Le code est également posté sur github. De plus, les noms de variables et le contenu du traitement sont essentiellement implémentés dans le livre.
Vous pouvez implémenter une régression linéaire avec des modèles scicit-learn ou stats. Cependant, en ce qui concerne les statistiques de chaque variable, statsmodels est plus avantageux, donc c'est plus pratique.
scikit-learn
Analyse de régression de sklearn
from sklearn.linear_model import LinearRegression
#Apprentissage de modèle
X = biased_data[['treatment', 'history']]
y = biased_data['spend']
model = LinearRegression(fit_intercept=True, normalize=False).fit(X, y)
#Sortie de résultat
print(f'R^2: {model.score(X, y)}')
print(f'intercept: {model.intercept_}')
print(f'coefficients: {model.coef_}')
Le résultat de scikit-learn est inférieur à celui des modèles de statistiques décrits plus loin. Il est possible de calculer chaque valeur statistique en fonction des données d'entraînement, mais il semble qu'il n'y ait aucun intérêt à utiliser scikit-learn jusqu'à ce point.
statsmodels
Il semble y avoir plusieurs façons d'apprendre des modèles à l'aide de modèles de statistiques, mais ceux de type R sont les suivants.
Analyse de régression des modèles de statistiques
from statsmodels.formula.api import ols
#Apprentissage de modèle
model = ols('spend ~ treatment + history', data=biased_data).fit()
#Sortie de résultat
model.summary()
En passant, si la sortie du résultat est comme model.summary (). Tables [1]
, vous pouvez spécifier n'importe quelle table à partir de plusieurs informations.
De plus, si vous souhaitez obtenir une estimation, vous pouvez utiliser model.params
pour faire référence à la liste au format dictionnaire.
Pour lire les données au format R, utilisez rdata. Pour plus de détails sur l'utilisation du module, consultez ici.
Lire RData
import rdata
parsed = rdata.parser.parse_file('./vouchers.rda')
converted = rdata.conversion.convert(parsed)
vouchers = converted['vouchers']
Dans ce livre, nous apprenons les modèles de plusieurs variables objectives à la fois, mais il semble difficile de faire de même en Python.
Analyse de régression collective
import pandas as pd
from statsmodels.formula.api import ols
#Définition de l'équation de régression
formula_x_base = ['VOUCH0']
formula_x_covariate = [
'SVY', 'HSVISIT', 'AGE', 'STRATA1', 'STRATA2', 'STRATA3', 'STRATA4', 'STRATA5', 'STRATA6', 'STRATAMS',
'D1993', 'D1995', 'D1997', 'DMONTH1', 'DMONTH2', 'DMONTH3', 'DMONTH4', 'DMONTH5', 'DMONTH6',
'DMONTH7', 'DMONTH8', 'DMONTH9', 'DMONTH10', 'DMONTH11', 'DMONTH12', 'SEX2',
]
formula_ys = [
"TOTSCYRS","INSCHL","PRSCH_C","USNGSCH","PRSCHA_1","FINISH6","FINISH7","FINISH8","REPT6",
"REPT","NREPT","MARRIED","HASCHILD","HOURSUM","WORKING3",
]
#Définition de la fonction qui reçoit le résultat de la régression
def get_regression_result(formula, data):
model = ols(formula, data=data).fit()
result = pd.read_html(model.summary().tables[1].as_html(), header=0)[0]
result.columns = ['term', 'estimate', 'std.err', 'statistic', 'p.value', '0.025', '0.975']
result
return result
#Effectuer une analyse de régression collectivement
results = list()
for formula_y in formula_ys:
base_reg_formula = f'{formula_y} ~ {" + ".join(formula_x_base)}'
base_reg_model_index = f'{formula_y}_base'
covariate_reg_formula = f'{formula_y} ~ {" + ".join(formula_x_base+formula_x_covariate)}'
covariate_reg_model_index = f'{formula_y}_covariate'
base_reg_result = get_regression_result(base_reg_formula, regression_data)
base_reg_result['model_index'] = base_reg_model_index
results.append(base_reg_result)
covariate_reg_result = get_regression_result(covariate_reg_formula, regression_data)
covariate_reg_result['model_index'] = covariate_reg_model_index
results.append(covariate_reg_result)
df_results = pd.concat(results).reset_index(drop=True)
df_results = df_results[['model_index', 'term', 'estimate', 'std.err', 'statistic', 'p.value', '0.025', '0.975']]
Probablement facile à tracer avec des barres d'erreur dans matplotlib. Le but est de trouver l'amplitude de l'erreur dans la barre d'erreur utilisée pour exprimer l'intervalle de confiance à partir de la différence entre la valeur estimée et l'intervalle de confiance.
Dans les données utilisées pour le dessin (non illustrées ici), la valeur est obtenue à partir du modèle, mais comme le nombre de nombres valides à ce moment-là est petit, il peut y avoir un certain écart.
terrain
import matplotlib.pyplot as plt
estimate = going_private_results['estimate']
estimate_error = going_private_results['estimate'] - going_private_results['0.025'] #Supposons que la différence entre l'intervalle de confiance et la valeur estimée soit la longueur de la barre d'erreur
xmin = 0
xmax = going_private_results.shape[0] - 1
plt.errorbar(range(xmax+1), estimate, estimate_error, fmt='o')
plt.hlines(y=0, xmin=xmin, xmax=xmax, colors='k', linestyles='dashed')
plt.xlabel('model_indexe')
plt.ylabel('estimate')
plt.xticks(range(going_private_results.shape[0]), going_private_results['model_index'], rotation=45)
plt.show()
Recommended Posts