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


Tema 4: Gráficos en R - Densidad y Area


Un gráfico de densidad visualiza la distribución de datos cuantitativos en un intervalo o período de tiempo continuo. Este gráfico es una variación de un histograma que usa suavizado de kernel para trazar valores, lo que permite distribuciones más suaves suavizando el ruido.
Los picos de un gráfico de densidad ayudan a mostrar dónde se concentran los valores durante el intervalo.

#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 historgramas en R

Se pueden construir histogramas con ggplot2 utilizando la geometría geom_density() 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. La mayor densidad de datos está en el rango de edad de 15 a 45.


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

#grafico de densidad
ggplot(titanic, aes(Age))+
  geom_density()
## Warning: Removed 263 rows containing non-finite values (stat_density).

Al crear este gráfico de desnsidad, R envia el mensaje:
Warning
Removed 263 rows containing non-finite values (stat_bin).

Indica que se han omitido 263 valores de la variable Age por ser valores nulos.
Podemos cambiar el color de la línea del grafico y el tamaño de la línea en la geometría.

#graficos de area de densidad
ggplot(titanic, aes(Age))+
  geom_density(color="#589652", size=2)
## Warning: Removed 263 rows containing non-finite values (stat_density).

Crear un color de relleno del grafico de densidad utilizando colores hexadecimales y la estetica fill.

#graficos de area de densidad
ggplot(titanic, aes(Age))+
  geom_density(fill="#589652")
## Warning: Removed 263 rows containing non-finite values (stat_density).

#Grafico densidad con variable cuantitativa Age y categorica Sex. Se utiliza la variable categórica para crear grupos de datos en las estica de datos fill =Sex.

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density()
## Warning: Removed 263 rows containing non-finite values (stat_density).


Se puden superponer los gráficos y mostrar ambos utilizando la estética alpha en la geometria.
En el gráfico de densidad se puede ver que existe una dispersión de datos (ancho del grafico) similar aunque los datos del grupofemenino están ligeramente mpas dispersos y una centralidad de datos (punto más alto de la curva, indica la media de datos) ligeramente mayor en los hombres.
Esto puede indicar que la media de edad de lis varones es mayor que el de las mujeres.

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density(alpha=0.45)
## Warning: Removed 263 rows containing non-finite values (stat_density).

Extrae subgrupo de datos por sexo y calculo de la media

Al crear subgrupo de datos por sexo, obtenemos dos nuevos dataFrames, female y male.
Si utilizamos la función mean() podemos calcular la media de los datos de la variable Age de la siguiente forma mean(female$Age).

#subgrupo de datos por sexo
female <- subset(titanic, titanic$Sex=="female")
male <- subset(titanic, titanic$Sex=="male")
nrow(female)
## [1] 466
nrow(male)
## [1] 843
#media de subgrupo de datos son valores nulos
# el resultado será NA 
mean(female$Age)
## [1] NA
mean(male$Age)
## [1] NA


Si ejecutamos la función summary podemos ver un resumen de los datos, donde en la variable Age indica 263 valores nulos, este impide que podamos utilizar funciones aritméticas como mean().

#Resumen de datos dond Eel variable AGE tiene valores nulos o NA
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

TIPS 1: Eliminar valores nulos NA y calculo de la media de grupos Sex

Podemos utilizar dentro de la funciones aritméticas la función na.omit(variable) para eliminar los valores nulos de la variable Age.
De esta forma calculamos la media de datos para identificar cual grupo tiene un valor central mayor:
female: 28.68
male 30.58

#media de subgrupo de datos sin valores nulos
mean(na.omit(female$Age))
## [1] 28.68707
mean(na.omit(male$Age))
## [1] 30.58523
#mediana 
median(na.omit(female$Age))
## [1] 27
median(na.omit(male$Age))
## [1] 28

Calculo de la Desviasión estandar para conocer la dispersión de datos.

Para conocer la dispersión de los datos por grupo Sex utilizamos la fucnión sd() y los dos subgrupos de datos.
El resultados de la desviación estandar nos muestara que:
female: 14.577
male: 14.28057

Una desviación estandar ligeramente mayor en los datos del Sexo femenino, como mostraba el gráfico de dispersión en la districución de datos.

#media de subgrupo de datos sin valores nulos
sd(na.omit(female$Age))
## [1] 14.577
sd(na.omit(male$Age))
## [1] 14.28057

Mostrar la media de los datos por grupo en el gráfico de densidad con la capa geom_vline().
Se añadio el título y el cambio de la etiqueta del eje x.
Se modifco la etqiueta de la leyenda.

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density(alpha=0.25)+
  geom_vline(aes(xintercept=mean(na.omit(female$Age)), color="blue"),
             linetype="dashed", size=1) +
  geom_vline(aes(xintercept=mean(na.omit(male$Age)), color="red"),
             linetype="dashed", size=1) +
  labs(title="Grafico de densidad de datos por Edad y Sexo",x="Edad(año)", y = "Density")
## Warning: Removed 263 rows containing non-finite values (stat_density).


Grafico de densidad por edad en faceta de la variable Sexo

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density(alpha=0.25)+
  geom_vline(aes(xintercept=mean(na.omit(female$Age)), color="blue"),
             linetype="dashed", size=1) +
  geom_vline(aes(xintercept=mean(na.omit(male$Age)), color="red"),
             linetype="dashed", size=1) +
  labs(title="Grafico de densidad de datos por Edad y Sexo",x="Edad(año)", y = "Density")+
  guides(fill = guide_legend("Sexo"), color = FALSE)+
facet_wrap(~Sex)
## Warning: Removed 263 rows containing non-finite values (stat_density).

Calculo de la media y datos de pasajeros del sexo femenino

La mayor distribución en el gráfico esta en pasajeros (mujeres) con edad por debajo de la media.

#total de pasajeros por sexo
table(titanic$Sex)
## 
## female   male 
##    466    843
#total de observaciones de mujeres
mujeres <- subset(titanic, titanic$Sex=="female")

# media edad de mujeres
mediaM <- mean(na.omit(female$Age))

#mujeres menores que la media
mujeresEdad_mayor <- subset(mujeres, mujeres$Age>mediaM)

#mujeres mayores de la media
mujeresEdad_menor <- subset(mujeres, mujeres$Age<mediaM)

Modificar etiqueta SEX y eliminar etiqueta color.

Para eliminar una etiqueta se debe llamar el atributo, en este caso color= y darle el valor de FALSE, para que no se muestre.

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density(alpha=0.25)+
  geom_vline(aes(xintercept=mean(na.omit(female$Age)), color="blue"),
             linetype="dashed", size=1) +
  geom_vline(aes(xintercept=mean(na.omit(male$Age)), color="red"),
             linetype="dashed", size=1) +
  labs(title="Grafico de densidad de datos por Edad y Sexo",x="Edad(año)", y = "Density")+
  guides(fill = guide_legend("Sexo"), color = FALSE)
## Warning: Removed 263 rows containing non-finite values (stat_density).

Agrupar graficos de densidad

Para agrupar graficos de densidad se debe utilizar la función position = “stack” en la geometría.

ggplot(titanic, aes(Age, fill=Sex))+
    geom_density(alpha=0.25 , position = "stack")+
  geom_vline(aes(xintercept=mean(na.omit(female$Age)), color="blue"),
             linetype="dashed", size=1) +
  geom_vline(aes(xintercept=mean(na.omit(male$Age)), color="red"),
             linetype="dashed", size=1) +
  labs(title="Grafico de densidad de datos por Edad y Sexo",x="Edad(año)", y = "Density")+
  guides(fill = guide_legend("Sexo"), color = FALSE)
## Warning: Removed 263 rows containing non-finite values (stat_density).

Análisis de los Gráficos de densidad.

Según datos y gráfico de densidad podemos decir que la variable Age con datos del sexo femenino se caracteriza por 28.68 +- 14.577 y los datos del sexo masculino 30.58 +- 14.28057, que indica una mayor centralidad de los datos del sexo masculino y una mayor dispersión en los datos del sexo femenino.



Mostrar grafico de densidad e histograma a la vez, solo con una variable cuantitativa

Se utiliza la geometria de histrograma con la diferencia que se le debe indicar que el valor de Y esta relacionado con la densidad geom_histogram(aes(y=..density..)) los demás parámetros dentro de la geometria de historgrama son esteticos.

ggplot(titanic, aes(Age))+
   geom_histogram(aes(y=..density..), alpha=0.35, bins=20)+
   geom_density(alpha=0.25 )+
  geom_vline(aes(xintercept=mean(na.omit(female$Age)), color="blue"),
             linetype="dashed", size=1) +
  geom_vline(aes(xintercept=mean(na.omit(male$Age)), color="red"),
             linetype="dashed", size=1) +
  labs(title="Grafico de densidad de datos por Edad y Sexo",x="Edad(año)", y = "Density")+
  guides(fill = guide_legend("Sexo"), color = FALSE)
## Warning: Removed 263 rows containing non-finite values (stat_bin).
## Warning: Removed 263 rows containing non-finite values (stat_density).

PRÁCTICA 1

Crear un gráfico de densidad con la variable FARE y categorica Sex

PRACTICA 2

Creo un gráfico de densidad con la variable FARE y categorica Sex Utilice en la geometria la estetica kernel = c(kernel=“gaussian”).

PRACTICA 3

Calcule la media y los datos de pasajeros del sexo masculino, mayores y menores que la media.
Muestre los 10 primeros datos.