Logo Studenta

Cuaderno Maca Ossa

¡Este material tiene más páginas!

Vista previa del material en texto

SISTEMAS DE INFORMACIÓN
Macarena Ossa
2020
VIDEO 3
#vector
vector_numeric<-c(…)
#extraer los datos de una posicion del vector
vector_numeric[2:4]
#vector con secuencias
vector_numeric<-seq(5): 1,2,3,4,5
vector_numeric<-seq(3:7): 4,5,6,7
vector_numeric<-seq(3,7):2,4,5,6,7
vector_numeric<-seq(3,7 by=2): 3,5,7
vector_numeric<-rep(1:4,2):1,2,3,4,1,2,3,4
vector_numeric<-rep(1:4,each=2): 1,1,2,2,3,3,4,4
#Lista
lista<-list(papá=”Alberto”,mamá=”Macarena…..)
VIDEO 4
#matrices
matriz<-matrix(1:6,nrow=2,ncol=3,byrow=T)
T= el orden de llenado es por filas
F= el orden de llenado es por columna
matriz[1,2]: valor en la fila 1 columna 2
cbind: pegar matrices por columna
rbind: pegar matrices por fila
#para seleccionar una región de la matriz (en este caso se extrae la columna 1 y 2, y las filas 1 y 2 también)
matriz[c(1,2),c(1,2)]
#fila 2, columnas 2 y 3
matriz[2,c(2,3]
%*%: multiplicar matrices 
diag(matriz): diagonal matriz
t(matriz): transponer matriz
#matriz con dimensiones
array(c(1,2,3,4,5),c(2,4,5))
solve(matriz): matriz inversa
DATA FRAME
p<-c(2,7,8)
q<-c(A,B,C)
x<-list(p,q)
x[2]: extraigo el vector en la posición 2 de la lista x, es decir, el vector (q).
x[[2]][2]: extraigo el vector en la posición 2 de la lista x, y el contenido en la posición 2 dentro de ese vector, es decir, extraigo B.
 
VIDEO 5
#crear data frame
library(readxl)
flores_iris <- read_excel("~/Desktop/Sist en español/flores_iris.xlsx")
getwd()
#resumen
summary(flores_iris)
#estructura data
str(flores_iris)
#cambiar columna por factor
flores_iris$Species<-as.factor(flores_iris$Species)
#nombres de columnas q tenemos 
names(flores_iris)
#muestra 6 primeras observaciones de mi objeto
head(flores_iris)
#ultimas 6 observaciones de mi objeto
tail(flores_iris)
#para saber la media 
mean(flores_iris$Petal.Length)
#Para buscar el valor fila 10 columna 4
flores_iris[10,4]
#para hacer un gráfico comparativo (petal lenght (x), sepal width (y))
plot(flores_iris$Petal.Length,flores_iris$Sepal.Width)
#Para hacer un histograma
hist(flores_iris$Petal.Length)
#Hacer un boxplot de las variables (de la columna 1 a la 4)
boxplot(x=flores_iris[,1:4], main="boxplot flores")
#Hacer un boxplot de otra variable
boxplot(flores_iris$Petal.Length)
#si quiero analizar las flores 
summary(flores_iris)
#si quiero solo las flores iris cullo largo sea menor o igual a 3.5
#crearun vector en el q se filtren aquellas flores con largo petalo menor o igual a 3.5
#vector en data frame
vector<-data.frame[flores_iris$Petal.Length<=3.5,]
quiero que de la fila Petal Lenght extraiga todos los valores menores que 3,5 y me entregue esos datos en forma de vector.
wich.Min/Max(data$columna): minimo o maximo de la columna
cor(data[]): correlacion
rbind: agrega fila
cbind: agrega columna
CONDITIONS
a==b: son iguales
a!=b: no son iguales
Video 6
#clase anterior
flores_iris<-as.data.frame(flores_iris)
#tarea
vector_petalo<-flores_iris[flores_iris$Petal.Length<=3.5,]
#ver si son mayores o igual a 5
flores_iris$Petal.Length<=3.5
mean(flores_iris$Petal.Length)
#dimensión
dim(flores_iris)
#Calcular la media por cada factor (sólo se puede teniendo los petalos como factor)
tapply(flores_iris$Petal.Length, flores_iris$Species, mean)
#Calcular medias y algunos datos
tapply(flores_iris$Petal.Length, flores_iris$Species, summary)
#investigar comandos: which.max, rbind, cbind
#para hacer una matriz de correlaciones
cor(flores_iris[,1:4])
#para resolver dudas hay un blog q se llama rpubs, muy útil
Video 7	
#Dónde estoy trabajando
getwd()
#Dónde quiero trabajar
setwd()
#hago un vector con datos faltantes
x<-c(1,2,NA,10,3)
#si calculo la media no la va a calcular
mean(x)
#para calcular la media independiente de los datos faltantes
mean(x, na.rm=T)
#para acortar nuestro vector
y<-c(1,2,NA,4,NA,5)
#para encontrar los datos faltantes
malos<-is.na(y)
malos
#eliminar los datos faltantes
z<-y[!malos,]
z
#para ver los valores buenos 
x<-c(1,2,NA,4,NA,5)
y<-c("a","b","NA","d","NA","f")
buenos<-complete.cases(x,y)
complete cases buscará en todas las filas y eliminará las que tenga un NA
buenos
#me muestra sólo los valores buenos 
y[buenos]
x[buenos]
#base de datos q trae R para jugar q mide viento, temperatura, meses, días 
airquality
#dimensión
dim(airquality)
#hay días q no se pudo medir, Cómo lo sacamos
aire_completo<-complete.cases(airquality)
#muestra solo datos existentes
airquality[buenos]
#par guardar en otra data
auxiliar<-airquality[buenos,]
Na: not available
NaN: not a numbre
VIDEO 8
if: si una condición se cumple
if(x>3){y<-10}
else: en caso contrario que no se cumpla la condición if
if(x>3){y<-10} else{y<-0}
else if: en caso de que la primera condición no se cumpla, intenta con otra condición
if(x>3){y<-10}else.if(x<2){y<-5}else{y<-0}
for: recorre de un punto a otro
x<-c(“a”,”b”,”c”,”d”)
for(i in 1:4){print(x[i])
“a”
“b”
“c”
“d”
while: ocurre cuando una condicion es verdadera (mientras la condicion se cumpla. ejecutará todo lo que esté en {})
#funciones condicionales
x<-2
y<-100
if (x>3){
 y<-10
} else {
 y<-0
}
y<-if(x>3){
 10
} else {
 0
}
#hacemos n vector
x<-c("a","b","c","d")
#le decimos a r que el valor i recorra la posición 1,2,3 y 4 
for(i in 1:4){
 print(x[i])
}
#hacemos una secuencia de numeros enteros
seq_along(x)
#haga un listado porfor 
for(i in seq_along(x)){
 print(x[i])
}
#también entrega un listado
for(letter in x){
 print(letter)
}
#tmabién entrega un listado
for(i in 1:4) print (x[i])
#haremos una matriz
x<-matrix(1:6,2,3)
#comando que nos retorna dos filas de x
nrow(x)
#comando que nos retorna dos columnas de x
ncol(x)
#para recorrer los elementos de una matriz o imprimir una matriz individualmente
#haremos dos for anidados (muy parecido a sumatorias)
for (j in seq_len(ncol(x))){
 for (i in seq_len(nrow(x))){
 print(x[i.j])
 }
}
#vamos a escribir un contador, y le vamos a decir que mientras sea menor a 10, imprima el valor del contador
#y luego incremente el valor del count en 1
count<-0
while(count<10){
 print(count)
 count<-count+1
}
#las condiciones siempre se evaluan de izq a derecha. A z le asignamos un rango entre 3 y 10
#funcion rbinom hace un binomial (numero aleatorio de una distribucíon binomial)
#una vez que tiro una moneda (1/2 de exito), si sale sello aumente a z en 1, de lo contrario a z reduzcale 1
z<-5
while (z>=3 & z<=10){
 print(z)
 coin<-rbinom(1,1,0.5)
 if (coin<-==1){
 z<-z+1
 } else {
 z<-z-1
 }
}
 
VIDEO 9
 #funciones (function)
#Ejemplo
suma<-function(x,y){
 x+y
}
#para realizar una operación (suma(1,2) y me da 3)
suma(1,2)
#funcion mas compleja (sobre 10)
sobre10<- function(x){
 use<-x>10
 x[use]
}
#hacemos una secuencia de 1 a 20
x<-1:20
#ahora me dará los valores de mayores a 10
sobre10(x)
#otra función sofisticada
sobre<-function(x,n=10){
 use<-x>n
 x[use]
}
#se pude hacer una funcion llamada promedio de columnas 
#jugaremos con el dataset
airquality
#funcion que nos dara todos los promedios de columnas
promedio_columna<-function(y,removeNA=T){
 nc<-ncol(y)
 means<-numeric(nc)
 
 for(i in 1:nc){
 means[i]<-mean(y[,i],na.rm = removeNA)
}
means
}
promedio_columna(airquality)
#si queremos verla
View(airquality)
#buscamos el promedio de otra forma
mean(airquality$Ozone)
#removemos los NA para que nos pueda entregar el promedio
mean(airquality$Ozone, na.rm=T)
VIDEO 10
#un vector con 100 obvservaciones
rnorm(100)
#rnomr(1) genera un numero de dist normal estandar (media 0 y desv 1)
rnorm(1)
#si lo vuelvo a ejecutar me da distintos valores aleatorios
#para dar resultados replicables, y fijar un valor aleatorio (me de siempre el mismo resultado)
set.seed(123)
#esto hará que me den los mismo resultados aleatorios (-o,5 en este caso)
datos<-rnorm(100)
sd(datos)
#si hay un na q no me lo muestre
sd(x=datos, na.rm=F)
#puedo hacer lo mismo con otra funcion 
sd(na.rm=F, datos)
#los argumentos de una funcion se consultan con args
args(sd)
#dos vectores aleatorios con dist normal (media 0 y desv 1)
datos<-data.frame(x=rnorm(100), y=rnorm(100))#puedo ver la correlación de los datos
cor(datos)
#para hacer una regresión lineal (me da el intercepto y el coeficiente)
lm(data=datos, y~x, model=FALSE)
#y=B0+B1X
lm(y~x, datos)
#si hago una funcion para que me retorne 2x+3y, para encontrar los resultados pongo los valores
algo<-function(x,y){
 2*x+3*y
}
#para encontrar los valores que quiera
algo(1,3)
algo(3,1)
VIDEO 11 y 12
#primero vamos a instalar una librería, vamos a packages, apretamos install y le pones dpyr y luego install
install.packages("dplyr")
#una vez instalada tenemos acceso a muchas funciones 
#también podemos instalar otra librería llamada nycflights13, base de datos de 
#vuelos muy útil para datos académicos
library(dplyr)
library(nycflights13)
#en vez de abrir un archivo, ocuparemos esa librería
#me mostrará una base de datos muy grande
View(flights)
datos<-flights
#tiene demasiadas observaciones, por lo que es muy útil flights
dim(datos)
#si quiero que me muestre los datos del 18 de septiembre, filtro, (filter filtra las filas)
datos1<-filter(datos,month==9,day==18)
#podemos ordenar los datos en funcion de los valores de una variable 
#ordenaremos primero por datos, año, mes y dia 
datos2<-arrange(datos, year, month,day)
#ordenamos los datos por arr_delay de menor a mayor
datos3<-arrange(datos, arr_delay)
#si los quiero ordenar de mayor a menor 
datos4<-arrange(datos, desc(arr_delay))
#para seleccionar columnas usamos select, y haremos que queden solo las columnas que le indiquemos (select filtra las columnas)
datos5<-select(datos, year, month, day)
#para mostrarme el nombre de las columnas
names(datos)
#si quiero que me muestre de la 1 a la 4 columna
datos6<-select(datos, year:dep_time)
#si quiero que algunas columnas no me las muestre
datos7<-select(datos, -(year:day))
#para agregar nuevas columnas de manera sencilla, usamos mutate (agregamos otra columna)
#vuelos) y una de la velocidad. Ahora tendremos 21 columnas
datos8<-mutate(datos, gain=arr_delay-dep_delay, speed=distance/air_time*60)
#si queremos ver sólo esas dos variables en lugar de agregarlas
datos9<-transmute(datos,gain=arr_delay-dep_delay, gin_per_hour=gain/(air_time/60))
#para crear resumenes estadísticos usamos summarise
summarise(datos, delay=mean(dep_delay, na.rm=TRUE))
#me entregó un 12.6 q es el mean de delay
summary(datos)
#veremos que el min es 12.64. En la función anterior nos ahorramos tener q buscar el dato
#la funcion %>% o más conocida como pipe nos permite encadenar funciones “y despues” “entonces”
#supp:quiero ordenar los datos por arr_delay(decendiente) aquellos datos desde el 18 de sept
datos10<-filter(datos,month==9,day==18)
datos11<-arrange(datos10, desc(arr_delay))
#supp: ahora me quiero quedar con las filas que no sean year:day
datos12<-select(datos11, -(year:day))
#para hacer esto más fácil encadenamos la funcion 
datos13<-datos %>% filter(month==9,day==18) %>% arrange(desc(arr_delay)) %>% select(-(year:day))
#es lo mismo que mis datos 12. Filtro y luego ordeno, así encadeno y ordeno
#elegir datos al azar
sample_n(datos,10)
#muestreo procentual
sample_frac(data,%)
sample_frac(data,0,01)
#agrupar datos según criterio
datos%>%
group by (year,month,day) %>%
 select(arr_delay,dep_delay) %>%
 summarise(arr=mean(arr_delay.na.rm=T)
GRÁFICOS
str(data): estructura data
plot(datos$fila,datos$columna)
$: se usa para entrar a la fila/columna con datos
#para cambiar color
plot(datos$temp,datos$ozone,col=”blue”)
#para pintar los puntos del gráfico
plot(datos$temp,datos$ozone,pch=16)
#tipo de gráfico
type=”I”: lineas
type=”o”: sobrepone puntos y lineas
#para gráficar x en función de y
plot(datos$temp,~dias)
#histograma
hist(datos$temp, breaks=30)
lwd: ancho de la línea
main= titulo
y.lab/x.lab=nombre de los ejes
legend: leyenda de las líneas del gráfico
MERGE Y REDUCE
#para fucionar datas con carácterística común.
merge(data 1, data 2, by=”palabra que tengan en común”)
merge(data 1, data 2, by=”palabra comun”, all.x=T, all.y=F)
que es lo mismo que
merge(data 1, data 2, by=”palabra comun”, all=T)
#cuando el dato en común tiene distinto nombre
merge(data1, data2, by.x=”cultivo”,by.y=”plantación”)
#para juntar mas de dos data frame
deben tener igual el nombre del dato común
#para cambiar nombre de un dato
names(data[número de la posición del dato a cambiar]<-“nombre nuevo”)
#para reunir todos los datos comunes que encuentre
reduce(merge,list(data1, data2,data3))
VIDEO ESTADÍSTICA BÁSICA
#head(banco,10): primeras 10 observaciones
#head(banco): primeras 6 observaciones
#tail(banco): ultimas 6 observaciones
#str(banco): estructura del data
#unique(banco$marriel): para entrar a las categorías de esa columna “niveles”
#sum(is.na(banco)): hay valores NA en la data?
#hist(banco$age, main= “Histograma de edad”, xlab= “edad”, y.lba=”Frecuencia”, breaks=20, col=”red”)
breaks= numero de barritas que usara el grafico
#plot(banco$education, main= “grafica de educacion”, xlab= “Nivel educativo”, y.lba=”Frecuencia”, breaks=20, col=”grey”, “yellow”, “purple”, “blue”)
con esos 4 colores cada barra tomará el color según el orden. 
#table(banco$education): me hace una tabla con los datos
#pie(table(banco$education), main= “grafica de educacion”, xlab= “Nivel educativo”, y.lba=”Frecuencia”, breaks=20, col=”grey”, “yellow”, “purple”, “blue”): grafico de torta con la informacion de la tabla
## Gráfico apilado (Stacked graph)
# tabla de contingencia usando dos variables
tabla_banco <- table(banco$loan, banco$education)
tabla_banco
# gráfico de barras apilado (Stacked graph)
barplot(tabla_banco)
## Porporción por columna
# si en vez de totales queremos trabajar con proporciones
prop.table(tabla_banco, margin = 1) # margin = 1: x fila ; margin = 2: x columna 
# porporción por columna
prop.table(tabla_banco, margin = 2)
# porporción por tabla
prop.table(tabla_banco)
sum(prop.table(tabla_banco))
# propiedades gráficas en barplot
ptab_banco <- prop.table(tabla_banco, margin = 2)
barplot(ptab_banco)
barplot(ptab_banco, main = "Prestamos por nivel educativo",
 xlab = "Nivel educativo", ylab = "Proporción", 
 col = c("blue", "grey"))
## Leyendas (descriptores de los colores asociadas a las variables en un gráfico)
# leyendas, se crean con la función legend() despues de construir los gráficos 
?legend()
val_distintos <- unique(banco$loan) 
#con unique voy a crear una variable de tipo factor que continue los niveles contenidos en la variables loan
barplot(ptab_banco, main = "Prestamos por nivel educativo",
 xlab = "Nivel educativo", ylab = "Proporción", 
 col = c("blue", "grey"))
legend(x = "bottomright", legend = val_distintos, fill = c("blue", "grey"), 
 title = "Loan" )
# Resumen estadístico (sobre nuestra base de datos bank)
summary(banco) 
# Medidas de centralización
mean(banco$age)
median(banco$age)
# Cuartiles (son 3 valores de la variable que dividen a un conjunto de datos ordenados en 4 partes iguales)
#0, que coincide con el valor máximo
#25, que coincide con el primer cuartil
#50, que coincide con el segundo cuartil y con la mediana
#75, que coincide con el tercer cuartil
#100, que coincide con el valor máximo
quantile(banco$age, na.rm = FALSE, type = 1)
# deciles
quantile(banco$age, prob=seq(0, 1, length = 11))
# percentiles
quantile(banco$age, prob=seq(0, 1, length = 101))
# medidas de dispersión
var(banco$age, na.rm = TRUE)
sd(banco$age, na.rm = TRUE)
## Gráfico boxplot 
plot(x = banco$education, y = banco$age) # x vector tipo factor ; y tiene que ser de tipo numérico
plot(x = banco$education, y = banco$age, main = "Edad por nivel educativo", 
 xlab = "Nivel educativo", ylab = "Edad", 
 col = c("orange", "yellow", "green", "grey"))
# otra función para hacer un boxplot 
boxplot(formula = banco$age ~ banco$education, data = banco)
boxplot(formula = banco$age ~ banco$education, data = banco,
 main = "Edad por nivel educativo", 
 xlab = "Nivel educativo", ylab = "Edad", 
 col = c("orange", "yellow", "green", "grey"),horizontal = FALSE)
## Ejemplo 
# box plot de edades para clientes con educación primaria 
boxplot(formula = banco$age ~ banco$education, data = banco)
quantile(banco[banco$education =='primary',"age"], na.rm = FALSE,type=1)
# construyendo el boxplot por partes
banco_primary <- banco[banco$education =='primary',"age"]
boxplot(banco_primary, main = "Distribución edad en educación primaria", 
 xlab = "Primaria", ylab = "Edad", 
 col = "orange",
 horizontal = FALSE)
q1 <- quantile(banco_primary, prob=0.25)
q2 <- quantile(banco_primary, prob=0.50)
q3 <- quantile(banco_primary, prob=0.75)
ric <- IQR(banco_primary, na.rm = TRUE, type = 1)
bigote_inferior <- q1[[1]] - 1.5*ric
bigote_superior <- q3[[1]] + 1.5*ric
# resumen resultados
c(bigote_inferior, q1[[1]] , q2[[1]] , q3[[1]] , bigote_superior)
# interpretación
# el 50% de los clientes tiene entre 39 y 55 años
# el 25% de los clientes tiene a lo más 40 años
# el 75% de los clientes tiene al menos 55 años
# despues de los 79 años se consideran datos atípicos (outliers)
## Descripción conjunta de dos variables 
# Gráfico de dispersion y medidas
# Se usa para mostrar la relación entre dos variables numéricas continuas, usando puntos. 
# Cada punto representa la intersección entre los valores de ambas variables.
plot(x = banco$age, y = banco$balance) # ambas variables tienen que ser discretas o idealmente continuas
banco$balance <- ifelse(banco$balance > 15000, 15000, banco$balance)
plot(x = banco$age, y = banco$balance)
# en los diagramas de dispersión, podemos usar el argumento col para cambiar el color de los puntos usando como referencia una tercera variable.
plot(x = banco$age, y = banco$balance, col= banco$loan)
legend(x = "topleft", legend = unique(banco$loan), fill = c("Black", "Red"), title = "Loan")
# usando otro dataset precargado por R base para ejemplificar un gráfico de dispersión: Iris
plot(x = iris$Petal.Length, y = iris$Petal.Width, col = iris$Species, 
 main = "Iris - Petalo", xlab = "Largo", ylab = "Ancho")
legend(x = "topleft", legend = c("Setosa", "Versicolor", "Virginica"), 
 fill = c("black", "red", "green"), title = "Especie")
# Covarianza (indica el grado de dependencia entre dos variables)
# - Si la covarianza es positiva, indica que hay "dependencia directa", es decir, que a mayor valor de una de las variables mayor valor de la otra. 
# - Si por el contrario es negativa, indica "dependencia indirecta", o sea a mayor valor de una de las variables menor valor de la otra.
cov(banco$age, banco$balance)
# Correlación (r^2 de Pearson)
# Al igual que la covarianza, se utiliza para comprobar la relación entre dos variables, 
# pero ésta tiene un valor comprendido entre -1 y 1. 
# El signo indica si la relación es directa o indirecta y el valor indica cuánto relacionadas están las variables. 
# - Si es cercano a -1 o 1 indica que hay relación fuerte (o en valor absoluto cercano a 1)
# - Si es cercana a cero relación débil 
# En la práctica se considerará fuerte cuando sea menor que -0,8 o mayor que 0,8)
cor(banco$age, banco$balance)
## Exportar gráfico 
plot(x = iris$Petal.Length, y = iris$Petal.Width, col = iris$Species, 
 main = "Iris - Pétalo", xlab = "Largo", ylab = "Ancho")
legend(x = "topleft", legend = c("Setosa", "Versicolor", "Virginica"), 
 fill = c("black", "red", "green"), title = "Especie")
dev.copy(png,file="grafico_dispersion.png")
dev.off()
## Vizualizar multiples gráficos juntos
par(mfrow=c(2,2))
boxplot(banco[banco$education =='primary',"age"])
boxplot(banco[banco$education =='secondary',"age"])
boxplot(banco[banco$education =='tertiary',"age"])
boxplot(banco[banco$education =='unknown',"age"])
VIDEO 1 REGRESIÓN LINEAL:
La estadística actual es el resultado de la unión de dos diciplinas que evolucionan independientemente hasta confluir en el siglo XIX: la primera es el calculo de probabilidades, que nace en el siglo XVII como teoría matemática de los juegos de azar; la segunda es la “estadística” (o ciencia del estado), que estudia la descripción de los datos y tiene unas raíces más antiguas.La integración de ambas líneas de pensamiento da lugar a una ciencia que estudia cómo obtener conclusiones de la investigación empíricamediante el uso de modelos matemáticos.
El método estadístico es el procedimiento mediante el cual se sistematiza y organiza este proceso de aprendizaje iterativo para convertir los datos en información y esta información en conocimiento. La estadística descriptiva se utiliza para sintetizar y resumir los datos transformándolos en información. Esta información es procesada a través de modelos y utilizada para adaptar el modelo a la realidad estudiada, con lo que convertimos la información en conocimiento científico de esa realidad.
un modelo de regression se usa para explicar la relacion de una variables dependiente con las variables independientes. (sera la representacion de la realidad)
y=f(x1,x2,x3……xn)
buscamos el valor esperados y para ciertos valores de x
E(y l x1,x2,x3….xn)
dicha relacion puede ser lineal o no lineal. 
Para realizar este analizis, debemos:
· dataset que tenga las observaciones de las variables independientes (xn)
· dataset que tenga las observaciones de las variables dependientes (Y)
· diremos que la funcion APRENDE a partir de las variables independientes cuando es capaz de ajustarse a los datos
· existe una funcion de hipoteis h(x), que permite predecir valores de (Y) desconocidos usando los valores de los atributos.
Data set -> learning algorithm (regression lineal) -> hyphotesis function -> y: h(x1,x2,x3….xn).
el proceso de ajustar una funcion a partir de los datos se le llama “entrenamiento” en la jerga de machine learning. 
cuando (Y) se categorica diremos que es un problema de clasificacion, y cuando sea continua: regresion.
Xi= B0 + B1Xi + Ei
 
· B0: intercepto en el eje (Y). Media de la distribucion (Y) cuando x=0.
· B1: pendiente de la recta de regresión, y representa el cambio en la media de la distribucion de (Y) producido por un cambio unitario en (x)
· Ei: es el residuo o error, la diferencia entre el valor observado y el estimado por el modelo. (y- y gorrito)
debemos encontrar (VER PPT)
h(x)= B0 + B1x
y se usa MCO
MÍN E= ( yi-h(xi))^2= (yi-B0-B1xi)^2
se deriva respecto a (B1 Y B0) y se iguala a cero. y se llega a que
B1(estimador, gorrito)= ((xi-x(estimado))*(xi-y(estimado))/(xi-x(estimado))^2
B0 (estimador, gorrito)= y(estimado)-B1x(estimado)
Para saber si el modelo es de buena / mala calidad usaremos:
SCE= Suma Cuadrática del Error
 (yi-y(estimado))^2
SCT= Suma Cuadratica Total
 (yi- media de y)^2
COEFICIENTE DE DETERMINACION= R^2 (medida de calidad del modelo)
1-(SCE/SCT)
un modelo nefasto, es cuando SCE=SCT. el modelo no predice nada R^2=0
el mejor de los modelos seria cuando SCE es muy pequeño es decir, cuando yi=y (estimado) de esta manera SCE=0 y mi R^2=1.
SCM= Suma Cuadratica Explicada por el Modelo
 (y (estimado) – media de y)^2
SCT=SCM+SCE
 
es decir,
 (y- media de y)^2= (y (estimado) -media de y )^2 + (y- y (estimado))^2
R^2=1-SCE/SCT 
R^2= SCM/SCT
 
R^2: proporcion de la variabilidad explicada por el regresor (x).
como 0<=SCE<= SCT, entonces 0<= R^2 <= 1: indica que la mayor parte de la variabilidad de (y) es explicada por el modelo de regresion.
MODELO DE REGRESION LINEAL SIMPLE
 
yi=B0+B1xi+ Ei
para ver si el modelo es significativo:
H0: B1=0. (y=B0, es decir, y= cte)
H1: B1 ≠ 0. (DISTINTO, SIGNIFICANTE)
· Sacar estadístico (t)
t= B1 (estimado)÷ se(B1(estimado)) ~t (n-2)
· RECHAZAR hipotesis H0: signifiva que x SI influye al explicar la variabilidad de y. Cuando podemos rechazar, se dcie que el contraste de hipotesis resulto significativo
· NO RECHAZAR hipotesis H0: significa que la mejor prediccion para todas las observaciones es y(estimado)= media de y. Puesto que la variable x NO influye en el modelo.
SUPUESTOS:
· Linealidad: la relacion entre las variables dependientes es lineal con respecto a las independientes.
· Normalidad: Los erroresdistribuyen normal, con media 0, es decir, E~N(0, sigma^2)
· Homocedastidicidad: Los errores tienen varianza cte= sigma^2
· Independencia: Los errores son independientes entre sí.
EJEMPLO EN R:	
Grasas= B0 + B1* Edad + E
1. importar data set
2. crear variable con el data set 
datos<- read.csv”dataset”
3. crear regresion
regresion<- lm(formula=(Grasas~Edad), data=datos)
lm=lineal model
Variable dependiente: Grasas en funcion de la variable independiente Edad (Grasas~Edad)
Data: Generico para referirse al data set que se esta usando
4. Para ver los elementos de la regresion (detalles)
summary(regresion)
E= Grasas – Grasas (estimado)= Residual
p-value: significancia de la regresion 
R-squared: significancia de la regresion
Pr(> ItI): valor P, de los coeficientes. (test significancia individual) en un contraste de hipótesisse define como la probabilidad de error en que incurriríamos en caso de rechazar la hipótesisnula con los datos de que disponemos.
𝑺𝒊𝒈𝒏𝒊𝒇.𝒄𝒐𝒅𝒆𝒔=𝜶=nível de significación(riesgoa equivocarmeque estoydispuestoa asumirencaso de rechazar𝐻0)
Si 
𝒑−𝒗𝒂𝒍𝒖𝒆≤𝜶, entoncesrechazamosH0,
yaque elriesgode equivocarmees pequeño.si
𝒑−𝒗𝒂𝒍𝒖𝒆>𝜶,entoncesaceptamosH0,
 yaque elriesgode equivocarmeencaso de rechazares más alto de loque estoydispuestoa assumir.
¿Qué podríamos decir de 𝑹𝟐?. 
Es la proporción de la variabilidad explicada por el regresor 𝑥(edad).
 𝟎≤𝑹𝟐≤𝟏;1 indica que la mayor parte de la variabilidad de 𝒚(𝑔𝑟𝑎𝑠𝑎𝑠)es explicada por el modelo de regresión.El modelo de regresión esta explicando un 70% de la variabilidad de 𝑦(grasas).
𝑹𝒂𝒋𝒖𝒔𝒕𝒂𝒅𝒐𝟐,aumentará,alincluirunnuevounregresorenelmodelo,sólosiestainclusiónreducelamediadecuadradosdeloserrores. Se usa principalmente cuando hay más de una variable regresora. 
RECORDAR: para que una variable sea significativa, o el modelo. Debo rechazar H0, es decir, Debo rechazar que B1=0.
RECHAZO H0 si: valor-p <= alfa. (es significativo)
ACEPTO H0 si: valor p > alfa. (no es significativo)
alfa (signif. codes) riesgo a equivocarme que estoy dispuesto a asumir en caso de rechazar (nivel de de signif)
cor(datos): correlacion de los datos de mi data set
pairs(datos): grafico con todos los plots
names (regresion): columnas o atributos de mi objeto regresion.
regresion$residuals: Todos los residuales (error entre la observacion real y la predicha por el modelo)
summary(regresion$residuals) entrega los mismos valores que el comando anterior
boxplot(regresion$residuals): para ver los regresores en estudio.
quantile(regresion$residuals): cuantiles del residuo
· Para predecir una regresion
regresion<- lm(grasas~Edad, data=datos)
#Grasas= B0 + B1*Edad+ E
predict(regresion, data.frame(edad=24))
 En este caso, en el modelo voy a predecir las grasas estimadas para una persona de 24 años.
plot(datos$grasas~datos$edad)
abline(regresion): recta de la regresion que aproxima los datos
· Regresion multiple
· #Grasas= B0 + B1*Edad+B2*Peso+ E
· regresion2<- lm(formula=Grasas~Edad+peso, data=datos)
· summary(regresion2)
Adjusted R-squeared: ayuda a penalizar aquellos modelos que tengan muchos regresores. Este aumentará al incluir un nuevo regresor en el modelo, solo si esta inclusion reduce SCE. Se usa principalmente cuando hay mas de una variable regresora.
R^2 ajustado= 1-((1-R^2)(n-1)÷n-k-1)
R^2= 0,7012, es decir, que el modelo de la regresion esta explicando un 70% de la variabilidad de y (grasas).
intercept =B0
REGRESION LINEAL MULTIPLE
Se utilizan con frecuencia como modelos empiricos. 
yi= B0+b1X1+B2X2+ E
B0: intercepto eje y
B1: cambio esperado en la respuesta (y) por unidad de cambio en x1, con el resto de las variables (x) constantes.
E: residuo/ error, diferencia entre el valor observado y el estimado por el modelo.
HIPOTESIS: para la significancia general de la regresion.
H0: B1=B2=…..Bn=0
H1: Bj ≠ 0. (para al menos un j)
rechazar la hipotesis H0, quiere decir que al menos uno de los regresores contribuye de manera significativa al modelo.
Una vez determinado que al menos uno de los coeficientes de regresion es significativa, lo siguiente es determinar cuales son los importantes
HIPOTESIS: para significancia de los coeficientes de la regresion
H0: Bj=0
H1: Bj ≠ 0
si no se rechaza la hipotesis H0 (aceptar H0): podemos eliminar el regresor xj
Si un coeficiente es de la forma 1,433e-07: es un numero muy muy signifcativo (e-07, es 10^-7). Por ende es un numero muy pequeño que será significativo para todo valor de alfa.
VIDEO REGRESIONES LOGÍSTICAS:
Bussines analytics: El uso de datosde diversas fuentes, tratados mediante análisisestadístico, análisis cuantitativo, data mining, modelado predictivo y otras tecnologías y técnicas, para mejorar y/o desarrollar procesos de negocios que agreguen valor en las empresas.
Data driven: Enfoque de gestión de empresas mediante el cual las decisiones siempre están respaldadas por datos verificables, en lugar de por la intuición o por la experiencia personal (juicio experto).
Transformacion digital: La transformación digital es una agenda que busca brindar beneficios comerciales:•Reduce el costo de venta •Reduce los gastos generales operativos•Reducir la fricción; más fácil de hacer negocios•Aumentar las tasas de conversión•Aumentar la lealtad del cliente / puntajes netos del promotor•Aumentar la atracción y retención de talento•Reduce la brecha entre las preferencias del cliente y las ofertas
Es un metodo de regresion que permite estimar la probabilidad de una variable cualitativa binaria en funcion de variables cuantitativas.
Establece una relacion de dependencia entre una variable dependiente categorica (y) con un conjunto de variables independientes cuantitativas y/o binarias (x).
Se usara las regresiones logistias binarias para calcular la probabilidad o bien para determinar la probabilidad que un evento ocurra (1) o no (0).
EJEMPLO:
y<-c(0,1,1,0,1,0,1)
x<-c(25,54,67,6,77,49,81)
datos_ejemplo<- data.fram (y,x)
regresion<- lm(formula= y~x, data=datos_ejemplo)
summary (regresion)
predict(regresion, data-frame(x=c(81,60,70))): para evaluar la regresion en esos valores.
la regresion al graficarla, no es una linea recta. Sino quees una sigmoide (ver ppt). 
y=ø(z)= 1÷(1+e^-x)
· para valores muy negativos de (x) y= 0
· cuando x=0, y=0,5
· cuando x>0, 0<y<1
asi, si tenemos (n) variables explicativas, donde el evento Y depende de las variables x1,x2,x3…xn.
P(Y=1/x1,x2,x3…xn)= 1÷(1+e^-(B0+B1x1+B2x2+….Bnxn)).
ODDS: P(Y=1/x) ÷ 1-P(Y=1/X)= e^( B0+B1x1+B2x2+….Bnxn)
p= 1÷ 1+e^-y
p= e^Y ÷ 1+e^Y
CALIDAD DEL MODELO:
En regresiones lineales, la calidad del modelo se podia ver con el R^2, que nos mostraba el (%) de la desviacion en la respuesta (y), explicada por el modelo. Pero en el modelo de regresion lineal multiple veiamos que R^2 aumenaba a medidad que aumentaba la calidad de los regresores.
el R^2 ajustado permite penalizar el efecto de agregar regresores.
En la regresion logistica, utilizamos el AIC (criterio de informacion de AKAIKE), es una medida de la calidad relativa de un modelo que explica el ajuste y el numero de terminos en el modelo. el estadistico no tiene interpretacion sin un valor de comparacion.
Se utiliza el AIC para comparar distintos modelos.
· mientas mas pequeño AIC, mejor se ajustara el modelo a los datos
En una regreion logistica muchas veces queremos predecir la respuesta Y=1, habran veces que las respuesta sera Y=1 y veces que sera Y=0
RECHAZO NO RECHAZO
	FALSE (α)
ERROR TIPO 1
(+)
	TRUE
(1- α)
	TRUE
(1-ß)
	FALSE (ß)
ERROR TIPO 2
(-)
VERDADERO
FALSO
RECHAZO NO RECHAZO
	Falso positivo (+)
	true postive
(1- α)
	True negativo
(1-ß)
	Falso negativo
(-)
VERDADERO
FALSO
tasa de true positive: TP ÷ P
tasa de false positive: FP ÷ N
P= positivos = 1
n= negativos = 0
ERROR TIPO 1: (falso positivo), rechazar H0, siendo verdadera. depende de α.
· incluir variables relevantes
· sube varianza
· no sesga
ERROR TIPO 2: (falso negativo), no rechazar H0, siendo falsa. depende de ß.
· omitir variables· baja la varianza
· sesga
	R E A. L
(1) 	 (0)
	
VP
	
FP
(erro tipo 1)
	 
FN
(error tipo 2)
	
VN
 
(1)
 		PREDICO
(0)
METRICAS:
accuracy (exactitud)= VP+VN ÷ (VP+VN+FN+FP)
precision= VP ÷ (VP + FP)
recall (sensibilidad)= VP ÷ (VP+FN)
F1score= precision * recall ÷ (precision + recall)
especifidad= VN ÷ (VN+FP)
true negative rate= VN ÷ (VN+FN)
VIDEO 2
EJEMPLO
variable dependiente toma valores (0 ò 1)
mydata<- dataframe
str(mydata): estructura de la data
mydata$admit<- as.factor(datafram$admit)
*si al transformarlo a factor aparece W/2 significa que tiene 2 niveles, W/4: 4 niveles
cor(mydata$gre,mydata$gpa): correlacion entre las variables
la correlacion solo se ve para variables numericas
xtabs(~admit+rank, data=mydata)
analisis de grafico (two way table)
library(ggplot2)
mosaicplot(mydata~mydata$ran, col=T, main=”Admit vs Rank”)
plot(mydata$gre~mydata$gpa)
cuando tengo una variable categorica se puede hacer un
library(lattice)
xyplot(mydata$gre~mydata$gpaImydata$admit)
gplot(mydata, aes(admit,gre,fill=admit))+
geom_boxplot()+
theme_bw()+
xlab(“Admit”)+
ylab(“GRE”)
ggtitle(“ADMIT vs GRE”)
Para calibrar el modelo (entrenar) con el 80% de los datos, y probarlo con el 20% de los datos
el grupo train-> 80% de los datos
el grupo test -> 20% de los datos
library(dplyr)
set.seed(cualquier valor): para repetir el experimente, guardandolo y replicando los resultados. (fija un punto de aleatoriedad)
set.seed(100)
muestra<- sample(1:nrow(mydata), round(0.8*nrow(mydata)))
 
nrow(mydata)= numero de observaciones, es decir que la muestra ira desde el 1 hasta el numero total de filas (datos) que tenga la data
y con sample, quiere decir que eligira al azar el 80% de los datos de mydata, es decir, 320 datos al azar (400*08)
train <-mydata [muestra, ]: quiero ver las filas de mydata (aquellas que si esten en la muestra), y todas las columnas (80%)
test<- mydata [-muestra, ]: quiero ver aquellas observaciones que no estan en la data, y todas las columnas. (20%)
MODELO
modelo1<-glm(admit~.): para regresionar contra todas las variables (.)
modelo1<-glm(admit~. , data=train, family=”binomial”)
ln(p÷(1-p))=B0+B1x1+…..+e
P-> probabilidad de ser aceptado admitido (admit)=1
1-P-> probabilidad de ser rechazado de ser admitido (admit)=0
los Betas, se interpretan como los logaritmos de la probabilidad, de acuerdo a su significancia (valor-p)
modelo2<-glm(admit~. gpa+rank , data=train, family=”binomial”)
modelo2<-glm(admit~. -gre , data=train, family=”binomial”)
de esta manera se estaria sacando la variable gre, que no es significativa. Ambas formas son analogas, es decir, logran lo mismo.
p.train<- predict(modelo2, train, type=”response”)
predi1<-ifelse(p.train>0.5,1,0)
si p.train>0.5, que tome el valor 1. Sino que tome el valor 0.
MATRIZ DE CONFUNSION:
tab1<-table(predicted~predi1, Actual=train$admit)
asi se puede ver la cantidad de:
· verdadero positivo (1,1): los que acerte, que predije que tenian la caracteristica y efectivamente la tiene
· verdadero negativos (error tipo II) (0,0): aquellos que predije que no iban a tener la caracteristica, y efectivamente no la tenian
· falso positivo (1,0) error tipo 1: rechazar H0, siendo verdadera. 
· falso negativo (0,1) error tipo 2: no rechazar H0, siendo falsa.
accurancy=(sum(diag(tab1))/sum(tab1)
FUERA DE MUESTRA (TEST)
p.test<- predict(modelo2, test, type=”response”)
con el mismo modelo de train, modelo2 
predi2<-ifelse(p.test>0.5,1,0)
tab2<-table(predicted~predi2, Actual=test$admit)
accurancy=(sum(diag(tab2))/sum(tab2)
accurancy= calidad.
CLASE ONLINE EN VIVO:
El aprendizaje automático (machine learning) le enseña al computador a hacer lo que es natural para humanosy animales: aprender de la experiencia.
●Usamos métodos computacionales para aprender información directamente de los datos sin depender de unaecuación predeterminada como modelo.
●Los algoritmos encuentran patrones naturales en los datos que generan insights ayudando a tomar mejoresdecisiones y a hacer mejores predicciones
TIPOS DE APRENDIZAJE:
· supervisado: se le entrega al computador respuestas correcta e incorrectas con datos etiquetados. y luego le entregare una observacion nueva, y que pueda saber que es. (clasificacion (para predecir si un elemento pertenece a una clase, variable binaria) y regresion(predecir valor continuo))
· no supervisado: se deducen patrones (estructuras subyacentes) a partir de datos no etiquetados, y es capaz de reconocer patrones. (clustering (agrupacion, segmentacion), reduccion de dimensionalidad (como resumir la data))
· refuerzo: hibrido entre supervisado y no supervisado, existe recompensa por éxito: es aprendizaje por ensayo y error.
1. APRENDIZAJE SUPERVISADO:
los algoritmos de aprendizaje supervisado toman un conjunto de datos de entrada (training set) y salida conocidas. Se entrega un modelo para generar predicciones para las salidas frente a nuevos datos de entrada.
las tecnicas de aprendizaje supervisado son:
· clasificado: se predice respuestas discretas en donde se busca predecir si un elemento pertenece a una clase o no
· regresion: se predice una respuesta continua (numerica)
ALGORITMOS DE CLASIFICACION
Los algoritmos de clasificación pueden ser binarios o multiclase. No todos los algoritmos sirven para todo, losproblemas de clasificación multiclase son más desafiantes porque requieren de modelos más complejos.
econocimiento de Imágenes Médicas
●Scoring Crediticio
Speech Recognition
●Filtro antispam
· Regresión Logística
¿Cómo funciona?
Predice una una probabilidad para una respuesta binaria de pertenecer o no a una clase. Por su simplicidad generalmente es el primer algoritmo utilizado
.¿Cuándo se usa?
●La data puede claramente separarse usando una única frontera lineal.
●Para definir un baseline antes de usar algoritmos de clasificación más complejos.
· K- Nearest Neighbor (KNN)
¿Cómo funciona?
Categoriza datos de respuesta no conocida basado en la características de sus vecinos. Supone que datos cercanos son similares.
¿Cuándo se usa?
●Se necesita un algoritmo simple para establecer un benchmark.
●Se desea clasificar rápido y la precisión no es tan relevante.
· Máquina de Soporte Vectorial (SVM)
¿Cómo funciona?
Clasifica data buscando fronteras lineales (hiperplanos) para separar las clases. Si la data no es linealmente separable se usa una transformación (de kernel) para llevar la data a dimensiones más altas donde sean linealmente separables.
¿Cuándo se usa?
●La data es de alta dimensionalidad y no es linealmente separable.
●Se requiere clasificar y se tienen pocos datos.
· Clasificador Bayesiano Ingenuo (Naive Bayes)
¿Cómo funciona?
Supone que la presencia de una característica particular en una clase no está relacionada con la presencia de cualquier otra característica. Clasifica los nuevos datos según la probabilidad más alta de que pertenezca a una clase en particular
.¿Cuándo se usa?
●Se tienen pocos datos y muchos parámetros.
●Se desea un clasificador fácil de interpretar.
●Cuando se encontrarán escenarios no vistos en el training set.
· Red Neuronal
¿Cómo funciona?
Inspirada en el cerebro humano, una red neuronal consiste en redes de neuronas altamente conectadas que relacionan las entradas con las salidas deseadas. La red se entrena modificando iterativamente los pesos de las conexiones para que desde las entradas se pueda llegar a la respuesta correcta. Cada neurona es una estructura en la que se reciben las entradas ponderadas y según un criterio de activación transmitirá una salida.
¿Cuándo se usa?
●El modelo es altamente no lineal.
●La cantidad de data aumenta y se desea actualizar constantemente el modelo.
●Pueden tenerse cambios inesperados en las entradas.
●La interpretación del modelo no es relevante.
· Árbol de Decisión
¿Cómo funciona?
Permite predecir las respuestas siguiendo las decisiones (reglas) en el árbol desde la raíz (principio) hasta un nodo de hoja (respuestas). Un árbol consiste en condiciones de bifurcación donde el valor de un predictor se comparacon un peso entrenado
. ¿Cuándo se usa?
●Se requiere un algoritmo rápido que no consuma mucha memoria, que sea fácil de interpretar y la precisión no es un tema tan relevante.
· Random Forest
¿Cómo funciona?
Se seleccionan aleatoriamente variables y observaciones y se clasifica usando un árbol de decisión, se hace esto con muchos árboles y se vota. Se usan muchos weak learners
.¿Cuándo se usa?
●Las variables son discretas o no lineales.
●Se busca precisión en un tiempo razonable.
●Hay data incompleta o mala (en bajas cantidades)
TECNICAS DE MACHINE LEARNING:
· Machine Learning usa dos tipos de técnicas de aprendizaje:
○Supervisado, en donde se entrena un modelo conociendo su input y output, para así predecir futurosoutputs.
○No Supervisado, en donde de manera automática se encuentran los patrones o estructuras intrínsecasen la data de entrada.
ALGORITMOS DE REGRESION:
Respuestas a medicamentos
Forecaste de precio de acciones
●Probabilidad de ser amigos en una red social
●Volúmenes de venta en función de variables exógenas
· Regresión Lineal
¿Cómo funciona?
Busca una respuesta continua basada en variables independientes usando un modelo lineal.
¿Cuándo se usa?
●Se necesita un algoritmo rápido y fácil de interpretar.
●Para definir un baseline antes de usar algoritmos de clasificación más complejos.
· Gaussian Process Regression (GPR)
¿Cómo funciona?
Son modelos no paramétricos que se utilizan para predecir el valor de una variable de respuesta continua. Son ampliamente utilizados en el campo del análisis espacial para la interpolación en presencia de incertidumbre.
¿Cuándo se usa?
●Se requiere hacer interpolaciones de data espacial.
●Se tienen datos con alta volatilidad.
· Red Neuronal
¿Cómo funciona?
Es la misma estructura que para clasificación, la salida después se escalará al rango utilizado en el set de datos.
¿Cuándo se usa?
●El modelo es altamente no lineal
.●La cantidad de data aumenta y se desea actualizar constantemente el modelo.
●Pueden tenerse cambios inesperados en las entradas.
●La interpretación del modelo no es relevante
· Regresión de Vectores de Soporte (SVR)
¿Cómo funciona? 
Funciona como el SVM, pero está modificado para predecir una respuesta continua. Se usan también funciones de kernel para llevar los datos a un mundo linealmente separable
.¿Cuándo se usa?
● La data tiene una alta dimensionalidad y muchos parámetros.
· Árbol de Decisión (Regression Tree)
¿Cómo funciona?
Es la misma estructura que para clasificación pero está modificado para predecir una respuesta continua.¿Cuándo se usa?
●Se tienen variables categóricas (discretas) o un comportamiento no lineal.
●Se busca rapidez en la predicción.
· Random Forest
¿Cómo funciona?
Es equivalente al caso de clasificación, salvo que en este caso se promedian valores continuos para la respuesta.
¿Cuándo se usa?
●Se tienen variables categóricas (discretas) o un comportamiento no lineal.
TECNICAS DE MACHINE LEARNING:
· Machine Learning usa dos tipos de técnicas de aprendizaje:
○ Supervisado, en donde se entrena un modelo conociendo su input y output, para así predecir futuros outputs.
○ No Supervisado, en donde de manera automática se encuentran los patrones o estructuras intrínsecas en la data de entrada.
existe también el aprendizaje de refuerzo, este es del tipo ensayo y error, en donde el computador busca una recompensa, se usa más en teoría de agentes que en machine learning.
2. APRENDIZAJE NO SUPERVISADO
●El aprendizaje no supervisado encuentra patrones ocultos o estructuras intrínsecas en los datos. Se utilizapara extraer inferencias de conjuntos de datos que consisten en datos de entrada sin respuestas etiquetadas.
●Clustering es la técnica de aprendizaje no supervisado más común, se utiliza para el análisis de datosexploratorios para encontrar patrones ocultos o grupos de datos. Los datos se dividen en grupos segúnalgunamedida de similitud o característica común, de manera que los objetos en el mismo grupo sean muy similaresy los objetos en grupos diferentes sean muy distintos.
Los algoritmos de clusters se dividen en dos grandes grupos:
· - Hard clustering: cada punto pertenece a un solo clúster
· - Soft clustering: cada punto puede pertenecer a más de un clúster
Las aplicaciones de técnicas de clustering incluyen la secuenciación de genes, segmentación de mercado, búsqueda de anomalías y reconocimiento de objetos, entre otros.
TECNICAS DE CLUSTERING: HARD CLUSTERING
· K-means
¿Cómo funciona?
Divide la data en k clusters mutuamente excluyentes, que tan bien un punto se asigna a un cluster está determinado por ladistancia desde ese punto hasta el centro del cluster.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
· K- medioids
¿Cómo funciona?
Similar a k-means, pero con la condición de que los centroides coincidan con puntos en la data.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
●Se busca representatividad con un ejemplo concreto
· Hierarchical
¿Cómo funciona?
Produce sets de clusters anidados según las similaridades de pares de puntos, arma un árbol de particiones.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
Cuando se desea visualizar para guiar la selección
· DBSCAN
¿Cómo funciona?
Clusteriza basado en la densidad de puntos, se definen puntos de core, borde y ruido.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
●Cuando se desea identificar los puntos no representativos que corresponden a ruido.
· Self Organizing Map (SOM)
¿Cómo funciona?
Es una red neuronal que se usa para producir una representación discreta del espacio de las observaciones de entrada.
¿Cuándo se usa?
●Para visualizar data de alta dimensionalidad en 2D-3D
●Para reducir la dimensionalidad de la data preservando su forma
TECNICAS DE CLUSTERING: SOFT CLUSTERING
· Fuzzy C-Means (Fuzzy K-Means)
¿Cómo funciona?
Divide la data en k clusters donde cada punto puede pertenecer a más de un cluster
.¿Cuándo se usa?
●El número de clusters es conocido
●Para reconocimiento de patrones
●Se sabe que los clusters pueden solaparse
· Gaussian Mixture Model
¿Cómo funciona?
Clusteriza asumiendo que los puntos vienen de muchas distribuciones normales multivariadas con ciertas probabilidades.
¿Cuándo se usa?
●Un dato puede pertenecer a más de un clúster.
●Los clusters tienen diferentes tamaños y correlaciones en las estructuras internas.
TECNICAS DE REDUCCION DE DIMENSIONALIDAD:
Muchas veces se desea visualizar data de más de 3 dimensiones, para ello existen técnicas que permitenreducir la dimensionalidad de los datos permitiendo su visualización, en estos casos, siempre se perderáinformación en el proceso
· PCA (Análisis de Componentes Principales)
¿Cómo funciona?
Realiza una transformación lineal en los datos para que la mayor parte de la varianza (información) sea capturada por las primeras componentes principales. La primera componente principal capturará la mayor varianza, seguida por la segunda componente principal, y así sucesivamente.
· t-SNE (t-Distributed Stochastic Neighbor Embedding)
¿Cómo funciona?
Transforma distancias en el espacio de alta dimensionalidad en probabilidades (de que un par de puntos sea vecino), después usa estas probabilidades en un espacio de dimensionalidad menor. Así se busca que puntos que son vecinos en alta dimensionalidad lo sean en el espacio de baja dimensión. 
· str(datos): estructuta de la data
· summary(datos): los datos que son factor, nos lo entrega como frecuencia. Con este comando veo mi data en mas detalle
· is.na(datos): para ver si hay datos faltantes
· cor(subset(datos, select= -c(shelveLock,Urban,US))): con este commando se establece una correlacion eliminando datos, es decir, seleccionando algunos datos para establecer la correlacion. con esto (select= -) se eliminan los datos que no se quieren agregar en la correlacion. y subset sirve para hacer subgrupos/subconjuntos
· Para separar entre train y test
1. establecer una data aleatoria (elegir observacionesaleatorias)
 set.seed: para repetir el experimento
set.seed(100): se puede poner cualquier numero en el parentesis
muestra<-sample(1:nrow(datos)): numeros del 1: hasta el numero de filas de la data
muestra<-sample(1:nrow(datos); round(0.8*nrow(datos))): se esta redondeando al 80% de los datos, es para extraer los datos sin decimales. extraera 80% de observaciones.
train<-datos[muestra, ]: para extraer todos los datos de muestra (80%)
2. hacer el test
test<-datos[-muestra, ]: de esta manera se extraen todos los datos que NO estan en la muestra. (29%)
3. regresion
regresion<- lm(sales~.): regresion contra todas las variables (.)
regresion<- lm(sales~., data=train): sales es la variable dependiente.
cuando tengo muchas variables, hay que fijarse en el R^2 AJUSTADO
regresion<- lm(sales~. -Population, data=train): Para sacar una variable de la regression.
cuando tengo una variable factor, R lo utiliza como variable dummy. Y los incluye en el intercepto.
4. predecir en muestra y fuera de la muestra, en este caso predeciremos en muestra
predic.train<- predict (regresion, train): sales estimada, regresion estimada
error.train<-train$sales-predic.train: errores de la regression
MAE.train<-sum(abs(train$sales-predic.train))/nrow(train): para ver que tan bien predice el modelo (train$sales-predic.train= y-y gorrito)
MSE.train<-sum((train$sales-predic.train)^2)/nrow(train)
RMSE.train<.sqrt(MSE.train)
METRICAS DE REGRESION
predict( que modelo utilizare para predecir, datos de la regresion)
MSE: min square error
RMSE: raiz cuadrada de MSE.
MAE: mean absolute error 
MAPE: mean absolute percent error (libreria Mlmetrics)
plot(predic.train~train$sales)
abline(0.1)
	predecir fuera de muestra:
	test<-datos[-muestra, ]: test esta fuera de la muestra (-muestra)
1. edit, find y cambiar a test.
predic.test<- predict (regresion, test)
error.test<-test$sales-predic.test
MAE.test<-sum(abs(test$sales-predic.test))/nrow(train)
MSE.test<-sum((test$sales-predic.test)^2)/nrow(train)
RMSE.test<.sqrt(MSE.test)
corrplot(Correlaciones, type="upper"): grafico de puntos
corrplot(Correlaciones, type="upper", order="hclust", method="color"): grafico con colores y cuadrados
VIDEO ARBOLES DE DECISION
APRENDIZAJE SUPERVISADO:
los algoritmos de aprendizaje supervisado toman un conjunto de datos de entrada (training set) y salida conocidas. Se entrega un modelo para generar predicciones para las salidas frente a nuevos datos de entrada.
las tecnicas de aprendizaje supervisado son:
· clasificado: se predice respuestas discretas en donde se busca predecir si un elemento pertenece a una clase o no
· regresion: se predice una respuesta continua (numerica)
PROCESO DE CONSTRUCCION DE UN MODELO:
1. TRAINING
2. PREDICTING: 
New data -> feature engineering -> predict -> target
Se trabajan dos grupos, train y test.
Con machine learning se entrena el modelo. Antes de salir, se prueba el modelo con las variables tests.
 
Arbol de decision: arbol de flujo.
Es un modelo supervisado que permite explicar/predecir el comportamiento de una variable y en funcion de una relacion de variables.
No existen restricciones sobre las variables implicadas, pudiendo ser continuas o discretas (nominales u ordinarias)
¿Cómo funciona?
El arbol predice la variable dependiente con base en el aprendizaje de reglas de decision inferidas desde las caracteristicas que poseen los datos; si la variable dependiente es categorica decimos que es un arbols de clasificacion, y si es numerica decimos que es un arbol de regresion.
¿Cuándo se usa?
Se requiere un algoritmo rápido que no consuma mucha memoria, que sea fácil de interpretar y la precisión no es un tema tan relevante.
Ventajas
· Su facilidad para ser interpretada
· No asumen una distribucion concreta sobre las variables explicativas
· Permiten capturas relaciones lineales y no lineales
Se comienza con una raiz (parte superior) y se desprenden las hojas.
· Criterio de segmentacion
1. entropia de shannon
Dado un vector de probabilidades p=(p1,p2,p3,…..,pn), se define una medida de incertidumbre como una funcion que debe cumplir las siguientes propiedades.
1. Si no hay incertidumbre, uno de los posibles sucesos ocurre seguro.
Por ejemplo: ocurrira algo si o si sin importar lo que pase (probabilidad=1)
Si H(p)=0 => €(1,2,….n) tal que p1=1
2. H(p) alcanza su maximo valor cuando todos los sucesos son equiprobables (igual de probables), es decir, alcanza su valor maximo en el punto, eventos disjuntos.
Todos pueden ocurrir con igual probabilidad (dado cargado)
(1/k,1/k,….,1/k)
Una de las medidas de incertidumbre mas utilizadas, es la entropia de shannon, mide el grado de incertidumbre asociado a una distribucion de probabilidad.
Dado dos conjuntos (x e y) podemos considerar H(x) e H(y)
ENTROPIA
H(x)= p(x)* log(p(x))
ENTROPIA CONJUNTA
H(X,Y)= -p(x,y) * log (p(X,Y))
ENTROPIA CONDICIONADA (cuando tengo mas informacion)
· Es la entropia de la distribicion (y) condicionada a (x)
· Expresa cuanta informacion necesitamos para especificar (y), supuesto que conozcamos (x)
H(Y I X)= - p(x,y)* log(p(yIx))
CLASIFICACION: ARBOLES DE DECISION
Medida de como se reduce la incertidumbre al paser de un nodo padre, a sus nodos hijos. Se trata de elegir la variable que, al entrar en el modelo, proporciona un mayor valor de U (uncertainty), es decir, la que permite una mayor reduccion de la incertidumbre.
U(Y I X)= (H(Py)-H(Py I Px))÷ H(Py)
(reduccion de la incertidumbre de la variable Y al introducir la variable X en el arbol, a mayor valor, mayor reduccion de incertidumbre)
EJEMPLO: detectar clientes propensos a darse de baja en una compañía en funcion de las variables: sexo, edad y si es o no cliente VIP.
· Objetivos: aprender un arbol de decision que explique los ejemplos disponibles.
Se tiene que analizar la entropia del evento a estudiar condicionada en las variables, es decir, la entropia de que se fugue siendo mujere/hombre.
Ejemplo ppt:
5/8: no se van a fugar
3/8: se fugan
Pfuga=(5/8,3/8)
Y calculamos la entropia
-5/8*log2(5/8)-3/8*log2(3/8)=0,954
Y evaluamos la entropia si es un HOMBRE quien se fuga
-3/5*log2(3/5)-2/5*log2(2/5)= 0,971
*que un HOMBRE no se fugue tiene probabilidad= (3/5)
* que un HOMBRE se fugue tiene probabilidad= (2/5)
Y evaluamos la entropia si es una MUJER quien se fuga
-2/3*log2(2/3)-1/3*log2(1/3)= 0,918
*que una MUJER no se fugue tiene probabilidad= (2/3)
* que un MUJER se fugue tiene probabilidad= (1/3)
Entonces la reduccion de entropia
P(fugaIsexo)= (5/8)*0,971+(3/8)*0,918= 0,951
(0,954-0,951)/0,954= 0,003
*se usa log2 porque el ejemplo utiliza solo dos separaciones (casos: se fuga o se fuga)
Y asi con cada variable, y se puede ver cual es la variable que elimina la mayor cantidad de entropia. Esta será la que tenga mayor coeficiente de reduccion de entropia.
2. indice de Gini
Otra medida que nos permite evaluar la incertidumbre es el indice de gini, este mide el grado de pureza de las variables, evaluadas con respecto a las variables dependientes.
Gini(s)= 1- p^2(s,c)
Gini split (X,s)= (s÷X)*Gini(s)
Criterio de selección: se selecciona la division (split) con menos Gini ponderado Gini (split). Buscamos la separacion que reduzca la impureza. 
En otras palabras estamos midiendo la impureza por eso queremos minimizar el valor.
X corresponde a una variables. 
S es el conjunto de las divisiones posibles de X.
S es una divicion en particular
C es el conjuto de clases o etiquetas de prediccion
BUSQUEDA DE UN ESPACIO DE HIPOTESIS:
· Espacio de hipotesis completo
· Un unico arbol candidato en cada paso
· Sin retrocesos (peligro de optimo locales), busqueda en escala
· Decisiones tomadas a partir de conjuntos de ejemplos
SESGO INDUCTIVO:
· Se prefieren arboles mas cortos sobre los mas largos
· Sesgo preferencial, implicito en la busqueda
· Principio de la navaja de Occam (* investigar)
SOBREAJUSTES:
· Atributos que en los ejemplos presentan una aparente regularidad pero que no son relevantes en realidad.
Conjunto de entrenamiento pequeños.
¿COMO EVITAMOSLOS SOBREAJUSTES?
· Para el desarrollo del arbol antes de que se ajuste perfectamente a todos los nodos.
Podar el arbol posteriori-
· Transformacion de las reglas, podado de las condiciones de las reglas
· Realizar podas directamente en el arbol
Recordar, Que el contexto es en machine learning.
En un arbol de decision, se definen criterios basicos acorde a la data, respondiendo preguntas como “si” o “no”
CÓDIGO
EJEMPLO 1
1. INSTALAR LIBRERÍA:
Datasets
Install.packages(“Datasets”.load)
Library(datasets.load): llamar librería
2.IMPORTAR DATA A ESTUDIAR
*se usará la data iris
Summary(iris)
3.INSTALAR LIBRERÍA PARA EL ARBOL
Install.packages(tree)
Library(tree)
4. ARMAR ARBOL
Iris.tr<- tree(Species~. , Iris)
Tree: commando para hacer un arbol
Species~. : la variable Species contra todo el resto
Iris: data set que se usara
Species sera lo que estara en las hojas.
Iris.tr: para ver que hay en la raiz, y como se va abriendo el arbol.
Plot(Iris.tr)
Text(Iris.tr): para agregarle texto al grafico
grafico del arbol, con texto
summary(Iris.tr): formula, cuantas observaciones quedaron mal especificadas, nodos terminales, error rate, etc
EJEMPLO 2
DAAG: librería para identificar si el correo es spam o no.
Library (DAAG)
Data set: spam7
Dim(spam7): 4601 observaciones, 7 columnas.
Head(spam7): primeras 10 observaciones de spam7
Str(spam7): estructura data (factor, numeric)
Summary(spam7): resumen data (ver si esta balanceada, si tiene hartos “yes”)
Librería 2 de arboles (rpart)
Library(rpart)
Spam.tree<-rpart(formula=yesno~. , method=”class”, data=spam7)
Method= metodo del arbol, queremos clasificar, por ende ponemos “class”
Yesno= variable dependiente, ver si es o no es un spam
Plot(spam.tree)
Text(spam.tree): para agregar texto al grafico.
Librería para arboles:
· Tree
· rpart
existe una metrica asociada a la comlejidad del arbol, en rpart se puede regular la complejidad (que tanto se abra el arbol, o que tan contraido sea)
plotcp(spam7): complejidad pequeña, cp alto
library(datasets.load)
#View(iris)
summary(iris)
library(tree)
iris.tr<-tree(Species~., iris)
iris.tr
plot(iris.tr)
text(iris.tr)
summary(iris.tr)
library(DAAG)
#Los datos que utilizaremos se denominan spam7. Estos datos se corresponden con 4601 muestras de correos electrónicos. Las variables explicativas son:
 
#crl.tot, longitud total de las palabras que están en mayúsculas;
#dollar, frecuencia del símbolo $, en términos del porcentaje respecto de caracteres;
#bang, frecuencia del símbolo !, en términos del porcentaje respecto de caracteres;
#money frecuencia de la palabra money, en términos del porcentaje respecto de caracteres;
#n000, frecuencia de la cadena 000, en términos del porcentaje respecto de caracteres;
#make, frecuencia de la palabra make, en términos del porcentaje respecto de caracteres.
#La variable dependiente 'yesno' toma los valores yes ('y' para spam) o no ('n' para no-spam). 
dim(spam7)
head(spam7)
str(spam7)
summary(spam7)
library(rpart)
library(rpart.plot)
spam.tree<-rpart(formula=yesno~., method="class", data=spam7)
rpart.plot(spam.tree)
iris.tree<-rpart(formula=Species~., method="class", data=iris)
rpart.plot(iris.tree)
CLASE EN VIVO 14/05/20
RANDOM FOREST:
¿Cómo funciona?
Se seleccionan aleatoriamente variables y observaciones y se clasifica usando un árbol de decisión, se hace esto con muchos árboles y se vota. Se repite el experimento un monton de veces.
¿Cuándo se usa?
●Las variables son discretas o no lineales.
●Se busca precisión en un tiempo razonable.
●Hay data incompleta o mala (en bajas cantidades)
Conceptualmente se tiene un set de entrenamientos:
In bag: lo que queda dentro del arbol.
Out bag: todo lo que queda fuera del arbol. (fuera de muestra)
· OOB error (outofbag error)
Cuando el algoritmo randomForestselecciona una muestra con reemplazo para crear un árbol en una iteración, algunas observaciones se quedan fuera (outofbag) y no son usadas para crear el árbol. 
Para esas observaciones que quedaron fuera del árbol, se hace una predicción y se calcula el error de la predicción. Esto se hace en cada iteración para calcular el error estimado, llamado OOB error.
RandomForest nos indica que variables fueron más importantes. Para esto usan una métrica llamada Mean DecreaseGini. Se suma el índice Gini de cada variable en cada árbol, luego se promedia y pondera por la proporción de registros que alcanzan ese nodo en cada árbol. (sesgo de falso positivo, falso negativo)
El gráfico se genera con plot(modelo)En este gráfico se muestra un modelo que intenta predecir la variable
 churn={yes,no}.
 La línea negra representa el OOB, La línea roja es el error al intentar predecir churn={yes}. La línea verde es el error en la predicción churn={no}.
· Verdadero positivo: aquel que yo acepte correctamente
· Verdadero negativo: aquel que yo rechace correctamente.
Verdadero: aquello que mi modelo hizo bien
· Falso positivo: aquello que yo rechace, siendo verdadero
· Falso negativo: aquello que yo no rechace, siendo falso
Falso: fallar
EJEMPLO:
Data: recursos humanos
(import data set)
View(data)
Str(data)
Summary(data)
Si la variable va entre 0,1 hay que hacerla factor
Data$left<-as.factor(data$left)
Pasa la variable a factor, en este caso la variable test toma los valores (0,1) por ende es una variable binaria.
Det.seed(100)
index<- sample(1, nrow(data), round(0.8*(nrow(data)))
train<-data[index, ]
test<-data[-index, ] 
#regresion logistica
Lm.fit<- glm(left~.,data=train, family=”binomial”(link=”logit”))
pr.lm<-predict(lm.fit, test, type="response")
 pr.lm<-ifelse(pr.lm>0.5,1,0)
elegir AIC mas chico
#Recursos Humanos RANDOM FOREST.
HR <- read_csv("Downloads/HR.csv")
HR <- read.csv("C:/Users/HP/Dropbox/Codigos Optimizacion/HR.csv")
View(HR)
str(HR)
summary(HR)
#si la variable está entre 0 y 1, debe hacerse factor
HR$Work_accident<-as.factor(HR$Work_accident)
HR$left<-as.factor(HR$left)
HR$promotion_last_5years<-as.factor(HR$promotion_last_5years)
set.seed(123)
index<-sample(1:nrow(HR), round(0.8*nrow(HR)))
train<-HR[index,]
test<-HR[-index,]
#Regresion Logistica
lm.fit<-glm(left~., data=train, family=binomial(link="logit"))
summary(lm.fit)
pr.lm<-predict(lm.fit, test, type="response")
pr.lm<-ifelse(pr.lm>0.5,1,0)
tab.lm<-table(Predicho=pr.lm, Real=test$left)
tab.lm
acc.lm<-sum(diag(tab.lm))/sum(tab.lm)
acc.lm
#calculamos la precisión que tendrá 
prec.lm<-tab.lm[2,2]/(tab.lm[2,1]+tab.lm[2,2])
prec.lm
#calculamos el recorrido
rec.lm<-tab.lm[2,2]/(tab.lm[1,2]+tab.lm[2,2])
rec.lm
library(rpart)
library(rpart.plot)
#Árboles
#comenzamos con la creación de los árboles, repitiendo lo que hicimos antes.
#en lugar de glm usamos rpart, classs de clasificación y un data.frame
#cp nos dice que tan complejo es el árbol (yo quiero tener un error bajo)
#si al árbol le ponog un cp de 0.22 será mucho mas simple, si pongo un cp de 0.000002, explotará 
#y no podré interpretar nada, por eso debemos ponerlo en un numero para que se interprete como queremos 
tree.fit<-rpart(formula=left~.,method="class", data=train, cp=0.006)
#para graficar el árbol. en el gráfico veremos si es mayor o no según las variables. 
#podemos jugar con el parámetro de complejidad (cex es para el tamaño de las letras)
rpart.plot(tree.fit, cex=0.7)
plotcp(tree.fit)
#luego hacemos un predict (muy parecido a lo anterior) El type class es para que no promedie
pr.tree<-predict(tree.fit, test, type="class")
#ahora copio la tabla que tenia (tab.lm) y la cambio por .tree
#me dará una nueva tabla (Real y predicho)
tab.tree<-table(Predicho=pr.tree, Real=test$left)
tab.tree
#repetimos esto con acc prec y rec
acc.tree<-sum(diag(tab.tree))/sum(tab.tree)
acc.tree
prec.tree<-tab.tree[2,2]/(tab.tree[2,1]+tab.tree[2,2])
prec.tree
rec.tree<-tab.tree[2,2]/(tab.tree[1,2]+tab.tree[2,2])
rec.tree
#Random Forest (bomba atómica)
#vamos a packages, install, randomforest para instalar la librería
#llamamos a la librería
library(randomForest)
#haremos un random forest con 100 arbolitos, nos mostrará el error de las clases
rf.fit<-randomForest(left~.,data=train,ntree=100)rf.fit
#graficamos el randomforest. Nos dice que nuestro error de estimación es de 0.82% (data que dejamos fuera)
plot(rf.fit)
#ahora graficaremos según importancia de variables 
varImpPlot(rf.fit)
#ahora compararemos ranndom forest con el árbol y con la reg logística (response para que no hay promedios y se la juegue)
#usamos los demás datos y comparamos
pr.rf<-predict(rf.fit, test, type="response")
tab.rf<-table(Predicho=pr.rf, Real=test$left)
tab.rf
acc.rf<-sum(diag(tab.rf))/sum(tab.rf)
acc.rf
prec.rf<-tab.rf[2,2]/(tab.rf[2,1]+tab.rf[2,2])
prec.rf
rec.rf<-tab.rf[2,2]/(tab.rf[1,2]+tab.rf[2,2])
rec.rf
acc.lm
acc.tree
acc.rf
prec.lm
prec.tree
prec.rf
rec.lm
rec.tree
rec.rf
VIDEO REDES NEURONALES Y SVM
MAQUINAS DE SOPORTE VERTICAL Y REDES NEURONALES ARTIFICIALES.
MAQUINA DE SOPORTE VERTICAL (SVM)
¿Cómo funciona?
Clasifica data buscando fronteras lineales (hiperplanos) para separar las clases. Si la data no es linealmente separable se usa una tranformacion (de Kennel) para llevar la data a dimensiones mas altas donde sean linealmente separables.
¿Cuándo se usa?
· La data es de alta dimensionalidad y no es linealmente separable
· Se requiere clasificar y se tiene pocos datos
REGRESION DE VECTORES DE SOPORTE (SVR)
¿Cómo funciona?
Funciona como el SVM, pero esta modificado para predecir una respuesta continua. Se usan tambien funciones de kernel para llevar a cabo los datos a un mundo linealmente separable.
¿Cuándo se usa?
· La data tiene una alta dimensionalidad y muchos parametros.
EJEMPLO:
Cervezas, (sabor, amargor, color)
Los usuarios del focus group votan por cual le gusto y cual no.
Con un metodo de optimizacion se separa por una venidad que los separe de manera mas notable. (y que genere un maximo margen para hacer la separacion de clases)
FUNCIONES DE KERNEL
Cuando la data no es linealmente separable. Se aplica una funacion que transforma el espacio de modo que las clases sean linealmente separables. 
TIPOS:
Kernel function
· Linear kernel= K(z1,z2)=z1*z2
· Quadratic kernel= K(z1,z2)=(z1*z2+1)^2
· Polynomial kernel= K(z1,z2)=(z1*z2+1)^2
· RBF kernel= K(z1,z2)= e^()
RED NEURONAL ARTIFICIAL:
¿Cómo funciona?
Inspirada en el cerebro, una red neuronal consiste en redes de neuronas altamente conectadas que relacionan las entradas con las salidas deseadas. La red se entrena modificando iterativamente los pesos de las conexiones para que desde las entradas se pueda llegar a una respuesta correcta. Cada neurona es una estructura en la que se reciben las entradas ponderadas y según un criterio de activacion transmitira una salidad.
¿Cuándo se usa?
· Para clasificacion o regresion
· El modelo es altamente no lineal
· La cantidad de data aumenta y se desea actualizar constantemente el modelo
· Pueden tenerse cambios inesperados en las entradas
· La interpretacion del modelo no es relevante
RED NEURONAL: intuicion biologica
Una neurona artificial puede verse como una funcion, la cual recibe entradas (provenientes del exterior [data de entrada] o de neuronas precedentes), dichas entradas son sumadas de manera ponderada (aplicandose un peso w) y agregandose “bias” (similar al intercepto B0 en una regresion lineal)
El restultado de esa suma ponderada pasara a una funcion de activacion, en donde si se supera un umbral determinado, transmitira el mensaje.
· Sigmond: resultados entre (0 y 1) si es muy negativo (0) si es muy positivo (1)
· ReLu: si lo que entra es negativo, responde 0. Si es positivo lo manda tal cual.
EJEMPLO RECONOCIMIENTO DE CARACTERES:
Cuando un pixel esta totalmente negro, tiene un valor de 1. Y cuando no tiene tinta, tiene valor 0. Si es un tono mas gris ira entre 0 y 1.
Red feedforward: cuando todas las conexiones entre las distintas neuronas de la red siguen un unico sentido, desde las variables de entrada hasta las de salida.
Red feedback o recurrente: cuando las conexiones pueden ser tanto hacia adelante como hacia atrás.
REDES NEURONALES: PROCESO DE APRENDIZAJE
· Proceso de aprendizaje/entrenamiento de una red neuronal consiste en encontrar la relacion de pesos que permiten a la red desarrollar correctamente la tarea para la que ha sido diseñada: clasificar/predecir
· Es un proceso iterativo en el que, secuencialmente se va analizando cada uno de los patrones de entrada a la red, reajustando en cada iteracion la relacion de pesos que permite definir bien esta relacion
· Se denomina patron (de entrenamiento, validacion o test) a cada uno de los registros que conforman las tablas (de entrenamiento, validacion, o test). Un patron se compone de:
· Una relacion de valores para unas variables explicativas (o inputs)
· Una relacion de valores para unas variables targets
· El objetivo de la red, encontrar la relacion entre unos y otros valores, dada por una ecuacion en la que participan los pesos w.
· En este proceso de aprendizaje, es necesario establecer una función de error 𝐸(𝑊)que mide el rendimiento de la red en un instante dado (el error generado por la fórmula definida para la relación de pesos sinápticos ajustados hasta dicho instante)
· El objetivo del proceso de entrenamiento es, obviamente, encontrar la relación de pesos que minimizan dicha función de error
· El proceso de aprendizaje comienza en un instante inicial, 𝑡=0, partiendo de un conjunto de pesos aleatorios que generan un error inicial de clasificación/predicción
· En cada instante de tiempo (𝑑𝑒𝑡𝑎𝑡+1),se analiza un nuevo patrón de entrada 𝑥(𝑛), y se va realizando un refinamiento de los pesos buscando mejorar el nivel de error actual del modelo 
· El conjunto de todos los patrones puede ser recorrido varias veces, denominándose ciclo al periodo que supone hacer cada recorrido 
· El algoritmo se detiene cuando, al final de un ciclo el error se sitúa por debajo de una cota prestablecida o, cuando, de un ciclo a otro, el error no decrece sensiblemente 
· El método de entrenamiento más utilizado es el algoritmo backpropagationen el que se distinguen claramente dos etapas:
 	✓Cálculo de la salida dada por la red para un patrón de entrada
 	✓Cálculo del error (entre la salida y el target) y propagación de dicho error hacia atrás desde la capa de salida, donde cada neurona precedente recibe un error proporcional a su contribución sobre el error total de la red 
· Dicho método está basado en el método del gradiente descendente cual parte de un conjunto de pesos 𝑊(0)(en el instante 𝑡=0) y calcula la dirección de máximo decrecimiento del error.
LIBRERIAS
library(e1071)
library(neuralnet)
el modelo se ve si es bueno o malo, cuando se regresiona fuera de muestra.
library(readxl)
library(dplyr)
library(rpart)
library(rpart.plot)
library(randomForest)
library(e1071)
library(neuralnet)
datos <- read_excel("G:/Mi unidad/BA Uandes 2 2019/02 Clases/Clases 1 MRR 2020/BostonHousing.xlsx")
summary(datos)
datos$chas<-as.factor(datos$chas)
summary(datos)
set.seed(11)
index<-sample(1:nrow(datos),(0.8)*nrow(datos))
train<-datos[index,]
test<-datos[-index,]
#Modelo Lineal
lm.fit<-lm(medv~.,train)
summary(lm.fit)
pr.lm<-predict(lm.fit,test)
MAE.lm<-sum(abs(test$medv-pr.lm))/nrow(test)
MSE.lm<-sum((test$medv-pr.lm)^2)/nrow(test)
RMSE.lm<-sqrt(MSE.lm)
plot(test$medv~pr.lm, main="Lineal")
abline(0,1)
#Arbol
tree.fit<-rpart(medv~.,train, cp=0.01)
rpart.plot(tree.fit, cex=0.8)
plotcp(tree.fit)
pr.tree<-predict(tree.fit,test, type="vector")
MAE.tree<-sum(abs(test$medv-pr.tree))/nrow(test)
MSE.tree<-sum((test$medv-pr.tree)^2)/nrow(test)
RMSE.tree<-sqrt(MSE.tree)
plotcp(tree.fit)
plot(test$medv~pr.tree, main="Arbol")
abline(0,1)
tree.prune<-prune(tree.fit,tree,cp): para poder el arbol
rpart.plot(tree.prune,cex=0.8)
pr.tree<-predict(tree.prune,test,type=”prob”)
cp=complexidad
cex=tamaño del grafico
#Random Forest
rf.fit<-randomForest(medv~.,train) 
plot(rf.fit)
pr.rf<-predict(rf.fit,test)
MAE.rf<-sum(abs(test$medv-pr.rf))/nrow(test)
MSE.rf<-sum((test$medv-pr.rf)^2)/nrow(test)
RMSE.rf<-sqrt(MSE.rf)
plot(test$medv~pr.rf, main="Random Forest")
abline(0,1)
#SVM
#Espeificamos que es Regresión en type y funciónde Kernel radial 
svm.fit<-svm(medv~.,data=train, type="eps-regression",kernel = "radial") 
summary(svm.fit)
pr.svm<-predict(svm.fit,test)
MAE.svm<-sum(abs(test$medv-pr.svm))/nrow(test)
MSE.svm<-sum((test$medv-pr.svm)^2)/nrow(test)
RMSE.svm<-sqrt(MSE.svm)
plot(test$medv~pr.svm, main="SVM")
abline(0,1)
#Red Neuronal
datos_nn<-datos
#Necesitamos que los datos sean numéricos
datos_nn$chas<-as.numeric(datos_nn$chas)
#Escalaremos los datos para que queden entre 0 y 1
maxs <- apply(datos_nn, 2, max) 
mins <- apply(datos_nn, 2, min)
scaled <- as.data.frame(scale(datos_nn, center = mins, scale = maxs - mins))
#Usamos la misma partición anterior
train_ <- scaled[index,]
test_ <- scaled[-index,]
#La librería neuralnet no nos deja usar la notaión y~., hay que escribir la fórumula
n <- names(train_)
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = " + ")))
nn <- neuralnet(f,data=train_,hidden=c(5,3),linear.output=T)
pr.nn <- compute(nn,test_[,1:13])
pr.nn_ <- pr.nn$net.result*(max(datos_nn$medv)-min(datos_nn$medv))+min(datos_nn$medv)
MAE.nn<-sum(abs(test$medv - pr.nn_))/nrow(test_)
MSE.nn <- sum((test$medv - pr.nn_)^2)/nrow(test_)
RMSE.nn<-sqrt(MSE.nn)
plot(test$medv~pr.nn_, main="Red Neuronal")
abline(0,1)
plot(nn)
MAE.lm
MAE.tree
MAE.rf
MAE.svm
MAE.nn
RMSE.lm
RMSE.tree
RMSE.rf
RMSE.svm
RMSE.nn
VIDEO DE CROSS VALIDATION
PROBLEMA DE MACHINE LEARNING:
1. Cuando ejecutamos el modelo en un nuevo conjunto de datos “no vistos” de curriculums, solo obtenemos un 50% se precision. Nuestro modelo no generaliza bien con datos no vistos.
Esto se conoce como OVERFITTING y es un problema comun en machine learning en data science. 
Overfitting:
	
3. Trade off sesgo v/s varianza
Este problema se ataca con cross validation (separar la data en train y test. 
La validacion cruzada es una poderosa medida preventiva contra el sobreajuste. La idea es inteligente: use sus datos de entrenamiento iniciales para generar multiples mini divisiones train/test. Utilice estas divisiones para ajustar su modelo.
En la validacion cruzada de K-rold estandar, dividimos los datos en k subconjuntos, llamados folds. Luego, entrenamos de manera iterativa el algoritmo en los folds k-1 mientras usamos el fold restante como conjunto de test (llamado el “holdout fold”)
La validacion cruzada permite ajustar hiperparametros solo con su conjunto de train original. Esto permite mantener el conjutno de tests como un conjunto de dato realmente no visto para seleccionar el modelo final.
METRICAS PARA CLASIFICADORES: para ver que tan bueno es el modelo.
EJE Y= Recall( true positive rate)= VP/VP+FN= datos reales de los que tienen la enfermedad a cuantos le achunte
EJE X= Recall (false positive rate)=FP/ FP+VN=
CURVA DE ROC: una prediccion perfecta se situaria en la esquina superior izquiera (0,1) el modelo siempre predicirá cero. Donde no existe ningun verdadero positivio y ningo falso negativo. Al area bajo la curva se le denomia (AUC) y se usa para comparar de forma numerica los modelos. Y se utiliza para ver la calidad del modelo.
Un modelo aleatoria se ubica en la linea diagonal (es un mal modelo)
 A medida que se acerquen arriba del eje (y) se ubique, significa que no habran falsos positivos (tendera a cero)
GANANCIA ACUMULADA:
EJE Y=Recall= VP/VP+FN= datos reales
EJE X= Recall (rpp)= VP+FP/VP+FP+VN+FN= de los que son positivos, cuanto fueron del total
Tomando un 20% de las puntuaciones mas altas dadas por el modelo, se consigue capturar un 40% del total de los eventos reales. Mientras arriba en el eje (Y) mejor el modelo.
CODIGO
EJEMPLO NUMERICO:
datos <- read.delim("http://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data"
 ,header=F,sep=" ")
dim(datos): Ver la dimension de los datos 
names(datos) <- c("chk_acct", "duration", "history", "purpose",
 "amount", "sav_acct", "employment", 
 "install_rate", "pstatus", "other_debtor", 
 "time_resid", "property", "age", 
 "other_install", "housing", "other_credits",
 "job", "num_depend", "telephone", "foreign",
 "response")
head(datos): primeros 10 datos de la data
# chequeamos el "status" de cada variable:
str(datos): estructura de la data
# análisis básico de montos y duracion
hist(datos$amount, col = "royalblue")
hist(datos$age, col = "brown")
# muchas veces en los modelos de DataMining Agrupamos las variables en tramos, puesto que resulta mas adecuado e intuitivo el análisis hacerlo de esta manera:
datos$amt.fac <- as.factor(ifelse(datos$amount <= 2500, "0-2500",ifelse(datos$amount <= 5000, "2600-5000", "5000+")))
head(datos$amt.fac)
datos$age.fac <- as.factor(ifelse(datos$age<=30, '0-30', ifelse(datos$age <= 40, '30-40', '40+')))
“si es menor a 30 “0-30”, si es menor a 40 “30-40”, si es mayor de 40 “40+”
head(datos$age.fac)
# Vamos a poner la variable que intentamos modelar en terminos de
# 0 y 1 (esta en "1" y "2")
#Creamos response
datos$default <- as.factor(ifelse(datos$response == 1, "0", "1"))
is.factor(datos$default)
contrasts(datos$default)
head(datos$default)
dim(datos)
# Mas analisis Grafico para ver como interactuan las variables (library(package = "lattice")):
library(lattice): para hacer graficos de barra, o graficos fraccionados (frecuencia por tramos)
barchart(datos$age.fac, col = "grey")
barchart(datos$amt.fac, col = "grey")
histogram(datos$employment, col = "grey")
histogram(datos$sav_acct, col = "grey")
spineplot(datos$default ~ datos$age.fac): permite abrir la variable default (esta entre 0 y 1 en función de la edad (que tan calibrada esta la variable dummy con una clase).
Mosaicplot= similar al spineplot, también separa por clases, y sirve para ver las proporciones)
mosaicplot(datos$default ~ datos$age.fac, col = T)
mosaicplot(datos$default ~ datos$amt.fac, col = T)
mosaicplot(datos$default ~ datos$job, col = T)
mosaicplot(datos$default ~ datos$chk_acct, col = T)
xyplot(datos$amount ~ datos$age)
# Separamos las relaciones en funcion de la var default
xyplot(datos$amount ~ datos$age | datos$default)
#Separamos en train y test
set.seed(100): para repetir el experimento
index<-sample(1:nrow(datos),(0.8)*nrow(datos))
train<-datos[index,]
test<-datos[-index,]
#Regresión Logística: (glm) buscaremos encontrar una probabilidad.
#La hacemos con todas las variables excepto las que modificamos
lm.fit<-glm(default~.-response-age-amount, family = binomial(link = "logit"),data=train)
summary(lm.fit)
pr.lm<-predict(lm.fit, test, type = "response")
# definición del umbral de decisión 
lm.umbral <- ifelse(pr.lm > 0.5, 1, 0)
si la predicción >0,5 ponga un 1, sino 0.
# matriz de Confusion
tab0 <- table(Predicted=lm.umbral, Actual=test$default)
tab0
library(ROCR)
#funcion (prediction) (requiere que la data no este en binario, sino en una probabilidad) es una función de ROCR que ayuda a calcular métricas
m1.scores <- prediction(pr.lm, test$default)
slotNames(m1.scores)
# se calcula y grafica la curva ROC con performance(variable con predicciones, medidas)
m1.perf <- performance(m1.scores, measure = "tpr", x.measure = "fpr")
plot(m1.perf, col = "red")
abline(0,1, lty = 8, col = "grey"):linea del modelo aleatorio 
# otro valor de referencia es el area debajo de la curva (AUC)
m1.auc <- performance(m1.scores, "auc")
m1.auc@y.values[[1]]: AREA BAJO LA CURBA
### Ahora vamos a comparar este modelo con un arbol.
 Para ello primero construimos el arbol:
library(rpart)
library(rpart.plot)
tree.fit<-rpart(default~.-response-age-amount, data=train)
#graficamos el árbol
rpart.plot(tree.fit, cex=0.8)
# graficamos la relación entre el parámetro de complejidad y el error:
plotcp(tree.fit)
#Buscamos el parámetro de complejidad de menor error
tree.cp <- tree.fit$cptable[which.min(tree.fit$cptable[, "xerror"]), "CP"]
tree.cp
# podamos el árbol según cp escogido, en caso de ser necesario
tree.prune <- prune(tree.fit, tree.cp)
#graficamos el árbol podado
rpart.plot(tree.prune, cex=0.8)
# evaluamos el modelo

Otros materiales