R for Data Science 2ed

1 Visualización de datos

ā€œEl grĆ”fico simple ha aportado mĆ”s información a la mente del analista de datos que cualquier otro dispositivoā€. — John Tukey

Requisitos previos

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## āœ” dplyr     1.1.4     āœ” readr     2.1.5
## āœ” forcats   1.0.0     āœ” stringr   1.5.1
## āœ” ggplot2   3.5.1     āœ” tibble    3.2.1
## āœ” lubridate 1.9.3     āœ” tidyr     1.3.1
## āœ” purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## āœ– dplyr::filter() masks stats::filter()
## āœ– dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(palmerpenguins)
library(ggthemes)

Primeros pasos

¿Los pingüinos con aletas mÔs largas pesan mÔs o menos que los pingüinos con aletas mÔs cortas? Probablemente ya tengas una respuesta, pero intenta que sea precisa. ¿Cómo es la relación entre la longitud de las aletas y la masa corporal? ¿Es positiva? ¿Negativa? ¿Lineal? ¿No lineal? ¿La relación varía según la especie de pingüino? ¿Y según la isla en la que vive el pingüino? Creemos visualizaciones que podamos usar para responder estas preguntas.

El marco de datos penguins

Para facilitar la discusión, definamos algunos términos:

  • Una variable es una cantidad, cualidad o propiedad que se puede medir.

  • Un valor es el estado de una variable cuando se mide. El valor de una variable puede cambiar de una medición a otra.

  • Una observación es un conjunto de mediciones realizadas en condiciones similares (normalmente, todas las mediciones de una observación se realizan al mismo tiempo y sobre el mismo objeto). Una observación contendrĆ” varios valores, cada uno asociado a una variable diferente. A veces nos referiremos a una observación como un punto de datos.

  • Los datos tabulares son un conjunto de valores, cada uno asociado a una variable y una observación. Los datos tabulares estĆ”n ordenados si cada valor se coloca en su propia ā€œceldaā€, cada variable en su propia columna y cada observación en su propia fila.

penguins

Este marco de datos contiene 8 columnas. Para obtener una vista alternativa, donde puede ver todas las variables y las primeras observaciones de cada variable, utilice glimpse(). O bien, si estĆ” en RStudio, ejecute View(penguins)para abrir un visor de datos interactivo.

Entre las variables de penguins se encuentran:

  • species:una especie de pingüino (Adelia, barbijo o papĆŗa).

  • flipper_length_mm:longitud de la aleta de un pingüino, en milĆ­metros.

  • body_mass_g:masa corporal de un pingüino, en gramos.

Objetivo final

Objetivo Final del Ejercicio
Objetivo Final del Ejercicio

Creación de un ggplot

Vamos a recrear esta trama paso a paso.

ggplot(
  data = penguins
)

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
)

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point()
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

Ahora tenemos algo que se parece a lo que podrĆ­amos considerar un ā€œdiagrama de dispersiónā€. TodavĆ­a no coincide con nuestro grĆ”fico de ā€œobjetivo finalā€, pero al utilizar este grĆ”fico podemos empezar a responder la pregunta que motivó nuestra exploración: ā€œĀæCómo es la relación entre la longitud de la aleta y la masa corporal?ā€ La relación parece ser positiva (a medida que aumenta la longitud de la aleta, tambiĆ©n lo hace la masa corporal), bastante lineal (los puntos se agrupan alrededor de una lĆ­nea en lugar de una curva) y moderadamente fuerte (no hay demasiada dispersión alrededor de dicha lĆ­nea). Los pingüinos con aletas mĆ”s largas son generalmente mĆ”s grandes en tĆ©rminos de su masa corporal.

AƱadiendo estƩtica y capas

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +
  geom_point()
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

Cuando una variable categórica se asigna a una estética, ggplot2 asignarÔ automÔticamente un valor único de la estética (aquí un color único) a cada nivel único de la variable (cada una de las tres especies), un proceso conocido como escalamiento . ggplot2 también agregarÔ una leyenda que explica qué valores corresponden a qué niveles.

Haciendo una regresión lineal

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +
  geom_point() +
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

## Regresión lineal por minimos cuadrados para cada especie

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +
  geom_point() +
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

Regresión lineal por mínimos cuadrados general

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(mapping = aes(color = species)) +
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

Visualización de los precios de las casas de Boston

Cargando el dataset housing.csv

library(readr)
housing <- read_csv("housing.csv")
## Rows: 20640 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): ocean_proximity
## dbl (9): longitude, latitude, housing_median_age, total_rooms, total_bedroom...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
names(housing)
##  [1] "longitude"          "latitude"           "housing_median_age"
##  [4] "total_rooms"        "total_bedrooms"     "population"        
##  [7] "households"         "median_income"      "median_house_value"
## [10] "ocean_proximity"

Visualizando el mapa de Boston

ggplot(
  data = housing,
  mapping = aes(x = longitude, y = latitude)
) +
  geom_point()

ggplot(
  data = housing,
  mapping = aes(x = longitude, y = latitude, colour = ocean_proximity)
) +
  geom_point()

Visualizar la relación entre el ā€œmedian_incomeā€ y el ā€œmedian_house_valueā€

ggplot(
  data = housing,
  mapping = aes(x = median_income, y = median_house_value)
) +
  geom_point()

Visualizando la relación de acuerdo a ocean_proximity

ggplot(
  data = housing,
  mapping = aes(x = median_income, y = median_house_value, colour = ocean_proximity)
) +
  geom_point()

Visualizando la relación entre el ā€œmedian_incomeā€ y el ā€œmedian_house_valueā€ estratificado por ocean_proximity y regresión lineal

ggplot(
  data = housing,
  mapping = aes(x = median_income, y = median_house_value, colour = ocean_proximity)
) +
  geom_point() +
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

Visualizando los precios de las casas de Boston en el mapa

# Crear el grƔfico
ggplot(housing, aes(x = longitude, y = latitude)) +
  geom_point(aes(color = median_house_value), size = 2) +  # Representa los precios medianos de las casas con el color
  scale_color_gradient(low = "blue", high = "red", name = "Precio Medio") +  # Define el gradiente de color
  labs(title = "Distribución de Precios de Casas", 
       x = "Longitud", 
       y = "Latitud") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el tĆ­tulo

## Visualizar de manera interactiva los precios de las casas en el mapa

# Cargar librerĆ­as
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
# Crear el grƔfico con ggplot2
gg <- ggplot(housing, aes(x = longitude, y = latitude)) +
  geom_point(aes(color = median_house_value, text = paste("Precio Medio:", median_house_value)), size = 2) + 
  scale_color_gradient(low = "blue", high = "red", name = "Precio Medio") +
  labs(title = "Distribución de Precios de Casas", 
       x = "Longitud", 
       y = "Latitud") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## Warning in geom_point(aes(color = median_house_value, text = paste("Precio
## Medio:", : Ignoring unknown aesthetics: text
# Convertir el grƔfico con plotly para interactividad
ggplotly(gg, tooltip = "text")