Sunteți pe pagina 1din 119

Introducción al R

Julio 2016
¿Qué es el R?

- R es un lenguaje de programación utilizado para análisis estadístico y gráfico


- Múltiples conjuntos de datos abiertos al mismo tiempo
- R es código abierto (es decir, GRATIS)

- Podemos bajar el R en http://cran.r‐project.org/


Propiedades
- Libre y de código abierto lo que permite realizarle modificaciones.
- Sostenido por una fuerte comunidad de usuarios
- Existen versiones para varios sistemas operativos
- Extensible y altamente flexible.
- Implementación de variados y modernos métodos estadísticos.
- Amplísimas facilidades gráficas.
- Muy lento operando con grandes volúmenes de datos.
- Manejo exclusivo del espacio de trabajo en memoria RAM.
La consola del R (en verdad el R-studio)
Paquetes

R puede extenderse fácilmente mediante paquetes o librerías que son módulos adicionales diseñados
con propósitos específicos.

Aproximadamente una decena de ellos vienen incluidos con la distribución original aunque
actualmente existen más de 6.000 disponibles en http://cran.r‐project.org/
Programando en R

El R guarda los datos y las salidas de los análisis estadísticos (y cualquier otra cosa) en objetos.
Para asignar y guardar en objetos, utilizamos como operador <- o =

#ESTO ES UN COMENTARIO (NO SE EJECUTA)


# asigna el número 3 al objeto abc
abc<-3
abc=3 # en el curso vamos a utilizar = siempre
# muestra que hay guardado en el objeto abc
abc
# [1] 3
Estableciendo el directorio de trabajo
getwd()# Muestra el directorio actual de trabajo(wd)

setwd(choose.dir())# Selecciona el directorio de forma interactiva

setwd("C:/Mis documentos/datos")# Cambia el directorio de trabajo

setwd("C:\\Mis documentos\\datos")# Cambia el directorio de trabajo


Creando directorios y explorando el espacio de trabajo
dir()# lista los archivos incluidos en el directorio de trabajo

dir.create("C:/Prueba")# Crea la carpeta "Prueba" en el disco C:

setwd("C:/Prueba")# Cambia el directorio de trabajo a "C:/Prueba"

objects()# lista todos los objetos actualmente en el espacio de trabajo

ls() # Lo mismo que objects()

remove()# Remueve objetos del espacio de trabajo

rm(list=ls()) #remueve TODOS los objetos del espacio de trabajo


Pidiendo ayuda
?plot #pide ayuda sobre la función plot

help(plot) #otra forma de pedir ayuda para la función plot

??regression # busca en las páginas donde aparezca la palabra "regression"

help.search("regression") # otra forma de pedir ayuda sobre "regression"

library(help="foreign") # muestra la documentación en el paquete foreign

args(mean) # descripción de los comandos de la función mean.


Instalando y cargando paquetes
search()# Muestra los paquetes cargados

library()# Muestra los paquetes instalados

library(foreign) # carga el paquete foreign

install.packages(survey) # instala el paquete survey (correr solo una vez)

La lista completa de paquetes por área se encuentra en

http://cran.r-project.org/web/views/
Creando vectores c()
Todo en R es un vector (algunos de un solo elemento <por ejemplo abc>). Para crear vectores tenemos
que utilizar la función c()

a=c(3,1,7,5)#crea un vector con los elementos 3,1,7,5 y lo guarda en el


objeto a
a
# [1] 3 1 7 5
#crea un vector con los elementos Montevideo, Interior, Montevideo y lo
#guarda en el objeto b
b=c('Montevideo','Interior','Montevideo')
b
# [1] "Montevideo" "Interior" "Montevideo"
Creando vectores c()
# crea un vector con los elementos 10,11,...,100
x=seq(10,100,1)#más adelante vamos a ver a fondo las funciones
x=seq(from = 10,to= 100,by=1)
x=10:100
y=rep(10,5)# crea un vector con cinco elementos igual a 10
y
# [1] 10 10 10 10 10
z=c(rep(10,5),rep(20,2))# vector con 5 elementos igual a 10 y 2 igual a 20
z
# [1] 10 10 10 10 10 20 20
Ejercicios vectores
Crear los siguientes vectores y guardarlos como v1, v2, v3, v4 y v5 respectivamente

a) (1, 2, 3, . . . , 19, 20)


b) (3,6,9……..,57,60)
c) (4, 6, 3, 4, 6, 3, . . . , 4, 6, 3) donde 4 ocurre 10 veces
d) (4, 4, . . . , 4, 6, 6, . . . , 6, 3, 3, . . . , 3) donde 4 ocurre 10 veces, 6 ocurre 20 veces y 3 ocurre 8
veces.
e) (0.1,0.22 , 0.13 , 0.24 , … . , 0.133 , 0.234 )
Trabajando un poco con los vectores
n=length(x) # tamaño del vector x y lo guarda en el objeto n
# [1] 91
sort(a) # ordena el vector a de forma ascendente
# [1] 1 3 5 7
sort(a,decreasing=TRUE) # ordena el vector a de forma descendente
# [1] 7 5 3 1
order(a)# posiciones de los elementos si el vector es ordenado de forma ascendente
# [1] 2 1 4 3
order(a,decreasing=TRUE)# idem si el vector es ordenado de forma ascendente
# [1] 3 4 1 2
Observación: TRUE y FALSE (Verdadero y Falso) son constantes lógicas.
Decreasing es un argumento de la funciones sort y order
Cargar archivos de texto (csv, txt)
El formato más fácil posee el nombre de las variables en la primera fila y las variables (campos) se
encuentran separados por comas
departamento ponderador sexo edad cond_act ingreso pobre
1 CANELONES 283 H 92 Inactivos 21000 No pobre
2 CANELONES 283 M 83 Inactivos 5300 No pobre
3 COLONIA 519 H 41 Ocupados 31663 No pobre
4 COLONIA 519 M 40 Ocupados 1500 No pobre
5 COLONIA 519 H 17 Inactivos 700 No pobre
6 COLONIA 519 H 6 Inactivos 0 No pobre

base=read.csv('ECH julio.csv',header=TRUE) # guarda los datos en base


Nota de la sintaxis
 Espacios entre los comandos no importa (excepto en el nombre de los archivos), pero las
mayúscula si importan.

 En R todo es una función, es decir, devuelve un valor.

 Los argumentos de la función pueden tener que ser nombrados (header=TRUE) o pueden ser
no nombrados(“ECH julio.csv”)

 El conjunto entero de datos (llamado data frame1)es guardado en un objeto (base). Por lo
tanto, más de un conjunto de datos pueden estar disponible al mismo tiempo.

1
Un data frame tiene la estructura de una matriz. Las observaciones corresponden a las filas y las variables
(numéricas o categóricas) corresponden a las columnas
Mirando los datos
head(base)#muestra las primeras 6 filas de la base de datos

# departamento ponderador sexo edad cond_act ingreso pobre


# 1 CANELONES 283 H 92 Inactivos 21000 No pobre
# 2 CANELONES 283 M 83 Inactivos 5300 No pobre
# 3 COLONIA 519 H 41 Ocupados 31663 No pobre
# 4 COLONIA 519 M 40 Ocupados 1500 No pobre
# 5 COLONIA 519 H 17 Inactivos 700 No pobre
# 6 COLONIA 519 H 6 Inactivos 0 No pobre
Mirando los datos
tail(base) # nos muestras las ultimas 6 filas de la base de datos

# departamento ponderador sexo edad cond_act ingreso pobre


# 11107 MONTEVIDEO 191 M 58 Ocupados 14583 No pobre
# 11108 MONTEVIDEO 380 H 39 Ocupados 4593 No pobre
# 11109 MONTEVIDEO 380 M 34 Ocupados 29593 No pobre
# 11110 MONTEVIDEO 380 M 11 Inactivos 0 No pobre
# 11111 MONTEVIDEO 380 H 6 Inactivos 0 No pobre
# 11112 MONTEVIDEO 313 M 77 Inactivos 11000 No pobre

names(base)#muestra los nombres de las variables


#[1]"departamento" "ponderador" "sexo" "edad" "cond_act" "ingreso" "pobre"
Mirando los datos
View(base) #abre una venta con los datos
Mirando los datos
edit(base) #nos permite editar los datos de forma manual

Observación: No es recomendado editar los datos de esta forma.


Cargando distintos tipos de archivos

library(foreign) #para cargar otro tipo de archivos (NO EXCEL)

stata=read.dta("ECH julio.dta")

spss=read.spss("ECH julio.sav", to.data.frame=TRUE)

sas=read.xport("ECH julio.xpt")

dbf=read.dbf("ECH julio.dbf")
Ejercicios base de datos
En la carpeta base de datos se encuentran archivos correspondientes a los microdatos de hogares de la
Encuesta continua de hogares del primer trimestre de 2013 en distintos formatos.

1.Cargar los microdatos de la ECH del archivo en formato csv y guardarlo en el objeto d1
2.Cargar los microdatos de la ECH del archivo en formato txt y guardarlo en el objeto d2
3.Cargar los microdatos de la ECH del archivo en formato sav (con y sin las etiquetas de los valores)
y guardarlo en el objeto d3 y d4 respectivamente.
4.Cargar los microdatos de la ECH del archivo en formato dbf y guardarlo en el objeto d5.
5.Listar todos los objetos que se encuentran en la memoria.
6.Borrar todas los objetos que se encuentran en memoria menos base
Cargando archivos Excel XLConnect
install.packages('rJava')
install.packages('XLConnect')
install.packages('XLConnectJars')
library(XLConnect)
#Guarda el archivo Excel en memoria
archivo.excel=file.path("………\\Curso R\\EAE\\Macrovariables 2011.xls")
#Carga la hoja 1 del archivo excel
eae=readWorksheetFromFile(archivo.excel, sheet=1)

Observación: puede ocurrir que tengamos que tener actualizada la versión de java y utilizar la versión
de 32 bits del R.
Trabajando con bases de datos en R
Dado que R puede manejar más de un data frame al mismo tiempo, debemos especificar donde
encontrar una variable.

La sintaxis base$edad significa que la variable edad se encuentra en el data frame base.

Obviamente es un vector!!

#Crea una variable de ingreso expresado en miles de pesos en base


base$ingreso_miles=base$ingreso/1000
Trabajando con bases de datos en R

Utilizamos[] para extraer elementos de la variable (vector).

base$edad[1] #Primer elemento


base$edad[-1] #Todos los elementos menos el primero
base$edad[5:10] #Elementos del 5 al 10
base$edad[c(5,7)] #Elementos 5 y 7
base$edad[base$pobre=='Pobre']#Edad de los hombres por debajo de la LP
Nota de la sintaxis

Necesitamos ==para testar igualdad, no sirve =

Índices positivos seleccionan elementos, índices negativos desechan elementos

Para el caso de variables no numéricas, tenemos que poner los valores entre comillas (' o ")
Datos faltantes
NA es el código para los datos perdidos.

Una forma de verlo es como “No lo conozco”. El R maneja con sensatez los cálculos.

Por ejemplo:
1 + NA = NA

(1+ “un numero que no conozco”= “un número que no conozco”)


Datos faltantes

No podemos testear

base$ingreso==NA (¿es el ingreso igual a un número que no conozco?),

Existe una función is.na(base$ingreso) (¿Existe algún ingreso que no conozco?)


Trabajando con bases de datos en R
Recordemos que un data frame tiene la estructura de una matriz. Las observaciones corresponden a las
filas y las variables (numéricas o categóricas) corresponden a las columnas. Para manipular un data
frame utilizamos

objeto[fila,columna]
base[1,] # Primera fila
base[,2] # Segunda columna
base[3:7, 2:4] # Algunas filas y columnas
base[, c("sexo","edad")] # Columnas por nombre
base[base$pobre=="Pobre", ]# Personas por debajo de la línea de pobreza
pobres=base[base$pobre=='Pobre', ] # Pone el data frame anterior en uno nuevo
Explorando los datos R
Utilizando la función dim, obtenemos la cantidad de observaciones (filas) y la cantidad de variables
(columnas)

dim(base)
## [1] 11112 8

nrow(base) #cantidad de filas (observaciones)


## [1] 11112

ncol(base) #cantidad de columnas (variables)


## [1] 8
Explorando los datos R

Utilizando la función str, obtenemos la estructura del data frame, incluyendo el tipo (class) de
variables
str(base)

## 'data.frame': 11112 obs. of 8 variables:


## $ departamento : Factor w/ 19 levels "ARTIGAS ",..: 2 2 4 4 4 4 8 8 8 10
## $ ponderador : int283 283 519 519 519 519 328 328 328 272 ...
## $ sexo : Factor w/ 2 levels "H","M": 1 2 1 2 1 1 1 1 1 2 ...
## $ edad : int 92 83 41 40 17 6 68 32 15 52 ...
## $ cond_act : Factor w/ 3 levels "Desocupados",..: 2 2 3 3 2 2 2 3 2 3 ...
## $ ingreso : num 21000 5300 31663 1500 700 ...
## $ pobre : Factor w/ 2 levels "No pobre","Pobre": 1 1 1 1 1 1 1 1 1 1
Ordenando un data frame order ()
Para ordenar el data frame tenemos que utilizar la función order. Recordemos que la función order
devuelve las posiciones de los elementos si el vector es ordenado de forma ascendente y nosotros
queremos el mismo data frame con las filas en otro orden.

base[order(base$ingreso),]#ordena la base de forma ascendente según ingreso

## departamento ponderador sexo edad cond_act ingreso pobre


## 6 COLONIA 519 H 6 Inactivos 0 No pobre
## 9 LAVALLEJA 328 H 15 Inactivos 0 No pobre
## 11 MONTEVIDEO 272 M 13 Inactivos 0 No pobre
## 16 MONTEVIDEO 301 H 12 Inactivos 0 No pobre
## 18 MONTEVIDEO 385 M 29 Inactivos 0 No pobre
## 19 MONTEVIDEO 385 M 1 Inactivos 0 No pobre
Ordenando un data frame order ()
# ordena la base de forma descendente según el ingreso
base[order(base$ingreso,decreasing=TRUE),]

## departamento ponderador sexo edad cond_act ingreso pobre


## 4566 MONTEVIDEO 142 H 37 Ocupados 415333.3 No pobre
## 5687 MONTEVIDEO 327 H 78 Ocupados 341593.0 No pobre
## 9293 MONTEVIDEO 167 H 55 Ocupados 337093.0 No pobre
## 364 MONTEVIDEO 341 H 55 Ocupados 336593.0 No pobre
## 852 MALDONADO 197 H 56 Ocupados 305663.0 No pobre
## 408 MALDONADO 140 H 62 Ocupados 260663.0 No pobre
Ordenando un data frame order ()

Si queremos ordenar el data frame por más de una variable

base[order(base$edad,base$sexo),] # ordena la base por edad y sexo


Estadísticas descriptivas en R
La función summary es una función genérica para resumir distintos tipos de objetos en R, incluyendo
base de datos. Cuando utilizamos summary en un data frame nos devuelve las estadísticas de resumen
para cada una de las variables.

summary(base)
## departamento ponderador sexo edad cond_act ingreso pobre
## MONTEVIDEO :4058 Min. : 24.0 H:5236 Min. : 0.00 Desocupados : 381 Min. : 0 No pobre:9958
## CANELONES :1688 1st Qu.:258.0 M:5876 1st Qu.:17.00 Inactivos :5553 1st Qu.: 0 Pobre :1154
## MALDONADO : 747 Median :314.0 Median :36.00 Ocupados :5178 Median : 7986
## ROCHA : 453 Mean :306.4 Mean :37.11 Mean : 14941
## SALTO : 426 3rd Qu.:359.0 3rd Qu.:55.00 3rd Qu.: 21663
## SAN JOSE : 375 Max. :799.0 Max. :98.00 Max. :415333
## (Other) :3365
Estadísticas descriptivas en R

Si las variables son numéricas nos devuelve mínimo, máximo, media y los cuartiles.

Si la variable es factor nos devuelve las frecuencias absolutas de cada una de las categorías.

Si la variable es carácter (character) no realiza ningún tipo de resumen ya que no la considera


como una variable categórica (carece de categorías)
Estadísticas condicionales en R
Por ejemplo podemos estar interesados solo en aquellas personas mayores de 60 años (edad>60). Para
ello, primero tenemos que definir el subconjunto (subset) y luego calcular las estadísticas de resumen
(summary).

summary(subset(base,edad>60))

## departamento ponderador sexo edad cond_act ingreso pobre


##MONTEVIDEO :773 Min. : 89.0 H: 855 Min. :61.00 Desocupados : 13 Min. : 0 No pobre:1991
##CANELONES :300 1st Qu.:252.0 M:1194 1st Qu.:65.00 Inactivos :1584 1st Qu.: 6600 Pobre : 58
##MALDONADO :124 Median :299.0 Median :71.00 Ocupados : 452 Median : 11020
## ROCHA :114 Mean :293.4 Mean :72.41 Mean : 17140
## SALTO : 74 3rd Qu.:336.0 3rd Qu.:79.00 3rd Qu.: 21100
## COLONIA : 72 Max. :799.0 Max. :98.00 Max. :341593
## (Other) :592
Nota de la sintaxis

R permite anidar funciones, en donde los resultados de una función pasan como argumentos para otra
función.

En este caso, la función subset devuelve un conjunto de datos conteniendo observaciones que
cumplen que edad>60. Este conjunto de datos es pasado a la función summary para obtener las
estadísticas de resumen de dicho subconjunto.
Estadísticas descriptivas en R
R cuenta con varias funciones para calcular distintas estadísticas. Algunas....

sum(base$ponderador)# suma de los ponderadores


## [1] 3404833
mean(base$ingreso) # media del ingreso
## [1] 14940.74
mean(base$ingreso,trim=0.05) # media del ingreso recortado al 5%
## [1] 12106.96
weighted.mean(base$ingreso,base$ponderador) # media ponderada
## [1] 14819.59
Estadísticas descriptivas en R
median(base$ingreso) #mediana del ingreso
## [1] 7986
max(base$edad)# máximo de la variable edad
## [1] 98
min(base$edad)# minimo de la variable edad
## [1] 0
var(base$edad) # varianza de la edad
## [1] 540.7173
sd(base$edad) # desviación estándar de la edad
## [1] 23.25333
Estadísticas descriptivas en R
quantile(base$ingreso) # cuartiles del ingreso
## 0% 25% 50% 75% 100%
## 0.0 0.0 7986.0 21663.0 415333.3

quantile(base$ingreso,0.99) #percentil 99
## 99%
## 94082.77

quantile(base$ingreso,seq(0.1,0.9,0.1)) # deciles del ingreso


## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 0 0 0 4000 7986 13000 18593 25663 38163
Estadísticas descriptivas en R
# Covarianza entre la edad y el ingreso
cov(base$edad,base$ingreso
## [1] 164506.2

# Correlación lineal entre la edad y el ingreso


cor(base$edad,base$ingreso)
Estadísticas condicionales (Continuación) en R
Aprovechemos que estamos trabajando con vectores y seleccionemos elementos que cumplan alguna
condición.

Recordemos que para seleccionar elementos necesitamos []

# media del ingreso de las mujeres


mean(base$ingreso[base$sexo=='M'])
## [1] 11707.51

# media ponderada del ingreso de las mujeres


weighted.mean(base$ingreso[base$sexo=='M'],base$ponderador[base$sexo=='M'])
## [1] 11367.7
Estadísticas condicionales (Continuación) en R

#mediana del ingreso de los hombres mayores de 40 años


median(base$ingreso[base$sexo=='H' &base$edad>40])
## [1] 21025.5

# Desviación estándar del ingreso de las personas del INTERIOR


sd(base$ingreso[base$departamento!='MONTEVIDEO '])
## [1] 18050.94
Estadísticas condicionales (Continuación) en R
# decil de ingreso para los ocupados de 45 años o más
quantile(base$ingreso[base$edad>45 &base$cond_act=='Ocupados ' ],
seq(0.1,0.9,0.1))
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 6100 10464 14163 18000 22363 28163 33663 43526 61183
Estadísticas condicionales (Continuación) en R
Siguiendo la misma lógica, en vez de utilizar la función subset podemos utilizar []

summary(base[base$edad>60,])

## departamento ponderador sexo edad cond_act ingreso pobre


## MONTEVIDEO :773 Min. : 89.0 H: 855 Min. :61.00 Desocupados : 13 Min. : 0 No pobre:1991
## CANELONES :300 1st Qu.:252.0 M:1194 1st Qu.:65.00 Inactivos :1584 1st Qu.: 6600 Pobre : 58
## MALDONADO :124 Median :299.0 Median :71.00 Ocupados : 452 Median : 11020
## ROCHA :114 Mean :293.4 Mean :72.41 Mean : 17140
## SALTO : 74 3rd Qu.:336.0 3rd Qu.:79.00 3rd Qu.: 21100
## COLONIA : 72 Max. :799.0 Max. :98.00 Max. :341593
## (Other) :592
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Para realizar tablas de frecuencias tenemos que utilizar la función table o xtabs(si queremos hacer
tablas con tres variables o más).

table(base$sexo)#Frecuencias de la variable sexo


## H M
## 52365876

table(base$pobre)#Frecuencias de la variable pobre


## No pobre Pobre
## 9958 1154
Tablas de frecuencias/tablas de contingencia table()o xtabs()
#Tabla de contingencia con las variables sexo y pobre

table(base$sexo,base$pobre)
## No pobre Pobre
## H 4711 525
## M 5247 629
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Podemos agregarle las frecuencias marginales a la tabla utilizando la función addmargins

tabla1=table(base$sexo,base$pobre)
addmargins(tabla1)#añade las frecuencias marginales a la tabla 1

## No pobre Pobre Sum


## H 4711 525 5236
## M 5247 629 5876
## Sum 9958 1154 11112
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Si queremos calcular tabla con las frecuencias relativas o condicionales a una variable de la tabla
tenemos que utilizar la función prop.table

prop.table(tabla1)# tabla de frecuencias relativas

## No pobre Pobre
## H 0.42395608 0.04724622
## M 0.47219222 0.05660547
Tablas de frecuencias/tablas de contingencia table()o xtabs()
prop.table(tabla1,1) # Frecuencias condicionadas por la variable sexo (fila)

## No pobre Pobre
## H 0.8997326 0.1002674
## M 0.8929544 0.1070456

prop.table(tabla1,2) # Frecuencias cond. por la variable pobre (columna)

## No pobre Pobre
## H 0.4730870 0.4549393
## M 0.5269130 0.5450607
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Seguimos anidando funciones………

# Tabla de frecuencias relativas con marginales


addmargins(prop.table(tabla1))

## No pobre Pobre Sum


## H 0.42395608 0.04724622 0.47120230
## M 0.47219222 0.05660547 0.52879770
## Sum 0.89614831 0.10385169 1.00000000
Tablas de frecuencias/tablas de contingencia table()o xtabs()
Para realizar tablas para tres o más variables podemos utilizar la función xtabs y luego ftable para
que se vean más lindas
#Tabla de las variables sexo, pobre y con_act
tabla2=xtabs(~sexo+pobre+cond_act, data=base
ftable(tabla2)# pone la tabla más linda
## cond_act Desocupados Inactivos Ocupados
## sexo pobre
## H No pobre 134 1919 2658
## Pobre 27 309 189
## M No pobre 174 2878 2195
## Pobre 46 447 136
Tablas de frecuencias/tablas de contingencia condicionales en R
Seguimos utilizando la misma lógica.

#Tabla de contingencia de sexo con pobre para los OCUPADOS


table(base$sexo[base$cond_act=='Ocupados '],base$pobre[base$cond_act=='Ocupados '])

## No pobre Pobre
## H 2658 189
## M 2195 136
Tablas de frecuencias/tablas de contingencia condicionales en R
#Tabla de las variables sexo, pobre y con_act solo para MONTEVIDEO
tabla3=xtabs(~sexo+pobre+cond_act,data=base[base$departamento=='MONTEVIDEO ',])
ftable(tabla3)

## cond_act Desocupados Inactivos Ocupados


## sexo pobre
## H No pobre 43 629 936
## Pobre 9 144 98
## M No pobre 63 982 856
## Pobre 26 193 79
Estadísticas descriptivas por grupo by()
Podemos realizar estadísticas descriptivas para las variables de nuestro data frame por grupos (by).

by(base,base$sexo,summary)# estadísticas descriptivas por sexo


#base$sexo: H
#departamento ponderador sexo edad cond_act ingreso pobre
# MONTEVIDEO :1859 Min. : 84.0 H:5236 Min. : 0.00 Desocupados : 161 Min. : 0 No pobre:4711
# CANELONES : 806 1st Qu.:288.0 M: 0 1st Qu.:16.00 Inactivos :2228 1st Qu.: 0 Pobre : 525
# MALDONADO : 355 Median :336.0 Median :34.00 Ocupados :2847 Median : 12000
# ROCHA : 213 Mean :327.4 Mean :35.59 Mean : 18569
# SALTO : 211 3rd Qu.:372.0 3rd Qu.:53.00 3rd Qu.: 27012
# SORIANO : 169 Max. :588.0 Max. :97.00 Max. :415333
# (Other) :1623
#----------------------------------------------------------------------------------------------------------------
#base$sexo: M
#departamento ponderador sexo edad cond_act ingreso pobre
# MONTEVIDEO :2199 Min. : 60.0 H: 0 Min. : 0.00 Desocupados : 220 Min. : 0 No pobre:5247
# CANELONES : 882 1st Qu.:276.0 M:5876 1st Qu.:18.00 Inactivos :3325 1st Qu.: 0 Pobre : 629
# MALDONADO : 392 Median :324.0 Median :37.00 Ocupados :2331 Median : 6000
# ROCHA : 240 Mean :314.8 Mean :38.47 Mean : 11708
# SALTO : 215 3rd Qu.:360.0 3rd Qu.:56.00 3rd Qu.: 17000
# SAN JOSE : 208 Max. :588.0 Max. :98.00 Max. :217443
# (Other) :1740
Estadísticas descriptivas por grupo by()

Observación: si queremos que los resultados estén en un data frame tenemos que utilizar la función
aggregate.

Con aggregate podemos calcular para más de una variable al mismo tiempo, pero solo podemos utilizar una
función que el resultado sea un vector de 1 elemento.
Estadísticas descriptivas por grupo aggregate()
Calculamos la edad promedio para la edad y el ingreso, según las variables sexo y pobre

aggregate(base[,c('edad','ingreso')],list(pobre=base$pobre,sexo=base$sexo),mean)

##pobre sexo edad ingreso


## 1 No pobre H 36.88771 20244.428
## 2 Pobre H 23.93143 3536.476
## 3 No pobre M 40.10349 12839.552
## 4 Pobre M 24.86010 2264.245
Estadísticas descriptivas por grupo con el paquete doBy
Con la función summaryBy podemos calcular al mismo tiempo distintas estadísticas y para distintas
variables por grupo
library(doBy)
# cant. de casos, promedio, desviación est. para el ingreso y edad según las
# variables sexo y pobre
summaryBy(edad+ingreso~sexo+pobre, data=base,FUN=c(mean,sd,length))

# sexo pobre edad.mean ingreso.mean edad.sd ingreso.sd edad.length ingreso.length


# 1 H No pobre 36.88771 20244.428 22.61055 26639.772 4711 4711
# 2 H Pobre 23.93143 3536.476 19.50208 5451.228 525 525
# 3 M No pobre 40.10349 12839.552 23.73317 17318.186 5247 5247
# 4 M Pobre 24.86010 2264.245 18.41626 3717.196 629 629
Introduciendo la Interfaz de fórmula ~

El símbolo ~ nos está indicando que vamos a modelar las variables edad e ingreso en función de
las variables sexo y pobre.

Las variables en la fórmula son buscadas automáticamente en el data frame base.

Está manera es también utilizada en los modelos de regresión.


Creando Funciones (hágalo usted mismo) en R
La versatilidad del R nos permite calcular nuestras propias funciones.

Para introducir el concepto imaginemos que queremos calcular el Indice de Gini (obviamente hay un
paquete que lo hace!)
𝑛+1 2 × ∑𝑛𝑖=1 𝑖𝑥𝑖
𝐺=[ ]−[ 𝑛 ]
𝑛 𝑛 × ∑𝑖=1 𝑥𝑖
La estructura de una función es la siguiente
function (argumentos) {
“Lo que queremos que haga la función”
return(objetos)
}
Creando Funciones (hágalo usted mismo) en R
G=function(x)
{
x=sort(x) #ordena el vector de ingresos
n=length(x)# tamaño del vector de ingresos
i=1:n #genera la secuencia de 1 hasta n
G=(n+1)/n - (2*sum((n+1-i)*x)/(n*sum(x))) #calcula el GINI
return(G) #nos devuelve el GINI
}
G(base$ingreso) #gini con toda la muestra
# [1] 0.6427655
G(base$ingreso[base$cond_act=='Ocupados ']) # gini solo con los ocupados
# [1] 0.4258947
Creando Funciones (hágalo usted mismo) en R
Nuestra función G ya es una más del R. Utilicémosla en el aggregate para calcular el Gini por
departamento.

aggregate(base$ingreso,list(dpto=base$departamento),G)
## dpto x
##1 ARTIGAS 0.6444840
##2 CANELONES 0.6409384
##3 CERRO LARGO 0.6380796
##4 COLONIA 0.5525926
##5 DURAZNO 0.6536870
##6 FLORES 0.6635737
##7 FLORIDA 0.6272090
##8 LAVALLEJA 0.6072111
Recodificando variables cut()
Cuando queremos realizar análisis estadísticos desagregados por una variable cuantitativa (edad,
ingreso, etc.) puede ser útil recodificarla en tramos.

# Define los tramos de edad. Inf<infinito> vamos hasta el mayor


cortes=c(0,20,40,60,Inf)
#crea una nueva variable con los tramos de edad
base$tramo_edad=cut(base$edad,cortestable(base$tramo_edad)

## (0,20] (20,40] (40,60] (60,Inf]


## 3287 2844 2801 2049

La función por defecto define los intervalos abiertos por la izquierda y cerrados por la derecha.
Recodificando variables cut()
Observación: nos devuelve un factor.

Si queremos hacer los tramos cerrados por la izquierda y abiertos por la derecha

# Define los tramos de edad. Inf<infinito> vamos hasta el mayor


cortes=c(0,20,40,60,Inf)
base$tramo_edad=cut(base$edad,cortes,right=FALSE)
table(base$tramo_edad)

## [0,20) [20,40) [40,60) [60,Inf)


## 3264 2846 2829 2173
Recodificando variables cut()
Podemos ponerle etiquetas (labels)

base$tramo_edad=cut(base$edad,cortes,right=FALSE,labels=c('t1','t2','t3','t4')

## t1 t2 t3 t4
## 3264 2846 2829 2173
Recodificando variables cut()
Calculemos una variable que identifique al quintil de ingreso al cual pertenece la persona. Trabajemos
solo con los ocupados.

ocup=base[base$cond_act=='Ocupados ',]
quintiles=quantile(ocup$ingreso,c(0.20,0.40,0.60,0.80))
cortes=c(0,quintiles,Inf)
ocup$quintil=cut(ocup$ingreso,cortes,right=FALSE,label=c('Q1','Q2','Q3','Q4'
,'Q5'))
Recodificando variables cut()
table(ocup$quintil,ocup$sexo)

## H M
## Q1 433 572
## Q2 527 538
## Q3 567 452
## Q4 641 412
## Q5 679 357
La función ifelse ()
Una función muy útil cuando estamos trabajando con base de datos es ifelse, la cual nos permite
realizar distintas “cosas” dependiendo de que se cumpla o no cierta condición.

¿Cómo funciona?

ifelse(condición/es, a1, b1).


Si la condición es verdadera (TRUE) devuelve a1, en cambio si la condición es falsa (FALSE)
devuelve a2.
La función ifelse ()
Para introducir la función pensemos que se está evaluando la posibilidad de introducir un nuevo
impuesto (trabajemos con el data frame ocup).
Dicho impuesto corresponde al 20% de su ingreso pero solo es aplicable para aquellos que perciben un
ingreso mayor a 70000 pesos.
Definamos una variable llamada impuesto1 que indique el monto del impuesto a pagar para cada una
de las personas

ocup$impuesto1=ifelse(ocup$ingreso>70000,ocup$ingreso*0.20,0)
sum(ocup$impuesto1)

## [1] 4894529
La función ifelse ()

Ahora pensemos que dicho impuesto solo será aplicado a las personas mayores de 40.

ocup$impuesto2=ifelse(ocup$ingreso>70000&ocup$edad>40,ocup$ingreso*0.20,0)
sum(ocup$impuesto2)

## [1] 3857190
Distribuciones de probabilidad en R
Para cada una de las distribuciones de probabilidad hay cuatro funciones que computan diferentes cosas.
Los argumentos en las funciones dependen de los parámetros que describen a las distribuciones de
probabilidad.

"d"= computa la altura de la función de densidad en un punto en el caso de una función continua
(𝑓(𝑥)) y la función de cuantía en el caso de una v.a discreta (𝑝(𝑥) = 𝑃[𝑋 = 𝑥])
"p"= computa la función de distribución evaluada en un punto (𝐹 (𝑥) = 𝑃[𝑋 ≤ 𝑥])
"q"= computa el inverso de la función de distribución, es decir, los cuantiles (𝑃[𝑋 ≤ 𝒙𝜶 ] = 𝛼)
"r"= computa número aleatorios de la distribución de probabilidad
Distribución Normal 𝑋~𝑁(𝜇, 𝜎) en R
Los argumentos para cualquiera de las cuatro funciones son mean (𝜇 = media) y sd (𝜎 = desviación
estándar).

#función de densidad de una normal estándar evaluada en 2


dnorm(2,mean=0,sd=1)
[1] 0.05399097

#función de distribución de una normal estándar evaluada en 1.96


pnorm(1.96,mean=0,sd=1)
#[1] 0.9750021
Distribución Normal 𝑋~𝑁(𝜇, 𝜎) en R
#Percentil 50 de una normal con media 5 y desviación estándar 10
qnorm(0.5, mean=5, sd=10)

#[1] 5

#Deciles de una normal estándar


qnorm(seq(0.1,0.9,0.1), mean=0, sd=1)

#[1] -1.2815516 -0.8416212 -0.5244005 -0.2533471 0.0000000 0.2533471


#0.5244005 0.8416212 1.2815516
Distribución Normal 𝑋~𝑁(𝜇, 𝜎) en R
#Genera 1000 observaciones provenientes de una distribución normal con media
100 y desviación #estándar 25

rnorm(n=1000,mean=100,sd=25)
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom
Los argumentos para cualquiera de las cuatro funciones son:

size (𝑛 = cantidad de pruebas)


prob (𝑝 = probabilidad de éxito).

#probabilidad de 3 éxitos en una distribución binomial con n=10 y p=0.20


dbinom(3,size=10,prob=0.20)

#[1] 0.2013266
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom

#para todo el recorrido en una distribución binomial con n=10 y p=0.20


dbinom(0:10,size=10,prob=0.20)

# [1] 0.1073741824 0.2684354560 0.3019898880 0.2013265920 0.0880803840


#0.0264241152 #0.0055050240 0.0007864320 0.0000737280 0.0000040960
#0.0000001024

#probabilidad de 5 éxitos o menos en una binomial con n=10 y p=0.20


pbinom(5,size=10,prob=0.20)

#[1] 0.9936306
Distribución Binomial 𝑋~𝐵𝑖𝑛(𝑛, 𝑝) binom
#Mediana de una distribución binomial con n=10 y p=0.20
qbinom(0.5,size=10,prob=0.20)

#[1] 2

#Genera 500 obs. provenientes de una distribución binomial con n=10 y p=0.20

rbinom(500,size=10,prob=0.20)
Otras distribuciones de probabilidad continuas

Distribución beta dbeta Distribución F df


Distribución Cauchy dcauchy Distribución t-student dt
Distribución Chi cuadrado dchisq Distribución log normal dlnorm
Distribución Exponencial dexp Distribución Gamma dgamma
Distribución Uniforme dunif Distribución Weibull dweibull
Otras distribuciones de probabilidad discretas

Distribución geométrica dgeom Distribución Hipergeométrica dhyper


Distribución Multinomial dmultinom Distribución binomial negatica dnbinom
Distribución Poisson dpois
Gráficos en R
R produce distintos tipos de gráficos, los cuales, pueden ser guardados en distintos formatos: PDF,
PNG, JPEG, BMP, Etc.

Dos aspectos importantes:

El gráfico tiene que “decirnos algo” (ese es tu problema).


El gráfico debe ser legible (el R nos puede ayudar)
Gráficos en R

A tener en cuenta:

Los ejes deben ser etiquetados


Los colores pueden ser muy útiles
Diferentes tipos de líneas o puntos usualmente deben ser etiquetados
Los puntos graficados uno encima del otro no se van a ver
Gráficos en R
La función en particular que necesitemos para realizar los gráficos dependerá de cuantas variables
tenemos y el patrón de los datos que queremos resaltar.

Vamos a presentar los gráficos en tres secciones:

- Gráficos para una variable


- Gráficos para dos variables.
- Gráficos especiales para casos particulares
Gráficos para una variable en R
Cuando trabajamos con una variable, el tipo de gráfico dependerá de la naturaleza de la variable
(cualitativa o cuantitativa) y lo que queremos resaltar de los datos.

Si la variable es cuantitativa podemos realizar:


o Histograma
o Diagrama de caja

En cambio si la variable es cualitativa podemos hacer:


o Diagrama de barras
o Diagrama de torta
Histogramas hist()
La función posee muchos argumentos, pero nos centraremos en los más utilizados en la práctica que
permiten logra que el gráfico sea legible. Como primer paso tenemos que especificarle a la función
hist cuál es la variable que queremos graficar.

# genera una semilla para que podamos obtener siempre lo mismo


set.seed(1234567)
#generamos 1000 observaciones de una normal N(100,20)
x=rnorm(1000,100,20)
#Hacemos el histograma
hist(x)
Histogramas hist()
Histogramas hist()
Cuando tenemos una cantidad grande observaciones podemos querer hacer más barras para poder
apreciar de mejor forma la distribución.

Esto se logra utilizando el argumento brakes.

Por ejemplo, construimos el histograma con 50 barras.

#histograma con 50 barras


hist(x, breaks=50)
Histogramas hist()
Histogramas hist()
Luego, podemos ponerle titulo al gráfico, etiquetas a los ejes y colores a las barras.

Para ello, tenemos que utilizar los argumentos title, xlab, ylab y col respectivamente.

hist(x,breaks=50,col='orange', main='Aca ponemos el título', xlab='Nombre de


la variable' ,ylab='Frecuencia')
Histogramas hist()
Nota de la sintaxis

Los argumentos title, xlab, ylab y col2 pertenecen a todas las funciones que realizan otros tipos
de gráficos.

2
Por más colores ver http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf
Histogramas hist()

hist(ocup$ingreso[ocup$ingreso<150000],30,main='Distribución del ingreso',


xlab='ingreso (en pesos)',ylab='Cantidad de personas', col='lavender',
prob=TRUE)

#graficamos la densidad estimada del ingreso


lines(density(ocup$ingreso[ocup$ingreso<150000]),col='red',lwd=2)
Histogramas hist()
Histogramas hist()
Ahora en logaritmos y trabajamos con todos los ingresos!

hist(log(ocup$ingreso),50,main='Distribución del ingreso (en logartimos)',


xlab='ingreso (en logaritmos)',ylab='Cantidad de personas',
col='darkslategray4',prob=TRUE)

lines(density(log(ocup$ingreso)),col=' darkslategrey',lwd=2)
Histogramas hist()
Diagrama de caja boxplot()
La lógica de la función boxplot es igual al histograma.

Podemos querer que el diagrama este horizontal o vertical (por defecto horizonal=FALSE) y cuál es el
rango que utilizamos para definir que una observación es atípica (por defecto range=1.5)

par(mfrow=c(1,2))#Nos permite hacer más de un gráfico al mismo tiempo


boxplot(x,main='Diagrama de caja vertical',col='green')
boxplot(x,horizontal=TRUE,range=0,main='Diagrama de caja
horizontal',col='yellow')
Diagrama de caja boxplot()
Diagrama de caja boxplot()
Utilizando la fórmula ~ podemos realizar diagramas de caja para una variable segmentada por otra
variable, por ejemplo, del ingreso según quintil

#creamos una base con los ingresos menor a 100.000 pesos


ocup1=ocup[ocup$ingreso<100000,]

boxplot(ocup1$ingreso~ocup1$quintil,col='darkolivegreen', main='Ingreso por


quintil', xlab='Quintil de ingreso',ylab='ingreso(pesos)')
Diagrama de caja boxplot()
Diagrama de caja boxplot()
boxplot(ocup1$ingreso~ocup1$quintil*ocup1$sexo,col=c(rep("slategray1",5)
,rep("slategray4",5)) , main='Ingreso por quintil y sexo', xlab='Quintil de
ingreso',ylab='ingreso(pesos)')
Diagrama de barras barplot()
Para realizar un diagrama de barras como paso previo tenemos que calcular las frecuencias (cuantas
veces se repite cada una de las categorías de la variable) de la variable utilizando la función table.

sexo=c(rep('Hombre',25),rep('Mujer',55))
tabla_sexo=table(sexo)
barplot(tabla_sexo,col=c('blue','red'),main='Cantidad de personas por sexo')
Diagrama de barras barplot()
tabla1=table(base$pobre,base$sexo)
barplot(tabla1,xlab="Sexo", col=c("slategray1","slategray4"),legend
=c('Pobre','No pobre'), main="Distribución por sexo y edad", beside=TRUE)
Diagrama de tarta pie()
La lógica para realizar un diagrama de tarta es exactamente igual al del diagrama de barras

pie(tabla_sexo,col=c('blue','red'))
Diagrama de dispersión plot()
set.seed(23112013)
x=runif(100,10,50)
y=x+rnorm(100,30,10)
plot(x,y,cex=2,pch=21,col='steelblue',bg='lightsteelblue1')

abline(lm(y~x),lwd=2,col='dodgerblue4')
Diagrama de dispersión plot()
Pirámide de población pyramid.plot

library(foreign)
library(survey)
library(plotrix)#carga el paquete para hacer pirámides (y otros)
# levanta la ECH
base=read.spss("ECH 2013.sav",to.data.frame=TRUE,use.value.labels=FALSE)

# define tramos quiniquenales


cortes_edad=c(seq(0,85,5),Inf)
base$tramo_edad=cut(base$edad,cortes_edad,include.lowest=TRUE,right=FALSE)#c
rea los tramos
Pirámide de población pyramid.plot
#carga el diseño muestral
ps=svydesign(id=~1,weights=~pesoano,data=base)
# calcula las frecuencias por tramo de edad y sexo
tabla_edad=svytable(~tramo_edad+sexo,ps)
# expresa la tabla en porcentajes
tabla_edad=tabla_edad/sum(tabla_edad)*100
# etiquetas de los tramos de edad
etiquetas=c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-
44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80-44","85+")
Pirámide de población pyramid.plot
pyramid.plot(tabla_edad[,1],tabla_edad[,2],lxcol=' steelblue', rxcol='
firebrick', show.values=TRUE, labels=etiquetas,
top.labels=c('Hombre','Edad','Mujer'),main='Píramide de población - Uruguay
- Año 2013 ')
Pirámide de población pyramid.plot
Graficando series de tiempo
tasas=read.csv('mercado de trabajo.csv',header=TRUE)
#mes año actividad empleo desempleo
# 1 ene 2006 63.1 55.3 12.3
# 2 feb 2006 59.7 52.9 11.5
# 3 mar 2006 60.4 52.8 12.5
# 4 abr 2006 60.5 54.0 10.8
# 5 may 2006 62.0 55.5 10.4
# 6 jun 2006 60.3 54.2 10.1
Debemos indicar al R que son series de tiempo, para ello utilizamos la función ts

desempleo=ts(tasas$desempleo,start=c(2006,1),frequency=12)
Graficando series de tiempo
plot(desempleo,ylim=c(0,15),lwd=2,col='royalblue1',main='Tasa de desempleo
2006 - 2013')
lines(decompose(desempleo)$trend,col='orangered',lwd=2)
Graficando mapas
El paquete survey

El paquete contiene funciones para calcular estimaciones y sus respectivas precisiones (varianza,
desviación estándar e intervalos de confianza) cuando los datos provienen de muestras aleatorias que
fueron seleccionadas bajo diseños muestrales complejos (muestreo por conglomerados, en varias etapas,
estratificado, proporcional al tamaño, etc).

Para ver cómo funciona el paquete Survey, vamos a suponer que la muestra de hogares de
Montevideo fue seleccionada bajo distintos diseños muestrales. La especificación del diseño muestral
repercutirá en las estimaciones puntuales y en el cálculo de las estimaciones de las varianzas de los
estimaciones (y por ende en las amplitudes de los intervalos de confianza).
El paquete survey
Como primer paso tenemos que cargar el paquete Survey

#carga el paquete survey


library(survey)

Segundo paso, tenemos que especificar el diseño muestral(svydesign) que fue utilizado para
seleccionar la muestra. Esto implica indicarle al Survey cuáles son los ponderadores o probabilidades
de inclusión de los individuos de la muestra, los estratos (si es que los hay), las tasas de muestreo (si es
que las hay) e indicar la cantidad de etapas de selección (si es que las hay).

La función tiene muchos argumentos, pero nos centraremos en argumentos que nos permitan ponderar
nuestra muestra.
El paquete survey
svydesign(ids, probs=NULL, strata = NULL, fpc=NULL, weights=NULL,data=NULL)

ids Formula o variables que especifiquen las etiquetas de los clusters (primera etapa, segunda etapa, etc.).
Si el diseño muestral no tiene clusters, id=~1.
probs Variables indicando las probabilidades de inclusión en cada una de las etapas de muestreo.
strata Variable que indique el estrato al que pertenece cada una de las unidades de la muestra
fpc Factor de corrección por población finita: variable indicando las tasas de muestreo o los tamaños de la
población .
weights Variable que indique los ponderadores de la muestra
data Data frame con la muestra.
El paquete survey
Una vez definido el diseño podemos calcular estimaciones para:
totales (svytotal),
medias (svymean)
percentiles (svyquantile),
tablas (svytable)
razón entre dos variables (svyratio)
modelos de regresión (svyglm)
gráficos (svyhist,svyplot).

También podemos realizar las estimaciones para distintos dominios (svyby)


El paquete survey
#carga el diseño
ps=svydesign(id=~1,weights=~ponderador,data=base)

#ingreso promedio
svymean(~ingreso,ps)
# mean SE
# ingreso 14790 204.35

#Frecuencia de la variable cond_act


svytable(~cond_act,ps)
# cond_act
# Desocupados Inactivos Ocupados
# 117256 1701459 1586118
El paquete survey
#Tabla de condición de actividad por sexo
svytable(~cond_act+sexo,ps)
# sexo
# cond_act H M
# Desocupados 49796 67460
# Inactivos 684630 1016829
# Ocupados 891491 694627

#ingreso promedio por departamento


svyby(~ingreso,~departamento,ps,svymean)

# departamento ingreso se
# ARTIGAS ARTIGAS 10939.671 963.0618
# CANELONES CANELONES 13850.623 482.9115
# CERRO LARGO CERRO LARGO 11527.024 1169.4040
# COLONIA COLONIA 14554.338 844.8672

S-ar putea să vă placă și