Jornada de Iniciación Científica - Centro Regional de Chiriquí


Tema 3: Gráficos en R - Histograma


Un histograma visualiza la distribución y frecuencia datos durante un intervalo continuo o un período de tiempo determinado. Cada barra en un histograma representa la frecuencia tabulada en cada intervalo / bin.
Los histogramas ayudan a dar una estimación de dónde se concentran los valores, cuáles son los extremos y si hay huecos o valores inusuales.

#cargar librerias ggplot
#-----------------------------------------
library(ggplot2)

# leer datos de titanic
titanic <- read.csv("titanic.csv")

Significado de las variables del dataframe titanic

survival - Survival (0 = No; 1 = Yes)
class - Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
name - Name
sex - Sex
age - Age
sibsp - Number of Siblings/Spouses Aboard
parch - Number of Parents/Children Aboard
ticket - Ticket Number
fare - Passenger Fare
cabin - Cabin
embarked - Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)
boat - Lifeboat (if survived)
body - Body number (if did not survive and body was recovered)

Crear histograma en R

Se pueden construir histogramas con ggplot2 utilizando la geometría geom_histogram() el cual requiere solo 1 variable numérica como entrada.
En este ejemplo se utiliza la variable númerica Age y se muestra una distribución de la edad de los pasajeros del Titanic, donde el indica que la mayor cantidad de pasajeros esta entre las edades de 20 a 40 años.


Gráfico de histograma de la edad de los pasajeros del titanic

ggplot(titanic, aes(Age))+
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 263 rows containing non-finite values (stat_bin).

Al crear este gráfico de Histrograma, R envia dos mensajes:
stat_bin()usingbins = 30. Pick better value withbinwidth`.
Warning
Removed 263 rows containing non-finite values (stat_bin).

El primer mensaje indica que se han generado 30 bin o bloques de columna para crear el histograma, que es el valor predeterminado y que este parámetro se puede modificar con el parámetro bins. El segundo mensaje es un WARNING que indica que se han omitido 263 valores de la variable Age.
En este ejmplo utilizaremos 20 bins o columnas.

ggplot(titanic, aes(Age))+
  geom_histogram(bins = 20)
## Warning: Removed 263 rows containing non-finite values (stat_bin).

Cambiar el color del borde de las barras del histograma para ver mejor los bins.

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="red")
## Warning: Removed 263 rows containing non-finite values (stat_bin).

Cambiar el color del relleno de las barras del histograma utilizando valores hexadecimales “#ff326c”.

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="red", fill="#ff769c")
## Warning: Removed 263 rows containing non-finite values (stat_bin).

Añadir una capa de etiqueta de datos donde es necesario utilizar la misma cantidad de bins en stat_bin(bins = 20).

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="red", fill="#ff769c")+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) 
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).


Al desplegar los graficos con la variable Age, GGPLOT envia el emnsaje:
Removed 263 rows containing non-finite values (stat_bin)
Esto indica que existen valores nulos que están siendo eliminados del gráfico.Podemos ver el esto en el resumen de datos con la función summary(data).

#resumen de datos 
summary(titanic)
##      Pclass         Survived         Name               Sex           
##  Min.   :1.000   Min.   :0.000   Length:1309        Length:1309       
##  1st Qu.:2.000   1st Qu.:0.000   Class :character   Class :character  
##  Median :3.000   Median :0.000   Mode  :character   Mode  :character  
##  Mean   :2.295   Mean   :0.382                                        
##  3rd Qu.:3.000   3rd Qu.:1.000                                        
##  Max.   :3.000   Max.   :1.000                                        
##                                                                       
##       Age              Sibsp            Parch          Ticket         
##  Min.   : 0.1667   Min.   :0.0000   Min.   :0.000   Length:1309       
##  1st Qu.:21.0000   1st Qu.:0.0000   1st Qu.:0.000   Class :character  
##  Median :28.0000   Median :0.0000   Median :0.000   Mode  :character  
##  Mean   :29.8811   Mean   :0.4989   Mean   :0.385                     
##  3rd Qu.:39.0000   3rd Qu.:1.0000   3rd Qu.:0.000                     
##  Max.   :80.0000   Max.   :8.0000   Max.   :9.000                     
##  NA's   :263                                                          
##       Fare            Cabin             Embarked             Boat          
##  Min.   :  0.000   Length:1309        Length:1309        Length:1309       
##  1st Qu.:  7.896   Class :character   Class :character   Class :character  
##  Median : 14.454   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 33.295                                                           
##  3rd Qu.: 31.275                                                           
##  Max.   :512.329                                                           
##  NA's   :1                                                                 
##       body        home.dest        
##  Min.   :  1.0   Length:1309       
##  1st Qu.: 72.0   Class :character  
##  Median :155.0   Mode  :character  
##  Mean   :160.8                     
##  3rd Qu.:256.0                     
##  Max.   :328.0                     
##  NA's   :1188


Modificar las etiquetas de los ejes X / Y del gráfico.

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="red", fill="#ff769c")+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad")
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Añadir la variable categórica SEX al grafico de histograma.

Aunque el histograma muestra dos datos por columna al utilizar la variable categorica SEC, el color de los datos agrupados es el mismo.
Esto se debe a que en la geometria tiene definida un solo color fill=“#ff769c”.

ggplot(titanic, aes(Age, fill = Sex))+
  geom_histogram( bins = 20, color="red", fill="#ff769c")+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad")
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Diferentes colores en el histograma basado en el color generado de una variable categorica eliminando el parámetro fill=“#ff769c” de la geometria.

ggplot(titanic, aes(Age, fill = Sex))+
  geom_histogram( bins = 20, color="red")+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad")
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Capa de facetas en gráficos de histogramas

Aunque permite mostrar los histogramas por sexo y sus datos, en existen valores que se solapan visualmente por lo que es necesaro modificar la visualización utilizando FACETAS.

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=Sex))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  facet_wrap(~Sex)
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Gráfico de histograma con facetas en una columna y dos filas

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=Sex))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  facet_wrap(~Sex, ncol=1)
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Modificar las escalas x / y del gráfico de histograma

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=Sex))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  facet_wrap(~Sex)+
  scale_x_continuous(breaks=c(0,10,20,30,40,50,60,70,80,90,100))+
  scale_y_continuous(breaks = c(0,20,40,60,80,100,120))
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Gráfico de histograma de sobrevivientes por sexo

Los resultados del histograma parecen estar bien, sin embargo los colores generados de la variable categórica no es el correcto. La variable Survived es una variable categorica con dos valores (0,1) por lo cual al ser asignada al atributo fill = Survived debiera generar dos colores.

¿Porqué ocurre este característica de degradado en el relleno?

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=Survived))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  scale_x_continuous(breaks=c(0,10,20,30,40,50,60,70,80,90,100))+
  scale_y_continuous(breaks = c(0,20,40,60,80,100))+
  facet_wrap(~Survived)
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).


Si ejecutamos la funcion str(titanic) se muestra que la variable Survived es de tipo entero con valores 0 y 1, por lo cual GGPLOT asignará a los colores valores continuos entre 0 y 1, osea 0.1, 0.2, 0.3, 0.4… hasta llegar a 1, es por eso que hay un degradado de colores por cada valor generado.

 str(titanic)
## 'data.frame':    1309 obs. of  14 variables:
##  $ Pclass   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Survived : int  1 1 0 0 0 1 1 0 1 0 ...
##  $ Name     : chr  "Allen, Miss. Elisabeth Walton" "Allison, Master. Hudson Trevor" "Allison, Miss. Helen Loraine" "Allison, Mr. Hudson Joshua Creighton" ...
##  $ Sex      : chr  "female" "male" "female" "male" ...
##  $ Age      : num  29 0.917 2 30 25 ...
##  $ Sibsp    : int  0 1 1 1 1 0 1 0 2 0 ...
##  $ Parch    : int  0 2 2 2 2 0 0 0 0 0 ...
##  $ Ticket   : chr  "24160" "113781" "113781" "113781" ...
##  $ Fare     : num  211 152 152 152 152 ...
##  $ Cabin    : chr  "B5" "C22 C26" "C22 C26" "C22 C26" ...
##  $ Embarked : chr  "S" "S" "S" "S" ...
##  $ Boat     : chr  "2" "11" "" "" ...
##  $ body     : int  NA NA NA 135 NA NA NA NA NA 22 ...
##  $ home.dest: chr  "St Louis, MO" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" ...


Debemos decirle a GGPLOT que Survived es una variable categórica asignando el siguiente código fill= as.factor(Survived).

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=as.factor(Survived)))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  scale_x_continuous(breaks=c(0,10,20,30,40,50,60,70,80,90,100))+
  scale_y_continuous(breaks = c(0,20,40,60,80,100))+
  facet_wrap(~Survived)
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).


Aunque utilicemos el siguiente código en GGPLOT la variable Survived sigue siendo de tipo númerica, int (entero).

Transformar variable tipo entero a variable categorica tipo “factor”

Para transformar el tipo de variable en el data.frame, en este caso tipo factor (categorica) debemos utilizar la función as.factor(variable) y asignarla a la misma variable que transformamos.

titanic$Survived <- as.factor(titanic$Survived)
titanic$Sex<- as.factor(titanic$Sex)


Si ejecutamos la función levels(titanic$Survived) muestra que esta variable Survived tiene dos valores o levels: 0 y 1.

Cambiar datos de una variable categorica de tipo factor()

Estos mismos valores aparecen en el gráfico de histograma con la capa de facetas.
Si queremos cambiar los valores de los datos representados por levels debemos asiganarles nuevos valores o labels.

#mostrar levels de la variable
levels(titanic$Survived)
## [1] "0" "1"
#modificar los levels de la variable Survived con nuevos datos
titanic$Survived <- factor(titanic$Survived, 
                             levels = c(0,1),
                             labels = c("no sobrevivieron","sobrevivieron"))

#mostrar nuevo slevels de la variable
levels(titanic$Survived)
## [1] "no sobrevivieron" "sobrevivieron"


Si visualizamos nuevamente el gráfico de histograma los datos de Survived en la capa facet() cambiaron.
Dr le añadio titulo , subtitulo y se modifico la leyenda de “Sobrevivientes”.

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=as.factor(Survived)))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5) +
  ylab("N° Pasajeros") + xlab("Edad") +
  scale_x_continuous(breaks=c(0,10,20,30,40,50,60,70,80,90,100))+
  scale_y_continuous(breaks = c(0,20,40,60,80,100))+
  facet_wrap(~Survived) +
  labs(title="Diatribución de la edad por Sexo de pasajeros que sobrevivieron",
       subtitle="Datos del Titanic - 1912") +
  guides(fill = guide_legend("Sobrevivientes")) 
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).


Podemos eliminar el título “Sobrevivientes” en la leyenda a la derecha del gráfico porque no sería necesario con los cambios realizados, para ello utilizamos el siguiente código guides(fill = guide_legend("")).

ggplot(titanic, aes(Age))+
  geom_histogram( bins = 20, color="black", aes(fill=as.factor(Survived)))+
  stat_bin(bins=20, geom="text", aes(label=..count..), vjust=-0.5, size=3) +
  ylab("N° Pasajeros") + xlab("Edad") +
  facet_wrap(~Survived) +
  labs(title="Diatribución de la edad por Sexo de pasajeros que sobrevivieron",
       subtitle="Datos del Titanic - 1912") +
  guides(fill = guide_legend("")) +
  scale_x_continuous(breaks=c(0,10,20,30,40,50,60,70,80,90,100))+
  scale_y_continuous(breaks = c(0,20,40,60,80,100))
## Warning: Removed 263 rows containing non-finite values (stat_bin).

## Warning: Removed 263 rows containing non-finite values (stat_bin).

Subgrupo de datos a partir de un dataframe.

Para fortalecer el análisis de los datos utilizaremos tablas de contingencias.

En el histrograma un elemento de interés es que se muestran pasajeros con X meses por lo que crearemos un subgrupo de datos a partir de un dataframe utilizando la funcion subset(tabla, filtro) para identificar cuantos pasajeros eran menores de meses. Utilizaremos un filtro o condición para extraer solo las filas cuyo valor de Age sea menor a 1.


#Número de sobrevivientes del titanic
table(titanic$Sex,titanic$Survived)
##         
##          no sobrevivieron sobrevivieron
##   female              127           339
##   male                682           161
#--------------------------------------------------------
#Sub grupo de pasajeros con mas de 18 y menos de 40 años
Edades <- subset(titanic, titanic$Age>=18 | titanic$Age<=40)

#Número de pasajeros con mas de 18 y menos de 40 años
nrow(Edades)
## [1] 1046
#Número de pasajeros con mas de 18 y menos de 40 años
table(Edades$Sex,Edades$Survived)
##         
##          no sobrevivieron sobrevivieron
##   female               96           292
##   male                523           135
#porcentaje
nrow(Edades) / nrow(titanic) *100
## [1] 79.90833
#--------------------------------------------------------
#Sub grupo de pasajeros con X meses de edad en el titanic
bebes <- subset(titanic, titanic$Age<=1)



#Número menores con X meses en el titanic
nrow(bebes)
## [1] 22
#Número menores con X meses que sobrevivieron por sexo
table(bebes$Sex,bebes$Survived)
##         
##          no sobrevivieron sobrevivieron
##   female                1             8
##   male                  4             9
#porcentaje
nrow(bebes) / nrow(titanic) *100
## [1] 1.680672

Análisis de los Gráficos con apoyo de las tablas de contingencias.

Según datos y gráfico de histograma de las 500 personas que sobrevivieron el mayor grupo estaba entre las edades de 18 y 40 años represntando el 79.9% de los pasajeros, de estos 22 eran pasajeros menores de un año, El Rango del grupo que fallecio estaba entre 18 y 45 años aproximadamente y se identifican 5 menores de un año.



PRÁCTICA 1

Crear un gráfico de histograma con la variable FARE.
Mostrar etiquetas de datos.
¿Que puede interpretar?

PRÁCTICA 2

Crear un gráfico de histograma con la variable Fare y la variable categorica Pclass .
Mostrar etiquetas de datos.
Modificar la cantidad de bins.
Incluya titulo y leyendas de ejes X /Y
¿Que observa en el gráfico?

PRÁCTICA 3

Modifique los valores de la variable categorica Pclass por:
Primera Clase, Segunda Clase, Tercera Clase.