Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PARTE 1
Introducción
R es un entorno y lenguaje de programación con enfoque al análisis estadístico. Es uno de los lenguajes más utilizados
en investigación por la comunidad científica. Proporciona un amplio abanico de herramientas gráficas y estadísticas
(modelos lineales y no lineales, tests estadísticos, análisis de series temporales, algoritmos de clasificación y
agrupamiento, etc.). Además, al tratarse de un lenguaje de programación, permite que los usuarios lo extiendan
definiendo y compartiendo sus propias funciones.
R es parte de la Fundación de Software Libre (Free Software Foundation) y es distribuido bajo la licencia GPL del
proyecto GNU. Esto implica que R es gratis y además de código abierto, es decir, cualquiera puede ver "qué hay
adentro". En este sentido está en contraposición con el modelo estándar del software comercial, en el que cada
programa es como una "caja negra" que produce salidas (outputs) a partir de entradas (inputs) sin mostrar los pasos
intermedios. En la práctica esto se traduce en un software construido en colaboración por una lista siempre creciente
de contribuyentes.
Trabajaremos con RStudio, un entorno de desarrollo integrado (Integrated Development Environment, IDE) que ofrece
una interfaz gráfica más amigable y que facilita la interacción con R. Está disponible en dos versiones: una de código
abierto y otra comercial. Ambas se pueden ejecutar localmente (descargando la aplicación RStudio Desktop para
Windows, Mac o Linux) o directamente desde un navegador conectado al servidor RStudio Server (solo disponible
para plataformas Linux).
Objetos y Clases
R es un lenguaje de programación orientado a objetos (OOP). Variables, tablas, vectores, números, funciones, etc.,
todos son objetos, y cada clase de objeto tiene diferentes atributos que determinan la forma en que trabajan dentro
de R. Algunas de las clases más comunes de objetos son: 'integer', 'numeric', 'character', 'logical', 'matrix', 'data.frame',
'list', 'function', 'ts' (serie de tiempo). Es importante estar atento a los tipos de objetos con los que estamos trabajando
ya que de esto dependen las operaciones o funciones que podemos aplicarles.
Para crear un vector llamado x que contenga los números 10.4, 5.6, 3.1, 6.4 y 21.7, podemos usar la función c() del
siguiente modo:
> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
Para acceder al tercer elemento del vector (el número 3.1), podemos escribir:
> x[3]
Los vectores son el tipo básico de objeto en R, pero existen otras clases de objetos:
● las matrices, que son colecciones bidimensionales de datos del mismo tipo. Para seleccionar el elemento que
está en la intersección de la fila 2 y la columna 1 de la matriz llamada mi_matriz:
> mi_matriz[2,1]
Si las filas y columnas tienen nombre, se puede acceder a los elementos indicando entre corchetes dichos
nombres. Si la fila o la columna se omiten, se devuelven todos los respectivos elementos. Por ejemplo, si
queremos listar todos los elementos de la columna “Melbourne” de la matriz vn del paquete fpp2:
> vn[ , “Melbourne”]
___________________________________
* Material preparado por Marcos L. De Vito, adscripto a la cátedra de Investigación Operativa II, Escuela de Ingeniería
Industrial, Facultad de Ciencias Exactas, Ingeniería y Agrimensura, Universidad Nacional de Rosario. 2018.
● Los objetos de clase "factor" son objetos que sirven para trabajar con variables categóricas, como pueden ser
franjas etarias, nombres de especies o lugares.
● las hojas de datos (data.frame), que son objetos bidimensionales similares a las matrices pero en los que las
columnas son vectores que pueden ser de distinto tipo.
● las listas, que son una forma generalizada de vector cuyos componentes pueden ser de distinto tipo y a
menudo son vectores, matrices o incluso otras listas. Son sucesiones de objetos.
● los objetos serie de tiempo (time series) son similares a los vectores pero incluyen además un índice de
tiempo para cada observación, la frecuencia de la muestra y el incremento de tiempo entre observaciones. Por
ejemplo, el objeto serie de tiempo gas (del paquete forecast) muestra la producción mensual de gas en
Australia entre enero de 1956 y agosto de 1995 (a cada observación le corresponde un índice de tiempo
formado por un año y un mes):
> gas
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1956 1709 1646 1794 1878 2173 2321 2468 2416 2184 2121 1962 1825
1957 1751 1688 1920 1941 2311 2279 2638 2448 2279 2163 1941 1878
1958 1773 1688 1783 1984 2290 2511 2712 2522 2342 2195 1931 1910
…
1993 37059 37963 31043 41712 50366 56977 56807 54634 51367 48073 46251 43736
1994 39975 40478 46895 46147 55011 57799 62450 63896 57784 53231 50354 38410
1995 41600 41471 46287 49013 56624 61739 66600 60054
La cantidad de clases de objetos es muy grande y crece permanentemente, acompañando la creación de nuevos
paquetes de R. Casi en cada paquete existen funciones que devuelven objetos de clases únicas que sólo esa función
puede generar y cuya interpretación y funcionalidad es específica del paquete en cuestión o de otros creados
posteriormente y que dependen del mismo. Por ejemplo las clases "igraph" o "markovchain" de los paquetes igraph y
markovchain definen objetos asociados a trabajo con grafos y Cadenas de Markov, respectivamente.
2
Paquetes (Packages). Instalación y carga.
Todas las funciones, conjuntos de datos y documentación de R están almacenados en paquetes. Algunos paquetes
básicos ya vienen preinstalados y cargados y contienen funcionalidades elementales (por ejemplo los operadores
aritméticos suma, resta, multiplicación y división), conjuntos de datos y funciones gráficas y estadísticas estándar.
Para expandir estas funcionalidades básicas hay miles de paquetes específicos (por ejemplo el paquete forecast que
incluye funciones para pronóstico de Series de tiempo) que están disponibles y pueden descargarse desde CRAN
(https://CRAN.R-project.org/) o directamente en el menú Herramientas de RStudio.
Para instalar un paquete (por ejemplo, el paquete forecast) escribir en la Consola la instrucción:
> install.packages("forecast")
o en RStudio, en el menú Herramientas (Tools) seleccionar Instalar Paquetes (Install Packages).
Funciones
Para llevar a cabo una acción específica sobre algún objeto, R dispone de las funciones. En general, una función acepta
argumentos de entrada y devuelve como salida uno o más valores (o ninguno).
Esquemáticamente:
Por ejemplo, la función sd() aplicada al vector vect_valores (argumento de entrada de la función) devuelve la desviación
estándar de los valores de dicho vector (valor de salida).
Sintaxis de una función: se escribe el nombre de la función y a continuación y entre paréntesis sus argumentos. Por
ejemplo:
> vect_valores <- c(1,5,6,7)
> sd(vect_valores)
3
En la Consola veremos el valor de salida:
[1] 2.629956
En el panel de ayuda encontraremos una descripción de la función, el listado de sus argumentos, qué tipo de valores de
salida genera, ejemplos, referencias bibliográficas, etc.
Por ejemplo, para saber más de la función sd() escribimos ?sd en la consola y en el panel de Ayuda encontraremos,
entre otra información, la sintaxis de la función:
Cuando escribimos los valores de los argumentos de una función, R los asigna a los respectivos argumentos con tres
criterios:
● Por nombre, cuando se explicita el nombre del argumento y luego el valor que asume.
> sd ( x=vect_valores , na.rm=FALSE )
● Por posición.
> sd ( vect_valores , FALSE )
En este caso R asigna el valor vect_valores al primer argumento (x) y el valor FALSE al segundo
argumento (na.rm).
● Por nombre y/o posición.
> sd ( vect_valores , na.rm=FALSE )
En este caso R asigna al primer argumento por posición y al segundo por nombre.
Cualquiera de las tres formas dará el mismo resultado.
4
En la ventana que se abre, hacer clic en el botón Browse y seleccionar el directorio donde está el archivo a importar.
Ajustando las opciones de importación se puede elegir la hoja de la planilla, el rango a importar, el nombre que se le
quiere dar al conjunto de datos, etc. Es interesante ver el código resultante de esos ajustes en la ventana “Code
Preview”.
Al hacer clic en el botón Import se ejecuta el código y se crea así un objeto tipo tibble (data.frame) con los datos de la
planilla Excel y cuyo nombre es el que se asignó en las opciones de importación . Para poder utilizar las funciones de
análisis de serie de tiempo y pronóstico es necesario transformarlo en objeto de clase ts (time series).
5
Análisis de series de tiempo en R
Comúnmente, la tarea de pronosticar involucra como primer paso un análisis exploratorio preliminar de los datos. A
través de gráficos y diferentes pruebas se intenta detectar outliers e identificar patrones y relaciones entre variables.
Dado un objeto que no sea del tipo time series, se le puede aplicar la función ts() para crear un objeto serie de tiempo.
Analicemos en detalle algunos de sus argumentos de mayor utilidad:
ts ( data = NA , start = 1 , frequency = 1 , … )
Es el vector o matriz de los valores observados de la serie, sin las fechas. Es un argumento opcional que por
data defecto asume el valor NA (“Not Available”, que se interpreta como valor ausente o vacío). Si no se asigna ningún
valor a este argumento, se crea un objeto serie de tiempo con un valor NA como única observación.
Información de la primera observación. Puede ser un número o un vector con dos enteros. También es opcional y
por defecto asume el valor 1, que significa que a la primera observación le asigna este índice y a las sucesivas los
start valores 2, 3, 4… Si quisiéramos que los índices estén relacionados a años y períodos específicos hay que indicarlo
mediante un vector de la forma c(año,período). Por ejemplo, si los datos corresponden a observaciones
mensuales desde marzo de 2008, deberíamos escribir start=c(2008,3).
Por ejemplo, creemos un vector llamado vector_datos_demanda con los valores registrados de las ventas anuales, en
miles de unidades, de un producto durante 8 años, comenzando en 2010:
> vector_datos_demanda <- c(10, 6, 11, 8, 10, 3, 6, 9)
Podemos crear el objeto serie de tiempo a partir de ese vector usando la función ts():
> ts_datos_demanda <- ts ( data=vector_datos_demanda , start=2010 )
Grafiquemos ambos objetos (recordar que la función genérica plot() da diferentes salidas según sea la clase de objeto
que se pretende graficar):
> plot(vector_datos_demanda)
> plot(ts_datos_demanda)
6
Gráficos y tests de hipótesis para analizar la serie de tiempo e identificar patrones
plot ( x, main = NULL, sub = NULL, xlab = NULL, ylab = NULL, type= “l”, pch= “1”, col= 1, lty= 1, lwd= 1, …)
sub Subtítulo.
type Tipo de gráfico: “p” (puntos), “l” (líneas; valor por defecto), “o” (overplotted, puntos y líneas), “h” (histograma), etc.
pch2 Tipo de punto. pch=1 es el valor que asume por defecto. Otros tipos de puntos:
col Color. Puede especificarse de muchas maneras. Una es con el nombre del color, en inglés: col=”red”, col=”blue” o
col=”green”. Otra es con un número entero: col=1 (negro; valor por defecto), col=2(rojo), col=3 (verde), col=4 (azul),
etc.
lty Tipos de línea. Pueden especificarse como enteros (1=sólido; valor por defecto, 2=línea de trazos, 3=línea de
puntos, 4=punto y trazo, 5=trazo largo, 6=trazo largo y corto) o como texto ("solid", "dashed", "dotted",
"dotdash","longdash" o "twodash", respectivamente)
lwd Espesor de la línea. valor por defecto: ldw=1. lwd=2 significa doble de espesor que el espesor por defecto, lwd=3 el
triple, etc.
> plot(ts_datos_demanda, main="Ventas anuales", ylab="Ventas [miles de unidades]", type="o", pch=16, col=4, lty=2,
lwd=2)
1
Para más detalles de los parámetros gráficos, consultar la función par().
2
Válido solo si en type se especificó un tipo de gráfico con puntos. Para más información y otros estilos de puntos:
help(points)
7
Gráfico estacional. Función ggseasonplot().
Es similar al gráfico de la función plot() excepto que ahora los datos de cada estación están superpuestos. Este tipo de
gráfico permite que el patrón estacional sea identificado más claramente, y es especialmente utilizado para detectar
posibles cambios del patrón a lo largo del tiempo. Si hay suficientes datos, también sirve para identificar la tendencia.
Veamos un ejemplo con la serie AirPassangers (cantidad de pasajeros de una aerolínea entre 1949 y 1960, en miles de
pasajeros) del Paquete datasets.
plot(AirPassengers)
ggseasonplot(AirPassengers, main="Grafico estacional: Pasajeros aerolinea", xlab="Meses", ylab="miles de pasajeros",
year.labels = TRUE)
8
Una variante interesante de este tipo de gráfico utiliza coordenadas polares. Al definir el argumento polar=TRUE
obtenemos el siguiente gráfico:
Un gráfico alternativo que enfatiza el patrón estacional se obtiene con la función ggsubseriesplot(), en el que los datos
de cada período se agrupan y grafican en pequeños gráficos.
9
Correlogramas. Funciones acf() y ggAcf().
Un gráfico también muy utilizado para analizar las características de la serie de tiempo es el correlograma, que grafica
los coeficientes de autocorrelación en función del rezago k.
El listado de los coeficientes de autocorrelación se puede obtener con la función acf(), del siguiente modo:
La función acf() tiene como salida los valores: lag, acf (los coeficientes de correlación), type (tipo de correlación),
n.used, series y snames. El símbolo $ luego de la función se utiliza para indicar que solo queremos que nos devuelva la
salida especificada; en nuestro caso, los coeficientes de correlación.
Función gglagplot()
ts_AUTOCORR <- ts(data=c(82,110,117,152,86,112,130,174,88,119,128,181,91,134,141,196),frequency = 4)
gglagplot(ts_AUTOCORR,lags = 9, do.lines = FALSE,diag = FALSE)
10
Ruido blanco - Tests de hipótesis
Aplicaremos las diferentes pruebas al Ejemplo 2-1 del apunte de teoría. Los datos correspondientes fueron guardados
en un objeto de serie de tiempo llamado ts_Ejemplo2_1.
lag Cantidad de rezagos (m) a incluir en el cálculo de los estadísticos QBP y QLB. Por defecto, lag=1.
fitdf Cantidad de grados de libertad (p) a sustraer si la serie analizada es una serie de residuos. p es el número de
parámetros del método aplicado.
2
parameter Grados de libertad de la distribución 𝟀 del estadístico de prueba. df=24
11
Si se desean aplicar test estadísticos formales, se pueden utilizar las funciones:
Función Prueba Paquete
En nuestro ejemplo, para obtener el valor del estadístico JB del contraste de Jarque-Bera, escribimos:
> jarque.bera.test(ts_Ejemplo2_1)$statistic
Y en la Consola obtenemos:
t = -0.803, df = 99, p-value = 0.4239
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-1.4321311 0.6069311
sample estimates:
mean of x
-0.4126
12