Está en la página 1de 28

Unidad 1

Exploración de datos y gráficas


Beatriz Ranera
2 de octubre, 2019

Contents
Tipos de objetos en R 1
Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Data frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Importación de datos 4
Ficheros de texto plano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Ficheros .csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Comandos básicos explorar datos 5


Función summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Tipos de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Gráficos 8
Variables categóricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Variables numéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Transformación de datos 22

Coeficiente de variación 22

Estandarización 22

Paquete ggplot2 23

Tipos de objetos en R
Recordar que R es un lenguaje orientado a objetos. Todos las variables que se utilicen serán objetos de una
clase, con sus propiedades partículares. Repasemos los principales objetos que manejaremos.
1. Numeric: son los números. 7 es de la clase numeric.
2. Character: son las cadenas de texto. “Cadena de texto” es de la clase character.
3. Logical: son los booleanos correspondientes a verdadero o falso. FALSE es de la clase logical.
A parte de estos tres objetos más básicos, existen otros más complejos que albergan conjutos de datos.

Vectores
Un vector es una lista ordenada de números o cadenas de letras. La forma de definir un vector es utilizando
la función c(), e indicando entre paréntesis los elementos del vector separados por comas.
numeros.vector<-c(1,2,3)
numeros.vector

1
## [1] 1 2 3
letras.vector<-c("Hola","que","tal")
letras.vector

## [1] "Hola" "que" "tal"


boolean.vector<-c(TRUE, FALSE, FALSE)
boolean.vector

## [1] TRUE FALSE FALSE

Matriz
Una matriz es una tabla de n filas y m columnas. Todos los elementos de una misma matriz deben de ser de
objetos del mismo tipo. No es posible mezclar números y cadenas de texto.
Para crear la matriz es necesario utilizar la función matrix, a la que se le debe pasar como parámetros: * un
vector * un número de filas * un numero de columnas * la forma de rellenar la matriz.
numeros.matriz<-matrix(c(0,1,1,1,0,0,1,1,1,1,0,0),
nrow=6,ncol=2,byrow = TRUE)
numeros.matriz

## [,1] [,2]
## [1,] 0 1
## [2,] 1 1
## [3,] 0 0
## [4,] 1 1
## [5,] 1 1
## [6,] 0 0
numeros.otra.matriz<-matrix(c(0,1,1,1,0,0,1,1,1,1,0,0),
nrow=6,ncol=2,byrow = FALSE)
numeros.otra.matriz

## [,1] [,2]
## [1,] 0 1
## [2,] 1 1
## [3,] 1 1
## [4,] 1 1
## [5,] 0 0
## [6,] 0 0

Data frame
Un data frame es como una matriz, pero las columnas pueden tener distintos tipos de objetos. De esta manera,
podemos tener una columna de cadenas de texto y la columna siguiente una columna de números. Es el objeto
más utilizado en R, puesto que normalmente se representan en las columnas los números correspondientes a
las variables analizadas y de las que se disponen datos y en las filas se corresponden con las observaciones,
que serían los distintos individuos sobre los que se han realizado las mediciones, y habitualmente se encuentran
identificados con una cadena de texto.
En un data frame las columnas pueden tener un nombre o etiqueta (label), así como las filas, que se
correspondería con el identificador del elemento.
Para crear un objeto de la clase data.frame es preciso trabajar con dos vectores y la función data.frame().
Es importante que estos dos vectores tengan la misma longitud, sino obtendremos

2
x<-c(0,1,0,0,1,0,0,1,0)
y<-c(0,0,1,0,0,1,0,0,1)
numeros.dataframe<-data.frame(x,y)
numeros.dataframe

## x y
## 1 0 0
## 2 1 0
## 3 0 1
## 4 0 0
## 5 1 0
## 6 0 1
## 7 0 0
## 8 1 0
## 9 0 1
class(numeros.dataframe)

## [1] "data.frame"
x<-c(0,1,0,0,1,0,0)
y<-c("Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo")
semana.dataframe<-data.frame(x,y)
semana.dataframe

## x y
## 1 0 Lunes
## 2 1 Martes
## 3 0 Miercoles
## 4 0 Jueves
## 5 1 Viernes
## 6 0 Sabado
## 7 0 Domingo
class(semana.dataframe)

## [1] "data.frame"
A parte de la función dim() anteriormente comentada en las matrices hay una serie de funciones habituales
para trabajar con este tipo de objetos.

Lista
Es un vector generalizado, es decir, un contenedor diseñado para almacenar objetos de tipos distintos,
incluyendo a su vez también listas. Una especie de “cajón de sastre”. Para su creación se emplea la función
list()
mix.lista<-list(x,y,"palabra",numeros.matriz)
mix.lista

## [[1]]
## [1] 0 1 0 0 1 0 0
##
## [[2]]
## [1] "Lunes" "Martes" "Miercoles" "Jueves" "Viernes" "Sabado"
## [7] "Domingo"
##
## [[3]]

3
## [1] "palabra"
##
## [[4]]
## [,1] [,2]
## [1,] 0 1
## [2,] 1 1
## [3,] 0 0
## [4,] 1 1
## [5,] 1 1
## [6,] 0 0
re.lista<-list(mix.lista,c("Esto","es","una","lista","con","lista","dentro"))
re.lista

## [[1]]
## [[1]][[1]]
## [1] 0 1 0 0 1 0 0
##
## [[1]][[2]]
## [1] "Lunes" "Martes" "Miercoles" "Jueves" "Viernes" "Sabado"
## [7] "Domingo"
##
## [[1]][[3]]
## [1] "palabra"
##
## [[1]][[4]]
## [,1] [,2]
## [1,] 0 1
## [2,] 1 1
## [3,] 0 0
## [4,] 1 1
## [5,] 1 1
## [6,] 0 0
##
##
## [[2]]
## [1] "Esto" "es" "una" "lista" "con" "lista" "dentro"
Cada elemento de la lista viene identificado por un número que indica la posición dentro de la lista marcado
por dos corchetes [[posicion]].

Importación de datos
En bioestadística la mayoría de las ocasiones los datos con los que se va a trabajar van a proceder de ficheros
externos. El objetivo fundamental será el de incorporar los datos en un objeto dentro de R.

Ficheros de texto plano.


Normalmente estos ficheros tienen una extensión .txt, aunque pueden tener cualquier otra. Lo más frecuente,
es que los ficheros que se deban cargar tengan la información separada por tabuladores, que se corresponde

con el carácter ****.
El comando para cargar estos ficheros, es read.table():
registro <- read.table(file = "DataReg.txt",header = TRUE, sep = "\t")

El tipo de objeto que se crea es un data.frame.

4
Ficheros .csv
Estos ficheros son grupos de datos cuyos valores están separados por comas. Si son generados por programas
tipo excel en sus configuraciones de idioma local español, en lugar de separados por comas lo estarán por
puntos y comas. Por ello, deben usarse distintos comandos. Habitualmente, trabajaremos con ficheros
separados por ;.
lab.data <- read.csv2(file="EsterData.csv", header = TRUE, sep = ";")

El objeto generado también es un data.frame.

Comandos básicos explorar datos


Tras realizar estudios de observación o experimentos en un laboratorio se acaban recopilando datos. Los
análisis comienzan habitualmente con la exploración de los mismos. El objetivo es obtener conocimiento
sobre los datos, conocer los valores que adquieren las distintas características estudiadas y como éstas varían
según cada muestra, en definitivas cuentas conocer su distribución.
Para un variable, la distribución muestra los valores posibles que ésta puede tomar, la posibilidad de observar
esos valores y la frecuencia que esperamos verlos para una muestra aleatoria de una población.
Mediante la exploración de datos se reduce la cantidad de información a estudiar para así centrarnos en los
aspectos clave de los datos.
A continuación se resumen las funciones básicas de R para obtener información de datasets.

Función Descripción tarea


sum(x) Suma los elementos en el vector x
prod(x) Multiplica los elementos en el vector x
max(x) Elemento máximo en el vector x
min(x) Elemento mínimo en el vector x
range(x) Rango (mínimo y máximo) de los elementos de x
length(x) Número de elementos en el vector x
mean(x) Media de elementos en x
median(x) Meidana de elementos en x
var(x) Varianza de elementos en x
sd(x) Desviación estándar de los elementos en x
cor(x,y) Correlación entre los elementos de los vectores x e y
quantile(x,p) El cuantil pth de x
cov(x,y) Covarianza entre x e y.

Función summary
A continuación se muestran los datos recogidos en un ensayo de tres lotes distintos de una misma enzima.
Cada ensayo consiste en enfrentar a cada variedad a una proteía de 200 aminoácidos para su disgestión. El
resultado del tiempo que tarda en digerirla es el siguiente:
enzyme

## VariedadA tiempoA VariedadB tiempoB VariedadC tiempoC


## 1 a 0.12 b 0.12 c 0.13
## 2 a 0.13 b 0.14 c 0.12
## 3 a 0.13 b 0.13 c 0.11
## 4 a 0.12 b 0.15 c 0.13
## 5 a 0.13 b 0.13 c 0.12
## 6 a 0.12 b 0.14 c 0.13

5
Para obtener información dde manera rápida sobre cuál de los lotes es mejro de la enzima la función summary
es muy útil. Realiza la función de varios de los comandos de la tabla anterior.
summary(enzyme)

## VariedadA tiempoA VariedadB tiempoB VariedadC


## a:6 Min. :0.120 b:6 Min. :0.120 c:6
## 1st Qu.:0.120 1st Qu.:0.130
## Median :0.125 Median :0.135
## Mean :0.125 Mean :0.135
## 3rd Qu.:0.130 3rd Qu.:0.140
## Max. :0.130 Max. :0.150
## tiempoC
## Min. :0.1100
## 1st Qu.:0.1200
## Median :0.1250
## Mean :0.1233
## 3rd Qu.:0.1300
## Max. :0.1300
Se puede observar que la media de la variedad B es mayor en tiempo que las de las variedades A y C. Este
dato podría ser estadísticamente significativo, y por tanto, ser utilizado para testear diferencias.

Tipos de variables
Las variables que podemos representar pueden ser de dos tipos:
• Categóricas.
• Numéricas.
El siguiente ejemplo contiene ambos tipos de variables. Se trata de un ejemplo dentro del paquete MASS
llamado birthwt que incluye información sobre 189 recién nacidos en Springfield en el año 1986:
require(MASS)

## Loading required package: MASS


head(birthwt)

## low age lwt race smoke ptl ht ui ftv bwt


## 85 0 19 182 2 0 0 0 1 0 2523
## 86 0 33 155 3 0 0 0 0 3 2551
## 87 0 20 105 1 1 0 0 0 1 2557
## 88 0 21 108 1 1 0 0 1 2 2594
## 89 0 18 107 1 1 0 0 1 0 2600
## 91 0 21 124 3 0 0 0 0 0 2622
Las variables de los que hay datos son:
• low: indcador de nacimientos con bebes con menos de 2.5 kg (0 = peso normal de nacimiento, 1 =
peso bajo).
• age: edad de la madre en años.
• lwt: peso de la madre en libras en su último periodo menstrual.
• race: raza de la madre (1 = blanca, 2 = afroamericana, 3 = otra)
• smoke: madre fumadora durante embarazo (0 = no fumadora, 1 = fumadora).
• ptl: número de partos prematuros previos.
• ht: historial hipertensión (0 = no, 1 = sí).
• ui: presencia de irritabilidad uterina (0 = no, 1 = sí).
• ftv: número de visitas físicas durante el primer trimestre.

6
• bwt: peso en gramos al nacimiento.
Las variables age, lwt, ptl, ftv y bwt son variables numéricas. El resto, low, race, smoke, ht y ui
son categóricas, aunque estén codificadas con valores numéricos. En este caso R, no las reconoce como
variables categóricas, sino como numéricas por defecto, por ello hay que recodificarlas a factores.
birthwt$low <- as.factor(birthwt$low)
birthwt$race <- as.factor(birthwt$race)
birthwt$smoke <- as.factor(birthwt$smoke)
birthwt$ht <- as.factor(birthwt$ht)
birthwt$ui <- as.factor(birthwt$ui)

Explorando variables categóricas


Frecuencia es el número de veces que una categoría, c, específica es observada nc .
Para el dataset anterior, el número de mujeres de raza blanca fue 96, el de raza afroamericana fue 26, mientras
que el de otra raza 67.
require(knitr)

## Loading required package: knitr


kable(table(birthwt$race))

Var1 Freq
1 96
2 26
3 67

La suma de las frecuencias de todas las categorías tiene que ser igual a la suma total de la muestra.

X
nc = n,
c
X
nc = n1 + n2 + n3 = 96 + 26 + 67 = 189
c

Frecuencia relativa
Hemos obtenido que n1 = 96, n2 = 26 y n3 = 67, para mujeres blancas, afroamericanas y otras, respectiva-
mente. Dijeramos, que el tamaño de la muestra es representativo a la sociedad americana, de forma que los
datos también deberían de serlo. Para ello se calcula la frecuencia relativa.
Por tanto, se definiría como la proporción de muestra de cada categoria posible. Y se obtiene:

nc
pc = ,
n
donde
pc es la frecuencia relativa, nc la frecuencia absoluta hallada anteriormente y n el número de observaciones.
A veces, el valor se suele presentar en porcentajes, bastaría con multiplicar por 100 el resultado obtenido.
Por tanto, los valores anteriores de frecuencias relativas serían:

p1 = 96/189 = 0.508
p2 = 26/189 = 0.138

7
p3 = 67/189 = 0.354

La suma de las frecuencias relativas de todas las categorías debe ser igual a 1, siempre (100 si se suman los
porcentajes).

X
nc = 1,
c
X
nc = n1 + n2 + n3 = 0.508 + 0.138 + 0.354 = 1
c

Para una variables categórica, la moda es el valor mas común, es decir, el de mayor frecuencia.

Explorando variables numéricas


En la visualización de variables numéricas, el especial interés en el estudio exploratorio de su distribución
radica en donde están localizadas y como de dispersas están.
La localización, hace referencia la tendencia central de los valores, es decir, al rededor de que punto se agrupan
la mayoría de valores.
La dispersión de una distribución se refiere a como de dispersos están los valores posibles al rededor de una
localización.

Gráficos
Las representaciones gráficas suelen ser de gran ayuda en bioestadística durante la exploración de datos, de
un vistazo se pueden obtener mucha información. Para cada tipo de variable de las anteriores explicadas hay
una serie de gráficos que ayudan a representar sus correspondientes datos.

Variables categóricas
Gráficos de barras
Es la forma más simple de visualizar datos. Se pueden ver:
• Los posibles valores que hay por categoría.
• Número de veces que cada categoría es observada en la muestra.
No es otra cosa sino la representación de las frecuencias absolutas obtenidas.
Para esta parte teórica, también vamos a trabajar con el dataset diabetes, que muestra los datos recogidos
en un hospital de la India sobre mujeres diabéticas, que contiene la siguiente información:
• Pregnancies, número de embarazos.
• Glucose, concentración plasmática de glucosa en el test oral de tolerancia,
• BloodPressure, presión sanguínea diastólica,
• SkinThickness, grosor del pliegue de la piel del triceps,
• BMI, índice de masa corporal,
• DiabetesPedigreeFunction, función de pedigrí diabético,
• Age, edad,
• Outcome, estatus de la enfermedad, 1 diabética (Sí), 0 no diabética (No).
Representando la variable Outcome con un diagrama de barras se puede observar la frecuencia de los valores
obtenidos en el estudio para enfermas.
# Se calcula la frecuencia absoluta
tabla.diabetes <- table(diabetes$Outcome)

8
Gráfico de barras de frecuencia de diabetes
100 200 300 400 500
Frecuencia

No Si

Estatus enfermedad

Figure 1: Barplot

# Se representa la frecuencia absoluta


barplot(tabla.diabetes, main = "Gráfico de barras de frecuencia de diabetes"
,xlab = "Estatus enfermedad", ylab="Frecuencia")

La altura de cada barra se corresponde con la frecuencia de cada categoría.


A lo largo de nuestros estudios hemos visto distintos tipos de gráficos de barras, a continuación se muestran
unos ejemplos varias opciones distintas.
La función par se utiliza para establecer parámetros en los gráficos y que estos queden diseñados y ajustados
a lo que el usuario desea. Con los parámetros mfrow o mfcol se pueden representar varios gráficos en un
mismo espacio. Basta con ejecutar par con alguno de los atributos anteriores, antes de la representación de
los gráficos que se quieren mostrar.
La función layout también sirve para establecer una ordenación de gráficos con una mayor flexibilidad, al
pasarle como parámetro una matriz.
# Se categoriza el índice de masa corporal, BMI, según sus valores
diabetes$BMI2[diabetes$BMI < 15.9] <- "Delgadez Severa"
diabetes$BMI2[diabetes$BMI < 18.4 & diabetes$BMI > 16] <- "Delgadez"
diabetes$BMI2[diabetes$BMI>18.5 & diabetes$BMI < 24.9] <- "Saludable"
diabetes$BMI2[diabetes$BMI>25 & diabetes$BMI < 29.9] <- "Sobrepeso"
diabetes$BMI2[diabetes$BMI>30] <- "Obesidad"

# Se calculan las frecuencias de diabéticas según la categoría de índice corporal


tabla.BMI <- table(diabetes$Outcome,diabetes$BMI2)
# Un total de 3 gráficos

9
# Colocados todos en dos filas
# Se aplican por gráfico los parámetros del chunk

par(mfrow=c(1,2))

# Barras pegadas
barplot(tabla.diabetes, main = "Barras pegadas", space=0
,xlab = "Estatus enfermedad", ylab="Frecuencia")

# Barras yuxtapuestas de dos categorías


barplot(tabla.BMI, main = "Gráfico de barras de frecuencia
de diabetes por IMC", beside = TRUE,
ylab="Frecuencia", las=2, col=c(1,2))
legend("topright",legend=rownames(tabla.BMI), col=c(1,2), lty=1)

# Barras apiladas de dos categorías


barplot(tabla.BMI, main = "Gráfico de barras de frecuencia
de diabetes por IMC", beside = FALSE,
ylab="Frecuencia", las=2, col=c(1,2))
legend("topright", legend=rownames(tabla.BMI), col=c(1,2), lty=1)

# Eliminar la configuración anterior


dev.off()
# Un total de 3 gráficos

# Indicando uno en la primera fila y los dos siguientes en las siguientes


layout(matrix(c(1,1,2,3),2,2, byrow = TRUE))

# Barras pegadas
barplot(tabla.diabetes, main = "Barras pegadas", space=0
,xlab = "Estatus enfermedad", ylab="Frecuencia")

# Barras yuxtapuestas de dos categorías


barplot(tabla.BMI, main = "Gráfico de barras de frecuencia
de diabetes por IMC", beside = TRUE,
ylab="Frecuencia", las = 2, col=c(1,2))
legend("topright",legend=rownames(tabla.BMI), col=c(1,2), lty=1)

# Barras apiladas de dos categorías


barplot(tabla.BMI, main = "Gráfico de barras de frecuencia
de diabetes por IMC", beside = FALSE,
ylab="Frecuencia", las = 2, col=c(1,2))
legend("topright",legend=rownames(tabla.BMI), col=c(1,2), lty=1)

10
Gráfico de barras de frecuencia
Barras pegadas
de diabetes por IMC
100 200 300 400 500

250
No
200 Si
Frecuencia

Frecuencia
150

100

50

0
0

Delgadez

Delgadez Severa

Obesidad

Saludable

Sobrepeso
No Si

Estatus enfermedad

Gráfico de barras de frecuencia


de diabetes por IMC

No
400
Si
Frecuencia

300

200

100

0
Delgadez

Delgadez Severa

Obesidad

Saludable

Sobrepeso

Figure 2: 3 Gráficos con par

11
Barras pegadas
500
400
300
Frecuencia

200
100
0

No Si

Estatus enfermedad

Gráfico de barras de frecuencia Gráfico de barras de frecuencia


de diabetes por IMC de diabetes por IMC
250
No No
Si 400 Si
200

300
Frecuencia

Frecuencia

150

200
100

50 100

0 0
Delgadez

Delgadez Severa

Obesidad

Saludable

Sobrepeso

Delgadez

Delgadez Severa

Obesidad

Saludable

Sobrepeso

Figure 3: 3 Gráficos con layout

12
Pie chart
Los gráficos tipo tarta se utilizan para la visualización de las frecuencias relativas de una variable categórica.
El área de un círculo se dividirá en tantos sectores como categorías posibles. El área de cada sector será
proporcional a la frecuencia relativa calculada.
# Se utilizan las frecuencias absolutas y automáticamente determina la relativas
pie(tabla.diabetes, main="Frecuencia diabetes")

Frecuencia diabetes

No

Si

Figure 4: Pie chart

Variables numéricas
Histogramas
Son muy habituales para visualizar variables numéricas. Sería un gráfico de barras, pero en que la variable
a estudiar está agrupada en un número finito de intervalos. Para cada intervalo, la altura de la barra se
corresponde con la frecuencia de esa observación en ese intervalo. La función a utilizar es hist()
Para la variable del dataset de diabetes del índice de masa corporal (BMI), un histograma quedaría de la
siguiente manera.
# Eliminar la configuración anterior
dev.off()
par(c(1,2))

## NULL
# Frecuencia absoluta
hist(diabetes$BMI, main="Histograma de frecuencia absoluta del BMI ", xlab="BMI"
, col="grey", freq = TRUE)

13
Histograma de frecuencia absoluta del BMI
200
150
Frequency

100
50
0

0 10 20 30 40 50 60 70

BMI

Figure 5: Histogramas

# Frecuencia relativa
hist(diabetes$BMI, main="Histograma de frecuencia relativa del BMI ", xlab="BMI"
, col="grey", freq = FALSE)

Con los histogramas se puede obtener de un solo vistazo donde se encuentran los índices de masa corporal
más frecuentes del estudio: entre 25 y 40.
Los dos gráficos representados, a priori son iguales, únicamente cambiando los valores del eje de las y. Sin
embargo, es más habitual la representación del segundo, con elvalor de Density. Que sería similar al concepto
de frecuencia relativa, pero al tratarse de una variable cuantitativa, es más habitual referirse al dato obtenido
como densidad.
La densidad, por tanto, es la frecuencia relativa de una unidad de intervalo. Se obtiene diviendo la frecuencia
relativa para la anchura del intervalo, c:

pc
fc = , donde
wc

pc = nc /n es la frecuencia relativa con nc como la frecuencia del intervalo c y n el total del tamaño de la
muestra, wc es el tamaño del intervalo de c.
Para el intervalo de (30,35], que es el séptimo intervalo, c = 7, hay 221 observaciones (n7 ). Por tanto la
frecuencia relativa p7 = 0.2877604. Teniendo en cuenta que la wc = 5, la densidad será:

f7 = 0.289/5 = 0.0578

El número de intervalos (bins, en inglés), en los que un histograma puede dividirse tiene una anchura
determinada, w. Esta anchura determinará el número de intervalos que tengamos, por tanto es importante

14
Histograma de frecuencia relativa del BMI
0.04
Density

0.02
0.00

0 10 20 30 40 50 60 70

BMI

Figure 6: Histogramas

escoger una anchura determinadda, puesto que determinará la forma del histograma. El parámetro a incluir
en la función hist es breaks, y automáticamente se calculará el tamaño del intervalo, sin embargo el valor
índicado no tiene porque ser el que finalmente se use para hacer la división. Cuando se desea forzar un
número de intervalos exactos la mejor opción es pasarle un vector, de esta manera se índican los puntos
límites entre cada intervalo.
Por ejemplo, si en el dataset de diabetes para BMI anterior queremos un histograma dividido en 5 intervalos:
# Para el número de intervalos deseados crear un vector con
# el mínimo valor, el máximo valor y n+1 intervalos que se desean.
intervalos <- seq(min(diabetes$BMI),max(diabetes$BMI),length.out = 6)

hist(diabetes$BMI, main="Histograma de frecuencia relativa del BMI ", xlab="BMI"


,breaks = intervalos, col="grey", freq = FALSE)

Forma de los histogramas


La forma en la que los datos encajan en los histogramas es también muy informátiva. Nos da una idea de
como los valores se extienden al rededor de la localización. Las distintas formas que podemos encontrar son:
• Simétricos: las densidades observadas son la mismas a cada lado del centro del gráfico. Es muy raro
encontrar un conjunto de datos que genere un histograma simétrico exacto, así que normalmente se
denomina simétrico si las densidades a cada lado son aproximadas. Este sería el caso a los datos BMI.
• Sesgado a la izquierda (left-skewed): el histograma muestra la mayor parte de los datos a la izquierda
del gráfico, hay poca densidad de datos en el lado derecho de la gráfica.
• Sesgado a la derecha (right-skewed): el histograma muestra la mayor parte de los datos a la derecha del
gráfico, hay poca densidad de datos en el lado izquierdo de la gráfica.

15
Histograma de frecuencia relativa del BMI
0.04
Density

0.02
0.00

0 10 20 30 40 50 60

BMI

Figure 7: Histogramas

Boxplot
Para estudiar los gráficos de cajas, es preciso repasar algunos conceptos básicos estadísticos:

Media
Es el valor medio de los datos observados. Para valores x1 , . . . , xn, la media de la muestra es x y se calcula:
P
i xi
x=
n
donde xi es la cada valor ith observado del vector de tamaño n.
La función para calcularla es mean.
Si el vector tiene valores muy grandes o muy pequeños, que en alguna ocasión podrán ser considerarse valores
inusuales ,outliers, la media será muy sensible al ellos.

Mediana
Es una medida alternativa de localización, menos sensible a los outliers, por ello se dice que es robusta. Para
valores x1 , . . . , xn, la mediana de la muestra es x̃, y se calcularía ordenando de menor a mayor los valores
observados y seleccionando el valor central. Si el tamaño de la muestra, n es impar, será el valor central, si es
par, será la media de los valores centrales.
La función para calcularla es median.

16
Varianza
Para terminar de describir la distribución de los datos es necesario estudiar la dispersión. Está basado en la
desviación de los valores observados de la media, que sería: xi − x. La suma de todas las desviaciones es
0, por lo que la desviación en sí no se puede utilizar como medida de dispersión. En cambio si eliminamos
el signo del cálculo de la desviación, por ejemplo tomando el valor absoluto de la desviación o elevando al
cuadrado (opción más frecuente) si que podemos observar la dispersión.
La varianza, s2 , se basa en el cálculo de las desviaciones al cuadrado dividido para el tamaño de la muestra,
n:
Pn
i=1 (xi − x)2
s2 =
n
Aunque es habitual encontrar el cálculo de la varianza con la división para n − 1, se conoce como la correción
de Bessel. De esta manera se corrige el sesgo estadístico (concepto que estudiaremos más adelante), y será
esta variación la que se utilizará en la asignatura.
Pn
− x)2
i=1 (xi
s2 =
n−1

La función para calcular es var

Desviación estándar
Es también una medida de dispersión de los datos de una muestra, y se calcula a partir de la raíz cuadrada
de la varianza:
r Pn
i=1 (xi − x)2
s=
n

La función para calcular es sd

Cuartiles
El cuantil o percentil es el resultado de encajar en cuatro bloques distintos los valores ordenados de menor a
mayor de una muestra.
Por lo tanto existen 4 cuantiles, son valores, Q1 , Q2 , Q3 y Q4 .
• Q2 se corresponde con la mediana.
• Q1 será el primer cuantil.
• Q3 es el tercer cuantil.
• Q4 es el cuarto cuantil.
El 50% de los valores se encuentran entre Q1 y Q3 . Y se conoce como rango intercuantil la diferencia
entre el valor Q3 y el Q1 (IQR = Q3 - Q1 ). No confundir con el rango que será la diferencia entre el valor
máximo y el mínimo de la muestra. El rango intercuantil será una medida más robusta, puesto que es menos
sensible a los valores inusuales, ya que habitualmente están por debajo de Q1 y por encima de Q3 .
Para visualizar como los datos se distribuyen en los cuartiles, el gráfico boxplot. Este gráfico también permite
estudiar la simetría, la distribución de los datos y comparar poblaciones.
boxplot(diabetes$BMI, main="Boxplot BMI ", xlab="BMI", col="grey")

# También se puede representar horizontal


boxplot(diabetes$BMI, main="Boxplot BMI ", xlab="BMI", col="grey",horizontal = TRUE)

17
Boxplot BMI
50
30
0 10

BMI

Boxplot BMI

0 10 20 30 40 50 60

BMI

Figure 8: Boxplot

18
La línea inferior de la caja representa el Q1 , mientras que la línea superior se corresponde con el Q3 . La línea
horizontal central de la caja se corresponde con el Q2 . El 50% de los datos se encuentran contenidos en esta
caja, es decir, representa el rango intercuartil.
Las líneas que se extienden de las cajas, llamadas bigotes (whiskers), se extienden por arriba y por abajo
hasta el valor Q3 + 1,5 x IQR y Q1 - 1,5 x IQR. Aquellos datos que se encuentren fuera de estas líneas son
potenciales outliers, y por tanto, suceptibles de ser eliminados.

Matrices de dispersión
Están relacionadas con la representación de todas las variables numéricas de un dataset, y su objetivo es el
de presentar las relaciones entre pares de variables. El gráfico en sí es una matriz donde cada entrada es
un gráfico de dispersión sencillo. Cuanto mayor es el número de visualizaciones peor es la visualización. Se
consigue gracias a la función pairs().
pairs(diabetes[,seq(1:8)], main="Matriz dispersión para diabetes")

Matriz dispersión para diabetes


0 100 0 40 100 0 30 60 20 50 80

Pregnancies

0
Glucose
0

BloodPressure

0
SkinThickness
0

Insulin

0
BMI
0

DiabetesPedigreeFunction

0.0
Age
20

0 10 0 60 120 0 400 0.0 1.5

Figure 9: Matriz dispersión

19
A continuación se muestra el listado resumen de los comandos para representar gráficos que hemos estudiado.

Comando Tipo de variable Gráfico que genera


boxplot(x) Gráfico de cajas y bigotes
pie(x) Gráfico de tarta circular
hist(x) Histograma de frecuencias de x
barplot(x) Histograma de valores de x
dotchart(x) Gráfico de puntos
pairs(x) Para un matriz, todos los gráficos bivariados de puntos
contour(x,y,z) Gráfico de contorno para vectores x, y y z

Los gráficos principales, como los anteriores, pueden incluir otros gráficos de segundo nivel que pueden
dibujarse dentro de ellos. Basta con ejecutar la función justo después del gráfico principal.

Comando Gráfico que genera


points(x,y) Añade puntos
points(x,y) Añade líneas
text(x,y,label="") Añade el texto contenido en la etiqueta en el punto
segments(x0 , y0 , x1 , y1 ) Dibuja una línea entre los puntos
abline(y=) Dibuja una línea horizontal
abline(x=) Dibuja una línea vertical
abline(a,b) Dibuja una recta con pendiente a y ordenada en el origen b
curve(funcion curva) Dibuja la curva indicada por la función pasada
title("") Añade un título principal al gráfico.
rug(x) Dibuja los datos sobre el eje x con líneas verticales pequeñas
rect(x0 , y0 , x1 , y1 ) Dibuja un rectángulo con esos límites
legend(x,y,legend=, ) Añade una leyenda a las coordenas x,y
axis() Añade un eje adicional al gráfico actual

Los gráficos pueden incluir parámetros para que sean más vistosos y/o informativos, se incluirán como
argumentos en los gráficos anteriores.

Parámetro Especificación
main Título
sub Subtítulo
xlab Nombre del eje x
ylab Nombre del eje y
xlim=c(xminimo ,xmaximo ) Representación del eje x entre el máximo y el mínimo
ylim=c(yminimo ,ymaximo ) Representación del eje y entre el máximo y el mínimo
bg Color de fondo de la ventana
col Controla el color de símbolos, ejes, título.. (col.axis, col.lab,
col.title. . . )
font Controla el estílo del texto (0 normal, 1 cursiva, 2 negrita, 3
cursiva negrita)
lty Tipo de línea (1 sólida, 2 rallas, 3 puntos. . . )
lwd Anchura de las líneas
cex Controla el tamaño de símbolos, ejes, título.. (cex.axis,
cex.lab, cex.title. . . )
pch Controla el tipo de símbolos (carácter del dibujo) (del 1 al
25)
title("") Añade un título principal al gráfico.

20
Parámetro Especificación
rug(x) Dibuja los datos sobre el eje x con líneas verticales pequeñas
rect(x0 , y0 , x1 , y1 ) Dibuja un rectángulo con esos límites
legend(x,y,legend=, ) Añade una leyenda a las coordenas x,y
axis() Añade un eje adicional al gráfico actual
las() Orientación etiquetas en los ejes (0 paralelo a los ejes, 1
horizontal, 2 perpendicular a los ejes, 3 vertical)

21
Transformación de datos
En ocasiones, se pueden dar situaciones de valores dentro de los datos que sean extremos, para poder reducir
su influencia previo a los análisis que se vayan a realizar se suelen realizar dos transformaciones de todos los
datos:
• Aplicar logarítmos: cuando hay valores muy grandes positivos (observamos un sesgo a la derecha), se
consigue aplicando la función log. De esta manera se reduce el sesgo, y, por ejemplo, en los histogramas,
se observa una distribución de datos más simétrica.
• Aplicar la raíz cuadrada.

Coeficiente de variación
Para comparar la dispersión de varios grupos de datos independientemente de sus unidades, el coeficiente
de variación es muy útil, ya que a través de su cálculo se elimina cualquier influencia que se pueda tener de
las unidades.

s
CV =
x
Por ejemplo, en el dataset de birthwt, las variables lwt y bwt están en distintas unidades, libras y gramos,
respectivamente:
lwt.sd <- sd(birthwt$lwt)
lwt.sd

## [1] 30.57938
bwt.sd <- sd(birthwt$bwt)
bwt.sd

## [1] 729.2143
Calculando el coeficiente de variación:
lwt.cv <- (lwt.sd/mean(birthwt$lwt))
lwt.cv

## [1] 0.2355616
bwt.cv <- (bwt.sd/mean(birthwt$bwt))
bwt.cv

## [1] 0.2476457
De esta manera se puede comparar la distribución de las observaciones de ambas variables, que en esto caso
presentan prácticamente la misma dispersión hablando en términos de CV.

Estandarización
La estandarización de una variable es una transformación lineal habitual, consiste en dividir la media de
la muestra, x, a cada valor observado y dividirlo para la desviación estándar, s, de la muestra:
La variable xi se transforma en la variable yi de la siguiente manera,

xi − x
yi =
s

22
Al restar la media, las observaciones se desplazan hacia el cero. La desviación sigue manteniéndose igual.
Al dividir para la desviación estándar, ésta cambia a 1.
El resultado es que la nueva variable, yi , tiene media 0 y desviación estándar 0.
Es muy habitual en los análisis que realizaremos en las regresiones lineales y de clusterización.

Paquete ggplot2
Existen otros paquetes en R para realizar representaciones gráficas. El paquete ggplot2 ofrece múltiples
funciones para crear gráficos complejos y elegantes. Podeis encontrar cheatsheets en https://ggplot2.tidyverse.
org/
Mientras que en los gráficos básicos hay que pasar como parámetro un vector, ggplot trabaja con dataframes.
Se puede construir cualquier gráfico con los 3 mismos componentes: un dataset, un sistema de coordenadas y
las marcas visuales que representan los puntos de los datos.
install.packages("ggplot2")
Los ejes de coordinación se especifican con el parámetro data, los puntos a representar con la función aes
(viene de aesthetics)
# Solo los ejes
ggplot(diabetes, aes(x= Glucose,y = BMI))

60

40
BMI

20

0 50 100 150 200


Glucose

Se van añadiendo capas al gráfico


# Ejes y puntos
ggplot(diabetes, aes(x= Glucose,y = BMI)) + geom_point()

23
60

40
BMI

20

0 50 100 150 200


Glucose

# Agregar una línea de tendencia


ggplot(diabetes, aes(x= Glucose,y = BMI)) + geom_point() + geom_smooth(method="lm")

60

40
BMI

20

0 50 100 150 200


Glucose

Ajustar los gráficos a nuestras necesidades, eliminando los puntos para los que no hay un valor

24
g <- ggplot(diabetes, aes(x= Glucose,y = BMI)) + geom_point() + geom_smooth(method="lm")
g + xlim(c(1,201)) + ylim(c(1,70))

60

40
BMI

20

0
0 50 100 150 200
Glucose

Hacer zoom a la zona de interés


g <- ggplot(diabetes, aes(x= Glucose,y = BMI)) + geom_point() + geom_smooth(method="lm")
g + coord_cartesian(xlim=c(40,201), ylim=c(15,70))

25
70

60

50
BMI

40

30

20

50 100 150 200


Glucose

Cambiar títulos y etiquetas de los ejes


g1 <- g + coord_cartesian(xlim=c(40,201), ylim=c(15,70))
g1 + labs(title="BMI vs Glucose", subtitle="birthwt dataset", y ="BMI", x="Glucose", caption="Diabetes i

BMI vs Glucose
birthwt dataset
70

60

50
BMI

40

30

20

50 100 150 200


Glucose
Diabetes in women

26
Modificar color y tamaño de puntos
ggplot(diabetes, aes(x= Glucose,y = BMI)) +
geom_point(col="steelblue", size=.5) +
geom_smooth(method="lm", col="firebrick") +
coord_cartesian(xlim=c(40,201), ylim=c(15,70))+
labs(title="BMI vs Glucose", subtitle="birthwt dataset", y ="BMI", x="Glucose", caption="Diabetes in wom

BMI vs Glucose
birthwt dataset
70

60

50
BMI

40

30

20

50 100 150 200


Glucose
Diabetes in women

# Ojo! poner el + al final de cada línea, no al inicio

Distintas categoría en distinto color con leyenda


ggplot(diabetes, aes(x= Glucose,y = BMI)) +
geom_point(aes(col=Outcome), size=1.5) +
geom_smooth(method="lm", col="firebrick") +
coord_cartesian(xlim=c(40,201), ylim=c(15,70))+
labs(title="BMI vs Glucose", subtitle="birthwt dataset", y ="BMI", x="Glucose", caption="Diabetes in wom

27
BMI vs Glucose
birthwt dataset
70

60

50
Outcome
BMI

No
40
Si

30

20

50 100 150 200


Glucose
Diabetes in women

Existen otros paquetes de gráficos como lattice muy útiles para la visualización de datos multivariantes.

28

También podría gustarte