#8 Regresion Multiple como modelo de Machine Learning

El tema a tratar en este post es el usar la programación en python para analizar el bajo rendimiento
en matemáticas I en la UNEFA de los estudiantes de 
Ingeniería, ya que se ha observado un alto  indice de 
repitencia en los primeros semestres, en  las 
asignaturas de contenido Matemático:
Matemáticas I,II,II, Algebra Lineal, Estadística,
Geometría Analítica, Física, Programación, 
Cálculo Numérico entre otras.
Para ello se aplico una encuesta a una muestra de 165
estudiantes con dos objetivos: 
(1) investigar que variables podrían influir  en el bajo rendimiento y
(2) construir un modelo predictivo de las 
calificaciones en matemáticas I (variable dependiente)
basado inicialmente en 54 variables independientes 
que consideramos pudieran afectar en el rendimiento estudiantil. 
 

Las variables consideradas en este estudio fueron:

NombreDescripción
carrera0carrera del estudiante (nominal;: 0 Ing.Sistemas, 1:Ing.Civil)
edad1Edad del estudiante (tipo numérica entera con 6 valores: 17 ,18,19, 20, 21,22 ; 22 representa 22 años o más)
genero2Sexo del estudiante (nominal; binaria 0: Femenino, 1: Masculino)
zona3Zona donde reside el estudiante (nominal; binaria : 0: Urbana y 1:Rural
nb4Nota promedio de bachillerato (numérica continua)
tipolic5tipo de liceo (nominal; binaria 0: 0: Público, 1: Privado)
matcinuNota de matemáticas en el CINU (numérica continua)
repRepitencia en Matemáticas I (nominal; binaria 0: No repitió y 1:Si repitió
calNota  en Matemáticas I (numérica continua)
dedica9Horas semanales dedicadas al estudio de Mat I (numérica continua)
mcom10recursos complementarios para el estudio de Matemática  I (nominal: 1 libros 2.internet 3 otros:profesores,asesorías etc)
asesoria11Hrs. semanales que recibe asesoría en Matemáticas (numérica con 4 valores 0 cero hrs,.1: 1hr, -2 :2hrs 3. 3 o mas hrs
cursoextra12  Realiza o No curso extra  (nominal; binaria 0: No, 1:Si)
Transporte13Medio de transporte utilizado la mayoría de las veces para ir a la universidad (nominal con 4 niveles, “1” Transporte universitario, “2” Transporte Público, “3” Transporte Privado, “4” Caminando)
tiempottiempo empleado para llegar a la universidad (numerica,1 –<  =1hr.,2-entre 1> y <=2.hrs, 3 – > entre 2 y <=3.hrs. 4- 3 mas de 3 )
autoest15auto-estima  (nominal con 3 niveles; “1” Mucho, “2” Lo suficiente, “3” Poco)
motiv16Gusto por la matemática (nominal con 3 niveles; “1” tot desacuerdo, “2” parc de acuerdo, “3” tot. acuerdo)
trab17Si trabaja o No (nominal; binaria 0: No, 1:Si)
Alcohol18Consumo de  alcohol   (numérica; “0” .Nunca, “2”. Esporádicamente, “3” .una vez por semana) “4” ,Diario)
Tipohab19Tipo de habitación (nominal con 3 niveles; “1” De padres, “2” De un familiar, “3” Alquilada)
personas20Número de personas que conviven con el estudiante (numérica de 0 a 6, 6 representa 6  o mas)
Comidas21Número de comidas diarias que hace  el estudiante (numérica de 1 a 4, 4 representa 4  o mas)
Sueldo22Sueldo familiar  (numérica con valores 1,2,3,4)
nemadre23nivel educativo de la madre (numérica de 1 a 4)
nepadre24nivel educativo del padre (numérica de 1 a 4)
Trabma25situación laboral de la madre (nominal; binaria 0: No, 1:Si)
Trabpa26situación laboral del padre nominal; binaria 0: No, 1:Si)
pc27tenencia de computadora en casa (nominal; binaria 0: No, 1:Si )
Internet28empleo de internet en sus estudios (nominal; binaria 0: No, 1:Si)
Libros29número de libros de matemáticas disponibles en casa (numérica; de 0 a 6, 6 representa 6  o más)
Lugar30disposición de un lugar  para  estudiar en casa (nominal; binaria 0: No, 1:Si)
ecpadres31estado civil de los padres (nominal; 1:Solteros, 2:casados,3:Divorciados,4:Viudos)
vivecon32Con cuál de los padres vive? (nominal; 1:Mama, 2:Papa,3:Ambos,4:Ninguno)
nherm33número de hermanos (numérica de 1 a 4, 4 representa 4  o mas)
relacionf34Relación familiar (nominal; 1:Buena, 2:Regular,3:Mala)
rdmatiUso del profesor de material impreso (nominal; binaria 0: No, 1:Si)
rdpizarronUso del profesor de pizarrón ( nominal; binaria 0: No, 1:Si)
rdmataudiovUso del profesor de material audiovisual  (nominal; binaria 0: No, 1:Si)
rdblogUso del profesor de blog educativo (nominal; binaria 0: No, 1:Si)
rdemailUso del profesor de email como recurso educativo ( nominal; binaria 0: No, 1:Si)
rdredesUso del profesor de redes sociales como recurso educativo (nominal; binaria 0: No, 1:Si)
rdinternetUso del profesor de internet como recurso educativo (nominal; binaria 0: No, 1:Si)
habilidoc36habilidades del docente de Matemáticas para promover la participación de los alumnos (nominal “1” tot desac, “2” parc de acuerdo, “3” tot. acuerdo)
dudasdoc37habilidad del docente de Matemáticas para aclarar dudas (nominal “1” tot desac, “2” parc de acuerdo, “3” tot. acuerdo)
evalpruebaSi el docente realiza pruebas como tipo de evaluación (nominal; binaria 0: No, 1:Si)
evaltallSi el docente realiza talleres como tipo de evaluación (nominal; binaria 0: No, 1:Si)
evaltraSi el docente realiza trabajos como tipo de evaluación (nominal; binaria 0: No, 1:Si)
evaltareasSi el docente realiza tareas como tipo de evaluación (nominal; binaria 0: No, 1:Si)
niveeval39Si el nivel de evaluación en Matemáticas es adecuado (nominal “1” tot desac, “2” parc de acuerdo, “3” tot. acuerdo)
asistdoc40Si el docente asiste regularmente a clases (nominal “1” tot desac, “2” parc de acuerdo, “3” tot. acuerdo)
Promot41factores promotores de la enseñanza en Matemáticas
Detract42factores detractores de la enseñanza en Matemáticas.

Objetivo1: Seleccion de variables que mas influyen en el rendimiento de matematicas I

Para ello procedemos a la lectura de la base de datos, buscamos su dimension, graficamos las variables independientes vs la variable dependiente, la correlacion de las variables independientes con la dependiente y calculamos su significancia p

```python
import pandas as pd
import seaborn as sb
```
```python
from pandas import ExcelFile
data1= pd.read_excel('jas19.xlsx')
data1.shape
```
    (164, 55)
#Visualizacion de las variables
```python
sb.pairplot(data1,x_vars=['sueldo22','nb4','matcinu6','nemadre23','personas20','comidas21','nepadre24','libros29'],y_vars='cal8',kind='reg')
```
salida
<seaborn.axisgrid.PairGrid at 0x230d71d27b8>

# calculo de la correlacion de las variables X vs Y

from scipy.stats import pearsonr
def calculate_pvalues(df):
    df = df.dropna()._get_numeric_data()
    dfcols = pd.DataFrame(columns=df.columns)
    pvalues = dfcols.transpose().join(dfcols, how='outer')
    for r in df.columns:
        for c in df.columns:
            pvalues[r][c] = round(pearsonr(df[r], df[c])[1], 4)
    return pvalues
df2_p=calculate_pvalues(data2) 
co=df2_p['cal8']

print('p-values para la correlacion de las variables predictoras  con la calificacion,(cal8)\n variable       p-value\n', co)
p-values para la correlacion de las variables predictoras  con la calificacion,(cal8)
 variable       p-value
 carrera         0.0029
edad1            0.735
genero2          0.003
zona3           0.6863
nb4             0.0109
tipoIB5         0.5232
matcinu6        0.0003
dedica9              0
mcom10          0.5242
asesoria11      0.0472
cursoextra12    0.4926
transporte13    0.1715
tiempot         0.1295
autoest15       0.0056
motiv16         0.1262
trab17          0.4636
alcohol18       0.3391
tipohab19       0.6023
personas20      0.0567
comidas21       0.1775
sueldo22        0.7574
nemadre23       0.3761
nepadre24       0.0106
trabma25         0.455
trabpa26        0.4042
pc27            0.9026
internet28      0.5363
libros29        0.0245
lugar30          0.141
ecpadres31      0.8469
vivecon32       0.5581
nherm33         0.6479
relacionf34     0.0071
rdmati          0.0022
rdpizarron      0.1592
rdmaudiov       0.0014
rdblog          0.0363
rdemail         0.1819
rdredess        0.9552
rdinternet      0.8533
habilidoc36     0.8139
dudasdoc37      0.0016
evalprueba      0.0513
evaltall         0.436
evaltra         0.2734
evaltareas      0.0581
niveeval39      0.0503
asistdoc40       0.184
rep7                 0
cal8                 0
Name: cal8, dtype: object

Conclusión: Las variables con menor valor de p ( las que tienen mejor correlación), son:

X1: Promedio de notas de bachillerato (nb4)

X2: Notas de matematicas en el Cuso introductorio(matcinu6)

x3: dedicacion semanal al estudio fde matematicas(dedica9)

x4: autoestima(autoest15)

x5: nivel educativo del padre(nepadre24)

x6:Relacion familiar(relacionf34)

x7: uso de blogs como recurso didactico (rdblog)

x8: Aclaracion de las dudas por el docente(dudasdoc37)

x9: Nivel de repitencia(rep7)

Estas variables tienen correlación significativa con la variable dependiendente.

#Denotamos estas variables independientes con la letra X

X=data1[[  ‘nb4’,  ‘matcinu6’,  ‘dedica9′,’asesoria11’, ‘autoest15’,

nepadre24′, ‘relacionf34’, ‘rdmati’,’rdblog’,’dudasdoc37′,’rep7′ ]]

Preprocesamiento de los datos
​El preprocesamiento de los datos transforma las variables en
variables con media cero y varianza 1, lo cual permite un tratamiento insesgado de las variables
la libreria sklearn tiene este procedimiento automatizado, el cual invocamos a continuacion
from sklearn import preprocessing
​X=preprocessing.normalize(X)
print(X.shape)
print(y.shape)
salida:
164, 9)
(164, 1)
 
'''
Division de los datos
Ahora realizamos la division de los datos  en forma aleatoria
Nuevamente invocamos sklearn
'''
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,
test_size=0.33, random_state=42)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
salida:
(109, 9)
(109, 1)
(55, 9)
(55, 1)
'''
Los datos de construccion fueron un total de 109,
mientras que los datos de prueba fueron 55.
Ahora, invocamos  el modulo de Linear Regresion desde sklearn
y el modulo de metricas y luego entrenamos el modelo
'''
from sklearn.linear_model import LinearRegression
from sklearn import metrics
model = LinearRegression()
model.fit(X_train,y_train)
#Resultados
print('intercept: ',model.intercept_)
print ('Coefficients: ', model.coef_)
predy=model.predict(X_train)
print(metrics.r2_score(y_train,predy))

salida: intercepto, coeficientes y R2
intercept:  [-48.01274719]
Coefficients:[39.88433889  39.96228126 39.85694224 
-9.09651957   2.2309526  -13.2340093  
62.48698455  -1.7206179  -82.16102567]]
R2=0.7778738689631319

Este ultimo resultado nos indica que el modelo es bastante bueno
ya que el porcentaje de explicación
del mismo es de 77%.
'''

”’
EVALUACION DEL MODELO
La evaluación del modelo se realiza usando los datos
de prueba, primero hacemos la predicción de los datos  
prueba que son datos no utilizados en la construcción
del modelo y luego
calculamos el R2 correspondiente. Logicamente este
R2 de prueba va a dar menor que el R2 correspondiente a
 los datos de construcción. Pero si se mantiene alto,
podemos concluir que el modelo es exitoso para predecir y
en base X
”’
#Codigo para evaluar el modelo
predy_test=model.predict(X_test)
from sklearn import metrics
print(metrics.r2_score(y_test,predy_test))
”’
Salida
0.6642294077237553
Este resultado valida el modelo ya que para los datos de prueba se produce un R2 de 66% que es bastante bueno si consideramos que los datos son de naturaleza social.
 Podemos concluir que el modelo es exitoso para predecir y
en base X
”’


'RESUMEN DE RESULTADOS'
import statsmodels.api as sm
results=sm.OLS(y,sm.add_constant(X)).fit()
print(results.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   cal8   R-squared:                       0.629
Model:                            OLS   Adj. R-squared:                  0.594
Method:                 Least Squares   F-statistic:                     18.02
Date:                Thu, 19 Sep 2019   Prob (F-statistic):           1.79e-25
Time:                        15:17:48   Log-Likelihood:                -413.74
No. Observations:                 164   AIC:                             857.5
Df Residuals:                     149   BIC:                             904.0
Df Model:                          14                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         70.1220     25.383      2.763      0.006      19.964     120.280
x1            27.1233     13.078      2.074      0.040       1.281      52.966
x2            20.6945     12.755      1.622      0.107      -4.509      45.898
x3           -48.3959     19.011     -2.546      0.012     -85.962     -10.830
x4           -30.5542     16.254     -1.880      0.062     -62.672       1.563
x5            -8.2339      4.840     -1.701      0.091     -17.797       1.330
x6           -23.0505      8.538     -2.700      0.008     -39.922      -6.179
x7             8.5797      8.272      1.037      0.301      -7.765      24.925
x8            -9.5213      4.955     -1.922      0.057     -19.312       0.269
x9           -35.4267      9.528     -3.718      0.000     -54.255     -16.598
x10           49.9618     19.348      2.582      0.011      11.730      88.193
x11          -59.7699     22.982     -2.601      0.010    -105.183     -14.357
x12           -1.4117     34.497     -0.041      0.967     -69.578      66.755
x13           -0.0670      8.052     -0.008      0.993     -15.978      15.844
x14         -124.7283     11.672    -10.686      0.000    -147.792    -101.664
==============================================================================
Omnibus:                        0.812   Durbin-Watson:                   1.758
Prob(Omnibus):                  0.666   Jarque-Bera (JB):                0.934
Skew:                           0.125   Prob(JB):                        0.627
Kurtosis:                       2.727   Cond. No.                         215.
==============================================================================

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

Leave a comment

Design a site like this with WordPress.com
Get started