Sie sind auf Seite 1von 17

Descripci

on de datos con el entorno R


Jose R. Berrendero
Departamento de Matem
aticas
Universidad Aut
onoma de Madrid

1.

Introducci
on
Rick Becker, John Chambers y Allan Wilks desarrollaron en los AT&T Bell Labo-

ratories un lenguaje de programacion, que denominaron S, con el objetivo de facilitar


la visualizacion, el analisis y la manipulacion de datos. El entorno R [R Development
Core Team, 2004] constituye una implementacion de S que puede obtenerse facilmente
en la direccion:
http://www.r-project.org
Suelen publicarse dos actualizaciones anuales de R. La u
ltima R 2.0.0 corresponde
a octubre de 2004. Como programa para llevar a cabo calculos estadsticos, R tiene
varias caractersticas recomendables:
Sus posibilidades graficas son excelentes.
Es muy flexible. Los procedimientos estadsticos estandar se pueden aplicar con
solo utilizar el comando apropiado. Ademas, existen multitud de libreras programadas por los usuarios de todo el mundo para llevar a cabo procedimientos
mas especficos. En u
ltima instancia, podemos programar nuestras propios procedimientos y aplicaciones.
En la misma pagina desde la que se puede bajar el programa, existe abundante
documentacion sobre como utilizarlo.
Es gratuito.
1

Estas notas constituyen una introduccion elemental a R. El objetivo principal es


mostrar como usar el programa para llevar a cabo un analisis descriptivo sencillo y,
simultaneamente, ilustrar cuales son las caractersticas principales de la sintaxis del
lenguaje.
Los conjuntos de datos que se mencionan en los ejemplos pueden encontrarse en la
direccion:
http://www.uam.es/joser.berrendero/docencia/estad1/estad1.html
Una buena forma de utilizar estos apuntes es reproducir los comandos descritos y experimentar un poco con los parametros con el fin de entenderlos correctamente. Si
detectais alg
un error o teneis alguna sugerencia para mejorar estas notas, os agradecera que enviarais el correspondiente comentario a la direccion de correo electronico:
joser.berrendero@uam.es

2.

Operaciones b
asicas

2.1.

C
omo obtener ayuda

Algunas posibilidades en R para obtener ayuda son:


Tecleando help(nombre de comando) se abre una ventana con informacion sobre
un comando especfico. Prueba, por ejemplo, help(mean) e intenta entender como
se calcula una media recortada.
Otro comando muy u
til es help.search(palabra clave). En este caso obtenemos una lista de los comandos relacionados con palabra clave. Por ejemplo, teclea
help.search(median) y obtendras una lista de comandos de R relacionados
con la mediana.
Finalmente, una forma de obtener ayuda en formato html consiste en teclear
help.start().
2

2.2.

R es un lenguaje orientado a objetos

R es un lenguaje orientado a objetos. Esto significa que los diferentes objetos a


los que se aplican los comandos de R tienen ciertas caractersticas y atributos. Cada
comando reconoce estos atributos y act
ua de diferente forma en funcion de ellos. Es
decir, el mismo comando aplicado a diferentes tipos de objetos hace cosas diferentes.
No es necesario predefinir el modo de un objeto, sino que R lo establece de acuerdo
con la asignacion que hagamos. Para asignar el valor 2.3 al objeto x, debemos teclear x
<- 2.3. Si ahora usamos mode(x), R nos dira que x es numeric porque es un n
umero.
Sin embargo, si escribimos x <- silla, entonces mode(x) devuelve character.
Una lista de todos los objetos que se encuentran en la memoria de trabajo se
obtiene mediante el comando ls(). Si se teclea el nombre de un objeto se puede ver
su contenido.
Los tipos de objetos mas importantes para nuestros propositos son: vectores, matrices, listas y ficheros de datos (data frames). Si quereis pasar rapidamente al analisis
descriptivo de un conjunto de datos podeis pasar a la seccion siguiente. Sin embargo,
os conviene seguir en esta seccion si quereis conocer con mas detalle la sintaxis de R.

2.3.

Vectores y matrices

Si queremos, por ejemplo, que el objeto x contenga el vector (2, 1, 3.6, 5), debemos
usar el comando c (que alude a combinar) para hacer la siguiente asignacion:
x <- c(2,1,3.6,5).
Una sucesion regular de n
umeros se puede obtener de la siguiente forma:
x <- 1:10
x
1 2 3 4 5 6 7 8 9 10
Si queremos cambiar el incremento:
x <- seq(1,10,2)
3

x
1 3 5 7 9
En el comando seq el primer argumento indica el punto inicial de la sucesion, el segundo
el punto final, y el tercero el incremento.
Es muy facil generar con R sucesiones de n
umeros aleatorios. El programa utiliza
funciones de la forma rdistribucion(n,lista de argumentos) para generar n observaciones de una larga lista de distribuciones. Por ejemplo, si queremos obtener 1000
observaciones de una distribucion normal de media 3 y desviacion tpica 2 y guardarlas
en el vector x basta escribir
x <- rnorm(1000,mean=3,sd=2)
Para R, una matriz no es mas que un vector con un atributo adicional que contiene
el n
umero de filas y columnas. Por lo tanto una matriz se puede crear a partir de un
vector, a
nadiendo informacion sobre el n
umero de filas y columnas de la matriz. Por
ejemplo, el siguiente comando puede utilizarse para generar aleatoriamente 1000 datos
con distribucion normal estandar que, a su vez, forman una matriz x con dimension
10 100:
x <- matrix(rnorm(1000),nrow=10,ncol=100)
Este comando puede ser u
til si en un ejercicio de simulacion queremos simular 100 muestras aleatorias simples de tama
no 10 de una poblacion normal. Para entender mejor el
funcionamiento de matrix os sugiero los ejemplos siguientes: matrix(1,nrow=3,ncol=3)
y matrix(1:2,nrow=3,ncol=4).
Si creamos una matriz x y queremos extraer alguno de sus elementos, podemos usar
x[i,j], donde (i, j) son la fila y la columna del elemento. Para extraer la tercera fila de
la matriz y guardarla en el vector y se escribe y <- x[3,], es decir si no especificamos la
columna, R entiende que las queremos todas. Estos comandos admiten tambien valores
negativos de manera que si escribimos y <- x[,-1], entonces y es la matriz x donde
se ha eliminado la columna 1. Se pueden usar tambien condiciones logicas para extraer
los elementos de la matriz que nos convenga. Por ejemplo, y <- x[x>=11] genera un
vector y con todos los elementos de x mayores o iguales que 11. Otro comando u
til es
4

y <- diag(x), que almacena en un vector y los elementos de la diagonal de x.


La siguiente tabla resume la manera de llevar a cabo las operaciones mas frecuentes
con matrices o vectores:

Operaci
on

Expresi
on de R

Producto matricial

A %* %B

Producto elemento a elemento

A*B

Calcular la traspuesta de A

t(A)

Resolver el sistema Ax = b

solve(A,b)

Calcular la inversa de A

solve(A)

Calcular los autovalores y autovectores de A

eigen(A)

Suma de los elementos de A

sum(A)

Promedio de los elementos de cada columna de A

colMeans(A)

Con el fin de comprender el criterio de R a la hora de operar con vectores y matrices, es aconsejable pedirle que haga algunas operaciones en las que las matrices no
tengan dimensiones compatibles. Por ejemplo, supongamos que x<-matrix(1:4,2,2).
Que responde el programa si hacemos x+1? Y si hacemos x*diag(x) y x + x[2,]?
Trata de encontrar una explicacion logica de los resultados.

2.4.

Listas

Las listas son conjuntos heterogeneos de objetos, a los que por alguna razon conviene tener juntos y darles un nombre. Las salidas de muchas funciones que llevan
a cabo procedimientos estadsticos son listas, ya que incluyen resultados numericos,
graficos, etc. Para crear una lista llamada resultados que contenga los objetos x1,
x2,... basta utilizar
resultados <- list(x1,x2,...)

3.

Ficheros de datos

3.1.

Leer un fichero de texto con datos

Para leer un fichero de texto fichero.txt en el que se encuentran los datos con
los que queremos trabajar se usa el comando
datos <- read.table(c:\\camino\\fichero.txt,header=T)
Este comando genera un fichero de datos (un objeto del tipo data frame) con el nombre
elegido. Cuidado con las barras del camino que han de ser dobles. El argumento header
se utiliza para indicar si la primera fila contiene (T) o no (F) los nombres de las variables.
Por ejemplo, distintas variables relacionadas con el nivel de vida y grado de desarrollo de 91 pases del mundo se encuentran en el fichero de texto paises.txt. Supongamos
que el fichero lo tenemos en la carpeta datos de c:. Entonces, para leer el fichero y
almacenarlo en un data frame que tambien llamamos paises, usamos
paises <- read.table(c:\\datos\\paises.txt,header=T)
Si ahora tecleamos names(paises) obtenemos
nat mort mortinf esph espm pnb grupo nombre
que son los nombres de las variables del fichero (correspondientes a la natalidad, mortalidad, mortalidad infantil, esperanza de vida de los hombres y de las mujeres, producto
nacional bruto per capita, grupo geoeconomico al que pertenece el pas y nombre del
pas). Con el comando fix(paises) se abre una hoja de calculo rudimentaria en la
que podemos a
nadir mas datos al fichero o modificar los ya existentes.
Si escribimos el nombre de una de las variables, por ejemplo nat, observaremos que
el programa no la reconoce. Ello se debe a que las variables se nombran anteponiendo
el nombre del fichero y el signo $, es decir, paises$nat. Sin embargo, se puede utilizar
attach(paises) para poder trabajar directamente con los nombres de las variables
del fichero.
6

Otro fichero de datos que vamos a utilizar en los ejemplos es el de los resultados
de todos los partidos de la liga espa
nola de f
utbol de primera division de la temporada
2003-04. Los resultados se encuentran en el fichero de texto liga03-04.txt. Podemos
crear el correspondiente fichero de R mediante:
liga <- read.table(liga03-04.txt,header=T).
El comando names(liga) da como resultado en este caso casa y fuera ya que el
fichero tiene dos variables correspondientes a los goles conseguidos por el equipo local
y el visitante.

3.2.

Formar un fichero de datos a partir de las variables

Supongamos que creamos una variable de datos x <- c(34,20,19) y otra que contiene nombres de pases paises <- c(Espa~
na,Italia,Alemania). Podemos
crear un fichero de datos que incluye ambas variables si utilizamos el comando
fichero <- data.frame(x,paises)
Observad que la letra ~
n da algunos problemas.

4.

C
omo guardar los resultados
Podemos guardar los objetos x1,x2,... en un fichero llamado fichero.RData medi-

ante:
fichero.Rdata <-save(x1,x2,...,file=fichero.RData)
El fichero se guarda en el directorio de trabajo. Para saber cual es el directorio de
trabajo hay que usar getwd(). Para cambiarlo setwd(camino del nuevo directorio).
Los objetos que guardamos en un fichero pueden ser tanto datos como resultados de
nuestros analisis. Para recuperar en otra sesion de R esta informacion basta utilizar
load(fichero.RData). La funcion save.image(file=fichero.RData) guarda
en fichero.RData todos los objetos que se encuentran en ese momento en la memoria
de trabajo de R.
7

5.

Tablas de frecuencias
Queremos obtener en este apartado la tabla de frecuencias de los goles conseguidos

en cada partido de la liga. Primero generamos la variable correspondiente sumando los


goles de los equipos locales y los visitantes y la a
nadimos al fichero
liga$total <- liga$casa + liga$fuera.
Despues calculamos las frecuencias mediante
tabla <- table(liga$total).
El resultado es
> tabla
0
20

74 104

83

50

25

15

La moda es el valor 2, es decir, lo mas frecuente es que en un partido de futbol se


consigan dos goles. Hubo 2 partidos en los que se consiguieron 9 goles. Cuales son los
resultados si consideramos solo los goles conseguidos por los equipos locales o visitantes?
Es posible que nos interese construir una tabla de frecuencias de una variable continua. Para ello tenemos que dividir previamente los datos en clases. Si consideramos,
por ejemplo, el fichero paises podemos utilizar
esph2<-cut(paises$esph,10),
que divide las esperanzas de vida de los hombres de los pases en 10 clases y almacena
en esph2 la clase que corresponde a cada dato. Si hubieramos querido incorporar esta
nueva variable al fichero deberamos haber utilizado
paises$esph2<-cut(paises$esph,10).
En cualquier caso, si ahora hacemos
tabla.esph <- table(esph2)
obtenemos

tabla.esph
(38.1,41.8](41.8,45.6](45.6,49.4](49.4,53.2](53.2,57](57,60.8]
4

11

(60.8,64.6](64.6,68.4](68.4,72.2](72.2,75.9]
13

18

13

11

El intervalo que contiene mas pases es (64.6,68.4]. Como ejercicio, puedes repetir este
procedimiento dividiendo los datos en solo 5 variables en lugar de 10.

6.

Pictograma
La u
nica variable cualitativa del fichero paises es grupo. Para dibujar el corre-

spondiente pictograma, tenemos que etiquetar primero los diferentes valores que toma
la variable:
etiquetas <- c(E.Este,SudAm,E.Occ,O.Prox,Asia,Africa)
Despues calculamos las frecuencias y dibujamos el grafico con
pie(table(paises$grupo),labels=etiquetas)
El resultado aparece en la siguiente figura
E.Occ

SudAm

E.Este
O.Prox

Asia
Africa

7.

Gr
afico de barras

Consideremos de nuevo los goles conseguidos en un partido de f


utbol, que estan en
la variable liga$total. El diagrama de barras de las frecuencias relativas observadas,
y de las probabilidades correspondientes un modelo de Poisson de parametro = 2,67

0.25

(que es la media de goles correspondiente a los datos) es el siguiente:

0.00

0.05

0.10

0.15

0.20

Frecuencias
Probabilidades

Se observa que los datos se ajustan muy bien al modelo de Poisson. La siguiente es la
secuencia de comandos de R que se ha utilizado para producir el grafico anterior:
probs <- dpois(0:9,2.67)
freqs <- table(liga$total)/380
matriz <- rbind(probs,freqs)
rownames(matriz)<-c(Frecuencias,Probabilidades)
barplot(matriz,beside=T,names.arg=c(0:9),legend.text=T)

La primera lnea se utiliza para calcular las probabilidades que asigna una distribucion
de Poisson de parametro = 2,67 a los valores k = 0, 1, . . . , 9. La segunda se utiliza
10

para calcular las frecuencias relativas, que queremos comparar con las probabilidades
teoricas. La tercera lnea se utiliza para pegar los dos vectores y formar una matriz con dos filas que contienen respectivamente las frecuencias y las probabilidades
calculadas previamente. El comando rownames permite asignar nombres a las filas de
matriz. Finalmente, el comando barplot se usa para representar el grafico de barras.
Cuando el primer argumento es una matriz representa dos barras para cada columna
de la matriz. Si el argumento beside toma el valor T sit
ua una barra al lado de la otra.
Si beside=F, sit
ua una sobre la otra. Los nombres para cada par de barras se asignan
mediante names.arg (en este caso, simplemente el n
umero de goles) y la leyenda se
genera mediante legend.text=T siempre que las filas de matriz tengan un nombre
asignado.

8.

Histograma

0.00008
0.00000

0.00004

Proporciones

0.00012

Histograma del PNB

5000

10000

15000

20000

25000

30000

35000

PNB

Para obtener un histograma de, por ejemplo, la variable paises$pnb se usa


hist(paises$pnb,freq = F,nclass=10,xlab=PNB,ylab=Proporciones,
main=Histograma del PNB)
Se utilizan diferentes argumentos para determinar si la altura de las barras del histogra11

ma corresponde a las proporciones (freq=F) en lugar de a las frecuencias absolutas


(freq=T), el n
umero de clases del histograma (nclass=10), las etiquetas para los dos
ejes (xlab e ylab), y el ttulo del grafico (main). El resultado se muestra en la figura
anterior. Se observa que la distribucion es muy asimetrica. Representa como ejercicio
el histograma del logaritmos neperiano del PNB. Esta transformacion debera reducir
la asimetra.

9.

Diagrama de cajas
PNB por grupos

20000

30000

5000 10000

E.Este

Samer

E.Occ

O.Prox

Asia

Africa

Podemos usar un diagrama de cajas m


ultiple para comparar el PNB de los pases
pertenecientes a los diferentes grupos de pases:
boxplot(pnb ~ grupo,data=paises,names=etiquetas, main=PNB por grupos).
Hemos usado en este caso una forma alternativa de conseguir que el programa reconozca las variables, usando el argumento data para indicar el fichero al que pertenecen,
en lugar de anteponiendo paises$. Es importante notar como se le dice al programa
la forma de agrupar las observaciones, usando (Alt + 126 y despues espacio o AltGr
+ 4 y despues espacio). El argumento names y la variable etiquetas se vuelven a usar
para dar nombre a los grupos. El resultado es la figura anterior. Tambien podemos
12

estar interesados en representar diagramas de cajas para variables que no pertenecen


al mismo fichero de datos. En este caso, podemos escribir
boxplot(lista de nombres de variables)
.

10.

Medidas descriptivas num


ericas

El comando summary(nombre de fichero) calcula el mnimo, primer cuartil, mediana, media, tercer cuartil y maximo de todas las variables de un fichero de datos. Por
ejemplo, si escribimos summary(paises), obtenemos
nat
mort
mortinf
Min. : 4.50

esph

Min. : 9.70

Min. : 2.20

1st Qu.:14.70

1st Qu.: 7.70 1st Qu.: 13.05

1st Qu.:55.40

Median :29.00

Median : 9.50 Median : 43.00

Median :63.40

Mean :29.46

Mean :10.73

Mean :61.38

3rd Qu.:42.55

3rd Qu.:12.30 3rd Qu.: 86.50

3rd Qu.:68.50

Max. :52.20

Max. :25.00

Max. :181.60

Max. :75.90

espm

pnb

grupo

nombre

Min. :41.20

Min. : 80

Min. :1.000

Afghanistan: 1

1st Qu.:56.75

1st Qu.: 475

1st Qu.:3.000

Albania : 1

Median :67.60

Median : 1690 Median :4.000

Algeria : 1

Mean :66.03

Mean : 5741

Angola : 1

3rd Qu.:75.45

3rd Qu.: 7325 3rd Qu.:6.000

Argentina : 1

Max. :81.80

Max. :34064

Austria : 1

Mean : 55.28

Mean :3.978

Max. :6.000

Min. :38.10

Para que variable se produce la mayor diferencia entre la media y la mediana? En


este caso, cual de las dos medidas es mas representativa?
Para medir la dispersion, la medida mas utilizada es la desviacion tpica. Para
13

calcular la desviacion tpica de, por ejemplo, el PNB per capita de los pases se utiliza sd(paises$pnb). Una alternativa mas robusta es la mediana de desviaciones
absolutas (meda). Si M = med{x1 , . . . , xn } es la mediana de los datos, entonces
meda = medi |{|xi M |}. Para calular la meda: mad(paises$pnb). Otra medida de
dispersion robusta es el rango intercuartlico, que se calcula mediante IQR(paises$pnb)
(el nombre de este comando se debe escribir con may
usculas).

11.
11.1.

Diagrama de dispersi
on y recta de mnimos cuadrados
Diagramas de dispersi
on

Para estudiar el tipo de relacion entre dos variables, lo mas conveniente es usar un
diagrama de dispersion. Por ejemplo, veamos cual es el que corresponde a las variables
pnb y esph. Para obtenerlo, basta teclear
plot(esph ~ pnb,data=paises,pch=16)
(se han omitido los argumentos main, xlab, ylab, cuyo uso ya se ha explicado anteriormente). El argumento pch=16 es el que se usa para que en el grafico aparezcan
puntos negros en lugar de otro smbolo. El resultado se ha representado en la figura
siguiente:

70

60

40

Esperanza de vida

50

5000

10000

15000

20000

PNB

14

25000

30000

35000

Si utilizamos plot(nombre de fichero de datos) se genera automaticamente una


matriz de diagramas de dispersion para todas las variables del fichero dos a dos. Tambien puede usarse el comando pairs(A), donde A es una matriz. Por ejemplo
pairs(cbind(paises$nat,paises$mort,paises$mortinf))
produce la siguiente figura (cbind se usa para pegar las columnas en una u
nica matriz):
20

25

25

20

mort

30

40

50

mortinf

50

150

20

100

10

15

10

11.2.

20

nat

10

50

15

40

10

30

50

100

150

Recta de mnimos cuadrados

En el grafico de dispersion entre las variables espm y pnb se observa que la relacion
entre ambas no es lineal. La solucion para obtener una relacion lineal es transformar
alguna de ellas. La figura siguiente muestra el diagrama de dispersion entre esph y
log(pnb):
15

70

60

50

Esperanza de vida

40

10

log del PNB

Podemos ahora calcular la recta de mnimos cuadrados para cuantificar la relacion


lineal observada en el grafico anterior. Para ello se utiliza
pnbesp.lm <- lm(esph ~ log(pnb),data=paises)
Esta funcion calcula, entre otras muchas cosas, el termino independiente y la pendiente
de la recta de mnimos cuadrados. Una lista de todo lo que calcula se puede obtener
mediante names(pnbesp.lm). Para extraer la informacion pueden usarse varios comandos especficos: coef(pnbesp.lm), resid(pnbesp.lm), summary(pnbesp.lm) o
plot(nombre-lista.lm). Por ejemplo, la salida que corresponde a summary(pnbesp.lm)
es:
Min

1Q

Median

3Q

Max

-14.587238 -3.506428 0.009532 3.756209 14.130883


Coefficients:
Estimate Std. Error t value
Pr(>|t|)
(Intercept)

25.4726

2.8387

8.973

4.27e-14 ***

log(pnb)
4.7804
0.3693
12.946
<2e-16 ***
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 5.761 on 89 degrees of freedom
Multiple R-Squared: 0.6532, Adjusted R-squared: 0.6493
F-statistic: 167.6 on 1 and 89 DF, p-value: <2.2e-16
16

En particular, el coeficiente de correlacion es 0.6532 y la pendiente de la recta es


1 4,78. Como el PNB esta en logaritmos esto significa que a un incremento del 1 %
en el PNB per capita de un pas, corresponde un incremento aproximado de 4.78 a
nos
en la esperanza de vida de los hombres.
Si queremos a
nadir al diagrama de dispersion la recta de mnimos cuadrados, se
puede usar abline(coef(pnbesp.lm)). El resultado es la figura siguiente:

70

60

50

Esperanza de vida

40

10

log del PNB

Referencias

R Development Core Team (2004). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Viena, Austria. ISBN 3-90005107-0, URL http://www.R-project.org.

17

Das könnte Ihnen auch gefallen