Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Análise Empírica da base de Test Scores da California fornecida pelo livro “Introduction to Econometrics - Stock e Watson” através exercícios econométricos no python

0 votos
106 visitas

1 Resposta

0 votos
respondida Nov 6 por Pedro Watuhã (1 ponto)  

Nesse exercício, exploremos a base de dados de resultados de provas da Califórnia. Inicialmente, observa-se a relação linear em uma única variável entre a relação de quantidade de estudantes por professor e uma dummy que designará quando essa relação for menor que 20 e seu impacto sob o desempenho na prova.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from scipy import stats
import seaborn as sns
from sklearn.linear_model import LinearRegression
import numpy as np 
from sklearn import datasets
from sklearn import linear_model
import statsmodels.api as sm 
import statsmodels.formula.api as smf
from statsmodels.tsa.tsatools import lagmat
import linearmodels as plm


df = pd.read_excel("school.xls")
y = df['testscr']
x = df["str"]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df["str"]
sns.regplot(x,y)
plt.xlabel("Test Score")
plt.ylabel("Student-Teacher Ratio")

A imagem será apresentada aqui.

A partir desses dados, constatamos a correlação negativa entre essas variáveis tal que podemos descrever essa equação por \( TestScore = 698.93 - 2,279 STR \).
Em seguida, almeja-se utilizar a quantidade de 20 alunos como limiar para observar a diferença de ter muitos ou poucos alunos por professor.

df = pd.read_excel("school.xls")
dic={}
j=0
for i in df["str"]:
    if i<20:
        dic[j]=1
    else:
        dic[j]=0
    j+=1
dummy = pd.DataFrame.from_dict(dic, orient='index')
df =df.join(dummy)
y = df['testscr']
x = df[0]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Nesse caso, como a dummy descreve a relação de ter menos alunos, ela é positivamente correlacionada ao test-score, descrita da seguinte forma: \( TestScore = 650 + 7.4D\).
Podemos analisar de que forma se comporta a média do desempenho de acordo com a porcentagem de alunos que aprendem em inglês, analisando como se comporta o possível viés de ter alunos imigrantes sob esses grupos. Em seguida, tem-se a estatistica T para determinar a significância da diferença entre ter ou não mais alunos.

z = df[df["str"]<20]["testscr"]
y = df[df["str"]>=20]["testscr"]
stats.ttest_ind(z,y)

x = df[df["el_pct"]<1.9]
z = x[x["str"]<20]["testscr"]
y = x[x["str"]>=20]["testscr"]
stats.ttest_ind(z,y)
x[x["str"]<20].mean()
x[x["str"]>=20].mean()

x = df[df["el_pct"]>=1.9]
x = x[x["el_pct"]<=8.8]
z = x[x["str"]<20]["testscr"]
y = x[x["str"]>=20]["testscr"]
stats.ttest_ind(z,y)
x[x["str"]<20].mean()
x[x["str"]>=20].mean()

x = df[df["el_pct"]>=8.8]
x = x[x["el_pct"]<=23]
z = x[x["str"]<20]["testscr"]
y = x[x["str"]>=20]["testscr"]
stats.ttest_ind(z,y)
x[x["str"]<20].mean()
x[x["str"]>=20].mean()

x = df[df["el_pct"]>=23]
z = x[x["str"]<20]["testscr"]
y = x[x["str"]>=20]["testscr"]
stats.ttest_ind(z,y)
x[x["str"]<20].mean()
x[x["str"]>=20].mean()

A imagem será apresentada aqui.

Todos os resultados obtidos a partir de 1,9% de falantes de inglês se mostraram muito significativos. O resultado de abaixo de 1,9%, todavia, não se mostrou tão significativo quanto os outros e é o único resultado que aponta uma diferença em sentido contrário. Por conseguinte, espera-se que o resultado seja robusto a esse tipo de viés.

Em seguida, incluiremos outras variáveis para evitar possíveis vieses de variável omitida, além de tentar explicar o impacto que a mesma pode ter sob o desempenho acadêmico. Utilizaremos, inicialmente, a variável de English Learners, trabalhada anteriormente, que designa a quantidade de alunos no distrito que aprendem em inglês.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df[["str","el_pct"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Assim como observado pelo desempenho das médias, a variável de English Learners está negativamente relacionada ao desempenho acadêmico e a quantidade de estudantes por professor também. Todavia, torna-se visível a redução da magnitude do efeito da última quando comparado à regressão linear simples. Pode-se explicitar essa relação pela equação \( TestScore = 686 - 1,1STR - 0,65EL_PCT\), com todos os coeficientes significativos.

Junto a essas variáveis, inclui-se também os gastos com educação por estudante. Assim como no modelo anterior, espera-se reduzir o viés de variável omitida sob a hipótese de que com maior gasto será plausível aumentar a qualidade dos professores ou a quantidade de professores por aluno. Tem-se como resultado disso:

df = pd.read_excel("school.xls")
y = df['testscr']
x = df[["str","el_pct","expn_stu"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Assim como indicava a hipótese, a relação entre os gastos por estudante e o desempenho acadêmico é positiva e a magnitude da variável que demonstra a quantidade de alunos por professor reduziu significativamente.
Para acrescentar ainda mais variáveis que possam ser relevantes ao nosso modelo, analisemos a relação entre as variáveis de qualificação para preço reduzido de almoço, que estima a porcentagem dos estudantes de um distrito que podem receber esse benefício, e a porcentagem qualificada a receber auxílio de renda, agindo como uma estimativa da situação econômica do local, em relação ao desempenho acadêmico.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df["el_pct"]
sns.scatterplot(x,y)
plt.title("(a) Percentage of English language learners")
plt.ylabel("Test Score")

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df["meal_pct"]
sns.scatterplot(x,y)
plt.title("(b) Percentage of qualifying for reduced price lunch")
plt.ylabel("Test Score")

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df["calw_pct"]
sns.scatterplot(x,y)
plt.title("(c) Percentage of qualifying for income assistance")
plt.ylabel("Test Score")

A imagem será apresentada aqui.

Observando o scatter plot dessas variáveis, percebemos que aparenta haver uma correlação negativa entre essas variáveis. Portanto, para obtermos melhores indicativos dessa correlação, realiza-se uma série de regressões e comparam-se os resultados.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df[["str","el_pct","meal_pct"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

df = pd.read_excel("school.xls")
y = df['testscr']
x = df[["str","el_pct","calw_pct"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

df = pd.read_excel("school.xls")
y = df['testscr']
x = df[["str","el_pct","calw_pct","meal_pct"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Nessa análise, percebem-se algumas peculiaridades. Primeiramente, individualmente, tanto a estimativa de auxílio de renda quanto de auxílio ao almoço são significativos. Todavia, percebe-se que no modelo em que são inclusas todas as variáveis, a porcentagem de assistência de renda deixa de ser significativa, possivelmente pelo auxílio de almoço atuar como uma estimativa melhor do mesmo fenômeno. De forma análoga, como estão sendo explicitados mais efeitos, a capacidade explicativa do modelo dado pelo \( R^2\) ajustado aumenta conforme as variáveis são incluídas, menos no caso do último modelo, visto que a variável não se mostra significativa.

Em seguida, podemos implementar funções não lineares sob nossas variáveis para otimizar o desempenho do modelo enquanto exploram-se outras variáveis. Um primeiro exemplo disso aparenta ser a variável de renda do distrito, que não aparenta estar distribuída linearmente em relação ao desempenho acadêmico. Portanto, opta-se pela logaritimização dessa variável conforme demonstrado pelo seguinte scatterplot e pela seguinte regressão:

 df = pd.read_excel("school.xls")
y = df['testscr']
x = df["avginc"]
sns.scatterplot(x,y)
xx=np.linspace(5,50,100)
yy= 36.41*np.log(xx) + 557.8323
plt.plot(xx,yy, label= "Linear-log Regression")
plt.xlabel("District Income")
plt.ylabel("Test Score")

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = df['testscr']
x = np.log(df["avginc"])
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Em ambos os resultados, a correlação entre as variáveis mostra-se perceptível e, no segundo, descobre-se que também é significativo. Em congruência a essa análise, é notável observar a magnitude do \( R^2\), indicando-nos a força que essa variável pode ter em explicar o modelo.
De forma análoga à variável explicativa, pode-se aplicar a logaritimização sob a variável dependente. Além disso, pretende-se aplicar a logaritimização sob ambas as variáveis e analisar qual modelo performa melhor.

df = pd.read_excel("school.xls")
y = np.log(df['testscr'])
x = df["avginc"]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = np.log(df['testscr'])
x = np.log(df["avginc"])
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
y = df['testscr']
x = df["avginc"]
sns.scatterplot(x,y)
xx=np.linspace(5,50,100)
yyy= np.exp(0.0554*np.log(xx) + 6.33)
yy= np.exp(6.4394 + 0.0028*xx)
plt.plot(xx,yy, label= "Linear-log Regression")
plt.plot(xx,yyy, label= "Log-Log Regression")
plt.xlabel("District Income")
plt.ylabel("Test Score")

A imagem será apresentada aqui.

Pela comparação dos resultados, percebe-se uma otimização tanto gráfica quanto sob o score do modelo. A curva laranja, que demonstra o modelo log-log aproxima os pontos dos extremos muito melhor que o modelo linear e o score aumentou de 0.487 para 0.557.
Por fim, exploremos algumas últimas relações entre as variáveis. Interpretemos, primeiramente, a interação entre as variáveis dummies de salas muito grandes e de um bom percentual de aprendizes de inglês.

df = pd.read_excel("school.xls")
df['el_pct'] = (df['el_pct'] >= 10).astype(int)
df['str'] = (df['str'] >= 20).astype(int)
df["interact"] = df['str']*df['el_pct']
y = df['testscr']
x = df[["el_pct","str","interact"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Essa regressão nos indicaria que, além do impacto estimado por se ter salas muito grandes e muito estudantes, há um impacto ainda mais negativo para aqueles que se encontram em ambos os grupos. Mas, ainda que negativas, tanto a variável de interação quanto a variável do tamanho da sala não se mostraram significativas.
Podemos observar, também, as estimativas observadas no caso da interação entre a dummy para estudantes de inglês e a variável contínua da proporção de estudantes por professor assim como o caso da interação entre as mesmas variáveis de forma contínua.

df = pd.read_excel("school.xls")
df['el_pct'] = (df['el_pct'] >= 10).astype(int)
df["interact"] = df['str']*df['el_pct']
y = df['testscr']
x = df[["el_pct","str","interact"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

df = pd.read_excel("school.xls")
df["interact"] = df['str']*df['el_pct']
y = df['testscr']
x = df[["el_pct","str","interact"]]
x = sm.add_constant(x)
m = sm.OLS(y,x)
est = m.fit()
print(est.summary())

A imagem será apresentada aqui.

Nesses modelos, podemos observar que, no primeiro modelo, a estimativa de sinal da proporção de estudantes torna-se positivo, mas não mais significativo, enquanto a variável de interação aparenta se tornar ainda mais impactante, ainda que também não se apresente de forma significativa. Já na segunda regressão, a magnitude das variáveis torna-se ainda menor e apenas a relação entre a quantidade de alunos por professor se mostra significativa.

...