Error in browseURL(url): 'url' must be a non-empty character string
---
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
`r opts_chunk$set(message=FALSE,comment="",size='small')`
```{r, echo = FALSE}
#install.packages(devtools)
#library(devtools)
#install_github('slidify', 'ramnathv')
#install_github('slidifyLibraries', 'ramnathv')
#install_version("stringr", version="0.6.2", type = "source")
#library(slidify)
#Cambiar el directorio: setwd("/Users/josezea/jfzeac")
# library(slidify)
# library(slidifyLibraries)
options(rpubs.upload.method = "internal")
publish(title = 'pp', 'index.html', host = 'rpubs')
```
<div align="center">
<img src = "candane.png" width = "900", height = "480" />
</div>
<br>
## Curso de Análisis de datos con R
</br>
<h3>Instructor:</h3>
<h2> José Fernando Zea</h2>
<li><h4>Msc en Estadística</h4></li>
<li><h4>Docente Universidad Nacional</h4></li>
<li><h4>Estudiante Phd en Estadistica (UNAL)</h4></li>
--- .cover #Cover
## Análisis de datos con R

Algunas ventajas:
---
## ¿Qué es R?
Algunas ventajas:
> 1. Editoriales como Springer, Wiley, OUP, Sage, W.H. Freeman, Elsevier, CRC, SIAM, CUP, BEP, O'Reilly disponen de muchos libros con aplicaciones en R (+ de 1000)
> 2. Editoriales de universidades del mundo hispano están publicando libros con aplicaciones en R
> 3. Mucho material en la web, tutoriales generales y específas
<p>
<div align="center">
<iframe width="460" height="215" src="https://www.youtube.com/embed/NZPHiYP7I24" frameborder="0" allowfullscreen></iframe>
</div>
---
## Amplia difusión
<p>
<div align="left">
<img src = "R_springer.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
<p>
<div align="left">
<img src = "R_Wiley.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
<p>
<div align="left">
<img src = "meetups.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
The best thing about R is that it was written by statisticians. The worst thing about R is that it was written by statisticians.
---
## Breve historia
1. Creado por Ross Ihaka y Robert Gentleman en 1993 en la Universidad de Auckland (Nueva Zelanda)
2. Tienen un predecesor en el cual está inspirado que es el lenguaje S (1976) desarrolado por los laboratorios Bell.
3. Es un lenguaje en si mismo y además orientado a objetos.
<blockquote>The best thing about R is that it was written by statisticians. The worst thing about R is that it was written by statisticians.</blockquote>
<p>
<div align="left">
<img src = "R_creators.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
--- #installr
## Proceso de instalación de R
1. Ingrese a <a href="http://www.r-project.org/">www.r-project.org</a>.
2. De click en download R, como se muestra en la imagen:
<p>
<div align="center">
<img src = "installr_1.png" width = "400", height = "200"
alt = "Instalando R" />
</div>
</p>
3. Escoja cualquier espejo (por ejemplo 0-cloud o cualquera de otro país).
4. Elija su sistema operativo y marque una de las tres opciones:
- Download R for Linux
- Download R for (Mac) OS X
- Download R for Windows
5. Si marca para windows de click en <FONT COLOR="#0000FF">install R for the first time</FONT>
y luego <FONT COLOR="#0000FF">Download R 3.2.0 for Windows</FONT> si se marca MAC marque en
<FONT COLOR="#0000FF">R-3.2.0.pkg </FONT>
<style>#installr li{font-size: 100%}</style>
De click en Desktop.
De clik en Download Rstudio Desktop
Escoja su sistema operativo.
---
## Proceso de instalación de Rstudio
1. Ingrese a <a href="http://www.rstudio.com//">www.rstudio.com/</a>.
2. De click en download Rstudio, como se muestra en la imagen:
<p>
<div align="center">
<img src = "install_rstudio.png" width = "250", height = "170"
alt = "Instalando R" />
</div>
</p>
3. De click en Desktop.
<p>
<div align="center">
<img src = "install_rstudio2.png" width = "250", height = "170"
alt = "Instalando R" />
</div>
</p>
4. De clik en Download Rstudio Desktop
5. Escoja su sistema operativo.
---
## Conociendo la consola

Los paquetes son necesarios para agregar funcionaliades a R, puede instalarse paquetes de la siguiente manera:
---
## Installar paquetes
Los paquetes son necesarios para agregar funcionaliades a R, puede instalarse paquetes de la siguiente manera:
* install.packages("nombrepaquete"), por ejemplo install.packages("sampling")
* Este último paquete agrega funcionalidades para manejar encuestas probabilísticas.
* Como se ilustra en la imagen, se puede instalar un paquete dando click a la pestaña "Packages" y luego "Install" en la parte central a mano izquierda de los menus de Rstudio.
<p>
<div align="center">
<img src = "install_packages.png" width = "400", height = "400"
alt = "Instalando R" />
</div>
</p>
* Para este curso se requieren los siguientes paquetes: moments, dplyr, readr, tidyr, ggplot2, ggvis, sqldf, sampling (por instalar), knitr (por instalar), survey (por instalar), plotrix (por instalar), entre otros.
* Instalarlos.
Existen varias formas de buscar ayuda en R
for
)
---
## La ayuda
Existen varias formas de buscar ayuda en R
* Nombre de la función precedida por signo de interrogación, por ejemplo ?mean
* help(mean)
* example(`for`)
* help.search("regression") o equivalentemente ??regression
* ??"logistic regression"
* apropos("mean")
* Lo mejor: buscar en inglés lo que se quiere en google y al final la palabra r
---
## A tener en cuenta ...
* Si sale un más con escape se vuelve a tener la consola limpia, por ejemplo: a = 5 * (3 - 2
* Los errores de sintaxis se destacan en rojo con el mensaje error: b = 3exp(1)
* Siempre es mejor trabajar con un script y no en consola
* Cuando sale la palabra warning o sale un mensaje rojo sin que se precede por la palabra "error" no necesariamente hay problemas: library(dplyr)
* Con ctrl + L se limpia la consola
* Es una práctica sana reiniciar la sesión command/ctrl + shift + F10
* Es útil ir borrando los objetos con la función rm
* En caso de que se congele Rstudio se puede cerrar y no se pierde el trabajo, sin embargo es recomendado ir guardando el script
* Con ls() se pueden ver los objetos existentes
* getwd() nos dice en que carpeta se guardará lo que trabajemos
* No olvidar cambiar de directorio para tener exportaciones con éxito. (Manualmente o con setwd)
Las estructuras de datos en R pueden clasificarse según su dimensionalidad y por si ellos son homogeneos o heterogeneos, es decir si pueden tener datos del mismo tipo. No hay tipo escalar en R, Los escalares son vectores de dimensión 1.
Dimensión | Homogéneos | Heterogéneos |
---|---|---|
1d | Vectores atómicos | Data frame |
2d | Matrices | Lista |
pd | Arreglos |
Empezamos con la estructura más simple, los vectores, ejecute los siguientes comandos:
10
c(1,2,3)
1:3
"Juan"
c("Pedro", "Andrés")
c(TRUE, FALSE, TRUE)
Los vectores se crean con c() que es un operador de concatenación, los vectores tienen tres atributos fundamentales: la longitud, el tipo y los atributos
length(1)
[1] 1
length(c(1,2,3))
[1] 3
--- #estruct_r
## Estructuras de datos
Las estructuras de datos en R pueden clasificarse según su dimensionalidad y por si ellos son homogeneos o heterogeneos, es decir si pueden tener datos del mismo tipo. No hay tipo escalar en R,
Los escalares son vectores de dimensión 1.
<div align="center">
```{r, results='asis', echo = FALSE}
#options(rpubs.upload.method = "internal")
#publish(title = 'AnalisisDatosRintro', 'index.html', host = 'rpubs')
library(xtable)
Dimensión <- c("1d", "2d", "pd")
Homogéneos <- c("Vectores atómicos", "Matrices", "Arreglos")
Heterogéneos <- c("Data frame", "Lista", "")
tabla1 <- data.frame(Dimensión, Homogéneos, Heterogéneos )
print(xtable(tabla1), type = "html", include.rownames=FALSE)
```
</div>
<p>
Empezamos con la estructura más simple, los vectores, ejecute los siguientes comandos:
</p>
```{r, eval=FALSE}
10
c(1,2,3)
1:3
"Juan"
c("Pedro", "Andrés")
c(TRUE, FALSE, TRUE)
```
Los vectores se crean con c() que es un operador de concatenación, los vectores tienen tres atributos fundamentales: la longitud, el tipo y los atributos
```{r, echo = TRUE}
length(1)
length(c(1,2,3))
```
<style>#estruct_r li{font-size: 120%}</style>
Existen cuatro tipos de vectores atómicos utilizados comunmente: Numérico ("double"), entero, caracter y complejo.
x <- c(4.1, 3.8, 2.5, 1)
y <- c(1L, 4L)
z <- c(1, 4)
complejos <- c(2+3i, -2i)
El operador <- es de asignación, si bien en R peude usarse puede utilizarse el símbolo igual es mejor utilizar <- para evitar confusiones puesto que = tiene otros usos.
typeof(x); typeof(y); typeof(z); typeof(complejos)
rm(x, y , z)
w <- c(TRUE, FALSE, FALSE, TRUE)
x <- c("Juan", "Ana", 1)
y <- c("15/12/12", "15/02/15")
z <- c("15-12-2012", "15-02-15")
typeof(w); typeof(x); typeof(y); typeof(z)
Los dos últimos vectores son de tipo carácter pero contienen fechas, para que R sepa que el valor ahí contenido es una fecha hace falta unos pasos.
---
## Vectores
Existen cuatro tipos de vectores atómicos utilizados comunmente: Numérico ("double"), entero, caracter y complejo.
```{r, results='markup', size='footnotesize'}
x <- c(4.1, 3.8, 2.5, 1)
y <- c(1L, 4L)
z <- c(1, 4)
complejos <- c(2+3i, -2i)
```
El operador <- es de asignación, si bien en R peude usarse puede utilizarse el símbolo igual es mejor utilizar <- para evitar confusiones puesto que = tiene otros usos.
```{r, eval=FALSE}
typeof(x); typeof(y); typeof(z); typeof(complejos)
```
```{r, results='markup'}
rm(x, y , z)
w <- c(TRUE, FALSE, FALSE, TRUE)
x <- c("Juan", "Ana", 1)
y <- c("15/12/12", "15/02/15")
z <- c("15-12-2012", "15-02-15")
```
```{r, eval=FALSE}
typeof(w); typeof(x); typeof(y); typeof(z)
```
Los dos últimos vectores son de tipo carácter pero contienen fechas, para que R sepa que el valor ahí contenido es una fecha hace falta unos pasos.
Se puede convertir un vector de un tipo a otro en varias casos:
#Enteros a numérico (double)
as.double(c(1L, 2L, 5L))
[1] 1 2 5
typeof(as.double(c(1L, 2L, 5L)))
[1] "double"
#Numérico a entero
as.integer(c(3.6, 4.1))
[1] 3 4
Corra las siguientes sentencias:
#Las operaciones matemáticas sobre vectores lógicos convierten antes T en 1, F en 0
mean(c(T, F, F, F, T))
#Lo mismo que la sentencia anterior
mean(as.numeric(c(T, F, F, F, T)))
#Un vector de carácteres de números puede convertirse a numérico
as.numeric(c("01", "10", "24"))
--- -
## Coerción de tipos
Se puede convertir un vector de un tipo a otro en varias casos:
```{r, echo = TRUE}
#Enteros a numérico (double)
as.double(c(1L, 2L, 5L))
typeof(as.double(c(1L, 2L, 5L)))
#Numérico a entero
as.integer(c(3.6, 4.1))
```
Corra las siguientes sentencias:
```{r, eval=FALSE}
#Las operaciones matemáticas sobre vectores lógicos convierten antes T en 1, F en 0
mean(c(T, F, F, F, T))
#Lo mismo que la sentencia anterior
mean(as.numeric(c(T, F, F, F, T)))
#Un vector de carácteres de números puede convertirse a numérico
as.numeric(c("01", "10", "24"))
```
Ejecute las siguientes sentencias y comentelas con su compañero
exp(1)
sin(pi)
sqrt ( (1/2) * pi) * exp ( (-1/2) * 0)
c(2, 5) + c(6, 8)
a = 1000
3^2
3**2
log(exp(1))
log(100, base = 10)
log(base = 10, x = a)
log(8, 2)
factorial(3)
choose(5,2)
curve(x^3 - 3*x, -2, 2)
curve(dnorm, -3,3)
sum(c(4,5,6,7,12,1))
min(c(4,5,6,7,12,1))
max(c(4,5,6,7,12,1))
range(c(4,5,6,7,12,1))
---
## R puede usarse como calculadora
Ejecute las siguientes sentencias y comentelas con su compañero
```{r, eval=FALSE}
exp(1)
sin(pi)
sqrt ( (1/2) * pi) * exp ( (-1/2) * 0)
c(2, 5) + c(6, 8)
a = 1000
3^2
3**2
log(exp(1))
log(100, base = 10)
log(base = 10, x = a)
log(8, 2)
factorial(3)
choose(5,2)
curve(x^3 - 3*x, -2, 2)
curve(dnorm, -3,3)
sum(c(4,5,6,7,12,1))
min(c(4,5,6,7,12,1))
max(c(4,5,6,7,12,1))
range(c(4,5,6,7,12,1))
```
Las variables de escala nominal u ordinal son por lo general vectores de tipo caracter u entero (aunque vienen codificados como numèricos en muchos casos), algunos análisis usuales que se puden llevar a cabo se presentan:
#Variables categóricas
ID <- paste("ID", 1:10, sep = "")
Sexo <- c("M", "F", "F", "M", "F", "F", "F", "M", "M", "F")
length(Sexo)
table(Sexo)
prop.table(table(Sexo))
100 * prop.table(table(Sexo))
barplot(prop.table(table(Sexo)))
Hijos <- c(0, 0, 2, NA, 1, 3, 1, 0, 2, 1, NA)
table(Hijos)
table(Hijos, useNA="always")
cumsum(table(Hijos))
is.na(Hijos)
sum(is.na(Hijos))
#Proporción de faltantes
100 * sum(is.na(Hijos)) / length(Hijos)
---
## Funciones estadísticas básicas (1)
Las variables de escala nominal u ordinal son por lo general vectores de tipo caracter u entero (aunque vienen codificados como numèricos en muchos casos), algunos análisis usuales que se puden llevar a cabo se presentan:
```{r, eval=FALSE}
#Variables categóricas
ID <- paste("ID", 1:10, sep = "")
Sexo <- c("M", "F", "F", "M", "F", "F", "F", "M", "M", "F")
length(Sexo)
table(Sexo)
prop.table(table(Sexo))
100 * prop.table(table(Sexo))
barplot(prop.table(table(Sexo)))
Hijos <- c(0, 0, 2, NA, 1, 3, 1, 0, 2, 1, NA)
table(Hijos)
table(Hijos, useNA="always")
cumsum(table(Hijos))
is.na(Hijos)
sum(is.na(Hijos))
#Proporción de faltantes
100 * sum(is.na(Hijos)) / length(Hijos)
```
Algunos análisis llevados a cabo principalmente para variables de tipo continuo u ordinales con múltiples categorías que se pueden llevar a cabo son los siguientes:
ingreso <- c(800, 560, 1200, 600, 1800, 1500, 2700, 1900, 5000, 650, 1600)
summary(ingreso)
length(ingreso)
mean(ingreso)
median(ingreso)
sd(ingreso)
100 * sd(ingreso) / mean(ingreso)
ingreso > 1000
table(ingreso > 1000)
skewness(ingreso)
library(moments)
skewness(ingreso)
kurtosis(ingreso)
quantile(ingreso, c(0.25, 0.5, 0.75))
quantile(ingreso, 0.2)
fivenum(ingreso)
mean(ingreso, trim = 0.05) #Promedio recortado al 10% (Cinco y cinco)
Pueden existir datos faltantes
ingreso <- c(800, 560, 1200, 600, 1800, 1500, NA, 1900, 5000, NA, 1600)
sum(ingreso)
sum(ingreso, na.rm = T)
---
## Funciones estadísticas básicas (2)
Algunos análisis llevados a cabo principalmente para variables de tipo continuo u ordinales con múltiples categorías que se pueden llevar a cabo son los siguientes:
```{r, eval=FALSE}
ingreso <- c(800, 560, 1200, 600, 1800, 1500, 2700, 1900, 5000, 650, 1600)
summary(ingreso)
length(ingreso)
mean(ingreso)
median(ingreso)
sd(ingreso)
100 * sd(ingreso) / mean(ingreso)
ingreso > 1000
table(ingreso > 1000)
skewness(ingreso)
library(moments)
skewness(ingreso)
kurtosis(ingreso)
quantile(ingreso, c(0.25, 0.5, 0.75))
quantile(ingreso, 0.2)
fivenum(ingreso)
mean(ingreso, trim = 0.05) #Promedio recortado al 10% (Cinco y cinco)
```
Pueden existir datos faltantes
```{r, eval=FALSE}
ingreso <- c(800, 560, 1200, 600, 1800, 1500, NA, 1900, 5000, NA, 1600)
sum(ingreso)
sum(ingreso, na.rm = T)
```
Los vectores pueden ser de tipo numérico, entero, caracter o lógico, estos tipos no son suficiente para realizar un análisis estadísticos se requieren los FACTORES. Los factores permiten ahorrar espacio de almacenamiento.
#Primera forma: a los enteros ponerles etiquetas
a <- c(2, 1, 3, 1, 3, 2, 4, 1, 2, 4, 2, 1, 4)
b <- factor(a, level = c("Fútbol", "Basquet", "Ambos", "Ninguno")) #ERROR!!!!!!!
#Mejor así:
(b <- factor(a, label = c("Fútbol", "Basquet", "Ambos", "Ninguno")))
[1] Basquet Fútbol Ambos Fútbol Ambos Basquet Ninguno Fútbol
[9] Basquet Ninguno Basquet Fútbol Ninguno
Levels: Fútbol Basquet Ambos Ninguno
# Se especifican los niveles (5) y las etiquetas, el último es rubgy, (nadie lo especificó)
(c <- factor(a, levels = 1:5, label = c("Fútbol", "Basquet", "Ambos", "Ninguno", "Rugby")))
[1] Basquet Fútbol Ambos Fútbol Ambos Basquet Ninguno Fútbol
[9] Basquet Ninguno Basquet Fútbol Ninguno
Levels: Fútbol Basquet Ambos Ninguno Rugby
---
## Manejo de factores
Los vectores pueden ser de tipo numérico, entero, caracter o lógico, estos tipos no son suficiente para realizar un análisis estadísticos se requieren los FACTORES. Los factores permiten ahorrar espacio de almacenamiento.
* Permite etiquetar los valores enteros
* Permite manejar de forma amigable los vectores de tipo CARACTER que son ANALIZABLES ESTADÍSTICAMENTE.
```{r, echo = TRUE}
#Primera forma: a los enteros ponerles etiquetas
a <- c(2, 1, 3, 1, 3, 2, 4, 1, 2, 4, 2, 1, 4)
b <- factor(a, level = c("Fútbol", "Basquet", "Ambos", "Ninguno")) #ERROR!!!!!!!
#Mejor así:
(b <- factor(a, label = c("Fútbol", "Basquet", "Ambos", "Ninguno")))
```
```{r, echo=FALSE}
#Si hay mas niveles la siguiente linea dará error
#c <- factor(a, label = c("Fútbol", "Basquet", "Ambos", "Ninguno", "Rugby")) #ERROR!!!!!!!
```
```{r, echo = TRUE}
# Se especifican los niveles (5) y las etiquetas, el último es rubgy, (nadie lo especificó)
(c <- factor(a, levels = 1:5, label = c("Fútbol", "Basquet", "Ambos", "Ninguno", "Rugby")))
```
#Segunda forma: de caracteres a factores
x <- c("Fútbol", "Basquet", "Fútbol", "Ninguno", "Basquet", "Ambos", "Ambos",
"Ninguno", "Fútbol", "Fútbol", "Basquet", "Basquet", "Ambos", "Fútbol")
#Por defecto R asigna las etiquetas alfabéticamente en un factor
x1 <- factor(x)
table(x1)
x1
Ambos Basquet Fútbol Ninguno
3 4 5 2
#Escriba edit(x1) y observa como se almacenó
---
## Manejo de factores (2)
```{r, echo = TRUE}
#Segunda forma: de caracteres a factores
x <- c("Fútbol", "Basquet", "Fútbol", "Ninguno", "Basquet", "Ambos", "Ambos",
"Ninguno", "Fútbol", "Fútbol", "Basquet", "Basquet", "Ambos", "Fútbol")
#Por defecto R asigna las etiquetas alfabéticamente en un factor
x1 <- factor(x)
table(x1)
#Escriba edit(x1) y observa como se almacenó
```
#Segunda forma: de caracteres a factores
#Si quiero un orden en particular de etiquetas por ejemplo: "Fútbol", "Basquet","Ambos", "Ninguno"
y <- factor(x, levels = c("Fútbol", "Basquet","Ambos", "Ninguno" ))
table(y)
y
Fútbol Basquet Ambos Ninguno
5 4 3 2
#Puedo añadir categorías adicionales a las que son tomadas por los encuestados
y <- factor(x, levels = c("Fútbol", "Basquet","Ambos", "Ninguno", "Rugby"))
table(y)
y
Fútbol Basquet Ambos Ninguno Rugby
5 4 3 2 0
RETO: ordenar las etiquetas por el más frecuente, Ayuda: utilice la función order y table
#order(c(5, 2, 6, 1, 10, 3))
#t2 <- table(c("Bajo", "Alto", "Bajo", "Medio", "Alto", "Medio", "Medio", "Medio", "Alto", "Medio"))
#names(t2)
#order(t2, decreasing = T)
---
## Manejo de factores (3)
```{r, echo = TRUE}
#Segunda forma: de caracteres a factores
#Si quiero un orden en particular de etiquetas por ejemplo: "Fútbol", "Basquet","Ambos", "Ninguno"
y <- factor(x, levels = c("Fútbol", "Basquet","Ambos", "Ninguno" ))
table(y)
#Puedo añadir categorías adicionales a las que son tomadas por los encuestados
y <- factor(x, levels = c("Fútbol", "Basquet","Ambos", "Ninguno", "Rugby"))
table(y)
```
RETO: ordenar las etiquetas por el más frecuente, Ayuda: utilice la función order y table
```{r, echo = TRUE}
#order(c(5, 2, 6, 1, 10, 3))
#t2 <- table(c("Bajo", "Alto", "Bajo", "Medio", "Alto", "Medio", "Medio", "Medio", "Alto", "Medio"))
#names(t2)
#order(t2, decreasing = T)
```
#Etiquetar por la frecuencia de práctica en deporte (en orden descendente)
#Tabla de frecuencias relativas
(tabla <- table(x))
x
Ambos Basquet Fútbol Ninguno
3 4 5 2
#Posiciones que ocupa el mayor valor, el segundo,... el último
(posic <- order(tabla, decreasing = TRUE))
[1] 3 2 1 4
#La etiqueta del mayor, del segundo, ...
nomb_orden <- names(tabla[posic])
#Especifico los niveles
(z <- factor(x, levels = nomb_orden) )
[1] Fútbol Basquet Fútbol Ninguno Basquet Ambos Ambos Ninguno
[9] Fútbol Fútbol Basquet Basquet Ambos Fútbol
Levels: Fútbol Basquet Ambos Ninguno
# barplot(table(z))
---
## Solución:
```{r, echo = TRUE}
#Etiquetar por la frecuencia de práctica en deporte (en orden descendente)
#Tabla de frecuencias relativas
(tabla <- table(x))
#Posiciones que ocupa el mayor valor, el segundo,... el último
(posic <- order(tabla, decreasing = TRUE))
#La etiqueta del mayor, del segundo, ...
nomb_orden <- names(tabla[posic])
#Especifico los niveles
(z <- factor(x, levels = nomb_orden) )
# barplot(table(z))
```
Bidimensionales y homogéneos.
m1 <- matrix(c(25, 34, 56, 19, 17, 23, 3, 12, 35, 0, 0, 1), ncol = 2)
m1a <- matrix(c(25, 34, 56, 19, 17, 23, 3, 12, 35, 0, 0, 1), nrow = 6)
m1b <- matrix(c(25, 3, 34, 12, 56, 35, 19, 0, 17, 0, 23, 1), ncol = 2, byrow = T)
Su turno: complete la segunda matriz
---
## Matrices:
Bidimensionales y homogéneos.
* La matriz debe contener elementos de un mismo tipo (caracteres, o números).
* Es una estructura bidimensional (Filas y columnas)
* Se pueden nombrar tanto las filas como las columnas
* Se puede facilmente realizar operaciones (matemáticas) por filas o por columnas
<p>
<div align="left">
<img src = "matriz.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
<p>
<div align="left">
<img src = "ayuda_matriz.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
```{r, echo = TRUE}
m1 <- matrix(c(25, 34, 56, 19, 17, 23, 3, 12, 35, 0, 0, 1), ncol = 2)
m1a <- matrix(c(25, 34, 56, 19, 17, 23, 3, 12, 35, 0, 0, 1), nrow = 6)
m1b <- matrix(c(25, 3, 34, 12, 56, 35, 19, 0, 17, 0, 23, 1), ncol = 2, byrow = T)
```
Su turno: complete la segunda matriz
#Nombres por fila y por columna
rownames(m1) <- paste("Persona", 1:6, sep = "")
colnames(m1) <- c("edad", "exper_laboral")
#Dimensionalidad
dim(m1)
[1] 6 2
nrow(m1); ncol(m1)
[1] 6
[1] 2
#Clase y tipo
class(m1)
[1] "matrix"
typeof(m1)
[1] "double"
---
## Funciones y operaciones matriciales
```{r, echo = TRUE}
#Nombres por fila y por columna
rownames(m1) <- paste("Persona", 1:6, sep = "")
colnames(m1) <- c("edad", "exper_laboral")
#Dimensionalidad
dim(m1)
nrow(m1); ncol(m1)
#Clase y tipo
class(m1)
typeof(m1)
```
colSums(m1)
edad exper_laboral
174 51
rowSums(m1)
Persona1 Persona2 Persona3 Persona4 Persona5 Persona6
28 46 91 19 17 24
colMeans(m1)
edad exper_laboral
29.0 8.5
rowMeans(m1)
Persona1 Persona2 Persona3 Persona4 Persona5 Persona6
14.0 23.0 45.5 9.5 8.5 12.0
---
## Funciones y operaciones matriciales (2)
```{r, echo = TRUE}
colSums(m1)
rowSums(m1)
colMeans(m1)
rowMeans(m1)
```
Función para llevar a cabo funciones por fila o por columna:
?apply
apply(m1, 1, FUN = min)
Persona1 Persona2 Persona3 Persona4 Persona5 Persona6
3 12 35 0 0 1
apply(m1, 2, FUN = mean)
edad exper_laboral
29.0 8.5
apply(m1, 1, FUN = quantile, probs = 0.75)
Persona1 Persona2 Persona3 Persona4 Persona5 Persona6
19.50 28.50 50.75 14.25 12.75 17.50
---
## Uso de la función apply
Función para llevar a cabo funciones por fila o por columna:
```{r, echo = TRUE}
?apply
apply(m1, 1, FUN = min)
apply(m1, 2, FUN = mean)
apply(m1, 1, FUN = quantile, probs = 0.75)
```
A = matrix(c(2, 3, 5, 1), ncol = 2)
B = matrix(1:4, ncol = 2)
A + B
[,1] [,2]
[1,] 3 8
[2,] 5 5
#Multiplicacion elemento a elemento
A * B
[,1] [,2]
[1,] 2 15
[2,] 6 4
#Multiplicacion matricial
A %*% B
[,1] [,2]
[1,] 12 26
[2,] 5 13
---
## Operaciones matriciales
```{r, echo = TRUE}
A = matrix(c(2, 3, 5, 1), ncol = 2)
B = matrix(1:4, ncol = 2)
A + B
#Multiplicacion elemento a elemento
A * B
#Multiplicacion matricial
A %*% B
```
#Operaciones matriciales (2)
#Inversa de A
solve(A)
[,1] [,2]
[1,] -0.07692308 0.3846154
[2,] 0.23076923 -0.1538462
solve(A) %*% A
[,1] [,2]
[1,] 1 -5.551115e-17
[2,] 0 1.000000e+00
#Determinante
det(A)
[1] -13
#Valores y vectores propios
eigen(A)
$values
[1] 5.405125 -2.405125
$vectors
[,1] [,2]
[1,] 0.8265324 -0.7503320
[2,] 0.5628892 0.6610612
---
#Operaciones matriciales (2)
```{r, echo = TRUE}
#Inversa de A
solve(A)
solve(A) %*% A
#Determinante
det(A)
#Valores y vectores propios
eigen(A)
```
arreglo1 = array(c(459,34,76,5,12,150,17,46,4,7,50,12,8,3,4,
513,45,56,6,11,134,19,41,5,7,27,11,7,3,4),dim=c(5,3,2))
class(arreglo1)
[1] "array"
apply(arreglo1, c(1,2), sum)
[,1] [,2] [,3]
[1,] 972 284 77
[2,] 79 36 23
[3,] 132 87 15
[4,] 11 9 6
[5,] 23 14 8
---
## Arreglos
<p>
<div align="left">
<img src = "arreglos.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
```{r, echo = TRUE}
arreglo1 = array(c(459,34,76,5,12,150,17,46,4,7,50,12,8,3,4,
513,45,56,6,11,134,19,41,5,7,27,11,7,3,4),dim=c(5,3,2))
class(arreglo1)
apply(arreglo1, c(1,2), sum)
```
Se usará la librería readr y la función read_csv. Descargue estos archivos: GEIH y Pruebas Saber 2014
#setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
#Usar primero read.csv
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
library(readr)
saber2014_I <- read_csv2("saber2014I.csv")
rm(saber2014_I)
---
## Importando archivo csv
Se usará la librería readr y la función read_csv.
Descargue estos archivos:
<a href="https://www.dropbox.com/s/cabnpv00o8koj3f/Marzo_GEIH.zip?dl=0/">GEIH</a> y
<a href="https://www.dropbox.com/s/4jhxirpt7g1oll7/saber.zip?dl=0">Pruebas Saber 2014</a>
<p>
<div align="left">
<img src = "Tipos archivos.png" width = "400", height = "250"
alt = "Creadores de R" />
</div>
</p>
```{r, echo = TRUE}
#setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
#Usar primero read.csv
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
library(readr)
saber2014_I <- read_csv2("saber2014I.csv")
rm(saber2014_I)
```
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
saber_2014I <- read_csv2("saber2014I.csv",
col_types = list(
CODINST = col_character(),
NOMBREINSTITUCION = col_character(), CODIGOMUNICIPIO = col_character(),
NOMBREMUNICIPIO = col_character(), DEPARTAMENTO = col_character(),
CALENDARIO = col_character(), NATURALEZA = col_character(),
JORNADA = col_character(), PROMEDIOMATEMATICA = col_double(),
PROMEDIOQUIMICA = col_double(), PROMEDIOFISICA = col_double(),
PROMEDIOBIOLOGIA = col_double(), PROMEDIOFILOSOFIA = col_double(),
PROMEDIOINGLES = col_double(), PROMEDIOLENGUAJE = col_double(),
PROMEDIOSOCIALES = col_double(), DESVIACIONMATEMATICA = col_skip(),
DESVIACIONQUIMICA = col_skip(), DESVIACIONFISICA = col_skip(),
DESVIACIONBIOLOGIA = col_skip(), DESVIACIONFILOSOFIA = col_skip(),
DESVIACIONINGLES = col_skip(), DESVIACIONLENGUAJE = col_skip(),
DESVIACIONSOCIALES = col_skip(), EVALUADOS = col_double(),
PERIODO = col_character() ))
Warning: 6872 problems parsing 'saber2014I.csv'. See problems(...) for
more details.
---
## Importando archivo csv (2)
```{r, echo = TRUE, warnings=FALSE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
saber_2014I <- read_csv2("saber2014I.csv",
col_types = list(
CODINST = col_character(),
NOMBREINSTITUCION = col_character(), CODIGOMUNICIPIO = col_character(),
NOMBREMUNICIPIO = col_character(), DEPARTAMENTO = col_character(),
CALENDARIO = col_character(), NATURALEZA = col_character(),
JORNADA = col_character(), PROMEDIOMATEMATICA = col_double(),
PROMEDIOQUIMICA = col_double(), PROMEDIOFISICA = col_double(),
PROMEDIOBIOLOGIA = col_double(), PROMEDIOFILOSOFIA = col_double(),
PROMEDIOINGLES = col_double(), PROMEDIOLENGUAJE = col_double(),
PROMEDIOSOCIALES = col_double(), DESVIACIONMATEMATICA = col_skip(),
DESVIACIONQUIMICA = col_skip(), DESVIACIONFISICA = col_skip(),
DESVIACIONBIOLOGIA = col_skip(), DESVIACIONFILOSOFIA = col_skip(),
DESVIACIONINGLES = col_skip(), DESVIACIONLENGUAJE = col_skip(),
DESVIACIONSOCIALES = col_skip(), EVALUADOS = col_double(),
PERIODO = col_character() ))
```
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
library(readxl)
saber2014I <- read_excel("saber2014I.xlsx")
#str(saber2014I)
rm(saber2014I)
saber2014I <- read_excel("saber2014I.xls")
DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 01 00 5b 03 00 00 19 00
DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 01 00 5b 03 00 00 19 00
DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 01 00 5b 03 00 00 19 00
DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 01 00 5b 03 00 00 19 00
#str(saber2014I)
?read_excel
Importe los colegios que presentaron las pruebas en el segundo trimestre
---
## Importando archivos excel
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/saber")
library(readxl)
saber2014I <- read_excel("saber2014I.xlsx")
#str(saber2014I)
rm(saber2014I)
saber2014I <- read_excel("saber2014I.xls")
#str(saber2014I)
?read_excel
```
Importe los colegios que presentaron las pruebas en el segundo trimestre
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/Cabecera")
Ocupados_GEIH <- read_spss("Cabecera - Ocupados.sav")
#Veamos que quedan las etiqutas, aunque mal codificadas (tanto en MAC con en Windows):
#edit(Ocupados_GEIH$Area)
attributes((Ocupados_GEIH$Area))
$label
[1] "Area"
$class
[1] "labelled"
$labels
Antioquia Atl\xe1ntico Bogot\xe1, d.C.
"05" "08" "11"
Bol\xedvar Boyac\xe1 Caldas
"13" "15" "17"
Caquet\xe1 Cauca C\xe9sar
"18" "19" "20"
C\xf3rdoba Choc\xf3 Huila
"23" "27" "41"
La guajira Magdalena Meta
"44" "47" "50"
Nari\xf1o Norte de santander Quind\xedo
"52" "54" "63"
Risaralda Santander Sucre
"66" "68" "70"
Tolima Valle del cauca
"73" "76"
attributes((Ocupados_GEIH$Area))$labels
Antioquia Atl\xe1ntico Bogot\xe1, d.C.
"05" "08" "11"
Bol\xedvar Boyac\xe1 Caldas
"13" "15" "17"
Caquet\xe1 Cauca C\xe9sar
"18" "19" "20"
C\xf3rdoba Choc\xf3 Huila
"23" "27" "41"
La guajira Magdalena Meta
"44" "47" "50"
Nari\xf1o Norte de santander Quind\xedo
"52" "54" "63"
Risaralda Santander Sucre
"66" "68" "70"
Tolima Valle del cauca
"73" "76"
Los atributos contiene los metadatos: etiqueta de variable y etiqueta de valor.
---
## Importando archivos de spss
```{r, echo = TRUE}
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/Cabecera")
Ocupados_GEIH <- read_spss("Cabecera - Ocupados.sav")
#Veamos que quedan las etiqutas, aunque mal codificadas (tanto en MAC con en Windows):
#edit(Ocupados_GEIH$Area)
attributes((Ocupados_GEIH$Area))
attributes((Ocupados_GEIH$Area))$labels
```
Los atributos contiene los metadatos: etiqueta de variable y etiqueta de valor.
Estos atributos los convierto facilmente a factor,por otro lado los problemas de codificación se resuelven muy fácilmente:
Ocupados_GEIH$Area <- as_factor(Ocupados_GEIH$Area)
head(Ocupados_GEIH$Area)
[1] Huila Caquet\xe1 Caquet\xe1 Caquet\xe1 Magdalena Magdalena
23 Levels: Antioquia Atl\xe1ntico Bogot\xe1, d.C. Bol\xedvar ... Valle del cauca
Encoding(levels(Ocupados_GEIH$Area)) <- "latin1"
table(Ocupados_GEIH$Area)
Antioquia Atlántico Bogotá, d.C.
1586 1441 1553
Bolívar Boyacá Caldas
1063 836 974
Caquetá Cauca César
776 993 1053
Córdoba Chocó Huila
971 695 977
La guajira Magdalena Meta
917 1108 972
Nariño Norte de santander Quindío
973 809 911
Risaralda Santander Sucre
982 1076 1184
Tolima Valle del cauca
887 1128
#edit(Ocupados_GEIH$Area)
Ocupados_GEIH$P7240 <- as_factor(Ocupados_GEIH$P7240)
Encoding(levels(Ocupados_GEIH$P7240)) <- "latin1"
table(Ocupados_GEIH$Area, Ocupados_GEIH$P7240)
Cesantías? Ahorros personales?
Antioquia 210 241
Atlántico 216 38
Bogotá, d.C. 167 228
Bolívar 103 73
Boyacá 138 152
Caldas 102 97
Caquetá 20 50
Cauca 26 196
César 64 144
Córdoba 156 96
Chocó 38 23
Huila 40 135
La guajira 15 56
Magdalena 22 33
Meta 38 200
Nariño 51 115
Norte de santander 47 63
Quindío 42 91
Risaralda 83 60
Santander 51 105
Sucre 33 93
Tolima 53 90
Valle del cauca 103 134
Ayudas de hijos o familiares?
Antioquia 670
Atlántico 609
Bogotá, d.C. 609
Bolívar 417
Boyacá 340
Caldas 343
Caquetá 483
Cauca 319
César 639
Córdoba 655
Chocó 540
Huila 449
La guajira 532
Magdalena 814
Meta 498
Nariño 404
Norte de santander 480
Quindío 383
Risaralda 546
Santander 495
Sucre 819
Tolima 472
Valle del cauca 496
Indemnización o similar? No lo ha considerado?
Antioquia 20 90
Atlántico 0 308
Bogotá, d.C. 8 196
Bolívar 10 203
Boyacá 1 95
Caldas 5 140
Caquetá 3 100
Cauca 4 361
César 2 65
Córdoba 1 30
Chocó 1 5
Huila 4 159
La guajira 0 218
Magdalena 2 72
Meta 2 120
Nariño 4 113
Norte de santander 1 50
Quindío 1 61
Risaralda 1 83
Santander 4 144
Sucre 0 140
Tolima 10 85
Valle del cauca 32 83
Vendería su vivienda o bienes del hogar?
Antioquia 8
Atlántico 1
Bogotá, d.C. 13
Bolívar 1
Boyacá 5
Caldas 5
Caquetá 4
Cauca 3
César 0
Córdoba 0
Chocó 0
Huila 6
La guajira 0
Magdalena 0
Meta 1
Nariño 6
Norte de santander 0
Quindío 3
Risaralda 4
Santander 1
Sucre 1
Tolima 4
Valle del cauca 5
Empeñaría bienes del hogar? No tendría recursos?
Antioquia 6 265
Atlántico 0 169
Bogotá, d.C. 1 209
Bolívar 0 233
Boyacá 3 59
Caldas 1 226
Caquetá 6 74
Cauca 1 67
César 1 113
Córdoba 0 28
Chocó 0 67
Huila 3 134
La guajira 1 47
Magdalena 2 109
Meta 0 81
Nariño 3 177
Norte de santander 2 100
Quindío 2 292
Risaralda 3 173
Santander 1 187
Sucre 1 74
Tolima 1 118
Valle del cauca 11 183
Solicitaría dinero prestado? Otros,
Antioquia 34 42
Atlántico 44 56
Bogotá, d.C. 62 60
Bolívar 14 9
Boyacá 21 22
Caldas 9 46
Caquetá 27 9
Cauca 12 4
César 22 3
Córdoba 3 2
Chocó 15 6
Huila 14 33
La guajira 17 31
Magdalena 39 15
Meta 21 11
Nariño 68 32
Norte de santander 61 5
Quindío 15 21
Risaralda 17 12
Santander 60 28
Sucre 18 5
Tolima 27 27
Valle del cauca 44 37
#Corra lo siguiente y verifique que quedaron bien las etiqutas: #edit(Ocupados_GEIH$Area)
table(Ocupados_GEIH$Area)
Antioquia Atlántico Bogotá, d.C.
1586 1441 1553
Bolívar Boyacá Caldas
1063 836 974
Caquetá Cauca César
776 993 1053
Córdoba Chocó Huila
971 695 977
La guajira Magdalena Meta
917 1108 972
Nariño Norte de santander Quindío
973 809 911
Risaralda Santander Sucre
982 1076 1184
Tolima Valle del cauca
887 1128
names(Ocupados_GEIH)
[1] "Directorio" "Secuencia_p" "Orden" "Hogar" "Regis"
[6] "Clase" "P6440" "P6450" "P6460" "P6460s1"
[11] "P6400" "P6422" "P6424s2" "P6424s3" "P6424s1"
[16] "P6426" "P6430s1" "P6480" "P6480s1" "P6500"
[21] "P6510" "P6510s1" "P6510s2" "P6590" "P6590s1"
[26] "P6600" "P6600s1" "P6610" "P6610s1" "P6620"
[31] "P6620s1" "P6585s2a1" "P6585s3a1" "P6585s4a1" "P6585s3a2"
[36] "P6585s2a2" "P6585s1a2" "P6585s2" "P6585s3" "P6585s1a1"
[41] "P6585s4" "P6585s1" "P6580" "P6580s1" "P6580s2"
[46] "P6630s3" "P6630s4a1" "P6630s3a1" "P6630s2a1" "P6630s1a1"
[51] "P6630s4" "P6630s2" "P6630s1" "P6640" "P6765"
[56] "P6765s1" "P6772" "P6750" "P6760" "P550"
[61] "P6780" "P6780s1" "P6790" "P6410" "P6640s1"
[66] "P9440" "P6630s6" "P6630s6a1" "P6410s1" "P6545s1"
[71] "P6545" "P6545s2" "P6585s4a2" "P6773s1" "P6775"
[76] "P6772s1" "P388" "P6800" "P6810" "P6810s1"
[81] "P6850" "P6830" "P6830s1" "P6870" "P6880"
[86] "P6880s1" "P6920" "P6930" "P6940" "P6960"
[91] "P6980" "P6980s1" "P6980s2" "P6980s3" "P6980s4"
[96] "P6980s5" "P6980s6" "P6980s7" "P6980s8" "P6980s7a1"
[101] "P6990" "P7020" "P7026" "P7028" "P7028s1"
[106] "P7040" "P7045" "P7050" "P7050s1" "P7070"
[111] "P760" "P9450" "P6915s1" "P6915" "P7075"
[116] "P7077" "P390" "P7090" "P7100" "P7110"
[121] "P7120" "P7130" "P7140" "P7140s1" "P7140s2"
[126] "P7140s3" "P7140s4" "P7140s5" "P7140s6" "P7140s7"
[131] "P7140s8" "P7140s9" "P7140s9a1" "P7150" "P7160"
[136] "P7170s1" "P7170s5" "P7170s6" "P7180" "P7240"
[141] "P7240s1" "P514" "P515" "Oficio" "Rama2d"
[146] "Oci" "P6430" "Rama4d" "Rama4dp8" "Rama2dp8"
[151] "Inglabo" "Mes" "Dpto" "Fex_c_2011" "Area"
---
## Importando archivos de spss (2)
Estos atributos los convierto facilmente a factor,por otro lado los problemas de codificación se resuelven muy fácilmente:
```{r, echo = TRUE}
Ocupados_GEIH$Area <- as_factor(Ocupados_GEIH$Area)
head(Ocupados_GEIH$Area)
Encoding(levels(Ocupados_GEIH$Area)) <- "latin1"
table(Ocupados_GEIH$Area)
#edit(Ocupados_GEIH$Area)
Ocupados_GEIH$P7240 <- as_factor(Ocupados_GEIH$P7240)
Encoding(levels(Ocupados_GEIH$P7240)) <- "latin1"
table(Ocupados_GEIH$Area, Ocupados_GEIH$P7240)
#Corra lo siguiente y verifique que quedaron bien las etiqutas: #edit(Ocupados_GEIH$Area)
table(Ocupados_GEIH$Area)
names(Ocupados_GEIH)
```
Descargar la carpeta bases en SAS_Stata:Archivos_SAS y Stata
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Ejemplos en SAS_Stata")
demoadv <- read_sas("demoadv.sas7bdat")
# Observe la estructura de la base de datos str(prueba)
geodata <- read_dta("geodata.dta" )
#Exportación de archivos stata
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/Cabecera")
write_dta(mtcars, "mtcars.dta")
#Librería foreign
library(foreign)
write.dta(mtcars, "mtcars.dta")
#Exportación de archivos spss
write_sav(mtcars, "mtcars.sav")
---
## Importación y exportación archivos de spss y stata
Descargar la carpeta bases en SAS_Stata:<a href="https://www.dropbox.com/sh/9ix0py05frmzb50/AABGXHyLcT7ORDUYzCgznZ7Ba?dl=0/">Archivos_SAS y Stata</a>
```{r, echo = TRUE}
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Ejemplos en SAS_Stata")
demoadv <- read_sas("demoadv.sas7bdat")
# Observe la estructura de la base de datos str(prueba)
geodata <- read_dta("geodata.dta" )
#Exportación de archivos stata
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/Cabecera")
write_dta(mtcars, "mtcars.dta")
#Librería foreign
library(foreign)
write.dta(mtcars, "mtcars.dta")
#Exportación de archivos spss
write_sav(mtcars, "mtcars.sav")
```
Si se tienen etiquetas de valor en un archivo de stata (como se muestra en el siguiente archivo construido con las siguientes sentencias de stata). El archivo se denomina "autolab2.dta" y se encuentra en el siguiente link: Archivos_SAS y Stata
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Ejemplos en SAS_Stata")
autolab <- read_dta("autolab2.dta")
attributes(autolab$foreign)
$label
[1] "the origin of the car, foreign or domestic"
$class
[1] "labelled"
$labels
domestic car foreign car
0 1
---
## Si hay etiquetas en STATA
Si se tienen etiquetas de valor en un archivo de stata (como se muestra en el siguiente archivo construido con las siguientes sentencias de stata). El archivo se denomina "autolab2.dta" y se encuentra en el siguiente link:
<a href="https://www.dropbox.com/sh/9ix0py05frmzb50/AABGXHyLcT7ORDUYzCgznZ7Ba?dl=0/">Archivos_SAS y Stata</a>
<p>
<div align="left">
<img src = "Etiquetas_stata.png" width = "400", height = "400"
alt = "Etiquetas en stata" />
</div>
</p>
```{r, echo = TRUE}
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Ejemplos en SAS_Stata")
autolab <- read_dta("autolab2.dta")
attributes(autolab$foreign)
```
matriz <- matrix(c(1:25), ncol = 5)
a <- c(3,5,6, 7)
datos <- mtcars
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
save(matriz, a, datos, file = "ejemplo.RData")
rm(matriz); rm(a); rm(datos)
# Como leer un fichero
load("ejemplo.RData")
---
## El fichero de base de datos de R
* Comprime muchísimo
* Permite guardar muchos objetos (y de diferentes clases) en un sólo fichero
<p>
<div align="left">
<img src = "rdata.png" width = "600", height = "600"
alt = "Formatos de Fecha" />
</div>
</p>
```{r, echo = TRUE}
matriz <- matrix(c(1:25), ncol = 5)
a <- c(3,5,6, 7)
datos <- mtcars
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
save(matriz, a, datos, file = "ejemplo.RData")
rm(matriz); rm(a); rm(datos)
# Como leer un fichero
load("ejemplo.RData")
```
Fechas <- c("01/05/1965", "08/16/1975", "08/24/2015", "08/25/2015")
Fechas <- as.Date(Fechas, "%m/%d/%Y")
class(Fechas)
[1] "Date"
#edit(Fechas)
Fechas2 <- c("15-07-1985", "01-01-1970", "01-12-2015", "10-02-1990")
Fechas2 <- as.Date(Fechas2, "%d-%m-%Y")
#edit(Fechas2)
Fechas2[2] - Fechas2[1]
Time difference of -5674 days
a <- as.numeric(Sys.Date() - Fechas2[1] )
---
## Manejo de fechas
<p>
<div align="left">
<img src = "fechas.png" width = "600", height = "600"
alt = "Formatos de Fecha" />
</div>
</p>
```{r, echo = TRUE}
Fechas <- c("01/05/1965", "08/16/1975", "08/24/2015", "08/25/2015")
Fechas <- as.Date(Fechas, "%m/%d/%Y")
class(Fechas)
#edit(Fechas)
Fechas2 <- c("15-07-1985", "01-01-1970", "01-12-2015", "10-02-1990")
Fechas2 <- as.Date(Fechas2, "%d-%m-%Y")
#edit(Fechas2)
Fechas2[2] - Fechas2[1]
a <- as.numeric(Sys.Date() - Fechas2[1] )
```
a <- c("Sun May 27", "Thu Jul 07")
a <- as.Date(a, "%a %b %d")
b <- c("Sun Jun 01 2014", "Thu Oct 02 2014 ")
b <- as.Date(a, "%a %b %d %Y")
c <- c("June 01 2014", "October 02 2014 ")
c <- as.Date(a, "%B %d %Y")
#Fechas en español
#Configuración regional de idioma
localizacion_original<-Sys.getlocale(category = "LC_TIME")
#Cambiarlo a español
Sys.setlocale(category = "LC_TIME", locale = "es_ES.UTF-8")
[1] "es_ES.UTF-8"
fechas <- c("24-feb-15","26-ene-15","29-dic-14")
fechas <- as.Date(strptime(fechas,format="%d-%b-%y"))
#Recobrarlo a la configuración original (inglés)
Sys.setlocale(category = "LC_TIME", locale = localizacion_original)
[1] "en_US.UTF-8"
---
## Manejo de fechas (2)
```{r, echo = TRUE}
a <- c("Sun May 27", "Thu Jul 07")
a <- as.Date(a, "%a %b %d")
b <- c("Sun Jun 01 2014", "Thu Oct 02 2014 ")
b <- as.Date(a, "%a %b %d %Y")
c <- c("June 01 2014", "October 02 2014 ")
c <- as.Date(a, "%B %d %Y")
#Fechas en español
#Configuración regional de idioma
localizacion_original<-Sys.getlocale(category = "LC_TIME")
#Cambiarlo a español
Sys.setlocale(category = "LC_TIME", locale = "es_ES.UTF-8")
fechas <- c("24-feb-15","26-ene-15","29-dic-14")
fechas <- as.Date(strptime(fechas,format="%d-%b-%y"))
#Recobrarlo a la configuración original (inglés)
Sys.setlocale(category = "LC_TIME", locale = localizacion_original)
```
---
## Operaciones usuales
1. Filtros
2. Agregaciones
3. Pegado de bases de datos (merge/joins y append)
4. Reestructuración
<p>
<div align="left">
<img src = "Operaciones_manejoBD.png" width = "500", height = "500"
alt = "Formatos de Fecha" />
</div>
</p>
a <- c(11, 12, 13, 14, 15, 16, 17, 18)
a <- 11:18
# Con números enteros positivos selecciono valores
a[c(3, 6)]
[1] 13 16
# Con números enteros negativos quito valores
a[c(-3, -6)]
[1] 11 12 14 15 17 18
a[-c(3, 6)]
[1] 11 12 14 15 17 18
# No se pueden mezclar enteros positivos con negativos
#a[c(-3, 6)]
# Con vectores lógicos también puedo hacer lo mismo pero se debe especificar uno a uno
a[c(F, F, T, F, F, T, F, F )]
[1] 13 16
#También funcionan las condiciones lógicas
indices <- 1:8
a[indices == 3 | indices == 6 ]
[1] 13 16
--- -
## Como funcionan los filtros
```{r, echo = TRUE}
a <- c(11, 12, 13, 14, 15, 16, 17, 18)
a <- 11:18
# Con números enteros positivos selecciono valores
a[c(3, 6)]
# Con números enteros negativos quito valores
a[c(-3, -6)]
a[-c(3, 6)]
# No se pueden mezclar enteros positivos con negativos
#a[c(-3, 6)]
# Con vectores lógicos también puedo hacer lo mismo pero se debe especificar uno a uno
a[c(F, F, T, F, F, T, F, F )]
#También funcionan las condiciones lógicas
indices <- 1:8
a[indices == 3 | indices == 6 ]
```
En muchas ocasiones solamente se quiere trabajar con una parte de la base de datos. Condiciones lógicas:
---
## Filtros
En muchas ocasiones solamente se quiere trabajar con una parte de la base de datos. Condiciones lógicas:
<p>
<div align="left">
<img src = "operadoreslogicos.png" width = "400", height = "400"
alt = "Formatos de Fecha" />
</div>
</p>
* Seleccionar los colegios de Bogotá de 2014 II
* Seleccionar los colegios que son menos de 11 estudiantes o de más de 30 estudiantes
* Seleccionar los colegios que son públicos y que son de Bogotá de 2014 II
* Seleccionar los colegios de Bogotá, Valle y Antioquía de 2014 II.
* Seleccionar los colegios que nos son de la jornada de la mañana
* Seleccionar los colegios que son de Bogotá, Medellín y Cali y que son de más de 20 estudiantes
* Colocar los colegios que están en el último decil de matemáticas y que tiene entre 20 y cincuenta estudiantes.
Abrir el siguiente archivo:
https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0.
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") #Proceda a usar names y table para saber a quien filtrar
# names(table(saber_2014II$NOMBREMUNICIPIO))
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C.") #O jos con el doble igual
# dim(Bogota)
Bogota2 <- saber_2014II[saber_2014II$NOMBREMUNICIPIO == "BOGOTÁ D.C.", ] #En caso de existir faltantes en NOMBREMUNICIPIO también los filtro
library(dplyr) # Paquete de Hadley Wickham
Bogota3 <- filter(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C.")
#identical(Bogota, Bogota2)
rm(Bogota, Bogota2, Bogota3)
consulta0 <- subset(saber_2014II, EVALUADOS <= 10 & EVALUADOS > 30)
---
## Solución de los filtros (1)
Abrir el siguiente archivo:
<a href="https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0">https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0</a>.
* Seleccionar los colegios de Bogotá de 2014 II
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") #Proceda a usar names y table para saber a quien filtrar
# names(table(saber_2014II$NOMBREMUNICIPIO))
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C.") #O jos con el doble igual
# dim(Bogota)
```
```{r, echo = TRUE}
Bogota2 <- saber_2014II[saber_2014II$NOMBREMUNICIPIO == "BOGOTÁ D.C.", ] #En caso de existir faltantes en NOMBREMUNICIPIO también los filtro
library(dplyr) # Paquete de Hadley Wickham
Bogota3 <- filter(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C.")
#identical(Bogota, Bogota2)
rm(Bogota, Bogota2, Bogota3)
```
* Seleccionar los colegios que son menos de 11 estudiantes o de más de 30 estudiantes
```{r, echo = TRUE}
consulta0 <- subset(saber_2014II, EVALUADOS <= 10 & EVALUADOS > 30)
```
Para filtrar cuando se satisfacen dos condiciones se usa el operador &:
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == 1 )
# dim(Bogota)
saber_2014II$NATURALEZA <- as_factor(saber_2014II$NATURALEZA)
# table(saber_2014II$NATURALEZA)
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == 1)
# No funciona en un factor
# dim(Bogota)
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == "Oficial")
#dim(Bogota)
# Hacerlo con [] y filter.
rm(Bogota)
# ls()
# names(saber_2014II)
# table(saber_2014II$DEPARTAMENTO)
# Muy importante el operador %in%
consulta <- subset(saber_2014II, DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA"))
---
## Solución de los filtros (2)
Para filtrar cuando se satisfacen dos condiciones se usa el operador &:
* Seleccionar los colegios que son públicos y que son de Bogotá de 2014 II
```{r, echo = TRUE}
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == 1 )
# dim(Bogota)
saber_2014II$NATURALEZA <- as_factor(saber_2014II$NATURALEZA)
# table(saber_2014II$NATURALEZA)
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == 1)
# No funciona en un factor
# dim(Bogota)
Bogota <- subset(saber_2014II, NOMBREMUNICIPIO == "BOGOTÁ D.C." & NATURALEZA == "Oficial")
#dim(Bogota)
# Hacerlo con [] y filter.
rm(Bogota)
```
* Seleccionar los colegios de Bogotá, Valle y Antioquía de 2014 II.
```{r, echo = TRUE}
# ls()
# names(saber_2014II)
# table(saber_2014II$DEPARTAMENTO)
# Muy importante el operador %in%
consulta <- subset(saber_2014II, DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA"))
```
saber_2014II$JORNADA = as_factor(saber_2014II$JORNADA)
#table(saber_2014II$JORNADA)
library(dplyr)
consulta2 <- filter(saber_2014II, JORNADA != "Mañana")
saber_2014II$JORNADA = as_factor(saber_2014II$JORNADA)
#table(saber_2014II$JORNADA)
consulta3 <- subset(saber_2014II, DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA") & EVALUADOS > 20)
filtro <- saber_2014II$DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA") & saber_2014II$EVALUADOS > 20
consulta3 <- saber_2014II[filtro , ]
deciles_mat = quantile(saber_2014II$PROMMATEMATICA , seq(0, 1, by = 0.2))
filtro2 <- saber_2014II$PROMMATEMATICA > as.numeric(deciles_mat[5]) & saber_2014II$EVALUADOS <= 50 &
saber_2014II$EVALUADOS >= 20
consulta3 <- saber_2014II[filtro, ]
---
## Solución de los filtros (3)
* Seleccionar los colegios que nos son de la jornada de la mañana
```{r, echo = TRUE}
saber_2014II$JORNADA = as_factor(saber_2014II$JORNADA)
#table(saber_2014II$JORNADA)
library(dplyr)
consulta2 <- filter(saber_2014II, JORNADA != "Mañana")
```
* Seleccionar los colegios que son de Bogotá, Medellín y Cali y que son de más de 20 estudiantes
```{r, echo = TRUE}
saber_2014II$JORNADA = as_factor(saber_2014II$JORNADA)
#table(saber_2014II$JORNADA)
consulta3 <- subset(saber_2014II, DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA") & EVALUADOS > 20)
filtro <- saber_2014II$DEPARTAMENTO %in% c("ANTIOQUIA", "VALLE", "BOGOTA") & saber_2014II$EVALUADOS > 20
consulta3 <- saber_2014II[filtro , ]
```
* Colocar los colegios que están en el último decil de matemáticas y que tiene entre 20 y cincuenta estudiantes.
```{r, echo = TRUE}
deciles_mat = quantile(saber_2014II$PROMMATEMATICA , seq(0, 1, by = 0.2))
filtro2 <- saber_2014II$PROMMATEMATICA > as.numeric(deciles_mat[5]) & saber_2014II$EVALUADOS <= 50 &
saber_2014II$EVALUADOS >= 20
consulta3 <- saber_2014II[filtro, ]
```
---
## Agregaciones
<p>
<div align="left">
<img src = "Tablasdinamicas.png" width = "300", height = "300"
alt = "Agregaciones" />
</div>
</p>
* En diversos análisis estadísticos se requiere realizar estadísticas resumen (promedios, conteos, medianas, percentiles) por diferentes categorías (por departamento, por ciudad).
* En excel las agregaciones se denominan tablas pivotes o tablas dinámicas en SAS son las estadísticas resumenes que se sacan en un proc means utilizando la clausula by, en stata igualmente se utiliza la sentencia by en diferentes procedimientos, en SPSS es la función aggregate o tabmién las tablas personalizadas, en sql corresponde al group by.
* La información desagregada es facilmente resumida en gráficos (diagramas de barras), boxplot, histogramas.
* En R se disponen de muchísimsa opciones para calcular información desagregada: dplyr, aggregate, tapply, sql, entre muchos otros paquetes.
* Por ahora aprenderemos a realizar estadísticas resumenes sin factores de expansión, es decir asumiremos que disponemos de un censo, o un registro adminsitrativo.
* Se puede extraer información desagregada incorporando factores de expansión.
Abrir el siguiente archivo:
https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0. Promedio de matemáticas a nivel nacional
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") #Proceda a usar names y table para saber a quien filtrar
#names(saber_2014II)
#mean(saber_2014II$PROMMATEMATICA)
library(dplyr)
summarize(saber_2014II, prom_matematicas = mean(PROMMATEMATICA))
Source: local data frame [1 x 1]
prom_matematicas
1 48.89412
---
## dplyr
<p>
<div align="left">
<img src = "summarize.png" width = "300", height = "300"
alt = "Agregaciones" />
</div>
</p>
Abrir el siguiente archivo:
<a href="https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0">https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0</a>.
Promedio de matemáticas a nivel nacional
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") #Proceda a usar names y table para saber a quien filtrar
#names(saber_2014II)
#mean(saber_2014II$PROMMATEMATICA)
library(dplyr)
summarize(saber_2014II, prom_matematicas = mean(PROMMATEMATICA))
```
Promedio matemáticas a nivel departamento
summarise(group_by(var1, var2, ...), estad1, estad2 .... )
por_dpto <- group_by(saber_2014II, DEPARTAMENTO)
summarise(por_dpto, prom_matematicas = mean(PROMMATEMATICA))
Source: local data frame [33 x 2]
DEPARTAMENTO prom_matematicas
1 AMAZONAS 44.65611
2 ANTIOQUIA 48.94047
3 ARAUCA 48.97225
4 ATLANTICO 48.49026
5 BOGOTA 53.09767
6 BOLIVAR 46.82116
7 BOYACA 50.35568
8 CALDAS 48.03798
9 CAQUETA 46.85667
10 CASANARE 48.66729
.. ... ...
resumen <- summarise(por_dpto, prom_matematicas = mean(PROMMATEMATICA))
---
## Más dplyr...
Promedio matemáticas a nivel departamento
#
<div class="alert alert-info">
<p>
<strong>summarise(group_by(var1, var2, ...), estad1, estad2 .... )</strong>
</p>
</div>
```{r, echo = TRUE}
por_dpto <- group_by(saber_2014II, DEPARTAMENTO)
summarise(por_dpto, prom_matematicas = mean(PROMMATEMATICA))
resumen <- summarise(por_dpto, prom_matematicas = mean(PROMMATEMATICA))
```
Más desagregaciones: conteos, medianas, percentiles y desviaciones estándar a nivel departamental
resumen2 <- summarise(por_dpto, num_colegios = n(), prom_mat = mean(PROMMATEMATICA), min_mat = min(PROMMATEMATICA), p25_mat = quantile(PROMMATEMATICA, 0.25), mediana_mat = median(PROMMATEMATICA), p75_mat = quantile(PROMMATEMATICA, 0.75), max_mat = max(PROMMATEMATICA))
Source: local data frame [33 x 8]
DEPARTAMENTO num_colegios prom_mat min_mat p25_mat mediana_mat p75_mat
1 AMAZONAS 18 803.81 39.39 41.7400 43.855 46.1150
2 ANTIOQUIA 1383 67684.67 34.00 44.7850 48.160 51.7100
3 ARAUCA 71 3477.03 34.17 44.7900 48.520 51.9250
4 ATLANTICO 574 27833.41 36.33 44.5225 47.960 51.3475
5 BOGOTA 1448 76885.43 35.67 49.4675 52.075 55.7900
6 BOLIVAR 545 25517.53 33.75 42.8400 45.780 48.6400
7 BOYACA 437 22005.43 30.50 47.1700 50.030 52.8400
8 CALDAS 302 14507.47 38.20 44.8300 47.390 50.4250
9 CAQUETA 123 5763.37 34.00 43.6200 46.360 48.9100
10 CASANARE 140 6813.42 32.43 45.1850 48.135 51.3150
.. ... ... ... ... ... ... ...
Variables not shown: max_mat (dbl)
resumen3 <- summarise(por_dpto, num_colegios = n(), cor_inglesmat = cor(PROMINGLES, PROMMATEMATICA))
---
## Más dplyr (2) ...
Más desagregaciones: conteos, medianas, percentiles y desviaciones estándar a nivel departamental
<p>
<font size="3" color="blue"> resumen2 <- summarise(por_dpto, num_colegios = n(), prom_mat = mean(PROMMATEMATICA), min_mat = min(PROMMATEMATICA), p25_mat = quantile(PROMMATEMATICA, 0.25), mediana_mat = median(PROMMATEMATICA), p75_mat = quantile(PROMMATEMATICA, 0.75), max_mat = max(PROMMATEMATICA))
</font>
</p>
```{r, echo = FALSE}
resumen2 <- summarise(por_dpto, num_colegios = n(), prom_mat = sum(PROMMATEMATICA), min_mat = min(PROMMATEMATICA), p25_mat = quantile(PROMMATEMATICA, 0.25), mediana_mat = median(PROMMATEMATICA), p75_mat = quantile(PROMMATEMATICA, 0.75), max_mat = max(PROMMATEMATICA))
resumen2
```
<p>
<font size="3" color="blue"> resumen3 <- summarise(por_dpto, num_colegios = n(), cor_inglesmat = cor(PROMINGLES, PROMMATEMATICA))
</font>
</p>
```{r, echo = FALSE}
resumen3 <- summarise(por_dpto, num_colegios = n(), cor_inglesmat = cor(PROMINGLES, PROMMATEMATICA))
```
* Calcule el promedio de las diferentes asignaturas
* Calcule la correlación entre el número de evaluados y el promedio en matemáticos
resumen4 <- summarise(group_by(saber_2014II,NOMBREMUNICIPIO), num_colegios = n(), prom_mat = mean(PROMMATEMATICA))
resumen4 <- arrange(resumen4, prom_mat)
#resumen4
resumen4 <- arrange(resumen4, desc(prom_mat))
resumen4
Source: local data frame [1,022 x 3]
NOMBREMUNICIPIO num_colegios prom_mat
1 COTA 13 58.90231
2 TENJO 15 57.42467
3 SABANETA 18 57.16500
4 LA ESTRELLA 16 56.95562
5 PAIPA 13 56.38462
6 RETIRO 8 55.90875
7 SANTA ROSA DE VITERBO 5 55.86200
8 TUNJA 33 55.62273
9 NOBSA 4 55.59750
10 PARAMO 1 55.46000
.. ... ... ...
---
## Como ordenar los resultados...
* Cuantos personas presentaron la prueba en cada uno de los municipios
* Tiene mejor rendimiento promedio y mediano (en matemáticas) los colegios de jornada diurna?, los de jornada de la tarde?...
* ¿Cuál es el departamento con mejor rendimiento en matemáticas?
```{r, echo = TRUE}
resumen4 <- summarise(group_by(saber_2014II,NOMBREMUNICIPIO), num_colegios = n(), prom_mat = mean(PROMMATEMATICA))
resumen4 <- arrange(resumen4, prom_mat)
#resumen4
resumen4 <- arrange(resumen4, desc(prom_mat))
resumen4
```
Si se requiere por ejemplo calcular una agregación de una función que no existe en R, puede construirse previamente la función, si esta está en un paquete se puede invocar el paquete.
Calculemos promedio, desviación estándar, coeficiente de variación, asimetría y curtosis del puntaje en inglés por la jornada del colegio
library(sqldf)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") # Proceda a usar names y table para saber a quien filtrar
saber_2014II$JORNADA <- as_factor(saber_2014II$JORNADA)
datos <- select(saber_2014II, JORNADA, PROMINGLES)
cv <- function(x){
100 * sd(x) / mean(x)
}
library(moments) #Para asimetría (skewness) y curtosis (kurtosis)
resumen5 <- summarize(group_by(datos, JORNADA), prom_ingles = mean(PROMINGLES), de_ingles = sd(PROMINGLES), cv_ingles = cv(PROMINGLES), asimetria_ingles = skewness(PROMINGLES),
curtosis_ingles = kurtosis(PROMINGLES))
---
## Construir agregaciones construyendo otras funciones o usando otros paquetes
Si se requiere por ejemplo calcular una agregación de una función que no existe en R, puede construirse previamente la función, si esta está en un paquete se puede invocar el paquete.
Calculemos promedio, desviación estándar, coeficiente de variación, asimetría y curtosis del puntaje en inglés por la jornada del colegio
```{r, echo = TRUE}
library(sqldf)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") # Proceda a usar names y table para saber a quien filtrar
saber_2014II$JORNADA <- as_factor(saber_2014II$JORNADA)
datos <- select(saber_2014II, JORNADA, PROMINGLES)
cv <- function(x){
100 * sd(x) / mean(x)
}
library(moments) #Para asimetría (skewness) y curtosis (kurtosis)
resumen5 <- summarize(group_by(datos, JORNADA), prom_ingles = mean(PROMINGLES), de_ingles = sd(PROMINGLES), cv_ingles = cv(PROMINGLES), asimetria_ingles = skewness(PROMINGLES),
curtosis_ingles = kurtosis(PROMINGLES))
```
tapply(variable continua, variable desagregación ,FUN = medidaresumen)
aggregate(variable continua, list(variable desagregación) ,FUN = medidaresumen)
Calculemos el promedio por la naturaleza del colegio
aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = mean)
Group.1 x
1 1 47.62874
2 2 51.73614
tapply(saber_2014II$PROMMATEMATICA, saber_2014II$NATURALEZA, FUN = mean)
1 2
47.62874 51.73614
---
## Las funciones de agregación del paquete base
* aggregate y tapply
* Muy utiles para usarlas dentro de una función, dplyr y sql no es tan sencillo de manejarlas dentro de funciones.
* Desventaja solo permite de una agregación
* tapply arroja los resultados en un vector, aggregate en un dataframe
<div class="alert alert-info">
<p> tapply(variable continua, variable desagregación ,FUN = medidaresumen) </p>
</div>
<div class="alert alert-info">
<p> aggregate(variable continua, list(variable desagregación) ,FUN = medidaresumen) </p>
</div>
Calculemos el promedio por la naturaleza del colegio
```{r, echo = TRUE}
aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = mean)
tapply(saber_2014II$PROMMATEMATICA, saber_2014II$NATURALEZA, FUN = mean)
```
resumen6 <- aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = mean)
names(resumen6) <- c("NATURALEZA", "prom_matem") # Si se quiere se puede usar colnames (dataframe)
resumen6
NATURALEZA prom_matem
1 1 47.62874
2 2 51.73614
resumen7 <- aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = quantile, 0.25)
#tapply se puede manejar exactamente también como el aggregate
resumen7a <- tapply(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = quantile, 0.25)
#Para hacer conteos usar la función length (con cualquier variable inicial)
aggregate(saber_2014II$AGSB_CODINST, list(saber_2014II$NATURALEZA), FUN = length)
Group.1 x
1 1 8236
2 2 3667
tapply(saber_2014II$DESVSOCIALESYCIUDADANAS, list(saber_2014II$NATURALEZA), FUN = length)
1 2
8236 3667
---
## Más de aggregate y tapply
```{r, echo = TRUE}
resumen6 <- aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = mean)
names(resumen6) <- c("NATURALEZA", "prom_matem") # Si se quiere se puede usar colnames (dataframe)
resumen6
resumen7 <- aggregate(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = quantile, 0.25)
#tapply se puede manejar exactamente también como el aggregate
resumen7a <- tapply(saber_2014II$PROMMATEMATICA, list(saber_2014II$NATURALEZA), FUN = quantile, 0.25)
#Para hacer conteos usar la función length (con cualquier variable inicial)
aggregate(saber_2014II$AGSB_CODINST, list(saber_2014II$NATURALEZA), FUN = length)
tapply(saber_2014II$DESVSOCIALESYCIUDADANAS, list(saber_2014II$NATURALEZA), FUN = length)
```
select : permite calcular estadísticas resumenes, promedios, conteos, mínimo, máximo, etc. Lo mismo que el summarize del dplyr.
from : Tabla de datos de donde se trabajan.
where : Filtros, lo mismo que el filter del dplyr.
group by : Variables categóricas de agrupamiento. Lo mismo que el group_by del dplyr.
Descargar la siguiente base https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0.
Calcular el total de valuados por departamentolibrary(sqldf)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") # Proceda a usar names y table para saber a quien filtrar
cons1 <- sqldf("select avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II")
Promedio matemáticas a nivel departamento
cons2 <- sqldf("select DEPARTAMENTO, avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO")
Conteo a nivel departamental
cons3 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO")
---
## Manejo de sqldf
<font size="3" color="blue"> select </font>: permite calcular estadísticas resumenes, promedios, conteos, mínimo, máximo, etc. Lo mismo que el summarize del dplyr.
<font size="3" color="blue"> from </font>: Tabla de datos de donde se trabajan.
<font size="3" color="blue"> where </font>: Filtros, lo mismo que el filter del dplyr.
<font size="3" color="blue"> group by </font>: Variables categóricas de agrupamiento. Lo mismo que el group_by del dplyr.
* Ojo con utilizar en los nombres de las bases de datos o en las variables el punto (.)
<p>
Descargar la siguiente base <a
href="https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0">https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0</a>.
</p>
Calcular el total de valuados por departamento
```{r, echo = TRUE}
library(sqldf)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
library(haven)
saber_2014II <- read_spss("saber2014II.sav") # Proceda a usar names y table para saber a quien filtrar
cons1 <- sqldf("select avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II")
```
Promedio matemáticas a nivel departamento
```{r, echo = TRUE}
cons2 <- sqldf("select DEPARTAMENTO, avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO")
```
Conteo a nivel departamental
```{r, echo = TRUE}
cons3 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO")
```
* Conteo de colegios Promedio matemáticas a nivel departamento ordenado por matemáticas
# Ascendentemente
cons4 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO order by prom_mat")
# Descendentemente
cons5 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO order by prom_mat DESC")
---
## Algunas funciones de sql
* avg()
* count()
* max()
* min()
* sum()
* avg
* variance()
* sqrt(variance())
<p>
* Conteo de colegios Promedio matemáticas a nivel departamento ordenado por matemáticas
</p>
```{r, echo = TRUE}
# Ascendentemente
cons4 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO order by prom_mat")
# Descendentemente
cons5 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat' from saber_2014II group by DEPARTAMENTO order by prom_mat DESC")
```
cons6 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat',
median(PROMMATEMATICA) as 'mediana_mat',
stdev(PROMMATEMATICA) as 'de_mat' from saber_2014II group by DEPARTAMENTO")
saber_2014II$NATURALEZA <- as_factor(saber_2014II$NATURALEZA)
cons7 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat',
median(PROMMATEMATICA) as 'mediana_mat', stdev(PROMMATEMATICA) as 'de_mat'
from saber_2014II where NATURALEZA = 'Oficial' group by DEPARTAMENTO")
---
## Más de sql
* Conteos, medianas y desviaciones estándar a nivel departamental
```{r, echo = TRUE}
cons6 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat',
median(PROMMATEMATICA) as 'mediana_mat',
stdev(PROMMATEMATICA) as 'de_mat' from saber_2014II group by DEPARTAMENTO")
```
* Se pueden realizar filtros, calculemos la consulta anterior pero en colegios oficiales
```{r, echo = TRUE}
saber_2014II$NATURALEZA <- as_factor(saber_2014II$NATURALEZA)
cons7 <- sqldf("select DEPARTAMENTO, count(*) as 'num_colegios', avg(PROMMATEMATICA) as 'prom_mat',
median(PROMMATEMATICA) as 'mediana_mat', stdev(PROMMATEMATICA) as 'de_mat'
from saber_2014II where NATURALEZA = 'Oficial' group by DEPARTAMENTO")
```
resumen5 <- summarise(por_dpto, num_colegios = n())
resumen5
Source: local data frame [33 x 2]
DEPARTAMENTO num_colegios
1 AMAZONAS 18
2 ANTIOQUIA 1383
3 ARAUCA 71
4 ATLANTICO 574
5 BOGOTA 1448
6 BOLIVAR 545
7 BOYACA 437
8 CALDAS 302
9 CAQUETA 123
10 CASANARE 140
.. ... ...
table(saber_2014II$DEPARTAMENTO)
AMAZONAS ANTIOQUIA ARAUCA ATLANTICO
18 1383 71 574
BOGOTA BOLIVAR BOYACA CALDAS
1448 545 437 302
CAQUETA CASANARE CAUCA CESAR
123 140 423 269
CHOCO CORDOBA CUNDINAMARCA GUAINIA
120 396 911 8
GUAVIARE HUILA LA GUAJIRA MAGDALENA
32 343 149 353
META NARIÑO NORTE SANTANDER PUTUMAYO
266 421 330 108
QUINDIO RISARALDA SAN ANDRES SANTANDER
140 232 17 699
SUCRE TOLIMA VALLE VAUPES
246 447 924 13
VICHADA
15
---
## Las tablas de frecuencias son agregaciones también
```{r, echo = TRUE}
resumen5 <- summarise(por_dpto, num_colegios = n())
resumen5
table(saber_2014II$DEPARTAMENTO)
```
Abrir el siguiente archivo:
https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0.
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
library(sjPlot)
sjt.frq(saber_2014II$JORNADA)
sjp.frq(saber_2014II$JORNADA, sort.frq = "asc")
---
## Más de tablas de frecuencias ...
Abrir el siguiente archivo:
<a href="https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0">https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0</a>.
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
library(sjPlot)
sjt.frq(saber_2014II$JORNADA)
sjp.frq(saber_2014II$JORNADA, sort.frq = "asc")
```
Ver más: http://www.strengejacke.de/sjPlot/sjp.frq/.
prop.table(table(saber_2014II$JORNADA, saber_2014II$NATURALEZA), 1)
1 2
1 0.4204096 0.5795904
2 0.7899099 0.2100901
3 0.8423740 0.1576260
4 0.7971698 0.2028302
5 0.5482503 0.4517497
sjt.xtab(saber_2014II$JORNADA, saber_2014II$NATURALEZA, showExpected = TRUE,
showRowPerc = TRUE, showColPerc = TRUE, showCellPerc = TRUE,
variableLabels = c("Jornada", "Naturaleza"))
#Perfil columna
prop.table(table(saber_2014II$JORNADA, saber_2014II$NATURALEZA), 2)
1 2
1 0.14205925 0.43986910
2 0.53229723 0.31797109
3 0.16027198 0.06735751
4 0.10259835 0.05863103
5 0.06277319 0.11617126
---
## Tablas de frecuencias relativas: Perfil fila y columna
Ver más: <a href="http://www.strengejacke.de/sjPlot/sjp.frq/">http://www.strengejacke.de/sjPlot/sjp.frq/</a>.
```{r, echo = TRUE}
prop.table(table(saber_2014II$JORNADA, saber_2014II$NATURALEZA), 1)
sjt.xtab(saber_2014II$JORNADA, saber_2014II$NATURALEZA, showExpected = TRUE,
showRowPerc = TRUE, showColPerc = TRUE, showCellPerc = TRUE,
variableLabels = c("Jornada", "Naturaleza"))
#Perfil columna
prop.table(table(saber_2014II$JORNADA, saber_2014II$NATURALEZA), 2)
```
sjp.xtab(saber_2014II$JORNADA, saber_2014II$NATURALEZA, tableIndex = "row", barPosition = "stack")
---
## Gráfico perfil fila
```{r, echo = TRUE}
sjp.xtab(saber_2014II$JORNADA, saber_2014II$NATURALEZA, tableIndex = "row", barPosition = "stack")
```
Cargue la siguiente base: https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0. y corrale el siguiente código:
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
else{x}), stringsAsFactors = F)
df <- data.frame (color = c("blue", "black", "blue", "blue", "black"), value = 1:5)
a <- mutate(df, double = 2 * value, quadruple = 4 * double)
b <- transmute(df, double = 2 * value, quadruple = 4 * double)
#class(a); class(b)
Calcular el rendimiento promedio de los colegios
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
# else{x}), stringsAsFactors = F)
library(dplyr)
saber_2014II <- mutate(saber_2014II, PROMGLOBAL = PROMMATEMATICA + PROMINGLES + PROMLECTURACRITICA +
PROMSOCIALESYCIUDADANAS + PROMCIENCIASNATURALES + PROMRAZONAMIENTOCUANTITA + PROMCOMPETENCIASCIUDADAN)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.Rdata")
ing_gastos <- mutate(ing_gastos, Ahorro = ingreso - gasto, log_ingreso = log(ingreso),
porc_ahorro = 100 * (ingreso - gasto) / ingreso )
Ejercicio: ¿Qué tan homogeneo es cada colegio en su puntaje de matemáticas e inglés?, (calcule la desviación estándar de matemáticas e inglés)
---
## Trasformación o creación de variables
Cargue la siguiente base: <a href="https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0">https://www.dropbox.com/s/5odvss7s6iz3voq/saber2014II.sav?dl=0</a>. y corrale el siguiente código:
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
else{x}), stringsAsFactors = F)
```
<p>
<div align="left">
<img src = "mutate.png" width = "300", height = "300"
alt = "Agregaciones" />
</div>
</p>
```{r, echo = TRUE}
df <- data.frame (color = c("blue", "black", "blue", "blue", "black"), value = 1:5)
a <- mutate(df, double = 2 * value, quadruple = 4 * double)
b <- transmute(df, double = 2 * value, quadruple = 4 * double)
#class(a); class(b)
```
Calcular el rendimiento promedio de los colegios
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
# else{x}), stringsAsFactors = F)
library(dplyr)
saber_2014II <- mutate(saber_2014II, PROMGLOBAL = PROMMATEMATICA + PROMINGLES + PROMLECTURACRITICA +
PROMSOCIALESYCIUDADANAS + PROMCIENCIASNATURALES + PROMRAZONAMIENTOCUANTITA + PROMCOMPETENCIASCIUDADAN)
```
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.Rdata")
ing_gastos <- mutate(ing_gastos, Ahorro = ingreso - gasto, log_ingreso = log(ingreso),
porc_ahorro = 100 * (ingreso - gasto) / ingreso )
```
Ejercicio: ¿Qué tan homogeneo es cada colegio en su puntaje de matemáticas e inglés?, (calcule la desviación estándar de matemáticas e inglés)
df <- data.frame (color = c("blue", "black", "blue", "blue", "black"), value = 1:5)
df$double <- 2 * df$value
df$quadruple <- 4 * df$value
df$logvalue <- log(df$value)
#Si se quiere en una base aparte
b <- data.frame(double = 2 * df$value, quadruple = 4 * df$value)
Calcular el rendimiento promedio de los colegios
---
## Trasformación o creación de variables (con el paquete base)
```{r, echo = TRUE}
df <- data.frame (color = c("blue", "black", "blue", "blue", "black"), value = 1:5)
df$double <- 2 * df$value
df$quadruple <- 4 * df$value
df$logvalue <- log(df$value)
#Si se quiere en una base aparte
b <- data.frame(double = 2 * df$value, quadruple = 4 * df$value)
```
Calcular el rendimiento promedio de los colegios
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
saber_2014II$PROMGLOBAL <- (saber_2014II$PROMMATEMATICA + saber_2014II$PROMINGLES +
saber_2014II$PROMLECTURACRITICA + saber_2014II$PROMSOCIALESYCIUDADANAS +
saber_2014II$PROMCIENCIASNATURALES + saber_2014II$PROMRAZONAMIENTOCUANTITA +
saber_2014II$PROMCOMPETENCIASCIUDADAN) / 7
# head(iris)
iris <- rename(iris, longitud_petalo = Petal.Length, Especies = Species)
head(iris)
Sepal.Length Sepal.Width longitud_petalo Petal.Width Especies
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
Ejercicio: Renombre PROMMATEMATICA como MATEMATICA, PROMINGLES como INGLES
---
## Renombrando las variables y eliminandolas del data.frame
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
saber_2014II$PROMGLOBAL <- (saber_2014II$PROMMATEMATICA + saber_2014II$PROMINGLES +
saber_2014II$PROMLECTURACRITICA + saber_2014II$PROMSOCIALESYCIUDADANAS +
saber_2014II$PROMCIENCIASNATURALES + saber_2014II$PROMRAZONAMIENTOCUANTITA +
saber_2014II$PROMCOMPETENCIASCIUDADAN) / 7
```
```{r, echo = TRUE}
# head(iris)
iris <- rename(iris, longitud_petalo = Petal.Length, Especies = Species)
head(iris)
```
Ejercicio: Renombre PROMMATEMATICA como MATEMATICA, PROMINGLES como INGLES
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){
#as_factor(x)} else{x}), stringsAsFactors = F)
#Una por una
saber_2014II$DESVMATEMATICA <- NULL; saber_2014II$DESVINGLES <- NULL
saber_2014II$DESVLECTURACRITICA <- NULL; saber_2014II$DESVSOCIALESYCIUDADANAS <- NULL
saber_2014II$DESVCIENCIASNATURALES <- NULL; saber_2014II$DESVRAZONAMIENTOCUANTITA <- NULL
saber_2014II$DESVCOMPETENCIASCIUDADA <- NULL
#Se conservan las variables que se desean (con los nombres)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#edit(names(saber_2014II))
copiasaber_2014II <- saber_2014II[,c("AGSB_CODINST", "AGSB_NOMBREINSTITUCION",
"CODIGOMUNICIPIO", "NOMBREMUNICIPIO", "DEPARTAMENTO", "CALENDARIO", "NATURALEZA",
"JORNADA", "EVALUADOS", "PROMMATEMATICA", "PROMINGLES", "PROMLECTURACRITICA",
"PROMSOCIALESYCIUDADANAS", "PROMCIENCIASNATURALES", "PROMRAZONAMIENTOCUANTITA",
"PROMCOMPETENCIASCIUDADAN", "PERIODO")]
---
## Renombrando las variables y eliminandolas del data.frame (2)
* Suponga que se desea eliminar las desviaciones estándares de la base de datos, se puede hacer de al menos tres formas:
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){
#as_factor(x)} else{x}), stringsAsFactors = F)
#Una por una
saber_2014II$DESVMATEMATICA <- NULL; saber_2014II$DESVINGLES <- NULL
saber_2014II$DESVLECTURACRITICA <- NULL; saber_2014II$DESVSOCIALESYCIUDADANAS <- NULL
saber_2014II$DESVCIENCIASNATURALES <- NULL; saber_2014II$DESVRAZONAMIENTOCUANTITA <- NULL
saber_2014II$DESVCOMPETENCIASCIUDADA <- NULL
#Se conservan las variables que se desean (con los nombres)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#edit(names(saber_2014II))
copiasaber_2014II <- saber_2014II[,c("AGSB_CODINST", "AGSB_NOMBREINSTITUCION",
"CODIGOMUNICIPIO", "NOMBREMUNICIPIO", "DEPARTAMENTO", "CALENDARIO", "NATURALEZA",
"JORNADA", "EVALUADOS", "PROMMATEMATICA", "PROMINGLES", "PROMLECTURACRITICA",
"PROMSOCIALESYCIUDADANAS", "PROMCIENCIASNATURALES", "PROMRAZONAMIENTOCUANTITA",
"PROMCOMPETENCIASCIUDADAN", "PERIODO")]
```
#Se conservan las variables que se desean (con las posiciones no recomendable)
#names(saber_2014II)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
copiasaber2_2014II <- saber_2014II[,c(1:16,24 )]
saber_2014II <- read_spss("saber2014II.sav")
copiasaber2_2014II <- saber_2014II[,-c(17:23)]
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
#else{x}), stringsAsFactors = F)
library(dplyr)
datos1 <- select(saber_2014II, -DESVMATEMATICA)
datos2 <- select(saber_2014II, AGSB_CODINST, AGSB_NOMBREINSTITUCION, CODIGOMUNICIPIO, PROMMATEMATICA )
---
## Mas forma de Eliminar variables del data.frame (2)
```{r, echo = TRUE}
#Se conservan las variables que se desean (con las posiciones no recomendable)
#names(saber_2014II)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
copiasaber2_2014II <- saber_2014II[,c(1:16,24 )]
saber_2014II <- read_spss("saber2014II.sav")
copiasaber2_2014II <- saber_2014II[,-c(17:23)]
```
* Hacer las consultas anteriores con select, a continuación se muestra un ejemplo pequeño, observe como funciona
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled"){as_factor(x)}
#else{x}), stringsAsFactors = F)
library(dplyr)
datos1 <- select(saber_2014II, -DESVMATEMATICA)
datos2 <- select(saber_2014II, AGSB_CODINST, AGSB_NOMBREINSTITUCION, CODIGOMUNICIPIO, PROMMATEMATICA )
```
f(x,y) = x %>% f(y)
---
## Pipelines (tuberías)
* Simplifica notablemente el proceso de análisis de datos
<p>
<div align="left">
<img src = "pipelines.jpeg" width = "300", height = "300"
alt = "Agregaciones" />
</div>
</p>
<blockquote> f(x,y) = x %>% f(y) </blockquote>
* Operador magrittr: %>%, se puede leer como "luego haga"
* Permite utilizar el primer argumento de una función por fuera de la función, esto facilitará muchos procesos de análisis de datos.
* Ilustrameos el uso de los pipelines filtrando el departamento de Antioquia:
library(dplyr)
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
# names(saber_2014II)
# Vamos paso a paso
c1 <- saber_2014II %>% filter(DEPARTAMENTO == "Antioqua")
---
## Pipelines II
```{r, echo = TRUE}
library(dplyr)
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
# names(saber_2014II)
# Vamos paso a paso
c1 <- saber_2014II %>% filter(DEPARTAMENTO == "Antioqua")
```
<p>
<div align="left">
<img src = "Procesidatanalysis.png" width = "500", height = "500"
alt = "Agregaciones" />
</div>
</p>
library(dplyr)
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
# names(saber_2014II)
c1 <- saber_2014II %>% filter(DEPARTAMENTO == "ANTIOQUIA") %>% group_by(NOMBREMUNICIPIO) %>%
summarize(num_colegios = n(), num_evaluados = sum(EVALUADOS)) %>%
arrange(desc(num_evaluados))
head(c1)
Source: local data frame [6 x 3]
NOMBREMUNICIPIO num_colegios num_evaluados
1 MEDELLIN 412 30185
2 BELLO 85 5446
3 ITAGUI 54 3143
4 ENVIGADO 35 2635
5 RIONEGRO 35 2056
6 TURBO 40 1449
---
## Ejercicios interesantes con pipelines
* Calculemos el total de estudiantes evaluados y el número de colegios en cada uno de los municipios de antioquia y ordenelos en orden ascendente por el municipio de más evaluados
```{r, echo = TRUE}
library(dplyr)
library(haven)
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
# names(saber_2014II)
c1 <- saber_2014II %>% filter(DEPARTAMENTO == "ANTIOQUIA") %>% group_by(NOMBREMUNICIPIO) %>%
summarize(num_colegios = n(), num_evaluados = sum(EVALUADOS)) %>%
arrange(desc(num_evaluados))
head(c1)
```
Cargue la siguiente encuesta (Encuesta multiproposito de Bogotá): https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0. y corrale el siguiente código:
# Preparación de la base de datos
rm(list = ls())
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.RData")
# No le ponga mucha atención todavía al merge (se verá en detalle)
localidad <- merge(a, localidad)
localidad$nom_loc <- as.character(localidad$nom_loc)
Encoding(localidad$nom_loc) <- "latin1"
c <- merge(localidad, c)
ing_gastos <- merge(c, ing_gastos)
ing_gastos <- ing_gastos %>% select(directorio_hog,nom_loc, estrato, ingreso, gasto)
head(ing_gastos)
directorio_hog nom_loc estrato ingreso gasto
1 19800701 Barrios Unidos 3 4483333.3 4831841.1
2 19801701 Puente Aranda 3 NA 3027829.3
3 19801801 Puente Aranda 3 3030000.0 2435573.0
4 19808501 Antonio Nariño 3 954166.7 887512.7
5 19815401 Los Mártires 3 6875000.0 3439126.4
6 19815601 Teusaquillo 4 3787766.7 3334223.0
---
## Ejercicios interesantes con pipelines (2)
Cargue la siguiente encuesta (Encuesta multiproposito de Bogotá):
<a href="https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0">https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0</a>. y corrale el siguiente código:
* Calcular la localidad con mayor ingreso en Bogotá
```{r, echo = TRUE}
# Preparación de la base de datos
rm(list = ls())
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.RData")
# No le ponga mucha atención todavía al merge (se verá en detalle)
localidad <- merge(a, localidad)
localidad$nom_loc <- as.character(localidad$nom_loc)
Encoding(localidad$nom_loc) <- "latin1"
c <- merge(localidad, c)
ing_gastos <- merge(c, ing_gastos)
ing_gastos <- ing_gastos %>% select(directorio_hog,nom_loc, estrato, ingreso, gasto)
head(ing_gastos)
```
c2 <- ing_gastos %>% group_by(nom_loc) %>%
summarize(prom_ingreso = mean(ingreso, na.rm = T)) %>%
arrange(desc(prom_ingreso))
c3 <- ing_gastos %>% group_by(estrato, nom_loc) %>% summarize(numhog = n(),
prom_ingreso = mean(ingreso, na.rm = T),min_ingreso = min(ingreso, na.rm = T),
max_ingreso = max(ingreso, na.rm = T)) %>% arrange(prom_ingreso)
c4 <- ing_gastos %>% mutate(ahorro = ingreso - gasto) %>% group_by(estrato) %>%
summarize(numhog = n(), prom_ingreso = mean(ahorro, na.rm = T)) %>%
arrange(desc(prom_ingreso))
---
## Ejercicios interesantes con pipelines (2 cont.)
* Calcular la localidad con mayor ingreso en Bogotá
```{r, echo = TRUE}
c2 <- ing_gastos %>% group_by(nom_loc) %>%
summarize(prom_ingreso = mean(ingreso, na.rm = T)) %>%
arrange(desc(prom_ingreso))
```
* Calcular que combinación estrato y localidad que tiene los menores ingreso en Bogotá, sacar el número de hogares de la encuesta, el mínimo y el máximo
```{r, echo = TRUE}
c3 <- ing_gastos %>% group_by(estrato, nom_loc) %>% summarize(numhog = n(),
prom_ingreso = mean(ingreso, na.rm = T),min_ingreso = min(ingreso, na.rm = T),
max_ingreso = max(ingreso, na.rm = T)) %>% arrange(prom_ingreso)
```
* Ejercicio: calcular el promedio de ahorro por estrato en bogotá
```{r, echo = TRUE}
c4 <- ing_gastos %>% mutate(ahorro = ingreso - gasto) %>% group_by(estrato) %>%
summarize(numhog = n(), prom_ingreso = mean(ahorro, na.rm = T)) %>%
arrange(desc(prom_ingreso))
```
* Ejercicio: calcular como es la correlación del gasto y el ingreso en Bogotá
* Ejercicio: elabore cada uno una pregunta de investigación con las pruebas saber.
Para el primer punto utilice la encuesta multiproposito de Bogotá (EMB2011.Rdata), suponga que dicha información es censal e ignore los factores de expansión descarguela de: https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0
1) Calcule el ingreso el gasto promedio y los deciles de gasto de los Bogotanos en el año 2011. Realice lo mismo por localidad.
2) Calcular como es la correlación del gasto y el ingreso en Bogotá.
3) Calcule cuantos encuestas hubo por localidad, y cuantos faltantes hubo en la encuesta por localidad, luego calcule la proporción de faltantes por localdiad. Haga el mismo por estrato, ¿Qué concluye?
4) Corra el código que se presenta a continuación y genere la tabla ing_gastos (revise que columnas resultaron)
# Preparación de la base de datos
rm(list = ls())
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.RData")
# No le ponga mucha atención todavía al merge (se verá en detalle)
localidad <- merge(a, localidad)
localidad$nom_loc <- as.character(localidad$nom_loc)
Encoding(localidad$nom_loc) <- "latin1"
c <- merge(localidad, c)
tabla_inggastos_bogota <- merge(c, ing_gastos)
tabla_inggastos_bogota <- tabla_inggastos_bogota %>% select(directorio_hog,nom_loc,
estrato, ingreso, gasto)
---
## Taller 2
Para el primer punto utilice la encuesta multiproposito de Bogotá (EMB2011.Rdata), suponga que dicha información es censal e ignore los factores de expansión descarguela de: <a href="https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0">https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0</a>
1) Calcule el ingreso el gasto promedio y los deciles de gasto de los Bogotanos en el año 2011. Realice lo mismo por localidad.
2) Calcular como es la correlación del gasto y el ingreso en Bogotá.
3) Calcule cuantos encuestas hubo por localidad, y cuantos faltantes hubo en la encuesta por localidad, luego calcule la proporción de faltantes por localdiad. Haga el mismo por estrato, ¿Qué concluye?
4) Corra el código que se presenta a continuación y genere la tabla ing_gastos (revise que columnas resultaron)
```{r, echo = TRUE}
# Preparación de la base de datos
rm(list = ls())
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
load("EMB2011.RData")
# No le ponga mucha atención todavía al merge (se verá en detalle)
localidad <- merge(a, localidad)
localidad$nom_loc <- as.character(localidad$nom_loc)
Encoding(localidad$nom_loc) <- "latin1"
c <- merge(localidad, c)
tabla_inggastos_bogota <- merge(c, ing_gastos)
tabla_inggastos_bogota <- tabla_inggastos_bogota %>% select(directorio_hog,nom_loc,
estrato, ingreso, gasto)
```
Calcule lo que se indica posterior al código con la tabla tabla_inggastos_bogota generalda en el paso anterior:
Calcule cuantos hogares hay por cada localidad, cuantas personas no respondieron la encuesta por localidad y calcule el ingreso promedio, la mediana, el percentil 25 desagregado por localidad. Ordene la tabla por los mayores ingresos.
En la localidad de Chapinero calcule el promedio de los diferentes estratos socioecónómicos y la correlación entre el ingreso y el gasto.
Construya una función para calcular el coeficiente de variación y presente por el estrato el promedio, la desviación estándar, el coeficiente de variación, la asimetría y la curtosis por estrato socieconómico, excluya de la tabla los que no reportaron el estrato (estrato !=9)
Calcule el ahorro por estrato socieconómico para la localidad de Suba y reporte la localidad con mayores ingresos.
Cargue las pruebas saber con el siguiente código:
Lleve a cabo las siguientes consultas
---
## Taller 2 (cont)
* Calcule lo que se indica posterior al código con la tabla tabla_inggastos_bogota generalda en el paso anterior:
* Calcule cuantos hogares hay por cada localidad, cuantas personas no respondieron la encuesta por localidad y calcule el ingreso promedio, la mediana, el percentil 25 desagregado por localidad. Ordene la tabla por los mayores ingresos.
* En la localidad de Chapinero calcule el promedio de los diferentes estratos socioecónómicos y la correlación entre el ingreso y el gasto.
* Construya una función para calcular el coeficiente de variación y presente por el estrato el promedio, la desviación estándar, el coeficiente de variación, la asimetría y la curtosis por estrato socieconómico, excluya de la tabla los que no reportaron el estrato (estrato !=9)
* Calcule el ahorro por estrato socieconómico para la localidad de Suba y reporte la localidad con mayores ingresos.
* Cargue las pruebas saber con el siguiente código:
* Lleve a cabo las siguientes consultas
Cargue las pruebas saber con el siguiente código:
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación de las versiones viejas de dplyr
#corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
Lleve a cabo las siguientes consultas
5) Busque como le fue a su colegio en las pruebas saber: Consejo use arrange (ordene por municipio y nombre de la institución) y genere un consecutivo para saber el ranking. En la ciudad de su colegio que puesto tuvo el colegio. Si no estudio en Colombia o no aparece en el listado su colegio use el Colegio Antonio Nariño H.H Corazonista.
6) Calcule cuantos colegios y estudiantes hay según departamento, municipio, naturaleza y jornada y ordenelos por dichas columnas
7) Calcule el puntaje global de las pruebas saber y encuentre los 10 mejores colegios de Bogotá (según el puntaje global) de jornada continua de Bogotá que presentaron más de 10 estudiantes y que sean de calendario A.
8) En que departamento se presentan las mayores coeficientes de variación en el puntaje global. Para responder a a esto genere una tabla donde calcule el coeficiente de variación del puntaje global desagregado por departamento y ordene por el coeficiente de variación.
9) Calcule una tabla de frecuencias abosultas y relativas y un gráfico de las jornadas de los colegios de Bogotá. Etiquete correctamente el gráfico.
10) Calcule una tabla y gráfico de perfiles columna de la jornada del colegio y la naturalza del colegio. Use sjPlot. Etiquete correctamente el gráfico.
---
## Taller 2 (cont)
Cargue las pruebas saber con el siguiente código:
```{r, echo = TRUE}
setwd("/Users/josezea/Google Drive/Laboral 2015/curso DANE 2015/Bases de datos/Datos_Cursos/saber2014")
saber_2014II <- read_spss("saber2014II.sav")
#En windows para correguir problemas de codificación de las versiones viejas de dplyr
#corra la siguiente línea
#saber_2014II <- as.data.frame(lapply(saber_2014II, function(x) if(class(x)=="labelled")
#{as_factor(x)} else{x}), stringsAsFactors = F)
```
Lleve a cabo las siguientes consultas
<p>
<p>
5) Busque como le fue a su colegio en las pruebas saber: Consejo use arrange (ordene por municipio y nombre de la institución) y genere un consecutivo para saber el ranking. En la ciudad de su colegio que puesto tuvo el colegio. Si no estudio en Colombia o no aparece en el listado su colegio use el Colegio Antonio Nariño H.H Corazonista.
</p>
</p>
<p>
<p>
6) Calcule cuantos colegios y estudiantes hay según departamento, municipio, naturaleza y jornada y ordenelos por dichas columnas
</p>
</p>
<p>
<p>
7) Calcule el puntaje global de las pruebas saber y encuentre los 10 mejores colegios de Bogotá (según el puntaje global) de jornada continua de Bogotá que presentaron más de 10 estudiantes y que sean de calendario A.
</p>
</p>
<p>
<p>
8) En que departamento se presentan las mayores coeficientes de variación en el puntaje global. Para responder a a esto genere una tabla donde calcule el coeficiente de variación del puntaje global desagregado por departamento y ordene por el coeficiente de variación.
</p>
</p>
<p>
<p>
9) Calcule una tabla de frecuencias abosultas y relativas y un gráfico de las jornadas de los colegios de Bogotá. Etiquete correctamente el gráfico.
</p>
</p>
<p>
<p>
10) Calcule una tabla y gráfico de perfiles columna de la jornada del colegio y la naturalza del colegio. Use sjPlot. Etiquete correctamente el gráfico.
</p>
</p>
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |