#13 Solución de la ecuación f(x)=0. Métodos: secante,regla falsa y punto fijo

Método de la Secante

Es una variación del método de Newton-Raphson donde en vez de calcular la derivada de la función en el punto x0 se usa la aproximación a la derivada dada por:

aproxdf= (f(x)-f(x0))/(x-x0)

La que representa la pendiente de la recta secante que une los puntos (x0,f(x0)) y (x,f(x))Este método es de especial interés cuando es difícil   derivar la función de estudio, por lo que el método de Newton no resulta atractivo.

Preliminares 

  1. El concepto de  la derivada de una función en un punto x0 puede expresarse como el límite de la pendiente de la recta secante que une a los puntos  (x0,f(x0)) y (x,f(x)) cuando x->x0. es decir (lim x->x0) (f(x)-f(x0))/(x-x0)
  2. Por lo anteriormente expuesto el cociente (f(x)-f(x0))/(x-x0) puede usarse como una aproximación de la derivada cuando x esta cercano a x0 y esta es usada por  el método de la secante para sustituir a la derivada de la función

Por lo tanto el método de la secante sigue el mismo algoritmo que el método de Newton-Raphson excepto que se sustituye la derivada de la la función en el punto x0  por su aproximación. Otra diferencia es que usa 2 puntos iniciales en lugar de uno.

Una buena exposición del método la pueden ver en:

https://es.wikipedia.org/wiki/M%C3%A9todo_de_la_secante

EJEMPLO: Calcular la raíz de la ecuación f(x)=x**3+7*x**2-60,   usando el métodos de de la Secante.

Antes que nada realizamos la gráfica para ubicar 2 puntos cercanos a la raiz. Observando la gráfica adjunta podemos seleccionar x0=1 y x1=2 como puntos iniciales.

GRAFICA DE f(x)=x**3+7*x**2-60,

This image has an empty alt attribute; its file name is image-1.png

PROGRAMA EN PYTHON

def f(x): return x**3+7*x**2-60

x0=1; x1=2
tol=0.01; n=20

for i in range(n):
aproxdf=(f(x1)-f(x0))/(x1-x0)
x=x0-f(x0)/aproxdf
err= abs(x-x0)
print(i,x0,x,err)
if err<tol:
print(“\n”,”convergencia alcanzada”)
print(“numero de iteraciones”,i)
print(“Raiz= “,x)
break

x0=x1; x1=x

Método de la regla falsa

El método de regla falsa o falsa posición,  es un método iterativo similar al método de la biseccion. La única diferencia con este método es la formula iterativa para actualizar la raiz, la cual es:

xm=(b*f(a)-a*f(b))/(f(a)-f(b))

Esta formula representa el punto donde la curva f(x) intercepta al eje x. Ver grafica

Para codificar el método de la Regla Falsa, usamos el mismo código que para el método de la biseccion excepto que reemplazamos la formula para xm.

PROGRAMA EN PYTHON

EJEMPLO. Resolver la ecuación: x^3+7x-60=0

Antes de empezar la codificación, se realiza un estudio preliminar( el gráfico ayuda en esto) para seleccionar 2 puntos, a y b, tal que sus imágenes tengan signos diferentes, es decir, f (a)*f (b) <0. En esta caso, observando la gráfica podemos visualizar que entre  a=2 y b=3 hay un cambio de signo de f(x). Por lo tanto según el teorema de Bolzano existe una raiz  de f(x) entre a=2 y b=3

This image has an empty alt attribute; its file name is image-1.png

E este programa resolvemos la ecuación: x^3+7x-60=0, usamos el mismo programa que el metodo de la biseccion excepto que reemplazamos la formula para xm.

CODIGO

import matplotlib.pyplot as ptl
import numpy as np

def f(x): return x**3+7*x**2-60
a=1;b=3;n=30;tol=0.01 # valores iniciales
plt.plot(x,f(x))
plt.plot(x,0*x)
xant=0
for i in range(n):
   xm=(b*f(a)-a*f(b))/(b-a)
   print(xm)
   err=np.abs(xm-xant)
   print("\n"," solucion parcial iteracion",i)
   print("raiz,error",xm,err)
   print("imagenes f(a),f(b),f(xm)",f(a),f(b), f(xm))
   if err<tol:
      print("\n","convergencia alcanzada")
      print("numero de iteraciones",i)
      print("Raiz= ",xm)
      break
   else:
      if f(a)*f(xm)> 0 :
      a=xm
      print("cambia a, a=xm ")
      if f(a)*f(xm)< 0 :
         b=xm
         print("cambia  b  b=xm")

METODO PTO. FIJO

El Método de Punto Fijo, es otro método para resolverla ecuación f(x) = 0, para ello se reordena la ecuación en una forma equivalente despejando x y la función resultante se denota por g

Ejemplo: Resolver x**3-x-1=0

Despejamos x.

Hay 2 despejes posibles(los denotamos por g1(x) y g2(x))

g1(x)=x**3-1 y g2(x)=(x+1)**(1/3).

Se toma uno de los dos despejes y se aplica reiteradamente

X1=g(x0),

x2= g(x1),

x3= g(x2)

Xn=g (xn-1)

Mediante el metodo grafico se puede tomar x0=1.2 como valor inicial

Codigo en Python

import numpy as np

import matplotlib.pyplot as plt

def f(x): return x**3-x-1

def g(x): return (x+1)**(1/3)

n=10 #Número de iteraciones aceptadas

x0=1.2 #Valor inicial

e=0.001 #Tolerancia mínima aceptada

#Bucle de cálculos

for i in range(10):

    x1=(x0+1)**(1/3)

    error= abs(x1-x0)

    print(“Iteracion:”,i+1,”Raiz:”,round(x1,3),”Error:”,round(error,3))

    if (error < e):

        print(“Convergencia alcanzada”,round(e,3))

        print(“Número de iteraciones”,i+1)

        print(“Raíz=”, round(x0,3))

        break

    x0=x1

x = np.arange(-2.0,2.0,0.1)

y = np.arange(-7.0,4.0,0.1)

plt.plot(x,f(x)) # Dibujo de la funciÓn

plt.plot(x,0*x) # Dibujo del eje x

plt.plot(y*0,y) # Dibujo de la funciÓn

plt.show() # Dibujo en la pantalla

corrida

#12-Solución de la ecuación f(x)=0. Métodos: Gráfico, Newton-Raphson y Biseccion

El problema a discutir en este post y en el siguiente es el de resolver la ecuación f(x)=0, donde f(x) es una función de cualquier naturaleza, por ejm: f(x)=x^5-3×4+x^2-3=0, o f(x)=arctan(x)+sen(x)-2=0.

Diversos métodos se han propuestos para este tipo de problemas. Aquí discutiremos, el método gráfico, el de Newton Raphson y el de la Biseccion.

METODO GRAFICO

Consiste en hacer una gráfica de la curva y=f(x) en el sistema de coordenadas (x,y). Luego se escoge el/o  los puntos por donde corta el eje X.

Ejemplo: Hallar las raíces de la ecuación: f(x)=x^3 +7*x^2 -60=0

Solución en Python:

```python
import numpy as np
import matplotlib.pyplot as plt

# definición de la función
def f(x): return x**3+7*x**2-60
#f=lambda: x**3+7*x**2-60
#definición del intervalo
x = np.arange(-3.0,3.0,0.2)
plt.plot(x,f(x)) # Plot with specified
plt.plot(x,0*x)
plt.show() # Show plot on screen

Salida:

Puede observarse que la curva (color azul) corta a el eje X (color naranja ) en el punto x=2.4, luego esta es la solución aproximada por el método gráfico

METODO DE NEWTON RAPHSON

El método de Newton- Raphson es un método iterativo que comienza con una aproximación inicial x0 (la cual suele tomarse del resultado del método gráfico) y una formula a iterar:

x(n+1)=f(x(n))/f'(x(n))

donde f’ es la derivada de f. Se realizan las iteraciones hasta un numero máximo: N, o hasta alcanzar un grado de tolerancial: tol (lo que ocurra primero) previamente definidos.

Vamos a ejemplificar con la misma función anterior

f(x)= x^3 +7*x^2 -60. En este caso f'(x)=3x^2+14x y

podemos tomar x0=2.4 como valor Valor inicial y dejamos al usuario que introduzca la tolerancia y el valor maximo de iteraciones a trves del comando input

Programa en Python

```python
import numpy as np
#import matplotlib.pyplot as plt

# definición de la función
def f(x): return x**3+7*x**2-60
def df(x): return 3*x**2+14*x
x0=2.4 # Valor inicial
n=input("numero de interaciones = ?")
n=int(n)

maxe=input("tolerancia = ?")
maxe=float(tol)
print("\n")
for i in range(n):
    x=x0-f(x0)/df(x0)
    err=np.abs(x-x0)
    print("solución parcial para i = ",i+1)
    print(" x0, x : ",x0,x)
    if err < tol :
        print("\n","Convergencia alcanzada")
        print(" solución = ",x)
        print(" Numero de iteraciones = ",i+1)
        break
    else: 
        x0=x
    
Salida

```

    numero de interaciones = ?10
    tolerancia = ?.000000001
    
    
    solución parcial para i =  1
     x0, x :  2.4 2.5150943396226415
    solución parcial para i =  2
     x0, x :  2.5150943396226415 2.511594922905926
    solución parcial para i =  3
     x0, x :  2.511594922905926 2.511591630458341
    solución parcial para i =  4
     x0, x :  2.511591630458341 2.511591630455428
    
     Convergencia alcanzada
     solución =  2.511591630455428
     Numero de iteraciones =  4
       

METODO DE LA BISECCION

Es un algoritmo de búsqueda de raíces que trabaja dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raíz. Es un método sencillo de comprender, ya que es muy intuitivo. Se basa en el siguiente teorema
Teorema de BOLZANO
Sea y = f(x) continua en un intervalo [a,b] y supongamos que
f(x) tenga signos opuestos en a y b es decir f(a)*f(b)<0
Entonces debe existir r en [a,b] tal que tal que f(r)=0,
es decir, debe haber por lo menos una raíz en el intervalo.

Ejemplo: considere la función y= x^3+7*x-60. (Ver grafico)

This image has an empty alt attribute; its file name is image-1.png

Se realiza un estudio preliminar( el gráfico ayuda en esto) para seleccionar 2 puntos, a y b, tal que sus imágenes tengan signos diferentes, es decir, f (a)*f (b) <0. En esta caso, observando la gráfica podemos visualizar que entre  a=2 y b=3 hay un cambio de signo de f(x). Por lo tanto según el teorema de Bolzano existe una raiz  de f(x) entre a=2 y b=3

def f(x): return x3+7*x**2-60
a=2;b=3;n=30;tol=0.01 # valores iniciales
import numpy as np
import matplotlib.pyplot as plt
plt.plot(x,f(x))
plt.plot(x,0*x)
xvieja=0
for i in range(n):
    xm=(a+b)/2
    print(xvieja)
    err=np.abs(xm-xvieja)
    print("\n"," solucion parcial iteracion",i)
    print("raiz,error",xm,err)
    print("imagenes f(a),f(b),f(xm)",f(a),f(b), f(xm))
    if err<tol:
       print("\n","convergencia alcanzada")
       print("numero de iteraciones",i)
       print("Raiz= ",xm)
       break
    else:
       if f(a)*f(xm)> 0 :
          a=xm
          print("cambia a, a=xm ")
          if f(a)*f(xm)< 0 :
             b=xm
             print("cambia  b,  b=xm")

#11 METODO DE GAUSS-SEIDEL

Método de Gauss- Seidel

Es un método iterativo que comienza con un conjunto de formulas y una solución inicial .

Las formulas del método consisten en el despeje de cada incógnita en cada ecuación, es decir:

  1. Se despeja x1 de la primera ecuación.
  2. Se despeja x2 de la segunda ecuación y así sucesivamente se Se despeja xn de la ultima ecuación.

Ejemplo. Sea el sistema:

2X1-7X2+4X3=9
X1+9X2+6X3=25
-3X1+8X2+5X3=6

Despejamos X1, X2,Y X3

  1. X1=(9+7X2-4X3)/2
  2. X2=(25-X1-6X3)/9
  3. X3=(6+3X1-8X2)/5

las formulas anteriores son las formulas iterativas, los valores iniciales pueden ser cualquier valor pero se acostumbra a tomar x1=0, x2=0, ..xn=0

Vamos iterando de 1 hasta un numero máximo de iteraciones: N y se calcula el error en cada iteración.

Cuando el error sea menor que la tolerancia deseada se termina el “programa”.

Es de hacer notar que el método de Gauss-Seidel converge a la solución de un  sistema de ecuaciones lineales si se cumple la condición de que la matriz de coeficientes del sistema sea una matriz diagonalmente dominante, es decir, si se cumple la siguiente condición:

La condición de ser una matriz diagonalmente dominante simplemente significa que los elementos de la diagonal son mayores (en valor absoluto) que la suma de los valores absolutos de los demás elementos del mismo renglón. Nótese que en el ejemplo anterior, la matriz sí es diagonalmente dominante y por lo tanto, el método de Gauss-Seidel sí converge a la solución del sistema.

Sin embargo, la condición de la matriz diagonalmente dominante, solamente es una condición suficiente pero no necesaria, es decir, existen sistemas de ecuaciones que no cumplen con la condición y que sí convergen a la solución y también existen sistemas de ecuaciones que no cumplen con la condición y que no convergen a la solución.

PROGRAMA EN LENGUAJE PYTHON

a=np.array([[1,1,-1],[4,-1,5],[2,2,-3]])

b=np.array([7,4,0])

tol=0.01;    N=10

#valores iniciales:  

x=0;    y=0;    z=0

for i in range(1,N):

        xnew=(b[0]-(a[0,1]*y+a[0,2]*z))/a[0,0]

        ynew=(b[1]-(a[1,0]*x+a[1,2]*z))/a[1,1]

        znew=(b[2]-(a[2,0]*x+a[2,1]*y))/a[2,2]

ex=abs(x-xnew);        ey=abs(y-ynew);        ez=abs(z-znew)

print(“Solución parcial:”)

    print(“x:”,round(xnew,3),”\ny:”,round(ynew,3),”\nz:”,round(znew,3))

      if ((ex<tol) and (ey <tol) and (ez< tol)):

print(“convergencia alcanzada en “,i,”iteraciones, resultado:

( x, y, z) =”,round(xnew,3),round(ynew,3),round(znew,3))

    x=xnew,        y=ynew,        z=znew

#10 METODO DE CRAMER

Método de Cramer

El método de Cramer es un método muy popular para la solución de sistemas de ecuaciones lineales compatibles determinados, mediante el cálculo de determinantes. El lenguaje python te permite resolver un sistema de cualquier numero de ecuaciones, gracias a la poderosa función det() que calcula el determinante de una matriz, la cual esta en la libreria np en el modulo de linalg. Ejemplo:

Resolver el sistema: x+4y+2z=7; x-y+2z=4; -x+5y-3z=0

SOLUCION EN PYTHON

import numpy as np
a=np.array([[1,1,-1],[4,-1,5],[2,2,-3]])
b=np.array([7,4,0])

d=np.linalg.det(a)
ax=a.copy();
ax.T[0]=b
print(“Ax”)
print(ax)
dy=np.linalg.det(ax)
x=dy/d
print(“x:”,round(x,3))
ay=a.copy()
ay.T[1]=b
print(“Ay”)
print(ay)
dy=np.linalg.det(ay)
y=dy/d
print(“y”,round(y,3))
az=a.copy()
az.T[2]=b
print(“Az”)
print(az)
dz=np.linalg.det(az)
z=dz/d
print(“z”,round(z,3))

Nota: Como puede observarse las instrucciones para x, y z son repititivas, por lo tanto podríamos usar un ciclo for para reemplazar esta repiticion, para ello, insertamos un vector de las incógnitas x, el cual inicializamos con ceros

N=len(b); x=np.zeros(N)

Luego introducimos un ciclo for, para hallar cada incognita

El programa con n incógnitas quedaría aun mas sencillo,

Usando estas ideas el programa anterior lo podemos modificar para resolver un sistema de n incognitas asi

import numpy as np
a=np.array([[1,1,-1],[4,-1,5],[2,2,-3]])
b=np.array([7,4,0]) # Nota La matriz a puede ser de cualquier dimension, aqui la ejemplificamos con una 3×3

d=np.linalg.det(a)

N=len(b); x=np.zeros(N)

for i in range(N)

ai=a.copy();
ai.T[i]=b
di=np.linalg.det(ai)
x[i]=di/d

print(x)

Nota: Colocar las identaciones del for donde corresponden, ya que el wordpress no permite colocarlas

#9 Metodo de Gauss para resolver un sistema de Ecuaciones

SOLUCIÓN DE UN SISTEMA DE ECUACIONES LINEALES
Introducción. Un sistema de ecuaciones es un conjunto de n ecuaciones con n incógnitas x1, x2,.., xn para las cuales existe una solución común

Ejemplo: el sistema:

2X1-7X2+4X3=9
X1+9X2+6X3=25
-3X1+8X2+5X3=6

Tiene solución x1=4, x2=1 y x3=2, ya que estos valores satisfacen todas las ecuaciones simultáneamente. La matriz del sistema es la matriz formada por los coeficientes del sistema y la matriz aumentada es la matriz que contiene además de los coeficientes del sistema los términos independientes. En el ejemplo la matriz aumentada del sistema es :

Matriz aumentada
col1 col2 col3 b
[1,] 2 -7 4 9
[2,] 1 9 6 25
[3,] -3 8 5 6
SOLUCION DE UN SISTEMA POR EL METODO DE GAUSS
GAUSS (matemático alemán del siglo 18, su nombre completo es Carl Frederick Gauss) diseno un método para resolver un sistema de ecuaciones lineales basados en tres operaciones elementales en la matriz aumentada que no cambian la solucion del sistema. Estas operaciones son:
1) Intercambiar 2 filas
2) Multiplicar una fila por un numero
3) Cambiar una fila por el resultado de multiplicar otra fila por un numero y sumárselo a la primera.
Basados en estas operaciones, Gauss elaboro un Algoritmo para resolver un sistema de ecuaciones lineales, el cual tiene dos etapas: Etapa de eliminación y Etapa de Sustitución Regresiva
Etapa de eliminación
Se establece la fila k (k=1,2..n-1, siendo n el numero de filas) como fila pivote, y se busca un multiplicador que haga 0 al primer elemento de la fila i=k+1, este multiplicador es m=A[i,k]/A[k,k], luego se multiplica m por la fila k y el resultado se resta de la fila i, esto es:
A[i,j]=A[i,j]-m*A[k,j], j=k+1,… (n+1).
Siguiendo este algoritmo se obtiene un sistema triangular superior (Escalonado)
Ejemplo: Ver
http://www.ecoribera.org/ciencias/matematicas/2-bachillerato/142-sistemas-lineales-de-4-ecuaciones-con-4-incognitas

Etapa de Sustitución Regresiva
Una vez obtenido el sistema escalonado, se comienza de la ultima fila y se determina la solucion de la ultima incognita: x[n]=b[n]/A[n,n], Luego se obtienen las otras incognitas en forma regresiva desde la penultima fila hasta la primera, usando la formula
x(i)= (1/a(i,i) )[b[i]- suma desde j=i hasta n de a[i,j]*x[j], i=n-1,n-2,…1

PROGRAMA EN PYTHON
Código fuente
import numpy as np
def Gauss (a,b):
n = len(b)
for k in range(0,(n-1)):
for i in range(k+1,n):
if (a[i,k] != 0.0):
m= a[i,k]/a[k,k]
a[i,k+1:n] = a[i,k+1:n] – m*a[k,k+1:n] b[i] = b[i] – mb[k]
if(a[n-1,n-1]==0 and a[n-1,n]!=0):
print(‘Sistema incompatible’)
exit
if(a[n-1,n-1]==0 and a[n-1,n]==0):
print(‘Sistema compatible indeterminado’)
exit
for k in range((n-1),-1,-1):

and a[n-1,n]!=0):
print(‘Sistema incompatible’)
exit
if(a[n-1,n-1]==0 and a[n-1,n]==0):
print(‘Sistema compatible indeterminado’)
exit
for k in range((n-1),-1,-1):
b[k] = (b[k]-np.dot(a[k,k+1:n],b[k+1:n]))/a[k,k]
return b
A=np.array([[1,1,-1],[4,-1,5],[2,2,-3]])
B=np.array([7,4,0])
print(“\nGauss Ejercicio #1”)
print(Gauss(A,B))

#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.

#7 Regresion Multiple

EJEMPLO DE REGRESION LINEAL MULTIPLE

El objetivo de este ejemplo fue analizar el desempeño académico en Matemáticas I de los estudiantes de Ingeniería de la UNEFA-NE (Universidad Nacional Experimental de las Fuerzas Armadas de Venezuela – Núcleo Nueva Esparta) utilizando el modelo de Regresión Múltiple. En este caso la variable dependiente y, fue el rendimiento académico general del estudiante en esa asignatura (en escala de 0-20) y las variables dependientes:

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 dependiente (detalles en la publicación#8 de este blog)

PROGRAMA EN PYTHON

#primero cargamos las librerias de python que utiliza el programa, leemos el archivo tipo excel y determinamos su dimension:

import pandas as pd
from pandas import ExcelFile
data1= pd.read_excel(‘jas19.xlsx’)
data1.shape

salida: (164×55)

”’

La dimension de la base de datos es 164×55, es decir 164 alumnos y 55 variables, las cuales se redujeron a 10, (9 independientes y 1 dependiente) tomando en cuenta como se dijo antes, las mayores correlaciones de las variables independientes con la variable dependiente.

Ahora definimos las 10 variables a usar

”’

X=data1[[  ‘nb4’,  ‘matcinu6’,  ‘dedica9′,’asesoria11’, ‘autoest15’, ‘nepadre24’, ‘relacionf34’, ‘rdmati’,’rdblog’,’dudasdoc37′,’rep7′ ]]
y=data1[[‘cal8’]]
#Estan son las variables seleccionadas
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
”’

#6. REGRESION LINEAL SIMPLE USANDO SKLEARN

Sklearn es una de las bibliotecas de python que tiene los principales modelos de Machine learning ya programados como objetos entre ellos la Regresión lineal, Regresión logística, Knn, arboles de decision, etc, lo que nos hace la vida mas facil a todos los que trabajamos en Ciencia de los Datos.

Para el aprendizaje de esta herramienta estoy siguiendo dos grandes maestros:

Jason Brownlee (https://machinelearningmastery.com/get-your-hands-dirty-with-scikit-learn-now/) y

Kevin Marhan ( https://www.youtube.com/watch?v=IsXXlYVBt1M&t=93s )

Hoy vamos a usar esta herramienta para la regresión lineal, el ejercicio a resolver es el mismo resuelto con la programación directa en el post#5, aqui vamos:

https://mypythonblog.school.blog/wp-content/uploads/2019/09/reg.pdf

#5-REGRESION LINEAL SIMPLE CON PYTHON

Nuestro primer problema a resolver usando python consiste en determinar el modelo lineal simple y=a+bx+e que mejor se ajusta a un conjunto de datos conocidos (xi,yi) para i desde 1 hasta n. Para fijar ideas consideremos yi =el precio del $ paralelo en relacion al bolivar desde el mes de Marzo de 2019 hasta Agosto de 2019. Usando los datos aportados por la pagina dolar today, tenemos los siguientes datos:

mes (X)precio: Bolivares/$
1 (Marzo)3100
24629
35917
47500
511000
618000

El trabajo consiste en analizar los datos usando el modelo de  regresión lineal simple, la relación de la variable  x sobre la variable  y

Específicamente se pide:

  • Diagrama de dispersión
  • Determinar la ecuación de la recta de regresión de Y sobre X
  • interprete del coeficiente de regresión b
  • Dibuje la linea de regresión conjuntamente con el diagrama de dispersión
  • coeficiente de bondad del ajuste  R^2
  • Predecir la variable y para el valor un valor dado de X

Para la teoría de la regresión lineal simple ver: clase-reg

Soluci’on del problema en python

”’

Objetivo: construir una gráfica de dispersión, dibujar la línea de
regresión, y calcular los estadísticos de la regresión

1. Lectura de los datos. Los datos se pueden leer directamente como listas o exportarlos de una tabla Excel o csv o de una pagina web. En este caso como son pocos datos los leemos como listas

”’
x=[1, 2, 3, 4, 5, 6 ]

y=[3100, 4629, 5917, 7500,11000,18000]

”’

2. Diagrama de dispersion

para realizar el diagrama necesitamos la librería matplotlib la importamos como plt y dibujamos el diagrama de dispersión

”’

import matplotlib.pyplot as plt

plt.scatter(x,y, color=’red’, “*”)

plt.title(‘Regresión Lineal Simple’)
plt.xlabel(‘mes’)
plt.ylabel(‘precio Bs/1dolar’)
plt.show()

”’

El comando scatter produce el diagrama de dispersión y los comandos title, xlabel, y ylabel producen los títulos correspondientes en la gráfica.
Salida :

”’

”’

3. Calculo de los coeficientes de la linea de regresión

las formulas a usar son:

a=(my)-b*(mx)

”’

Notacion:

n= longitud de los datos

SSxy suma de productos de xy

SSx= suma de cuadrados de x

Sx=suma de los valores de x

Sy = suma de los valores de y

mx=media de los valores de x,

my=media de los valores de y

Para hacer estos cálculos necesitamos importar la libreria numpy, la importaremos como np

”’

import numpy as np

n=len(x)
Sx=sum(x)
SSx=np.dot(x,x)
Sy=sum(y)
SSxy=np.dot(x,y)
mx= np.mean(x)
my= np.mean(y)

b=(n*SSxy-Sx*Sy)/(n*SSx-Sx* Sx )
a=my-b*mx

print(Sx,SSx,Sy,SSxy,mx,my)

print(a,b) # coeficientes de regresión

”’

Una vez corrida esta parte del programa, se obtuvieron los siguientes resultados:

Sx=21, SSx= 91, Sy=50146, Sxy=223109, mx= 3.5, my=8357.66

a= -1161.93, b=2719.89

Por lo tanto nuestra linea de regresion es

y = -1161.93 + 2719.89*x

4. Interpretación de b

En general b es la variación (aumento o disminución) estimada de y por el incremento de x en una unidad. En este caso, b=2719.89 es el aumento estimado del precio del dolar respecto al bolívar por cada nuevo mes desde el mes de marzo.

5. Gráfica de la linea de regresión conjuntamente con los datos

,,,

plt.scatter(x,y )
plt.plot(x, a+b*np.array(x), ‘-r’)
plt.xlabel(“Meses”)
plt.ylabel(“Precio Bs./d.”)

”’

Aquí se presenta la salida

”’

6. Calculo de R-cuadrado (R2)

El R2 es una medida de la evaluaci’on del modelo y se define como la correlación al cuadrado entre los valores observados y  predichos. Su valor esta entre 0 y 1 y generalmente se expresa en porcentaje

R-cuadrado=cor(y,ypred)^2

Cuanto mayor sea el R2, mejor será el modelo

Una formula facil para calcular R2 es

R2=1-(SSres/SSyy)

SSres=suma de cuadrados de los residuos
SSyy = suma de cuadrados de y

Código para el calculo de R2

ypred = a+b*np.array(x)
res=y-ypred

SSres=np.dot(res,res)
SSyy = np.dot(y,y) – n*my*my
R2=1-SSres/SSyy
print(R2)

  ”’

El calculo de R2 usando este codigo es

0.8735864234951496.

Por tanto, R2=87.4%. lo que indica que la linea de regresión se ajusta bien a los datos

.Prediccion

Para hacer una prediccion con la linea de regresion calculada

y = -1161.93 + 2719.89*x ,

simplemente sustituimos x en la formula p.ej, para el mes de Septiembre (x=7), el valor de y estimado es

y = -1161.93 + 2719.89*7=17877,3

#4-Aplicaciones

Una vez tomados estos cursos viene la parte mas interesante como aplicar los conocimientos adquiridos en mi trabajo diario como docente – investigador. En estos momentos tengo dos proyectos de aplicación, el curso de Calculo numérico en la UNEFA

( https://calnum.wordpress.com)

Este curso esta dedicado al aprendizaje e implementaci’on de los algoritmos de calculo numérico usando un lenguaje de programación

y el otro un trabajo de investigaci’on en “Machine Learning ” titulado:

COMO MEJORAR UNA CARRERA UNIVERSITARIA USANDO
MODELOS ESTADISTICOS CASO DE ESTUDIO: CARRERA DE
INGENIERIA EN LA UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA DE LA FUERZA ARMADA – NUCLEO NUEVA
ESPARTA

Este es un trabajo que estoy desarrollando en la UNEFA conjuntamente con los colegas Ely Rosas y Luis Chirinos

En este trabajo vamos a determinar dos modelos predictivos del rendimiento académico de Mat I (variable cuantitativa) y otro del resultado del curso ( aprobado, reprobado) , usando 56 variables independientes. Este es un trabajo que iniciamos usando el lenguaje R, pero vamos a usar también el lenguaje Python como complemento para validar los resultados obtenidos inicialmente.

Para el desarrollo en python vamos a usar las sugerencias del Dr. Jason Brownlee, descritas a continuación

En las próximas publicaciones estaremos desarrollando un tema por cada publicación que puede ser indistintamente de uno u otro proyecto

Design a site like this with WordPress.com
Get started