0% encontró este documento útil (0 votos)
18 vistas52 páginas

TRABAJO

Análisis de datos, modelo de regresión y clasificación

Cargado por

Alex
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
18 vistas52 páginas

TRABAJO

Análisis de datos, modelo de regresión y clasificación

Cargado por

Alex
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

TRABAJO

TEÓRICO/PRÁCTICO

ASIGNATURA: INTRODUCCIÓN A LA CIENCIA DE


DATOS

ALUMNO: ALEJANDRO ÁLVAREZ MARCOS

1
ÍNDICE PAGS

1. ANÁLISIS EXPLORATORIO DE DATOS 3

1.1 ANÁLISIS DEL DATASET: “mortgage” 3

1.2 ANÁLISIS DEL DATASET: “vowel” 11

2. REGRESIÓN 19

2.1 REGRESIÓN LINEAL 19

2.2 REGRESIÓN LINEAL MÚLTIPLE 24

2.3 ALGORITMO K-NN 29

2.4 COMPARATIVA DE RESULTADOS

3. CLASIFICACIÓN 34

3.1 K-NN 34

3.2 LDA 36

3.3 QDA 38

3.4 COMPARACIÓN DE RESULTADOS ENTRE 39


ALGORITMOS

2
4. APÉNDICE 40

3
1. ANÁLISIS EXPLORATORIO DE DATOS

1.1 ANÁLISIS DEL DATASET: “mortgage”

Antes de iniciar el análisis tenemos la posibilidad en R de ver como se han recopila


-do los datos y en nuestro caso podemos ver que los datos están separados por comas
y la parte decimal de los dígitos por un punto. Por lo que para leer los datos en R vamo
s a utilizar una función especializada: mortgage<-[Link]("[Link]", c
[Link]="@",sep=",",dec=".",header=FALSE)

Convertimos las líneas que empiecen por “@” en comentarios, aplicamos la lectura
según los símbolos ya apuntados anteriormente. Y además incluimos header=FALSE
puesto que de no hacerlo la primera línea de los datos la cogería como cabecera y los
perderíamos. Acto seguido cambio el nombre a las variables para hacer más práctico el
desarrollo del análisis.
En primer lugar, comprobamos que estamos trabajando con un dataframe y
mostramos sus características más generales.

class(mortgage)
[1] "[Link]"

> typeof(mortgage)
[1] "list"
> str(mortgage)
'[Link]': 1049 obs. of 16 variables:
$ X1 : num 8.72 13.85 6.59 17.43 3.16 ...
$ X2 : num 90.7 109.4 88 96.1 85.1 ...
$ X3 : num 9.69 17.19 9.94 15.07 8.21 ...
$ X4 : num 7.62 12.06 5.74 15.2 2.97 ...
$ X5 : num 7.6 12.47 5.67 15.01 2.94 ...
$ X6 : num 7.72 13.94 7.42 13.13 4.93 ...
$ X7 : num 7.69 13.82 7.73 12.89 5.85 ...
$ X8 : num 2606 1347 2280 1237 2938 ...
$ X9 : num 223 124 199 116 289 ...
$ X10: num 280 231 287 242 336 ...
$ X11: num 8.52 14.35 6.77 18.12 2.96 ...
$ X12: num 794 443 756 410 1012 ...
$ X13: num 565 315 551 291 716 ...
$ X14: num 2020 1034 1744 933 2110 ...
$ X15: num 895 344 936 378 1180 ...
$ Y : num 7.66 13.73 6.65 14.24 3.5 ...

Con esta información comprobamos efectivamente que la clase de datos de


entrada es un dataframe y el tipo una lista. En concreto dispone de 1049 filas y 16
columnas, que corresponden inequívocamente a 16 variables distintas. Siendo 15

4
variables de entrada y una de salida. Además está claro que dentro del dataframe
disponemos exclusivamente de tipos de datos numéricos.
Es importante ver si existen missing values en el dataframe puesto que a la hora d
e realizar cualquier operación con los datos esta devolvería un resultado NA. Por tanto
voy a ver si hay NA en el dataframe:

length(mortgage[[Link](mortgage)])
0

Con este resultado podemos ver que no hay missing values en el dataframe y
despreocuparnos al realizar operaciones con los datos. En caso contrario, hubiese
bastado con añadir como argumento a las operaciones: [Link]=TRUE. Para ignorar los
valores ausentes durante el cálculo.

En un primer acercamiento, utilizamos la función summary, en el archivo .R para


que nos devuelva los parámetros estadísticos básicos de cada variable: la media, la
mediana, el mínimo y máximo valor, y los cuartiles. Sin embargo, vamos a generar estos
valores de manera manual para mostrarlo de una manera más estética.
> estadisticamortgage=[Link]("media"=sapply(mortgage,mean),"desvia
cion"=sapply(mortgage,sd),"varianza"=sapply(mortgage,var),"mediana"=sa
pply(mortgage,median) "minimo"=sapply(mortgage,min),"maximo"=sapply(mo
rtgage,max))

Estadisticamortgage
media desviacion varianza mediana
X1 7.521945 3.377216 1.140559e+01 6.610
X2 97.353633 14.471441 2.094226e+02 92.526
X3 10.400848 2.958872 8.754926e+00 9.900
X4 6.851220 2.954287 8.727812e+00 5.810
X5 6.829342 2.942284 8.657036e+00 5.770
X6 8.117378 2.883880 8.316764e+00 7.440
X7 8.359104 2.766248 7.652127e+00 7.760
X8 2639.677312 1010.520574 1.021152e+06 2616.100
X9 256.847664 114.575372 1.312752e+04 224.400
X10 308.115443 59.805094 3.576649e+03 287.700
X11 7.549495 3.538662 1.252213e+01 6.640
X12 813.330410 258.688545 6.691976e+04 796.000
X13 549.687417 157.072519 2.467178e+04 567.400
X14 1959.121830 720.531058 5.191650e+05 2023.900
X15 954.669399 372.292523 1.386017e+05 947.900
Y 7.543937 3.105787 9.645915e+00 6.710

minimo maximo
X1 3.020 20.760
X2 77.055 142.645
X3 6.490 18.630
X4 2.670 16.750
X5 2.690 16.760
X6 4.090 16.470
X7 4.170 16.130
X8 1130.900 4809.200

5
X9 105.600 533.000
X10 225.800 412.100
X11 2.860 20.060
X12 381.100 1154.100
X13 269.900 803.400
X14 868.100 3550.300
X15 175.600 1758.100
Y 3.020 17.150

X1 X2 X3 X4
0% 3.02 77.055 6.49 2.67
25% 5.37 86.799 7.88 4.99
50% 6.61 92.526 9.90 5.81
75% 8.82 104.736 12.80 8.14
100% 20.76 142.645 18.63 16.75

X5 X6 X7 X8
0% 2.69 4.09 4.17 1130.9
25% 4.98 5.89 6.14 1746.3
50% 5.77 7.44 7.76 2616.1
75% 8.09 9.69 9.98 3350.2
100% 16.76 16.47 16.13 4809.2
X9 X10 X11 X12
0% 105.6 225.8 2.86 381.1
25% 156.8 258.2 5.30 555.3
50% 224.4 287.7 6.64 796.0
75% 357.9 377.1 8.98 1080.5
100% 533.0 412.1 20.06 1154.1
X13 X14 X15 Y
0% 269.9 868.1 175.6 3.02
25% 394.7 1339.6 721.0 5.45
50% 567.4 2023.9 947.9 6.71
75% 658.8 2407.5 1197.4 9.03
100% 803.4 3550.3 1758.1 17.15

Al obtener estos datos ya podemos ver el rango de datos que tenemos para cada
variable y algo de información en cuanto a la distribución de los mismos. En particular
sabiendo que la media es más sensible a la presencia de outliers, notamos esto en las
variables X9 y X10.

También con la desviación estándar podemos ver cuán lejos están los valores de
la media.

A la hora de realizar el análisis exploratorio no podemos pasar por alto representar


las variables que se nos dan, de esta manera veremos las posibles correlaciones o no
entre las variables de entrada y la variable de salida, así como su posible dependencia.
Graficarlas es crucial para poder extraer toda la información posible de nuestros datos.

6
En este caso, voy a utilizar el paquete ggplot para representar los datos. En el título
abreviaré, MortgageRate por M.R por cuestiones de estética.

[Link]("gridExtra")

library(gridExtra)

p1=ggplot(data=mortgage,aes(x=X1,y=Y))+geom_point(colour="red")+labs(title="M.R
vs MonthCDRate real",x="MonthCDRate real",y="MortgageRate real")
p2=ggplot(data=mortgage,aes(x=X2,y=Y))+geom_point(colour="green")+labs(title="M.
R vs 1Y-CMaturityRate real ",x="1Y-CMaturityRate real",y="MortgageRate real")
p3=ggplot(data=mortgage,aes(x=X3,y=Y))+geom_point(colour="blue")+labs(title="M.R
vs RateAuctionAveragereal",x="Rate-AuctionAverage real",y="MortgageRate real")
p4=ggplot(data=mortgage,aes(x=X4,y=Y))+geom_point(colour="yellow")+labs(title="M
.R vs RateSecondaryMarketreal ",x="Rate-SecondaryMarket real",y="MortgageRate
real")
[Link](p1,p2,p3,p4,nrow=2,ncol=2)

7
Al acabar de mostrar los diferentes gráficos incluiré una descripción en base a lo
obtenido.

p5=ggplot(data=mortgage,aes(x=X5,y=Y))+geom_point(colour="violet")+lab
s(title="M.R vs 3Y-CMaturityRate real",x="3Y-CMaturityRate real",y="Mo
rtgageRate real")
p6=ggplot(data=mortgage,aes(x=X6,y=Y))+geom_point(colour="black")+labs
(title="M.R vs 5Y-CMaturityRate real",x="5Y-CMaturityRate real",y="Mo
rtgageRate real")
p7=ggplot(data=mortgage,aes(x=X7,y=Y))+geom_point(colour="orange")+lab
s(title="M.R vs bankCredit real",x="bankCredit real",y="MortgageRate r
eal")
p8=ggplot(data=mortgage,aes(x=X8,y=Y))+geom_point(colour="purple")+lab
s(title="M.R vs currency real ",x="currency real",y="MortgageRate real
")

[Link](p5,p6,p7,p8,nrow=2,ncol=2)

p9=ggplot(data=mortgage,aes(x=X9,y=Y))+geom_point(colour="gray")+labs(title="M.R
vs demandDeposits real",x="demandDeposits real",y="MortgageRate real")

8
p10=ggplot(data=mortgage,aes(x=X10,y=Y))+geom_point(colour="cyan")+labs(title="M
.R vs federalFunds real",x="federalFunds real",y="MortgageRate real")
p11=ggplot(data=mortgage,aes(x=X11,y=Y))+geom_point(colour="brown")+labs(title="
M.R vs moneyStock real",x="moneyStock real",y="MortgageRate real")
p12=ggplot(data=mortgage,aes(x=X12,y=Y))+geom_point(colour="pink")+labs(title="M
.R vs checkableDeposits real ",x="checkableDeposits real",y="MortgageRate real")
[Link](p9,p10,p11,p12,nrow=2,ncol=2)

p13=ggplot(data=mortgage,aes(x=X13,y=Y))+geom_point(colour="aquamarine")+labs(t
itle="M.R vs loansLeases real",x="loansLeases real",y="MortgageRate real")
p14=ggplot(data=mortgage,aes(x=X14,y=Y))+geom_point(colour="turquoise")+labs(titl
e="M.R vs savingsDeposits real",x="savingsDeposits real",y="MortgageRate real")
p15=ggplot(data=mortgage,aes(x=X11,y=Y))+geom_point(colour="red")+labs(title="M.
R vs tradeCurrencies real",x="tradeCurrencies real",y="MortgageRate real")
[Link](p13,p14,p15,nrow=3,ncol=1)

9
Una vez obtenidas todas las relaciones entre las variables de entrada y la de salida
estamos en condiciones de poder describir las formas variadas que toman las
distribuciones de puntos.
En la primera imagen estamos representando la tasa de interés hipotecario frente a
la tasa de mes real, apreciamos una monotonía en el crecimiento creciente de los puntos
y a priori una relación de proporcionalidad directa, cuya validación comprobaremos en
el transcurso del trabajo. Asimismo también encontramos mayor concentración de
puntos en la parte inferior que en la parte superior, puede ser debido a una menor
extracción de datos para esa parte.
El segundo gráfico, situado a la derecha del primero, muestra la relación entre la tasa
de interés hipotecario y la tasa de vencimiento (1Y), en este caso vemos que hay una
distribución de puntos concentrada en la parte inferior hasta que se trunca y se bifurca
en dos ramificaciones. En estudios más concretos veremos si existe alguna tendencia
aunque en un primer vistazo parece que no hay demasiada relación.
El tercer gráfico se encuentra debajo del primero, en este se dibuja de nuevo la
variable de salida, la cual es la misma para todos los gráficos, frente a la tasa del
promedio de subasta. Encontramos una monotonía creciente hasta casi el final donde
vemos una dispersión aleatoria de los puntos.

10
El siguiente gráfico se encuentra a continuación del anterior, la tasa de interés se
representa frente a la tasa de mercado secundario real. Aquí a simple vista apreciamos
una posible relación de proporcionalidad directa entre las dos variables.
Vamos a comentar la segunda tanda de gráficos, en primer lugar tenemos uno en el
que aparece la tasa de interés frente a la tasa de vencimiento (3Y) y a su lado frente a la
tasa de vencimiento (5Y) en las dos encontramos repetido el caso comentado
anteriormente: monotonía creciente con una posible relación de proporcionalidad
directa entre la dos variables. Tiene lógica que aumente la tasa de vencimiento a medida
que aumenta el interés hipotecario, aunque lo cotejaremos en el siguiente apartado.

El siguiente caso, es una gráfica que se encuentra debajo de la primera de este


conjunto, vemos la tasa de interés frente al crédito bancario con una monotonía
creciente pero los puntos se disponen en una especie de curva.

El último gráfico de este subconjunto corresponde a la representación de la tasa de


interés versus a la moneda, observamos una monotonía decreciente pero a la vez vemos
que la distribución oscila, por lo que podemos decir que es una oscilación amortiguada
a priori. Podemos descartar una relación de linealidad entre las dos variables aunque lo
verificaré.
En el tercer subconjunto de gráficos, el primero de ellos contiene la representación
de la tasa de interés frente a los depósitos a la vista reales donde vemos exactamente
la misma situación anterior. En el gráfico de su derecha tenemos la tasa de interés versus
fondos federales vemos una monotonía decreciente hasta el final que la vemos truncada
por una distribución de puntos dispersa. Además durante el decrecimiento no vemos
una oscilación de picos como en los casos anteriores, bien definida.
El siguiente detalla la tasa de interés frente al dinero en Stock y vemos algo muy
parecido a otros gráficos donde hay una monotonía creciente con una relación de
proporcionalidad directa en un primer análisis. El siguiente y último de este subconjunto
tiene como variable independiente los depósitos comprobables en el cual podemos
decir lo mismo que para el gráfico de los depósitos a la vista reales, que no repetiré.
En el último subconjunto tenemos los últimos tres gráficos. El primero de ellos tiene
como variable independiente el arrendamiento de préstamos. Observamos una
monotonía decreciente, curvilínea, con algunos picos durante el decrecimiento. El
gráfico debajo de este tiene como variable independiente los depósitos de ahorro donde
vemos una monotonía decreciente pero no con oscilaciones como había dicho para
otras variables. Sin embargo, se aprecia un decrecimiento a modo de curva.
La última gráfica representa la tasa de interés hipotecario frente al comercio de
divisas. Vemos una monotonía creciente con una posible relación directa de
proporcionalidad.

11
1.2 ANÁLISIS DEL DATASET: “vowel”

En el análisis exploratorio de este dataset vamos a seguir el mismo procedimiento que


para el anterior. Así que simplemente mostraré el código y comentando lo que difiera
respecto al otro dataset.
vowel<-[Link]("[Link]", [Link]="@",sep=",",dec=".",header=FALSE)

names(vowel)=c("TT integer","SpeakerNumber integer","Sex


integer",paste(rep("F",10),c(0:9),sep=""),"Class")

class(vowel)
[1] "[Link]"

typeof(vowel)
[1] "list"

> str(vowel)
'[Link]': 990 obs. of 14 variables:
$ TT integer : int 0 0 0 0 0 0 0 0 0 0 ...
$ SpeakerNumber integer: int 0 0 0 0 0 0 0 0 0 0 ...
$ Sex integer : int 0 0 0 0 0 0 0 0 0 0 ...
$ F0 : num -3.64 -3.33 -2.12 -2.29 -2.6 ...
$ F1 : num 0.418 0.496 0.894 1.809 1.938 ...
$ F2 : num -0.67 -0.694 -1.576 -1.498 -0.846 ...
$ F3 : num 1.779 1.365 0.147 1.012 1.062 ...
$ F4 : num -0.168 -0.265 -0.707 -1.053 -1.633 ...
$ F5 : num 1.627 1.933 1.559 1.06 0.764 ...
$ F6 : num -0.388 -0.363 -0.579 -0.567 0.394 0.217
0.322 -0.435 -0.512 -0.466 ...
$ F7 : num 0.529 0.51 0.676 0.235 -0.15 -0.246 0.4
5 0.992 0.928 0.702 ...
$ F8 : num -0.874 -0.621 -0.809 -0.091 0.277 0.238
0.377 0.575 -0.167 0.06 ...
$ F9 : num -0.814 -0.488 -0.049 -0.795 -0.396 -0.3
65 -0.366 -0.301 -0.434 -0.836 ...
$ Class : int 0 1 2 3 4 5 6 7 8 9 ...

Tenemos un data frame con 990 filas y 14 columnas, dentro de su estructura vem
os cuatro variables de tipo enteras y el resto numéricas. Además tenemos 13 variables
de entrada y una variable de salida, la cual es integer.

A continuación mostraremos las primeras seis filas del data frame para corroborar
lo que he puntualizado.

12
TT integer SpeakerNumber integer Sex integer F0
1 0 0 0 -3.639
2 0 0 0 -3.327
3 0 0 0 -2.120
4 0 0 0 -2.287
5 0 0 0 -2.598
6 0 0 0 -2.852

F1 F2 F3 F4
1 0.418 -0.670 1.779 -0.168
2 0.496 -0.694 1.365 -0.265
3 0.894 -1.576 0.147 -0.707
4 1.809 -1.498 1.012 -1.053
5 1.938 -0.846 1.062 -1.633
6 1.914 -0.755 0.825 -1.588

F5 F6 F7 F8
1 1.627 -0.388 0.529 -0.874
2 1.933 -0.363 0.510 -0.621
3 1.559 -0.579 0.676 -0.809
4 1.060 -0.567 0.235 -0.091
5 0.764 0.394 -0.150 0.277
6 0.855 0.217 -0.246 0.238
F9 Class
1 -0.814 0
2 -0.488 1
3 -0.049 2
4 -0.795 3
5 -0.396 4
6 -0.365 5

Comprobamos si hay algún missing value en el data frame:

any([Link](vowel))

[1] FALSE

El resultado es que no hay ningún missing value dentro del data frame.

estadisticavowel=[Link]("media"=sapply(vowel[,4:13],mean),"desviac
ion"=sapply(vowel[,4:13],sd),
+ "varianza"=sapply(vowel[,4:13],var),"
mediana"=sapply(vowel[,4:13],median),"minimo"=sapply(vowel[,4:13],min)
,"maximo"=sapply(vowel[,4:13],max))

Estadisticavowel
media desviacion varianza mediana minimo maximo
F0 -3.203740404 0.8689872 0.7551388 -3.1455 -5.211 -0.941
F1 1.881763636 1.1752720 1.3812643 1.8765 -1.274 5.074
F2 -0.507769697 0.7119483 0.5068703 -0.5725 -2.487 1.431
F3 0.515482828 0.7592613 0.5764778 0.4335 -1.409 2.377
F4 -0.305657576 0.6646023 0.4416962 -0.2990 -2.127 1.831
F5 0.630244444 0.6038711 0.3646603 0.5520 -0.836 2.327
F6 -0.004364646 0.4619268 0.2133764 0.0220 -1.537 1.403

13
F7 0.336552525 0.5733020 0.3286752 0.3280 -1.293 2.039
F8 -0.302975758 0.5701616 0.3250843 -0.3025 -1.613 1.309
F9 -0.071339394 0.6039855 0.3647985 -0.1565 -1.680 1.396

El cálculo de parámetros estadísticos está realizado únicamente para las variables


numéricas puesto que en el resto según la disposición que tienen los números enteros
no aportaría ninguna información. Es destacable que tenemos un rango en el que las
variables pueden tomar tanto valores positivos como negativos. Y que no se observan
grandes desviaciones respecto a la media.

Por último en la estadística descriptiva calculamos los cuartiles:

sapply(vowel[,4:13],quantile)

F0 F1 F2 F3 F4 F5
0% -5.21100 -1.2740 -2.48700 -1.4090 -2.1270 -0.8360
25% -3.88775 1.0515 -0.97575 -0.0655 -0.7690 0.1960
50% -3.14550 1.8765 -0.57250 0.4335 -0.2990 0.5520
75% -2.60250 2.7380 -0.06875 1.0960 0.1695 1.0285
100% -0.94100 5.0740 1.43100 2.3770 1.8310 2.3270

F6 F7 F8 F9
0% -1.5370 -1.29300 -1.61300 -1.6800
25% -0.3070 -0.09575 -0.70400 -0.5480
50% 0.0220 0.32800 -0.30250 -0.1565
75% 0.2965 0.77000 0.09375 0.3710
100% 1.4030 2.03900 1.30900 1.3960

Como en el caso anterior vamos a graficar las variables para ver que podemos
deducir en un primer momento de los datos en relación a sus correlaciones.

En este conjunto de datos, como ya apunte recientemente, tenemos dos tipos de


datos incluidos en el dataframe. Por un lado los numéricos y por otro los enteros, con lo
cual tendremos que utilizar un tipo de gráfico u otro para visualizar los datos de manera
óptima.

14
par(mfrow=c(2,1))
barplot(table(vowel[,1],vowel[,14]),beside=T,col=c("blue","red"),legen
d=c("0","1"),main="TT integer vs Class",xlab="Class")
barplot(table(vowel[,3],vowel[,14]),beside=T,col=c("white","black"),le
gend=c("0","1"),main="Sex integer vs Class",xlab="Class")

barplot(table(vowel[,2],vowel[,14]),col=c("dark blue","blue","cyan","g
reen","yellow","orange","brown","white","black","gray","pink","magenta
","red","violet","purple"),legend=c(paste("Speaker",c(0:14))),main="Sp
eak Number vs Class",xlab="Class")

15
Ahora mostraré las gráficas correspondientes a la variables numéricas del data fra-
me y al final procederé a realizar una descripción general de los datos teniendo en cuen
-ta todas las representaciones.

c1=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,4]))+geom_bo
xplot([Link]="red")+labs(title="F0 VS Class",x="Class",y="F0")
c2=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,5]))+geom_bo
xplot([Link]="blue")+labs(title="F1 VS Class",x="Class",y="F1"
)
c3=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,6]))+geom_bo
xplot([Link]="yellow")+labs(title="F2 VS Class",x="Class",y="F
2")
c4=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,7]))+geom_bo
xplot([Link]="orange")+labs(title="F3 VS Class",x="Class",y="F
3")
[Link](c1,c2,c3,c4,nrow=2,ncol=2)

16
c5=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,8]))+geom_bo
xplot([Link]="purple")+labs(title="F4 VS Class",x="Class",y="F
4")

c6=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,9]))+geom_bo
xplot([Link]="brown")+labs(title="F5 VS Class",x="Class",y="F5
")
c7=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,10]))+geom_b
oxplot([Link]="black")+labs(title="F6 VS Class",x="Class",y="F
6")
c8=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,11]))+geom_b
oxplot([Link]="pink")+labs(title="F7 VS Class",x="Class",y="F7
")
[Link](c5,c6,c7,c8,nrow=2,ncol=2)

17
c9=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,12]))+geom_boxplot(outli
[Link]="dark blue")+labs(title="F8 VS Class",x="Class",y="F8")

c10=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,13]))+geom_boxplot(outl
[Link]="red")+labs(title="F9 VS Class",x="Class",y="F9")

[Link](c9,c10,nrow=2,ncol=1)

18
Los dos primeros gráficos de barras tienen la misma estructura. He representado
la frecuencia de 0’s y 1’s asignados a cada clase distinguiéndolos por colores, como
marca la leyenda. Es fácil de ver que tanto en el primer como en el segundo gráfico
encontramos que hay más cantidad de ceros que de unos. En el primer caso los ceros
corresponden a la variable “TT integer” y en el segundo a “Sex integer”.
La tercera gráfica es totalmente distinta a las anteriores y a las que vienen después.
Se está representando la frecuencia de speakers respecto a cada clase pero como hay
15 tipos de speakers distintos para agruparlos a cada clase los he puesto uno encima de
otro en lugar uno a continuación del otro como en el caso anterior debido a una decisión
estética. Se puede ver por la forma que todos tienen la misma frecuencia.
Para las siguientes figuras he utilizado un boxplot para determinar el rango de
valores que toma cada F para cada clase. Y en el primer caso, F0 vs Class, observamos la
notable presencia de outliers y un comportamiento oscilante de una clase a otra. Lo
mismo podemos decir para las siguientes F’s en mayor o menor medida tienen el mismo
comportamiento con más o menos presencia de outliers, los cuales son bastante visibles
por los distintos colores. Posiblemente aunque no tenga referencias para corroborarlo

19
por el tipo de valores que tienen las F’s sean frecuencias de tono. Donde cuanto más
negativo es más y viceversa.

2. REGRESIÓN

2.1 REGRESIÓN LINEAL

Esta nueva sección versará sobre la obtención de modelos lineales predictivos


únicamente sobre el dataset:”mortgage”.

Basándome en la teoría de la asignatura me centraré en mostrar los resultados y el


procedimiento a seguir.

En primer lugar, aunque pudiésemos descartar muchas variables como candidatas al


ajuste lineal simple, según lo visto en el análisis exploratorio voy a argumentar con un
parámetro estadístico cuales son candidatas y cuales no.
fit1=lm(Y~X1,data=mortgage)

summary(fit1)

Estos comandos de encima los aplicaré a todas las variables X’s e Y. Para obtener s
con summary el coeficiente de correlación R-squared y el error residual estándar (ECM)
.

R-squared ECM
Y~X1 0.9551 0.6585

Y~X2 0.2798 2.637

Y~X3 0.8775 1.088

Y~X4 0.9731 0.5101

Y~X5 0.9751 0.4902

Y~X6 0.9701 0.9701

Y~X7 0.9347 0.7939

Y~X8 0.566 2.047

20
Y~X9 0.5148 2.164

Y~X10 0.5428 2.101

Y~X11 0.9395 0.7642

Y~X12 0.702 1.696

Y~X13 0.7177 1.651

Y~X14 0.5507 2.083

Y~X15 0.6816 1.753

En un principio podemos ver que existen 6 variables que se ajustan muy bien al
modelo lineal debido a que el R-squared supera el 0,9. Pero llegados a este punto me
quedaré con los cinco mejores: X4, X5, X6, X1 y X11. Estás serán las variables que
construirán un modelo lineal simple, cada una de ellas.
Como sabemos en ocasiones los números no son suficiente representativos por lo
que es necesario graficar el ajuste para tomar consciencia de él. (M.R=mortgage rate)

Y~X4:

ggplot(mortgage, aes(x=X4, y=Y))+


labs(title="M.R vs RateSecondaryMarket",x="RateSecondaryMarket",y="M.R
")+
geom_point(shape = 1)+

geom_smooth(method = lm,se = FALSE)+


geom_text(x = 5, y = 17, aes(label ="R-squared= 0,9731"))+
geom_text(x = 5, y = 16, aes(label ="ECM=0.5101"))

21
Y~X5:
ggplot(mortgage, aes(x=X5, y=Y))+
labs(title="M.R vs 3Y-CMaturityRate",x="3Y-CMaturityRate",y="M.R")+
geom_point(shape = 1)+

geom_smooth(method = lm,se = FALSE,colour="red")+


geom_text(x = 5, y = 17, aes(label ="R-squared= 0.9751"))+
geom_text(x = 5, y = 16, aes(label ="ECM=0.4902"))

22
Y~X6:
ggplot(mortgage, aes(x=X6, y=Y))+
labs(title="M.R vs 5Y-CMaturityRate real",x="5Y-CMaturityRate real",y=
"M.R")+
geom_point(shape = 1)+

geom_smooth(method = lm,se = FALSE,colour="green")+


geom_text(x = 5, y = 17, aes(label ="R-squared= 0.9701"))+
geom_text(x = 5, y = 16, aes(label ="ECM=0.9701"))

Y~X1:

ggplot(mortgage, aes(x=X1, y=Y))+


labs(title="M.R vs MonthCDRate real",x="MonthCDRate real",y="M.R")+
geom_point(shape = 1)+
geom_smooth(method = lm,se = FALSE,colour="yellow")+
geom_text(x = 5, y = 17, aes(label ="R-squared= 0.9551"))+
geom_text(x = 5, y = 16, aes(label ="ECM=0.6585"))

23
Y~X11:

ggplot(mortgage, aes(x=X11, y=Y))+


labs(title="M.R vs moneyStock real",x="moneyStock real",y="M.R")+
geom_point(shape = 1)+
geom_smooth(method = lm,se = FALSE,colour="cyan")+

geom_text(x = 5, y = 17, aes(label ="R-squared= 0.9395"))+


geom_text(x = 5, y = 16, aes(label ="ECM=0.7642"))

24
Como conclusion de este subapartado puedo decir que el modelo más adecuado
para nuestro conjunto de datos es: Y~X5. Donde estudiamos la tasa de interés
hipotecario frente a la tasa de vencimiento, maturity rate (3Y).

2.2 REGRESIÓN MÚLTIPLE LINEAL

En esta sección vamos a estudiar si un modelo múltiple lineal puede mejorar nuestro
modelo lineal. Para eso consideraré un modelo múltiple con todas las variables del
conjunto de datos con el fin de mostrar explícitamente la eliminación de variables en el
modelo.

fitm1=lm(Y~.,data=mortgage)
summary(fitm1)

25
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.031e-01 1.443e-01 2.793 0.005323 **
X1 4.595e-02 1.535e-02 2.994 0.002817 **
X2 -3.868e-03 5.035e-04 -7.683 3.59e-14 ***
X3 -4.183e-02 1.046e-02 -3.999 6.83e-05 ***
X4 7.983e-02 1.888e-02 4.228 2.57e-05 ***
X5 2.421e-01 2.282e-02 10.611 < 2e-16 ***
X6 1.444e+00 3.359e-02 42.986 < 2e-16 ***
X7 -7.311e-01 3.075e-02 -23.775 < 2e-16 ***
X8 1.365e-03 2.299e-04 5.939 3.92e-09 ***
X9 8.598e-03 5.132e-03 1.675 0.094170 .
X10 1.046e-03 2.903e-04 3.603 0.000329 ***
X11 -1.022e-02 1.192e-02 -0.857 0.391503
X12 -1.088e-02 5.109e-03 -2.130 0.033395 *
X13 1.029e-02 5.146e-03 2.000 0.045736 *
X14 -1.424e-03 2.126e-04 -6.699 3.45e-11 ***
X15 -2.883e-04 5.142e-05 -5.607 2.64e-08 ***

Para descartar las variables sobrantes del modelo múltiple hay que fijarse en los p-
values que se encuentran en la última columna. Por comparación se puede decir que X5,
X6 y X7 son las únicas variables que rechazan la hipótesis nula, por ello nos quedaremos
con esas variables para un posible modelo múltiple.
Los parámetros básicos que se obtienen son:
R-squared: 0.998 ECM: 0.1408

Con respecto al modelo lineal simple este nuevo modelo mejora el ajuste lineal en
dos décimas. El siguiente modelo lo probaré con cuatro variables.

summary(lm(Y~X2+X5+X6+X7,mortgage)):

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.1390902 0.0295344 4.709 2.82e-06 ***
X2 -0.0046343 0.0003845 -12.052 < 2e-16 ***
X5 0.3828640 0.0066048 57.967 < 2e-16 ***
X6 1.4233879 0.0256668 55.456 < 2e-16 ***
X7 -0.7552100 0.0219498 -34.406 < 2e-16 ***

R-squared: 0.9982

Sin embargo este último modelo de 4 variables mejora en las milésimas por lo que n
o me quedaré con él puesto que añadir otra variable no lo mejora significativamente y
siempre será mejor un modelo con menos variables.

Así que probare la interacción con los posibles pares de variables entre: X5, X6 y X7.

summary(lm(Y~X5+X7,mortgage))

R-squared: 0.9927 ECM=0.2658

26
ggplot(mortgage, aes(x=X5+X7, y=Y))+labs(title="M.R vs 3Y-CMaturityRate real + ba
nkCredit real",x="3Y-CMaturityRate real + bankCredit real",y="M.R")+ geom_point(sha
pe = 1)+geom_smooth(method = lm,se = FALSE)+geom_text(x = 20, y = 16, aes(label ="
R-squared= 0.9927"))

Observando la interacción por pares el mejor ajuste lineal lo encontré con las varia-
bles, X5 y X7, la tasa de vencimiento y el crédito bancario, lo cual en un primer momen
-to nos puede parecer convincente. Y hasta ahora es el mejor modelo, incluso mejora e
l modelo encontrado en regresión lineal simple, Y~X5.

Ahora es el turno de analizar las posibles interacciones y la no linealidad, donde pod


rán entrar en juego otras variables que no hemos considerado en los modelos lineales.
En principio, usando la intuición vi que se podría ajustar la variable X8 por una curva ge
nerada por función inversamente proporcional pero luego probando a meter variables
de forma aditiva y encontré lo siguiente:

Predict1=predict(lm(Y~I(X8^(-1))+X5,mortgage))
ggplot(mortgage,aes(x=X8,y=Y))+
labs(title="M.R vs currency real",x="currency real",y="Mortage Rate re
al")+
geom_point()+
geom_point(y=predict3,colour="red")+
geom_text(x=2000,y=15,aes(label="R-quared=0.9777"))

27
Obtuve un modelo por interacciones con dos únicas variables que ajusta muy bien
. Las variables involucradas, en el ajuste, son la moneda y la tasa de vencimiento. Como
vemos en la comparativa en la gráfica de la derecha hay un ajuste: lm(Y~I(X8^(-1)),
mortgage)).Es visible la gran diferencia que hay entre los dos ajustes y como la variab
le X5, tasa de vencimiento, explica las fluctuaciones de la relación entre la de salida y la
variable currency.

Exactamente lo mismo podemos hacer para la variable X9, demand deposits. Ya q


ue tienen la misma forma.

28
También si nos fijamos en el análisis exploratorio de datos la variable de salida con la
variable de entrada X12, chekeable deposits, tiene la misma forma que las anteriores p
or lo que también servirá el mismo tipo de ajuste.

Asimismo también con el mismo ajuste vemos que la variable X13 y X14, loans lea
ses y savings deposits, se ajustan perfectamente como en los anteriores casos.

29
Como conclusión para cerrar este apartado queda constatado que la variable X5,
la tasa de vencimiento, interacciona con muchas variables lo cual quiere decir que está
muy presenta en las relaciones entre la variable de salida y las de entrada que hemos
comentado hasta ahora.

2.3 ALGORITMO KNN

En este apartado voy a aplicar el algoritmo KNN para regresión el mejor modelo de
regresión lineal múltiple obtenido. El cual recordemos que fue: Y~X5+X7. Teniendo en
cuenta que este algoritmo depende del parámetro k, los vecinos más cercanos, vamos
a tener que ver como varía el ajuste dependiendo de ese parámetro y realizar una
comparación cuantitativa entre los dos algoritmos mediante el error cuadrático medio.

En primer lugar, leeré los archivos de training y test correspondientes:

mortgagetrain1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(mortgagetrain1)=c(paste(rep("X",15),c(1:15),sep=""),"Y")

30
mortgagetest1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(mortgagetest1)=c(paste(rep("X",15),c(1:15),sep=""),"Y")

Aplicaré knn al mejor modelo de regresión múltiple con diferentes k’s, predecimos
valores con knn y calculamos el error cuadrático medio, con el siguiente código:

fitknn1=kknn(mortgagetrain1$Y~mortgagetrain1$X5+mortgagetrain1$X7,mortgagetrai
n1,mortgagetest1,k=1,distance=2,kernel = "optimal", scale=TRUE)
yprime=predict(fitknn1)
sum(abs(mortgagetest1-yprime)^2)/length(yprime)

A continuación expondré una tabla con los resultados de aplicar diferentes k’s para
ajustar los datos.

k ECM
1 17.92246
2 17.9335
5 17.89185
10 17.84467
15 17.78577
20 17.7202

Está claro con estos valores que por muchos vecinos que pongamos el error no
cambia sustancialmente por lo que no importará, en este caso, que k escojamos. Así que
voy mostrar gráficamente cómo se comporta knn con mis datos.

31
El ajuste está representado por las líneas azules y como vemos el ajuste es
bastante aceptable aunque si lo comparamos con el que hice en regresión, este último
es mucho mejor, puesto que el error cuadrático es sustancialmente menor. Era un valor
de ECM=0.2658.

En esta sección comparamos la efectividad de los dos algoritmos comparando el


error cuadrático medio calculado con los diferentes conjuntos test y train para el mejor
modelo de regresión lineal múltiple. A continuación, expongo los resultados:

knnMSEtrain 0.01724081

knnMSEtest 0.03513957

lmMSEtrain 0.07041235
lmMSEtest 0.07078912

Con estos resultados podemos establecer una comparación y ver que se ajusta
mejor al modelo de regresión múltiple lineal escogido el método knn puesto que el error
es menor tanto para un conjunto como para el otro en contraste con la regresión.

32
2.4 COMPARACIÓN ENTRE ALGORITMOS

En esta subsección vamos a estudiar la efectividad de los algoritmos haciendo una


comparativa entre ellos mediante test’s estadísticos.
Realizaré el test de Wilconxon y aplicando el código que dejaré en el apéndice,
obtengo lo siguiente.

R(+) R(-) p-value


LM(R+) vs KNN(R-) 62 109 0.3247299

Esto significa que existe un 68% de confianza en que los métodos sean distintos, lo
cual es demasiado grande y nos hace ver que posiblemente los errores cuadráticos
medios calculados puede que su valor no sea del todo correcto.

El siguiente test es el Friedman:

Friedman chi-squared 8.7778

p-value 0.01241

Con este resultado puedo decir que existen diferencias entre al menos un par de
algoritmos.

Y por último POST-HOC HOLM

33
data: [Link](tablatst) and groups
1 2
2 0.442 -
3 0.071 0.108
P value adjustment method: holm

En 2vs3 podemos decir que tenemos un 90% y 3vs1 también, aproximadamente. Sin
embargo como ya adelantamos antes tenemos una diferencia muy significativa entre el
1 y el 2.

3. CLASIFICACIÓN

3.1 K-NN

En esta primera parte voy a utilizar el dataset: vowel. El cual ya estudié en el


apartado de análisis exploratorio. Recordemos que el dataset disponía de diez variables
numéricas, cuyos valores vamos a utilizar en clasificación, luego tenemos una variable
de salida llamada clase, nuestra variable categórica. Además también hay tres variables
que también son categóricas y que nos vamos a utilizar en clasificación, puesto que no
nos aportan información relevante en nuestro análisis: TT integer, SpeakerNumber
integer y Sex integer.
En un principio se deben normalizar las variables que vamos a clasificar antes de
aplicar k-nn, tanto para los datos de training como para los de test.

voweltra1_n <- [Link](lapply(voweltra1[,4:13], scale, center = TRUE, scale =


TRUE))

Comprobamos si ha funcionado la normalización.


summary(voweltra1_n[,c("F0","F1","F2")])

34
boxplot(voweltra1_n[,c("F0","F1","F2")])

De la misma manera para los datos test.


voweltest1_n <- [Link](lapply(voweltest1[,4:13], scale, center
= TRUE, scale = TRUE))

summary(voweltest1_n[,c("F0","F1","F2")])
boxplot(voweltest1_n[,c("F0","F1","F2")])

Después de probar varios k’s sin conseguir una precisión aceptable de clasifica-
Ción utilizarés cross validation para obtener el mejor k. Incluimos la variable de salida
En el conjunto training que he normalizado. No sin antes convertir los elementos ente-
ros de la variable clase en carácter.

voweltra1_n$Class=voweltra1[,14]
Knnmodel1=train(Class~.,method="knn", tuneGrid=[Link](k=1:30),trControl=trCo
ntrol1,metric="Accuracy",voweltra1_n)
Knnmodel1

The final value used for the model was k = 1.

prediction=predict(Knnmodel1)
matrizconf=confusionMatrix(table(prediction,voweltra1_n[1:length(prediction),11]))

Confusion Matrix and Statistics

35
prediction 0 1 2 3 4 5 6 7 8 9 10
0 81 0 0 0 0 0 0 0 0 0 0
1 0 81 0 0 0 0 0 0 0 0 0
2 0 0 81 0 0 0 0 0 0 0 0
3 0 0 0 81 0 0 0 0 0 0 0
4 0 0 0 0 81 0 0 0 0 0 0
5 0 0 0 0 0 81 0 0 0 0 0
6 0 0 0 0 0 0 81 0 0 0 0
7 0 0 0 0 0 0 0 81 0 0 0
8 0 0 0 0 0 0 0 0 81 0 0
9 0 0 0 0 0 0 0 0 0 81 0
10 0 0 0 0 0 0 0 0 0 0 81
Overall Statistics
Accuracy : 1
95% CI : (0.9959, 1)
No Information Rate : 0.0909
P-Value [Acc > NIR] : < 2.2e-16

Kappa : 1

3.2 LDA

Para aplicar el algoritmo debemos comprobar si existen asunciones estudiando si


los predictores constituyen por separado una distribución normal.

En este caso se debe mirar el p-value. Si este es mayor que 0.05, no se rechaza
la hipótesis nula y entonces podemos asumir normalidad.

[Link](vowel[,4])

VARIABLES p-VALUE
F0 9.807e-05

F1 0.0312

36
F2 4.245e-05

F3 4.324e-09

F4 0.07073

F5 5.435e-08

F6 0.0225

F7 0.0005086

F8 0.001437

F9 2.208e-12

En casi todos los casos no cumple la condición, que hemos impuesto, de


normalidad. De todas formas aplicaremos el algoritmo LDA. Y construimos la matriz de
confusión.

Confusion Matrix and Statistics

0 1 2 3 4 5 6 7 8 9 10
0 62 19 0 0 0 0 0 0 0 5 0
1 13 48 12 0 0 1 0 0 1 6 0
2 4 15 63 3 0 5 3 0 0 0 5
3 0 0 10 69 5 8 0 0 0 0 4
4 0 0 0 0 50 20 17 0 0 0 0
5 0 0 2 12 16 39 4 0 0 0 14
6 0 0 0 0 17 6 59 6 1 0 2
7 0 0 0 0 0 0 3 72 17 7 0
8 0 0 0 0 0 0 2 8 46 10 3
9 11 0 0 0 0 0 0 0 14 59 0
10 0 8 3 6 2 11 2 4 11 3 62
Overall Statistics
Accuracy : 0.6354
95% CI : (0.6045, 0.6654)
No Information Rate : 0.0909
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.5989

Vemos que la precisión obtenida con este método aproximadamente del 64%, muy
inferior a la obtenida por el procedimiento anterior, knn.

37
Ahora hago lo mismo con los conjuntos de test y entrenamiento para utilizar cross
validation y ver el resultado.

Confusion Matrix and Statistics

prediction 0 1 10 2 3 4 5 6 7 8 9
0 58 16 0 0 0 0 0 0 0 0 6
1 8 41 0 11 0 0 0 0 0 1 5
10 0 9 56 2 5 2 11 0 3 9 1
2 4 15 3 60 3 0 4 2 0 0 0
3 0 0 4 6 61 6 7 0 0 0 0
4 0 0 0 0 0 46 16 18 0 0 0
5 0 0 14 2 12 11 36 7 0 0 0
6 0 0 1 0 0 16 7 49 5 1 0
7 0 0 0 0 0 0 0 3 68 15 5
8 0 0 3 0 0 0 0 2 5 40 9
9 11 0 0 0 0 0 0 0 0 15 55

Overall Statistics
Accuracy : 0.6397
95% CI : (0.6072, 0.6713)
No Information Rate : 0.0909
P-Value [Acc > NIR] : < 2.2e-16

En este caso vemos que la precisión mejora pero no significativamente.

3.3 QDA

En este apartado seguimos exactamente la misma secuencia que la anterior.

Confusion Matrix and Statistics

0 1 2 3 4 5 6 7 8 9 10
0 85 1 0 0 0 1 0 0 0 0 0

38
1 5 87 7 0 0 0 0 0 0 0 0
2 0 2 83 0 0 0 0 0 0 0 0
3 0 0 0 90 1 1 0 0 0 0 0
4 0 0 0 0 81 9 4 0 0 0 0
5 0 0 0 0 2 74 0 0 0 0 1
6 0 0 0 0 5 0 84 4 1 0 2
7 0 0 0 0 0 0 2 85 5 0 0
8 0 0 0 0 0 0 0 1 83 1 0
9 0 0 0 0 0 0 0 0 1 88 1
10 0 0 0 0 1 5 0 0 0 1 86
Overall Statistics

Accuracy : 0.9354
95% CI : (0.9182, 0.9499)
No Information Rate : 0.0909
P-Value [Acc > NIR] : < 2.2e-16

Con Cross Validation obtenemos:

Confusion Matrix and Statistics

prediction 0 1 10 2 3 4 5 6 7 8 9
0 78 1 0 0 0 0 1 0 0 0 0
1 3 78 0 7 0 0 0 0 0 0 0
10 0 0 76 0 0 1 4 0 0 0 1
2 0 2 0 74 0 0 0 0 0 0 0
3 0 0 0 0 81 0 1 0 0 0 0
4 0 0 0 0 0 74 9 3 0 0 0
5 0 0 2 0 0 3 66 0 0 0 0
6 0 0 2 0 0 3 0 76 3 1 0
7 0 0 0 0 0 0 0 2 78 4 0
8 0 0 0 0 0 0 0 0 0 75 1
9 0 0 1 0 0 0 0 0 0 1 79

Overall Statistics
Accuracy : 0.9371
95% CI : (0.9192, 0.9522)
No Information Rate : 0.0909
P-Value [Acc > NIR] : < 2.2e-16

La mejora con los conjuntos test y train es sustancialmente pequeña. Pero el método
nos brinda una precisión mucho más notable que con el método LDA.

3.4 COMPARACIÓN DE RESULTADOS ENTRE


ALGORITMOS
39
Tras observar el distinto comportamiento de los clasificadores es plausible decir que
el parámetro que nos puede permitir comparar dichos algoritmos, es la precisión. Con
ella podremos decir que método clasifica mejor nuestros datos. En mi caso, el método
knn nos da un 100% de aciertos frente al método QDA nos proporciona un 94%
aproximadamente. Sin embargo el procedimiento que nos clasifica con equivocaciones
significativas es el LDA con el que obtuve un 64% de precisión.

4. APÉNDICE

library(caret)
library(gridExtra)

library(ggplot2)
library(MASS)
library(kknn)
library(ISLR)
#DATASET: MORTGAGE

#1 ANALISIS EXPLORATORIO DE DATOS

#cargamos los datos en R


mortgage<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(mortgage)=c(paste(rep("X",15),c(1:15),sep=""),"Y")

#Caracteristicas generales:
#Variables:

40
#Month Rate real
#MaturityRate real

#Rate AuctionAverage real


#Rate Secondary Market real
#Maturity Rate real
#bank Credit real
#currency real

#demand Deposits real


#federal Funds real
#money Stock
#checkable Deposits
#loans Leases

#savings Deposits
#trade Currencies
#Mortgage rate

class(mortgage)

typeof(mortgage)
str(mortgage)
length(mortgage[[Link](mortgage)]) #Comprobamos si hay missing values en
el dataframe
summary(mortgage)

#Calculo de parametros estadisticos

estadisticamortgage=[Link]("media"=sapply(mortgage,mean),"desviacion"=sappl
y(mortgage,sd),
"varianza"=sapply(mortgage,var),"mediana"=sapply(mortgage,median),"minimo"=sap
ply(mortgage,min),"maximo"=sapply(mortgage,max))

41
sapply(mortgage,quantile)

#Graficas de los datos


[Link]("gridExtra")#para poder generar grupos de graficos en la misma hoja
library(gridExtra)

#Primeros 4 graficos

p1=ggplot(data=mortgage,aes(x=X1,y=Y))+geom_point(colour="red")+labs(title="M.R
vs MonthCDRate real",x="MonthCDRate real",y="MortgageRate real")

p2=ggplot(data=mortgage,aes(x=X2,y=Y))+geom_point(colour="green")+labs(title="M.
R vs MaturityRate real ",x="MaturityRate real",y="MortgageRate real")
p3=ggplot(data=mortgage,aes(x=X3,y=Y))+geom_point(colour="blue")+labs(title="M.R
vs RateAuctionAveragereal",x="Rate-AuctionAverage real",y="MortgageRate real")
p4=ggplot(data=mortgage,aes(x=X4,y=Y))+geom_point(colour="yellow")+labs(title="M
.R vs RateSecondaryMarketreal ",x="Rate-SecondaryMarket real",y="MortgageRate
real")
[Link](p1,p2,p3,p4,nrow=2,ncol=2)

#segundos 4 graficos
p5=ggplot(data=mortgage,aes(x=X5,y=Y))+geom_point(colour="violet")+labs(title="M.
R vs 3Y-CMaturityRate real",x="3Y-CMaturityRate real",y="MortgageRate real")

p6=ggplot(data=mortgage,aes(x=X6,y=Y))+geom_point(colour="black")+labs(title="M.
R vs 5Y-CMaturityRate real",x="5Y-CMaturityRate real",y="MortgageRate real")

p7=ggplot(data=mortgage,aes(x=X7,y=Y))+geom_point(colour="orange")+labs(title="M
.R vs bankCredit real",x="bankCredit real",y="MortgageRate real")
p8=ggplot(data=mortgage,aes(x=X8,y=Y))+geom_point(colour="purple")+labs(title="M
.R vs currency real ",x="currency real",y="MortgageRate real")
[Link](p5,p6,p7,p8,nrow=2,ncol=2)

#terceros

42
p9=ggplot(data=mortgage,aes(x=X9,y=Y))+geom_point(colour="gray")+labs(title="M.R
vs demandDeposits real",x="demandDeposits real",y="MortgageRate real")
p10=ggplot(data=mortgage,aes(x=X10,y=Y))+geom_point(colour="cyan")+labs(title="M
.R vs federalFunds real",x="federalFunds real",y="MortgageRate real")
p11=ggplot(data=mortgage,aes(x=X11,y=Y))+geom_point(colour="brown")+labs(title="
M.R vs moneyStock real",x="moneyStock real",y="MortgageRate real")
p12=ggplot(data=mortgage,aes(x=X12,y=Y))+geom_point(colour="pink")+labs(title="M
.R vs checkableDeposits real ",x="checkableDeposits real",y="MortgageRate real")
[Link](p9,p10,p11,p12,nrow=2,ncol=2)

#ultimos

p13=ggplot(data=mortgage,aes(x=X13,y=Y))+geom_point(colour="aquamarine")+labs(t
itle="M.R vs loansLeases real",x="loansLeases real",y="MortgageRate real")
p14=ggplot(data=mortgage,aes(x=X14,y=Y))+geom_point(colour="turquoise")+labs(titl
e="M.R vs savingsDeposits real",x="savingsDeposits real",y="MortgageRate real")
p15=ggplot(data=mortgage,aes(x=X11,y=Y))+geom_point(colour="red")+labs(title="M.
R vs tradeCurrencies real",x="tradeCurrencies real",y="MortgageRate real")
[Link](p13,p14,p15,nrow=3,ncol=1)

#REGRESIÓN SIMPLE

fit1=lm(Y~X1,data=mortgage)
summary(fit1)

ggplot(mortgage, aes(x=X4, y=Y))+labs(title="M.R vs


RateSecondaryMarket",x="RateSecondaryMarket",y="M.R")+ geom_point(shape =
1)+geom_smooth(method = lm,se = FALSE)+geom_text(x = 5, y = 17, aes(label ="R-
squared= 0,9731"))+geom_text(x = 5, y = 16, aes(label ="ECM=0.5101"))

43
#REGRESION MULTIPLE
fitm1=lm(Y~.,data=mortgage)

summary(fitm1)
fitm2=lm(Y~X5+X6+X7,data=mortgage)
ggplot(mortgage, aes(x=X5+X6+X7, y=Y))+labs(title="M.R vs 3Y-CMaturityRate real+5Y-
CMaturityRate real+bankCredit real",x="3Y-CMaturityRate real+5Y-CMaturityRate
real+bankCredit real",y="M.R")+ geom_point(shape = 1)+geom_smooth(method =
lm,se = FALSE)+geom_text(x = 20, y = 16, aes(label ="R-squared= 0.998"))
summary(lm(Y~X5+X7,mortgage))
ggplot(mortgage, aes(x=X5+X7, y=Y))+labs(title="M.R vs 3Y-CMaturityRate real +
bankCredit real",x="3Y-CMaturityRate real + bankCredit real",y="M.R")+
geom_point(shape = 1)+geom_smooth(method = lm,se = FALSE)+geom_text(x = 20, y =
16, aes(label ="R-squared= 0.9927"))

#INTERACCIONES Y NO LINEALIDAD

summary(lm(Y~I(X8^(-1))+X1,mortgage))
summary(lm(Y~I(X8^(-1))+X4,mortgage))
summary(lm(Y~I(X8^(-1))+X5,mortgage))

ggplot(mortgage,aes(x=X8,y=Y))+labs(title="M.R vs currency real",x="currency


real",y="Mortage Rate
real")+geom_point()+geom_point(y=predict3,colour="red")+geom_text(x=2000,y=15,a
es(label="R-quared=0.9777"))

#CALCULO DE MSE CON CROSS VALIDATION PARA KNN Y LM

nombre<-"mortgage"
run_knn_fold<-function(i, x, tt= "test") {
file <-paste(x, "-5-", i, "[Link]", sep="")

44
x_tra<-[Link](file, [Link]="@")
file <-paste(x, "-5-", i, "[Link]", sep="")

x_tst<-[Link](file, [Link]="@")
In <-length(names(x_tra)) -1
names(x_tra)[1:In] <-paste ("X", 1:In, sep="")
names(x_tra)[In+1] <-"Y"
names(x_tst)[1:In] <-paste ("X", 1:In, sep="")

names(x_tst)[In+1] <-"Y"
if (tt== "train") {
test <-x_tra
}
else {

test <-x_tst
}
fitMulti=kknn(Y~X5+X7,x_tra,test)
yprime=fitMulti$[Link]
sum(abs(test$Y-yprime)^2)/length(yprime)

}
knnMSEtest<-mean(sapply(1:5,run_knn_fold,nombre,"test"))
knnMSEtrain<-mean(sapply(1:5,run_knn_fold,nombre,"train"))

run_lm_fold<-function(i, x, tt= "test") {


file <-paste(x, "-5-", i, "[Link]", sep=""); x_tra<-[Link](file, [Link]="@")
file <-paste(x, "-5-", i, "[Link]", sep=""); x_tst<-[Link](file, [Link]="@")
In <-length(names(x_tra)) -1
names(x_tra)[1:In] <-paste ("X", 1:In, sep=""); names(x_tra)[In+1] <-"Y"

names(x_tst)[1:In] <-paste ("X", 1:In, sep=""); names(x_tst)[In+1] <-"Y"


if (tt== "train") { test <-x_tra}

45
else { test <-x_tst}
fitMulti=lm(Y~X5+X7,x_tra)

yprime=predict(fitMulti,test)
sum(abs(test$Y-yprime)^2)/length(yprime)
}

lmMSEtrain<-mean(sapply(1:5,run_lm_fold,nombre,"train"))
lmMSEtest<-mean(sapply(1:5,run_lm_fold,nombre,"test"))

#COMPARATIVA ENTRE ALGORITMOS

#leemos la tabla con los errores medios de test

resultados<-[Link]("regr_test_alumnos.csv")
resultados[14,2]=lmMSEtest
resultados[14,3]=knnMSEtest
tablatst<-cbind(resultados[,2:dim(resultados)[2]])
colnames(tablatst) <-names(resultados)[2:dim(resultados)[2]]

rownames(tablatst) <-resultados[,1]

#leemos la tabla con los errores medios de entrenamiento

resultados<-[Link]("regr_train_alumnos.csv")
resultados[14,2]=lmMSEtrain

46
resultados[14,3]=knnMSEtrain
tablatra<-cbind(resultados[,2:dim(resultados)[2]])

colnames(tablatra) <-names(resultados)[2:dim(resultados)[2]]
rownames(tablatra) <-resultados[,1]

#TEST WILCONXON

#COMPARATIVA POR PARES ENTRE LM Y KNN


difs<-(tablatst[,1] -tablatst[,2]) / tablatst[,1]
wilc_1_2 <-cbind(ifelse(difs<0, abs(difs)+0.1, 0+0.1), ifelse(difs>0, abs(difs)+0.1, 0+0.1))
colnames(wilc_1_2) <-c(colnames(tablatst)[1], colnames(tablatst)[2])

head(wilc_1_2)

#APLICAMOS TEST
LMvsKNNtst<-[Link](wilc_1_2[,1], wilc_1_2[,2], alternative = "[Link]",
paired=TRUE)
Rmas<-LMvsKNNtst$statistic

pvalue<-LMvsKNNtst$[Link]
LMvsKNNtst<-[Link](wilc_1_2[,2], wilc_1_2[,1], alternative = "[Link]",
paired=TRUE)
Rmenos<-LMvsKNNtst$statistic
Rmas
Rmenos

pvalue

#TEST FRIEDMAN

47
test_friedman<-[Link]([Link](tablatst))
test_friedman

#TEST POST-HOC HOLM

tam <-dim(tablatst)
groups <-rep(1:tam[2], each=tam[1])

[Link]([Link](tablatst), groups, [Link]= "holm", paired = TRUE)

#ALGORITMO KNN

mortgagetrain1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(mortgagetrain1)=c(paste(rep("X",15),c(1:15),sep=""),"Y")

mortgagetest1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(mortgagetest1)=c(paste(rep("X",15),c(1:15),sep=""),"Y")

fitknn1=kknn(Y~X5+X7,mortgagetrain1,mortgagetest1,k=1,distance=2,kernel =
"optimal", scale=TRUE)
yprime=predict(fitknn1)

48
sum(abs(mortgagetest1-yprime)^2)/length(yprime)

ggplot(mortgagetrain1, aes(x=mortgagetrain1$X5+mortgagetrain1$X7,
y=mortgagetrain1$Y))+labs(title="M.R vs 3Y-CMaturityRate real + bankCredit
real",x="3Y-CMaturityRate real + bankCredit real",y="M.R")+ geom_point(shape =
1)+geom_line(y=yprime)+geom_text(x = 20, y = 16, aes(label ="ECM= 17."))

#DATASET: VOWEL
#ANALISIS EXPLORATORIO
vowel<-[Link]("[Link]", [Link]="@",sep=",",dec=".",header=FALSE)
names(vowel)=c("TT integer","SpeakerNumber integer","Sex
integer",paste(rep("F",10),c(0:9),sep=""),"Class")

class(vowel)
typeof(vowel)
str(vowel)
any([Link](vowel))
estadisticavowel=[Link]("media"=sapply(vowel[,4:13],mean),"desviacion"=sapply
(vowel[,4:13],sd)

#GRAFICOS
par(mfrow=c(2,1))
barplot(table(vowel[,1],vowel[,14]),beside=T,col=c("blue","red"),legend=c("0","1"))

barplot(table(vowel[,3],vowel[,14]),beside=T,col=c("white","black"),legend=c("0","1"),
main="Sex integer vs Class",xlab="Class")

barplot(table(vowel[,2],vowel[,14]),col=c("dark
blue","blue","cyan","green","yellow","orange","brown","white","black","gray","pink","
magenta","red","violet","purple"),legend=c(paste("Speaker",c(0:14))))

49
c1=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,4]))+geom_boxplot(outlier
.colour="red")+labs(title="F0 VS Class",x="Class",y="F0")
c2=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,5]))+geom_boxplot(outlier
.colour="blue")+labs(title="F1 VS Class",x="Class",y="F1")
c3=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,6]))+geom_boxplot(outlier
.colour="yellow")+labs(title="F2 VS Class",x="Class",y="F2")
c4=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,7]))+geom_boxplot(outlier
.colour="orange")+labs(title="F3 VS Class",x="Class",y="F3")
[Link](c1,c2,c3,c4,nrow=2,ncol=2)

c5=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,8]))+geom_boxplot(outlier
.colour="purple")+labs(title="F4 VS Class",x="Class",y="F4")
c6=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,9]))+geom_boxplot(outlier
.colour="brown")+labs(title="F5 VS Class",x="Class",y="F5")
c7=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,10]))+geom_boxplot(outli
[Link]="black")+labs(title="F6 VS Class",x="Class",y="F6")
c8=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,11]))+geom_boxplot(outli
[Link]="pink")+labs(title="F7 VS Class",x="Class",y="F7")
[Link](c5,c6,c7,c8,nrow=2,ncol=2)

c9=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,12]))+geom_boxplot(outli
[Link]="dark blue")+labs(title="F8 VS Class",x="Class",y="F8")
c10=ggplot(data=vowel,aes(x=[Link](vowel[,14]),y=vowel[,13]))+geom_boxplot(outl
[Link]="red")+labs(title="F9 VS Class",x="Class",y="F9")
[Link](c9,c10,nrow=2,ncol=1)

#CLASIFICACION KNN

50
voweltra1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(voweltra1)=c("TT integer","SpeakerNumber integer","Sex
integer",paste(rep("F",10),c(0:9),sep=""),"Class")

voweltest1<-[Link]("[Link]",
[Link]="@",sep=",",dec=".",header=FALSE)
names(voweltest1)=c("TT integer","SpeakerNumber integer","Sex
integer",paste(rep("F",10),c(0:9),sep=""),"Class")

#Normalizacion

voweltra1_n <- [Link](lapply(voweltra1[,4:13], scale, center = TRUE, scale =


TRUE))

voweltest1_n <- [Link](lapply(voweltest1[,4:13], scale, center = TRUE, scale =


TRUE))

vowel_test <- knn(train = voweltra1_n, test = voweltest1_n,


cl=vowel[1:nrow(voweltra1_n),14], k=1)

voweltra1$Class=[Link](voweltra1$Class)
voweltra1_n$Class=voweltra1[,14]
trControl1=trainControl(method="cv" , number=10)
Knnmodel1=train(Class~.,method="knn",
tuneGrid=[Link](k=1:30),trControl=trControl1,metric="Accuracy",voweltra1_n)
Knnmodel1

prediction=predict(Knnmodel1)
matrizconf=confusionMatrix(table(prediction,voweltra1_n[1:length(prediction),11]))

51
#LDA
[Link](voweltra1_n[,1])

[Link] <- lda(Class~F0+F1+F2+F3+F4+F5+F6+F7+F8+F9,data=vowel)


[Link]

plot([Link],col=c("blue","red","green","purple","cyan","brown","yellow","black","oran
ge","white"))

[Link] <- predict([Link])


table([Link]$class,vowel[1:length([Link]$class),14])
confusionMatrix(table([Link]$class,vowel[1:length([Link]$class),14]))

#CON CROSS VALIDATION


trControl1=trainControl(method="cv" , number=10)
ldamodel1=train(Class~.,method="lda",trControl=trControl1,metric="Accuracy",vowelt
ra1_n)
prediction=predict(ldamodel1)
matrizconf=confusionMatrix(table(prediction,voweltra1_n[1:length(prediction),11]))

matrizconf

#QDA

[Link] <- qda(Class~F0+F1+F2+F3+F4+F5+F6+F7+F8+F9,data=vowel)


[Link] <- predict([Link])
confusionMatrix(table([Link]$class,vowel[1:length([Link]$class),14]))

52

También podría gustarte