La estadística es una herramienta poderosa que nos permite transformar datos en información significativa. Al analizar datos, podemos identificar patrones, tendencias y características importantes de las poblaciones que estudiamos. Para esta segunda parte del manual, exploraremos conceptos básicos de estadística y utilizaremos el lenguaje de programación R para aplicar estos conceptos en la práctica.
Con frecuencia, los estudiantes de biología e ingeniería ambiental se enfrentan inicialmente con datos sin procesar, que son los registros u observaciones que conforman una muestra. Estos datos pueden estar almacenados en un objeto especializado de R, como un dataframe, y a menudo son leídos desde un archivo externo. Antes de poder resumir o modelar los datos, es crucial identificar claramente las variables disponibles. Una variable representa una característica de un individuo en una población, cuyo valor puede variar entre diferentes entidades dentro de esa población.
Una variable en el contexto de la estadística y el análisis de datos es una característica o propiedad que puede tomar diferentes valores y que se utiliza para describir a los individuos en una muestra o población. Por ejemplo, en un estudio sobre la biodiversidad de un ecosistema, las variables podrían incluir el número de especies, la biomasa total o la temperatura del ambiente. Estas variables son medidas o características que pueden diferir entre diferentes individuos u objetos en el estudio.
Una variable numérica en biología e ingeniería ambiental es aquella cuyas observaciones se registran como números. Existen dos tipos: continuas y discretas. Una variable continua puede tomar cualquier valor en un intervalo, con cualquier cantidad de decimales. Por ejemplo, si se está midiendo la temperatura del agua en un río, un valor de 25.5 grados Celsius tiene sentido, al igual que 25.5478 grados Celsius. En cambio, una variable discreta solo puede tomar valores numéricos distintos, y si el rango está restringido, entonces el número de valores posibles es finito. Por ejemplo, al contar la cantidad de especies de árboles en un área, solo se pueden tener números enteros, no se pueden tener 2.5 especies de árboles.
Las variables categóricas son aquellas que representan características que pueden clasificarse en grupos o categorías. Existen dos tipos principales: nominal y ordinal.
Las variables nominales son aquellas en las que las categorías no pueden ser ordenadas de manera lógica. Por ejemplo, en un estudio sobre especies de aves, la variable “color de plumaje” sería nominal, ya que los colores de plumaje no tienen un orden específico.
Por otro lado, las variables ordinales son aquellas en las que las categorías pueden ser ordenadas de alguna manera significativa. Por ejemplo, en un estudio sobre la calidad del agua, la variable “nivel de contaminación” podría ser ordinal si las categorías son “bajo”, “medio” y “alto”, ya que estas categorías tienen un orden específico de menor a mayor contaminación.
Identificar los tipos de variables en un conjunto de datos es simple una vez que sabes qué buscar. Por ejemplo, puedes usar el conjunto de datos ToothGrowth, que también está disponible en el paquete de datasets que se carga automáticamente. Al ingresar el comando adecuado en la consola de R, obtendrás una vista previa de los primeros registros de este conjunto de datos.
# Cargar el conjunto de datos ToothGrowth
data(ToothGrowth)
# Ver los primeros registros del conjunto de datos
head(ToothGrowth)En RStudio quedaría de la siguiente manera:
Ahora bien, la instrucción ?ToothGrowth , se utiliza
para acceder a la ayuda (documentación) relacionada con el conjunto de
datos ToothGrowth. Al ejecutar esta instrucción, se abrirá
la documentación asociada con el conjunto de datos
ToothGrowth, proporcionando información sobre su
estructura, contenido y uso.
# accede a la ayuda respecto al dataset TootGrowt
?ToothGrowth
El conjunto de datos ToothGrowth contiene información
sobre el crecimiento dental en conejos. Tiene 60 observaciones y 3
variables:
len: Es una variable numérica que representa la
longitud del brote dental.
supp y dose: Son variables categóricas.
supp indica el tipo de suplemento y doce la
dosis diaria del suplemento, ambos como factores categóricos.
Los datos univariables se refieren a aquellos datos que están relacionados con una sola variable o característica. En otras palabras, son observaciones que pueden ser expresadas con un único valor numérico o categórico. Por ejemplo, si estamos hablando de la longitud de una especie de planta, cada medición individual de longitud sería un dato univariable.
Por otro lado, los datos multivariables implican múltiples variables o características asociadas con cada observación. Estos datos están representados por más de un valor numérico o categórico por observación. Por ejemplo, si además de la longitud de una planta también tenemos información sobre su anchura, altura y peso, entonces estamos tratando con datos multivariables.
En el contexto de la biología y la ingeniería ambiental, los datos univariables pueden referirse a cosas como la temperatura del agua en un río, la cantidad de oxígeno disuelto en un lago o el número de especies de aves en un área específica. Estos datos son útiles para comprender una característica particular de un sistema biológico o ambiental.
Por otro lado, los datos multivariables en estos campos podrían incluir información sobre múltiples variables ambientales, como la temperatura, la humedad, la precipitación y la calidad del suelo en diferentes sitios de estudio. Estos datos son importantes para comprender las interacciones complejas entre diferentes variables en un ecosistema o entorno ambiental.
Se mencionan a continuación dos ejemplos de datos univariables y multivariables:
Univariable: El conjunto de datos CO2 contiene mediciones de la tasa de intercambio de dióxido de carbono (CO2) en plantas de diferentes tipos de árboles en respuesta a diferentes niveles de luz, agua y temperatura. Cada columna representa una variable univariable (tasa de CO2), y cada fila representa una observación única de una planta en condiciones específicas.
Multivariable: El conjunto de datos airquality contiene mediciones diarias de la calidad del aire en la ciudad de Nueva York. Incluye variables como la concentración de ozono, la velocidad del viento, la temperatura y la radiación solar. Cada columna representa una variable multivariable (ozono, velocidad del viento, etc.), y cada fila representa una observación única de un día específico.
# Carga del dataset
data(airquality)
# Visualización de las primeras filas del dataset
head(airquality)En RStudio se verían de la siguiente manera:
La estadística como disciplina se enfoca en comprender las características de una población completa, la cual consiste en todos los individuos o entidades de interés. Estas características son conocidas como parámetros. Dado que los investigadores generalmente no pueden acceder a datos relevantes de todos los miembros de la población, suelen recolectar una muestra representativa de entidades y registran los datos pertinentes de esta muestra. Posteriormente, pueden estimar los parámetros de interés utilizando los datos de la muestra, y esas estimaciones se consideran estadísticas.
Supongamos que un grupo de biólogos está estudiando una población de aves en un bosque. La población total de aves en el bosque se considera la población completa. Los biólogos están interesados en la altura promedio de los árboles en los que las aves anidan, pero medir la altura de todos los árboles en el bosque sería impracticable. En cambio, toman una muestra de árboles y registran sus alturas. La altura promedio de estos árboles en la muestra se considera una estadística, mientras que la altura promedio de todos los árboles en el bosque se consideraría el parámetro.
Imagina que un equipo de ingenieros ambientales está evaluando la calidad del agua en un río. La calidad del agua en todo el río se considera la población completa. Los ingenieros desean determinar la concentración promedio de un contaminante específico en el agua, pero tomar muestras de toda la longitud del río sería poco práctico. En cambio, recogen muestras de agua en varios puntos a lo largo del río y analizan la concentración del contaminante en estas muestras. La concentración promedio de contaminante en estas muestras sería una estadística, mientras que la concentración promedio en todo el río sería el parámetro de interés.
El análisis descriptivo de datos es una fase fundamental en estadística, esta se centra en la descripción, resumen y presentación de información clave sobre un conjunto de datos. El objetivo principal es entender las características principales de los datos y proporcionar una visión general que facilite la interpretación de los datos. Algunas de las técnicas comunes utilizadas en el análisis descriptivo de datos las distribuciones de frecuencia, las medidas de tendencia central y las medidas de dispersión.
Cuando hablamos de frecuencias, se trata de la cantidad de veces que se repite un fenómeno o evento en un período de tiempo específico. Entonces, ¿qué es una distribución de frecuencias? Es una representación de la frecuencia con la que ocurren diferentes valores en un conjunto de datos. En otras palabras, muestra cuántas veces aparece cada valor dentro de un conjunto de datos. Es una herramienta fundamental en estadística descriptiva que permite visualizar y comprender la estructura y la variabilidad de los datos.
Para crear una distribución de frecuencias, primero se identifican los valores únicos presentes en el conjunto de datos y luego se cuenta cuántas veces aparece cada valor. Estos recuentos se denominan frecuencias absolutas. Luego, las frecuencias absolutas se pueden convertir en frecuencias relativas dividiendo cada frecuencia absoluta por el tamaño total del conjunto de datos, lo que proporciona la proporción de veces que ocurre cada valor. Además, existen las frecuencias acumuladas, pueden ser absolutas acumuladas o relativas acumuladas, esto no es más que la suma de las frecuencias de los valores anteriores al último calculado hasta el valor de interés en un conjunto de datos
Las tablas de distribución de frecuencias pueden ser simples (valores puntuales) o agrupadas (intervalos de datos), por ejemplo:
El promedio mensual de la duración de fallas eléctricas, en minutos, de 36 casas de una misma colonia se presenta en la siguiente tabla. Determina su distribución de frecuencias
Para la distribución de frecuencias simples, buscamos una tabla que nos arroje qué tanto se repiten el mismo tiempo para las diferentes casas, el siguiente script se resuelve así:
# El promedio mensual de la duración de fallas eléctricas, en minutos, de
# 36 casas de una misma colonia se presenta en la siguiente tabla.
# Determina su distribución de frecuencias.
# Construcción de la matriz
Minutos_falla <- matrix(c(20,10,50,60,15,20,25,15,10,
60,10,25,5,70,25,0,15,10,
10,25,35,15,35,0,60,20,0,
10,20,60,15,60,10,5,70,60),4,9, byrow=T)
#observamos la matriz a la que nombramos: Minutos_falla
Minutos_falla
#La función table, nos arrojará la frecuencia de cada dato
table(Minutos_falla)
# La función data frame nos acomodará los datos en forma de tabla de doble entrada
data.frame(table(Minutos_falla))La función table(datos), será la responsable de contar
cuántas veces se repite un mismo valor en el conjunto de datos. Mientras
que la función data.frame(datos), nos sirve para reacomodar
la tabla de frecuencia absolutas.
Esto se resuelve de la siguiente forma en RStudio:
Por otro lado, para las frecuencias agrupadas, lo que buscamos es la frecuencia en la que se repiten los valores dentro de intervalos de nuestro conjunto de datos, para este ejemplo, tomaremos los mismos datos de la frecuencias simples con la diferencia de que ahora tomamos en cuenta intervalos, para poder comparar las frecuencias:
# El promedio mensual de la duración de fallas eléctricas, en minutos, de
# 36 casas de una misma colonia se presenta en la siguiente tabla.
# Determina su distribución de frecuencias.
# Construcción de la matriz
Minutos_falla <- matrix(c(20,10,50,60,15,20,25,15,10,
60,10,25,5,70,25,0,15,10,
10,25,35,15,35,0,60,20,0,
10,20,60,15,60,10,5,70,60),4,9, byrow=T)
Intervalos <- cut(Minutos_falla, breaks = c(-1,10,20,30,40,50,60,70))
levels(Intervalos) <- c("0 a 10", "11 a 20", "21 a 30", "31 a 40", "41 a 50", "51 a 60","61 a 70")
table(Intervalos)
data.frame(table(Intervalos))El comando cut(datos, breaks= ) nos separará el conjunto
de datos según lo definamos en la condición breaks, si concatenamos
valores del conjunto, los intervalos empezarán y terminarán en esos
mismos valores, mientras que si condicionamos el break a un solo numero,
por ejemplo, “cut(datos, breaks= 3)”, el conjunto de datos se dividirá
en exactamente 3 partes, por tanto, serán 3 intervalos del mismo
tamaño.
El comando levels(datos), nos dejará renombrar los
intervalos, para esto, es necesario dar el mismo número de nombres para
asignar, que número de intervalos.
Se trata de una tabla que incluye la frecuencia absoluta, frecuencia absoluta acumulada, frecuencia relativa y frecuencia relativa acumulada. Veamos un ejemplo:
La CFE requiere información sobre el consumo de los clientes para hacer pronósticos más precisos de la demanda de energía eléctrica. El área de impacto ambiental de la Dacbiol ha determinado que el consumo de energía (BTU) durante un periodo particular con una muestra de 81 clientes que enfrían sus casas on A/C. Los resultados fueron los siguientes. Calcula su tabla de frecuencia.
# # La CFE requiere información sobre el consumo de los clientes para hacer pronóstico
# más precisos de la demanda de energia electrica. El área de impacto ambiental de la
# DACBiol ha determinado que el consumo de energia (BTU) durante un periodo particular
# con una muestra de 81 clientes que enfrian sus casas con A/C. Los resultados fueron los siguientes.
# Calcula su tabla de frecuencia.
DATOS_CFE <- matrix(c(2.97, 4.00, 5.20, 5.56, 5.94, 5.98, 6.62, 6.72, 6.78,
6.80,6.85, 6.94, 7.15, 7.16, 7.23, 7.62, 7.62, 7.69, 7.73, 7.87, 7.93,
8.00, 8.26, 8.29, 8.47, 8.54, 8.58, 8.61, 8.67, 8.69, 8.81, 9.07,
9.27, 9.43, 9.52, 9.58, 9.60, 9.76, 9.82, 9.83, 9.83, 9.84, 10.04,
10.21, 10.28, 10.28, 10.30, 10.35, 10.36, 10.40, 10.49, 10.64, 10.95,
11.09, 11.12, 11.21, 11.29, 11.43, 11.62, 11.70, 12.16, 12.19, 12.28,
12.31, 12.62, 12.69, 12.71, 12.91, 13.11, 13.38, 13.42, 13.43, 13.47, 13.60,
13.96, 14.24, 14.35, 15.24, 16.06, 16.90, 18.26),9,9, byrow=T)
Intervalos <- cut(DATOS_CFE, breaks = c(2,6,9,12,15,19))
levels(Intervalos) <- c("(2,6]", "[6.1,9]","[9.1,12]","[12.1,15]","[15.1,19)")
Frec_Abs<- table(Intervalos)
Frec_Abs_Acum <- cumsum(Frec_Abs)
Frec_Relativa <- prop.table(Frec_Abs)
Frec_Rel_Acum <- cumsum(Frec_Relativa)
Tabla <- data.frame(Frec_Abs,Frec_Abs_Acum, Frec_Relativa,Frec_Rel_Acum,row.names=c(1:length(Frec_Abs)))
Tabla$Intervalos.1 <- NULL
colnames(Tabla)<- c("Intervalos","Frec_Abs", "Frec_Abs_Acum", "Frec_Relativa", "Frec_Rel_Acum")
TablaVeamos el script:
Esto se verá así en RStudio:
Las instrucciones usadas para la tabla de frecuencia fueron:
Cut(datos,breaks= c (x1,x2,…,xn=xi)) siendo datos,
nuestra matriz a la que le dimos el nombre de DATOS_CFE; y xi siendo los
valores que “cortaran” al conjuntos de datos, en intervalos.
Levels( Intervalos ) nos ayuda a crear un vector con los
nombres que le daremos a cada intervalo establecido.
Table( Intervalos ) se encarga de arrojarnos las
frecuencias absolutas de los datos agrupados.
Cumsum (datos) es la instrucción que nos dará la
frecuencia acumulada, o sea la frecuencia absoluta (o en su caso, la
frecuencia relativa) de ese valor en cuestión más la frecuencia absoluta
(o relativa) de todos los valores anteriores.
La instrucción prop.table(Frecuencia absoluta) nos dará
la frecuencia relativa de los intervalos, esto es la frecuencia absoluta
dividida por el número de datos, en este caso, 81.
Tip: Cuando añadimos todas las frecuencias calculadas a una sola tabla, con la instrucción data.frame, se incluirán todas las columnas que contengan inicialmente las frecuencias, así que cuando se repite una columna porque viene incluida en los resultados, la forma más facil de eliminarla es asignándole el valor NULL, así:
Tabla$Columna <- NULL
Esta diferencia en el data.frame se observa así:
Las medidas de tendencia central son estadísticas que proporcionan un valor representativo o “centro” de un conjunto de datos. Estas medidas ofrecen una idea de la ubicación típica de los datos y son útiles para resumir grandes cantidades de información en un solo valor.
La media de un conjunto de datos es un número que indica el promedio
ponderado de los diferentes valores que forman parte del conjunto que se
está analizando. A la media también se le conoce como esperanza, valor
esperado o valor promedio. Para calcular el valor de la media, se suman
todos los valores del vector el cual estamos operando, y dividiendo esa
suma por el número total de observaciones, a este número de
observaciones se le denomina n. La fórmula para calcular la media de un
conjunto de datos con n observaciones es: \[\bar{X} = \frac{\sum_{i=1}^n X_i}{n}\] Por
ejemplo, si las calificaciones finales de un estudiante son:
8.8,9,10,9,7.5 y 10, el promedio de calificaciones del estudiante
es:\(¯X= (8+9+10+9+7+10) / 6 = 8.8 »
9\) En RStudio, la instrucción que calcula la media de un
conjunto de datos es mean(datos).
En RStudio, la instrucción que calcula la media de un conjunto de
datos es mean(datos).
Observemos el ejemplo:
# Cálculo de la media de un conjuntos de datos
data_birds <- data.frame(
Especie = c("Quetzal", "Tucán pico iris", "Colibrí orejas violeta", "Pájaro carpintero bellotero", "Perico frentirrojo", "Chachalaca", "Azulejo lomiescarlata", "Garza tricolor", "Tangara dorada", "Chuparrosa garganta rubí", "Pájaro moscón collarejo", "Quiróptero orejón", "Zopilote rey", "Cigüeña jabirú", "Cotorro cabeza amarilla", "Gavilán de Swainson", "Tórtola cola larga", "Picaflor de vientre blanco", "Carpintero real", "Vireo ojirrojo"
),
Longitud_Cuerpo_cm = c(45, 8, 100, 15, 70, 100, 37, 72, 23, 88, 45, 14, 65, 30, 91, 50, 77, 19, 58, 84),
Peso_g = c(206, 183, 129, 217, 142, 199, 121, 94, 228, 176, 104, 215, 195, 148, 87, 122, 234, 201, 84, 159)
)
mean(data_birds$Peso_g)
# Para que el error “math processing error” no ocurra instala, el siguiente paquete:
#install.packages("tinytex")
#tinytex::install_tinytex()En RStudio, los resultados se verán así:
En contraste, se establece que la mediana representa el punto medio de una serie de datos cuando estos están dispuestos en orden ascendente. En el caso de un conjunto impar de datos, la mediana se corresponde con el valor ubicado en la posición central. Por otro lado, cuando se trata de un número par de datos, la mediana se calcula tomando el promedio entre los dos valores centrales.
Por ejemplo, si el conjunto de datos es: 1, 4, 7, 8, 10; como hay un número impar de datos, la mediana es el valor en la posición central, que es 7. Por otro lado, si el conjunto de datos es: 2, 3, 5, 7, 9, 12; como hay un número par de datos, la mediana se obtiene promediando los dos valores centrales, que son 5 y 7. Por lo tanto, la mediana en este caso sería \((5 + 7) / 2 = 6\).
En RStudio, la instrucción que nos arroja la mediana de un conjunto
de datos, es la instrucción median(datos), observemos su
aplicación a continuación:
# Calculo de la mediana de un conjunto de datos
# El siguiente cojuntos de datos representa la longitud en metros de diferentes
# cocodrilos que fueron objeto de investigación
longitud <- c(3.3, 5, 1.3,1.9,2.2,3.3,1.7)
median(longitud)Tip: No es necesario que se ordenen los datos puesto que la instrucción lo hará automáticamente. Observemos los resultados en RStudio:
Por último, la moda se trata del valor que aparece con mayor frecuencia dentro del conjunto de datos, para esta medida estadística no es necesario ordenar los datos. Puede haber más de una moda en un conjunto si varios valores tienen la misma frecuencia máxima o bien, que no tenga moda si es que ningún valor de repite.
Por ejemplo, considera el conjunto de datos: 2, 4, 4, 6, 6, 6, 8, 1, 1, 6, 6, 9, 11, 6, 7, 9, 3, 10, 6. En este caso, la moda sería 6, ya que es el valor que aparece con mayor frecuencia.
En RStudio, hay diferentes maneras de que se nos muestre la moda: Se
utiliza la función table(datos) para contar las frecuencias
de los valores en el vector de datos, se nombra a esta tabla y luego
encontrar el valor o los valores con la frecuencia máxima, usando la
instrucción names(tabla [tabla == max(tabla)]) como se
ve:
# Calcular la tabla de frecuencia de los datos de la temperatura en grados Celcius en Tabasco
Temperatura<- c(30,32,31, 27, 38, 23, 40, 35, 29, 41, 33, 30, 43, 22, 37, 28, 42, 36, 31, 39, 26, 34, 32)
tabla_frecuencia <- table(Temperatura)
# Encontrar el valor o los valores con la frecuencia máxima (moda)
moda <- names(tabla_frecuencia[tabla_frecuencia == max(tabla_frecuencia)])
modaEn la pantalla de RStudio se ve así:
Si la cantidad de datos es pequeña, la moda se puede encontrar
visualmente; una vez establecida la tabla con la función
table(datos), utilizamos la instrucción sort(tabla), que
una vez ordenada nos mostrará como primer número, el dato que más se
repite, observemos el ejemplo:
# Calcular la tabla de frecuencia de los datos de la temperatura en grados Celcius en Tabasco
Temperatura<- c(30,32,31, 27, 38, 23, 40, 35, 29, 41, 33, 30, 43, 22, 37, 28, 42, 36, 31, 39, 26, 34, 32)
tabla_frecuencia <- table(Temperatura)
# Llamamos a la tabla
tabla_frecuencia
#Ordenamos
sort(tabla_frecuencia)En la pantalla de RStudio se ve así:
Aquí se concluye nuevamente, que las temperaturas 30, 31 y 32 son las que se repiten, estos valores corresponden a la moda del conjunto de datos.
Finalmente, observemos un ejemplo donde se calculan las medidas de tendencia central de un dataset importado:
# Cálculo de la media de un conjuntos de datos
# Lee un archivo CSV en el nuevo directorio
#Importamos el dataset
Morfometri_as <- read.csv("Downloads/Morfometrías de Chelydra rossigonii.csv")
#Usamos la función na.omit() para omitir los espacios que tengan NA y las filas que nos nos sirvan
Morfometrias <- na.omit(Morfometri_as[-c(1,2), ])
# Para convertir los valores de la tabla a valores numéricos usamos la función as.numeric()
# Calculamos la media del peso, en este caso es la columa X.5
mean(as.numeric(Morfometrias$X.5))
# Calculamos la mediana de la altura del pastrón, en este caso es la columa X.4
median(as.numeric(Morfometrias$X.4))
# Finalmente, la moda en la edad, este caso la columna X.8
edad<- table(as.numeric(Morfometrias$X.8))
moda <- names(edad[edad == max(edad)])
modaEsta instrucción se verá resulta así en la consola de RStudio:
A continuación, se presenta un ejemplo que ilustra cómo generar un dataframe con datos de meteorología extrema correspondientes al mes de enero en la ciudad de Villahermosa, Tabasco, México. Este código producirá un conjunto de datos con valores aleatorios que representan las temperaturas extremas, humedad y velocidad del viento para cada día del mencionado mes. La flexibilidad de este enfoque permite ajustar los rangos de los valores aleatorios según sea necesario para simular diversas condiciones meteorológicas extremas que puedan ser de interés para el análisis o la planificación.
# Definir fechas del mes de enero
fechas_enero <- seq(as.Date("2024-01-01"), as.Date("2024-01-31"), by = "dia")
# Generar datos aleatorios para temperaturas extremas, humedad y velocidad del viento
set.seed(123) # Establecer semilla para reproducibilidad
temperaturas <- runif(31, min = 25, max = 35) # Temperaturas aleatorias entre 25°C y 35°C
humedad <- runif(31, min = 50, max = 90) # Humedad relativa aleatoria entre 50% y 90%
viento <- runif(31, min = 0, max = 20) # Velocidad del viento aleatoria entre 0 km/h y 20 km/h
# Crear el dataframe de meteorología extrema para enero
meteorologia_extrema_enero <- data.frame(
Fecha = fechas_enero,
Temperatura = temperaturas,
Humedad = humedad,
Viento = viento
)
# Mostrar el dataframe
print("Datos de meteorología extrema para enero en Villahermosa, Tabasco:")
print(meteorologia_extrema_enero)Observemos este script en la consola de RStudio:
Además, podrás complementar o usar por separado un conjunto de datos (dataset) externo para enriquecer el análisis y así obtengas una perspectiva más completa de las condiciones climáticas externas y sus implicaciones.
Un cuantil es un valor derivado de un conjunto de mediciones numéricas que indica la posición de una observación dentro de un conjunto ordenado de datos u observaciones. Por ejemplo, la mediana se puede entender como un cuantil, ya que se trata del punto por debajo del cual se encuentra la mitad de las observaciones; de esta forma la mediana es el cuantil 0.5. Además, los cuantiles pueden ser expresados como percentiles, que es una medida equivalente pero en una escala de 0 al 100. En resumen, el cuantil p es equivalente al percentil 100 x p, así la mediana es el percentil 50.
Hay varias formas de calcular cuantiles y percentiles. Todos ellos implican ordenar las observaciones de menor a mayor y utilizar algún tipo de promedio ponderado para determinar el valor numérico correspondiente a p.
En RStudio, la instrucción que calcula los cuantiles es
quantile(datos,prob= ), donde el primer detalle es el
conjunto al cuál se le calculará el quantil o el percentil.
Calculemos los percentiles del siguiente conjunto generado de manera aleatoria:
# Establecemos la semilla
set.seed(2024)
# Generamos el conjunto de valores aleatorios de una distribución normal
# a la que llamaremos conjunto
conjunto<- rnorm(30)
# Calculamos el cuantil .5 = percentil 50
quantile(conjunto,.5)
median(conjunto)
# Calculamos el cuantil 0 = percentil 0
quantile(conjunto, 0)Con este ejemplo, veremos que el cuantil .5 coincide con la mediana de nuestro conjunto de datos, así como el cuantil 0 es el valor más pequeño de nuestro conjunto ordenado de datos.
El conjunto que se generó fue el siguiente:
Ya ordenado, la mediana efectivamente es el cuantil .5 y el valor más pequeño es -3.2742858, el cual coincide con el valor del cuantil 0 que calculamos en RStudio.
Ahora, existe un conjunto de cuantiles a los cuales se les conoce como “Resumen de cinco números”, compuesto por el percentil 0 (el mínimo), el percentil 25, el percentil 50, el percentil 75 y el percentil 100 (el máximo). El cuantil 0.25 se refiere como el primer o cuartil inferior, y el cuantil 0.75 se refiere como el tercer o cuartil superior.
En RStudio, hay dos formas de calcular este resumen, con la
instrucción quantile(datos,c( 0,0.25,0.5,0.75,1)) o
summary(datos), esta última te muestra adicionalmente, la
media.
suma <- 1 + 1
print(suma)
# Retomamos la misma semilla
set.seed(2024)
#Generamos el mismo conjunto de valores de nuevo
conjunto<- rnorm(30)
#Resumen de cinco numeros
quantile(conjunto,c( 0,0.25,0.5,0.75,1))
summary(conjunto)Se generaron los dos resumen de cinco numeros, con los mismo valores pero de diferente forma, donde además nuevamente aparecen el cuantil .5 y 0 que se calculó por separado en el script anterior.
Las medidas de tendencia central ofrecen una buena indicación de dónde se agrupan tus mediciones numéricas, pero no indican qué tan dispersos están tus datos. Las herramientas estadísticas son las medidas de dispersión, estas medidas nos ayudan a saber qué tan “lejos” estan las observaciones de la media estimada del conjunto de datos. Para medir la dispersión, se utilizan valores como la varianza, la desviación estándar y el rango.
La varianza de la muestra mide el grado de dispersión de las observaciones numéricas alrededor de su media. La varianza es una representación específica de la distancia promedio al cuadrado de cada observación en comparación con la media.
Para un conjunto de \(n\) observaciones numéricas llamadas \(x ={x1,x2,x3,…,xn}\), la varianza \(s2x\) se calcula con ayuda la siguiente ecuación:
\[ s_x^2 = \frac{(x_1 - \bar{x})^2 + (x_2 - \bar{x})^2 + \cdots + (x_n - \bar{x})^2}{n - 1} = \frac{1}{n - 1} \sum_{i=1}^{n} (x_i - \bar{x})^2 \]
Por ejemplo, si nuestro conjunto es de 6 observaciones, x= 2, 4.5, 3, 8, 2, 2.5; el cálculo para la varianza muestral es
\[ s_x^2 = \frac{(2 - 3.667)^2 + (4.5 - 3.667)^2 + (3 - 3.667)^2 + (8 - 3.667)^2 + (2 - 3.667)^2 + (2.5 - 3.667)^2}{5} \]
\[ \frac{1.694 + 0.306 + 0.110 + 10.410 + 1.694 + 2.812}{5} = 3.2052 \]
En RStudio, la función que nos calcula la varianza es
var(datos).Observemos el siguiente ejemplo:
# Lee un archivo CSV en el nuevo directorio
#Importamos el dataset
Morfometri_as <- read.csv("Downloads/Morfometrías de Chelydra rossigonii.csv")
#Usamos la función na.omit() para omitir los espacios que tengan NA y las filas que nos nos sirvan
Morfometrias <- na.omit(Morfometri_as[-c(1,2), ])
# Para convertir los valores de la tabla a valores numéricos usamos la función as.numeric()
# Calculamos la varianza del peso, en este caso es la columa X.5
var(as.numeric(Morfometrias$X.5))Observemos la solución en RStudio:
La segunda medida de dispersión es la desviación estándar, esta se obtiene al tomar la raíz cuadrada de la varianza. Ya que la varianza refleja la distancia promedio al cuadrado, la desviación estándar ofrece un valor que se puede interpretar en relación con la escala de las observaciones originales.
Entonces la fórmula para encontrar la desviación estandar de un conjunto de observaciones es:
\[ \sqrt{s_x^2} = \sqrt{\frac{1}{n - 1} \sum_{i=1}^{n} (x_i - \bar{x})^2} = s_x \]
Así, la desviación estándar del conjunto de 6 observaciones, \(x= 2, 4.5, 3, 8, 2, 2.5\), es simplemente, la raíz cuadrada de \(3.2052\) : \(√(3.2052=) 1.7904=s_x\)
En RStudio, la función que nos calcula la
varianza es sd(datos). Veamos un ejemplo :
# Lee un archivo CSV en el nuevo directorio
#Importamos el dataset
Morfometri_as <- read.csv("Downloads/Morfometrías de Chelydra rossigonii.csv")
#Usamos la función na.omit() para omitir los espacios que tengan NA y las filas que nos nos sirvan
Morfometrias <- na.omit(Morfometri_as[-c(1,2), ])
# Para convertir los valores de la tabla a valores numéricos usamos la función as.numeric()
# Calculamos la desviación del alto del caparazón, en este caso es la columa X.3
sd(as.numeric(Morfometrias$X.3))En RStudio se resuelve así:
Por último, el rango (IQR, por sus siglas en inglés) mide la amplitud del “50% intermedio” de las observaciones, es decir, el rango de valores que se encuentran dentro de un cuartil del 25% a cada lado de la mediana. El rango se calcula como la diferencia entre el cuartil superior y el cuartil inferior de los datos.
Supongamos que tienes el siguiente conjunto de datos ordenado: 12, 15, 18, 20, 22, 25, 28, 30, 35, 40; primero calculamos el valor del cuartíl inferior, el 25% de los datos están por debajo de Q1, dado que tenemos 10 datos, Q1 estaría en la posición \(¼*10=2.5\), lo cual redondeamos hacia arriba a 3. Entonces Q1 es el tercer valor en nuestro conjunto, que es 18. Por otro lado, el cuartil superior estará en la posición \(¾*10=7.5\), redondeando hacia arriba a 8. Entonces Q3 es el octavo valor en el conjunto, que es 30.
Finalmente, IQR es la diferencia entre Q3 y Q1: IQR = Q3−Q1 = 30−18 = 12. Esto significa que el rango de la “zona central” que abarca el 50% de los datos es 12.
En RStudio, se calcula el rango intercuartil con la función
IQR(dato). Calculemos el rango del ejemplo:
# Lee un archivo CSV en el nuevo directorio
#Importamos el dataset
Morfometri_as <- read.csv("Downloads/Morfometrías de Chelydra rossigonii.csv")
#Usamos la función na.omit() para omitir los espacios que tengan NA y las filas que nos nos sirvan
Morfometrias <- na.omit(Morfometri_as[-c(1,2), ])
# Para convertir los valores de la tabla a valores numéricos usamos la función as.numeric()
# Calculamos el rango del peso, en este caso es la columa X.5
IQR(as.numeric(Morfometrias$X.5))En la consola de RStudio se ve así:
Recordemos que podemos visualizar los datos importados haciendo clic sobre el ícono de la tabla en el Environment.
Para el ejemplo, los datasets fueron:
La siguiente tabla fue a la que se le omitieron las celdas NA( sin
valor) con la función na.omit(datos) y las filas que solo
tenían títulos, con la función
datos[-c(filas separadas por coma), ]
El siguiente script define una función llamada calcular_estadisticas, que toma un vector de números como entrada y devuelve un resumen estadístico que incluye la media, la mediana, la desviación estándar y el rango de los datos:
# Definición de la función para calcular estadísticas
calcular_estadisticas <- function(datos) {
# Calcula la media de los datos
media <- mean(datos)
# Calcula la mediana de los datos
mediana <- median(datos)
# Calcula la desviación estándar de los datos
desviacion <- sd(datos)
# Calcula el rango de los datos
rango <- max(datos) - min(datos)
# Devuelve un resumen estadístico
resumen <- list(media = media, mediana = mediana, desviacion = desviacion, rango = rango)
return(resumen)
}
# Vector de datos de ejemplo
datos_ejemplo <- c(12, 15, 18, 20, 22, 24, 26, 28, 30)
# Llamada a la función para calcular estadísticas
resultado <- calcular_estadisticas(datos_ejemplo)
# Imprime el resumen estadístico
print("Resumen estadístico de los datos:")
print(resultado)Observemos este ejemplo en RStudio:
Enfocado en la consola, los resultados son:
En R hay una función que nos permite obtener la estadística
descriptiva de un conjunto de datos y es summary(). Esta
función proporciona un resumen estadístico básico que incluye el mínimo,
el primer cuartil, la mediana, la media, el tercer cuartil y el máximo
de cada variable numérica en el conjunto de datos. Además, también
muestra el número total de observaciones y el número de valores
faltantes en cada variable. Aquí tienes un ejemplo de cómo usar la
función summary() en R:
Veamos un ejemplo:
# Crear un conjunto de datos de ejemplo
datos_cocodrilos <- data.frame(
Longitud = c(2.1, 2.3, 2.5, 2.2, 2.4),
Peso = c(150, 180, 170, 160, 175),
Edad = c(15, 18, 20, 16, 19)
)
# Mostrar el conjunto de datos
print("Conjunto de datos de mediciones de cocodrilos Moreletii:")
print(datos_cocodrilos)
# Obtener un resumen de las estadísticas descriptivas
print("Resumen de estadísticas descriptivas:")
resumen_cocodrilos <- summary(datos_cocodrilos)
print(resumen_cocodrilos)En RStudio quedaría de la siguiente manera:
Cuando analizamos datos, es conveniente investigar la relación entre dos variables numéricas para evaluar las tendencias. Por ejemplo, podrías esperar que los kilómetros recorridos de un vehículos y el desgaste de una llanta estén asociadas, así como se puede imaginar que la medida de la mano y el color del cabello tendrían menos asociación. Una de las formas más simples y comunes en que se cuantifican y comparan este tipo de asociaciones es a través del concepto de correlación, para lo cual antes es necesaria conocer la covarianza.
La covarianza indica el grado de cambio conjunto entre dos variables numéricas. Si es positiva, implica que ambas variables tienden a aumentar o disminuir en conjunto. Por el contrario, si es negativa, indica que una variable tiende a aumentar mientras la otra disminuye, y viceversa. Cuando la covarianza es cero, señala que no existe una relación lineal entre las dos variables. Es útil notar que el orden de las variables en la fórmula en sí misma no importa; en otras palabras \(r_xy=r_yx\).
La covarianza muestral rxy entre las variables x y y se calcula utilizando la fórmula:
\[ r_{xy} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{n - 1} \]
\(x_i\) y \(y_i\) son las observaciones individuales para las variables \(x\) y \(y\), respectivamente.
\(x ̅\) y \(y̅\) son las medias muestrales de las variables \(x\) y \(y\), respectivamente. \(n\) es el número de observaciones.
Por otro lado, la correlación proporciona una comprensión más detallada de la covarianza al reconocer tanto la orientación como la intensidad de cualquier relación. Existen diferentes tipos de coeficientes de correlación, pero el más usado es el coeficiente de correlación de Pearson: ρ_xy que se calcula dividiendo la covarianza muestral por el producto de la desviación estándar de cada conjunto de datos, o sea:
\[ \rho_{xy} = \frac{r_{xy}}{s_x s_y} \]
De tal manera que \(−1 ≤ ρ_xy ≤ 1\).
Cuando \(ρ_xy= -1\) , se presenta una relación lineal negativa perfecta. Si el resultado es menor que cero, indica una relación negativa, y esta relación se vuelve más débil a medida que el coeficiente se acerca a cero, llegando a \(ρ_xy= 0\) , lo que indica ninguna relación en absoluto. Conforme el coeficiente aumenta por encima de cero, se muestra una relación positiva, alcanzando su punto máximo en \(ρ_xy= 1\), que representa una relación lineal positiva perfecta.
En RStudio, los comando cov y cor calculan la covarianza y la correlación de los conjuntos de datos que estemos asociando, respectivamente.
Calculemos la covarianza y correlación del siguiente ejemplo:
Supongamos que queremos conocer qué tanto se relaciona la humedad con la temperatura en el habitat de la especie alfredii.
library(readxl)
Base_Biodiversidad <- read_excel("Downloads/Base Biodiversidad.xlsx")
# Hacemos la lista con las columnas de las variables que utilizaremos
y <- Base_Biodiversidad$Humedad
x <- Base_Biodiversidad$Temperatura
cov(x,y)
cor(x,y)
plot(x,y,type = "p", main="Relación entre temperatura y humedad" ,xlab="Temperatura"
,ylab="Humedad", col="hotpink")Con la librería readxl, podemos importar el dataset con la información de 14 especies de plantas alfredii. También podremos observar la gráfica para las dos variables.
Nombramos \(x\) y \(y\) a nuestros vectores.
La covarianza de las variables resultó 24.33, este valor al ser positivo y grande indica que las variables tienden a disminuir o aumentar juntas.
Además, la correlación es 0.5739, que la correlación sea mayor a 0 nos indica que la relación lineal es positiva, siendo casi una relación lineal perfecta.
Adicionalmente, veamos como con ayuda de la instrucción plot, graficamos a las variables, donde observamos que se concentran los datos en el extremo superior izquierdo, entre 24 ºC y 29 ºC de temperatura, y 75 g/m3 y 95 g/m3 de humedad.
Un outlier, o valor atípico, es una observación que se aparta del resto de los datos. Se trata de un valor extremo en comparación con la mayoría de los datos, es decir, una anomalía. En algunos casos, puede sospecharse que esta observación extrema no proviene del mismo mecanismo que generó las otras observaciones, pero no existe una regla numérica precisa sobre lo que constituye un outlier.
Veamos el siguiente ejemplo, donde se crea un gráfico de dispersión con un outlier identificado visualmente mediante una línea horizontal, una flecha y un texto. Observa los resultados en la gráfica generada en el panel plots.
# Crear un vector con datos
datos <- c(10, 15, 12, 14, 16, 18, 20, 22, 24, 100)
# Crear un gráfico de dispersión
plot(datos, type="o", pch=19, main="Gráfico de Dispersión con Outlier")
# Identificar el índice del outlier
indice_outlier <- which.max(datos)
# Dibujar una línea horizontal en el nivel del outlier
abline(h = datos[indice_outlier], col = "red", lty = 2)
# Agregar una flecha y texto para señalar el outlier
text(x = indice_outlier, y = datos[indice_outlier], labels = "Outlier", pos = 2)
arrows(x0 = indice_outlier, y0 = datos[indice_outlier], x1 = indice_outlier, y1 = datos[indice_outlier] - 10, code = 3, angle = 90, length = 0.1)En la siguiente imagen podrás observar el dato extremo o valor típico.
Ahora veamos un ejemplo para identificar los valores atípicos en los datos univariados y multivariados y los resaltará en verde en los gráficos. Los valores atípicos se identifican como aquellos que están a más de 2 desviaciones estándar de la media.
# Generar datos univariados
set.seed(123)
data_univar <- c(rnorm(50), 10, 12, 15)
# Generar datos bivariados
data_multivar <- data.frame(x = c(rnorm(50), 10, 12, 15),
y = c(rnorm(50), 10, 12, 15))
# Crear gráfico para datos univariados
par(mfrow = c(1, 2))
plot(data_univar, main = "Datos Univariados", pch = 19)
abline(h = mean(data_univar), col = "red")
text(55, mean(data_univar), "Media", pos = 2, col = "red")
arrows(55, mean(data_univar) - sd(data_univar), 55, mean(data_univar) + sd(data_univar),
angle = 90, code = 3, length = 0.1, col = "blue")
text(55, mean(data_univar) - sd(data_univar), "SD", pos = 2, col = "blue")
outliers_univar <- data_univar[abs(data_univar - mean(data_univar)) > 2 * sd(data_univar)]
points(which(abs(data_univar - mean(data_univar)) > 2 * sd(data_univar)), outliers_univar, col = "green", pch = 19)
text(55, mean(data_univar) - 2 * sd(data_univar), "Outliers", pos = 2, col = "green")
# Crear gráfico para datos multivariados
plot(data_multivar, main = "Datos Multivariados", pch = 19)
abline(h = mean(data_multivar$y), col = "red")
abline(v = mean(data_multivar$x), col = "blue")
text(5, mean(data_multivar$y), "Media Y", pos = 2, col = "red")
text(mean(data_multivar$x), -2, "Media X", pos = 2, col = "blue")
outliers_multivar <- data_multivar[abs(data_multivar$x - mean(data_multivar$x)) > 2 * sd(data_multivar$x) |
abs(data_multivar$y - mean(data_multivar$y)) > 2 * sd(data_multivar$y), ]
points(outliers_multivar, col = "green", pch = 19)
text(mean(data_multivar$x), -3, "Outliers", pos = 2, col = "green")En RStudio en el panel de ploteo (plots), haz clic en la pestaña zoom y se abrirá una ventana que te permitirá ver las gráficas con más amplitud:
En RStudio quedaría de la siguiente manera:
La visualización de datos en estadística implica representar información numérica mediante gráficos, diagramas y otros elementos visuales. Su importancia radica en que facilita la comprensión y accesibilidad de los datos, incluso para quienes no son expertos en estadística. Permite la identificación de patrones, tendencias y relaciones en los datos. Además, las visualizaciones ayudan a comunicar resultados y hallazgos de forma clara y efectiva, lo que es crucial en la presentación de informes y la toma de decisiones basadas en datos. También son útiles para detectar datos atípicos, errores en los datos o problemas en el análisis, lo que permite corregirlos y mejorar la calidad de los resultados. Asimismo, permiten explorar los datos de forma interactiva, cambiando perspectivas y enfoques para obtener una comprensión más profunda de los datos.
Los gráficos de barras y los gráficos circulares se utilizan comúnmente para visualizar datos cualitativos por frecuencia de categoría.
Un gráfico de barras representa visualmente las frecuencias de las categorías relevantes mediante barras verticales u horizontales, por lo general separadas por espacios en blanco. Aunque comúnmente se muestran las frecuencias en bruto, este tipo de gráfico también puede utilizarse para representar otras medidas, como promedios o proporciones, que están directamente relacionadas con estas frecuencias.
Utilicemos el conjunto de datos iris, que contiene información sobre diferentes medidas de flores iris. Aquí te muestro cómo crear un gráfico de barras que muestra la cantidad de flores de cada especie en el conjunto de datos:
# Cargar el conjunto de datos
data(iris)
# Calcular la cantidad de flores de cada especie
especies <- table(iris$Species)
# Crear el gráfico de barras
barplot(especies, main="Cantidad de Flores por Especie",
xlab="Especie", ylab="Cantidad", col="lightblue",
names.arg=names(especies))En RStudio quedaría de la siguiente manera:
Tenemos ahora un script que utiliza un conjunto de datos ficticios relacionados con especies biológicas y su frecuencia de avistamiento en diferentes localidades.
# Crear un dataframe con datos biológicos
datos <- data.frame(
Especie = c("Especie1", "Especie2", "Especie3", "Especie4", "Especie5"),
Frecuencia = c(10, 15, 8, 12, 20)
)
# Generar el gráfico de barras sin espacio entre las barras
barplot(
height = datos$Frecuencia,
names.arg = datos$Especie,
col = "skyblue",
border = "black",
main = "Frecuencia de Especies",
xlab = "Especies",
ylab = "Frecuencia",
space = 0
)En RStudio quedaría de la siguiente manera:
Ahora bien, en el siguiente script, se crea un gráfico de barras horizontales utilizando datos ficticios sobre la frecuencia de diferentes hábitats. El resultado es un gráfico de barras horizontales donde cada barra representa un tipo de hábitat y su altura indica la frecuencia de ese hábitat en los datos.
# Crear un dataframe con datos ambientales
datos_ambientales <- data.frame(
Habitat = c("Bosque", "Río", "Pradera", "Manglar", "Desierto"),
Frecuencia = c(20, 15, 10, 25, 18)
)
# Generar el gráfico de barras horizontales sin espacio entre barras
barplot(
datos_ambientales$Frecuencia,
horiz = TRUE,
beside = FALSE,
col = rainbow(nrow(datos_ambientales)),
main = "Frecuencia de Habitat",
xlab = "Frecuencia",
ylab = "Habitat",
legend.text = datos_ambientales$Habitat,
args.legend = list(x = "topright", bty = "n", cex = 0.8),
width = 1 # Ancho de las barras
)En RStudio quedaría de la siguiente manera:
Ahora bien, tambien podemos usar ggplot2, que es una librería de visualización de datos que se basa en la “gramática de gráficos”. Esta gramática descompone los gráficos en componentes básicos, como datos, estética y capas, lo que permite construir gráficos complejos a partir de componentes simples.
En ggplot2, se sigue un enfoque de “capas” para construir gráficos.
Primero, se especifican los datos y se asignan a variables estéticas,
como el color o el tamaño. Luego, se añaden capas adicionales, como
puntos, líneas o barras, utilizando funciones como
geom_point() o
geom_line(). Estas capas se pueden
combinar y personalizar para crear gráficos con aspecto profesional.
Además de las capas básicas, ggplot2 ofrece una amplia gama de
funciones para personalizar la apariencia del gráfico, como labs() para
etiquetar ejes y títulos,
´scale_**para ajustar escalas, y **theme()`
para modificar el aspecto general del gráfico.
Recuerda instalar el paquete ggplot2 para poder ejecutar el siguiente script que genera un gráfico de barras horizontal con especies en peligro de extinción en México y sus hábitats correspondientes, necesitarías tener un conjunto de datos específico que contenga esta información. Este es un ejemplo genérico con datos ficticios:
# Instalar y cargar la librería ggplot2 si aún no está instalada
if (!require(ggplot2)) {
install.packages("ggplot2")
library(ggplot2)
}
# Crear un conjunto de datos de ejemplo
datos_extincion_mexico <- data.frame(
especie = c("Tigrillo", "Lince", "Águila Real", "Cotorra", "Ocelote"),
habitat = c("Selva Tropical", "Bosque Templado", "Sierra Nevada", "Manglar", "Selva Húmeda")
)
# Crear el gráfico de barras horizontal
ggplot(datos_extincion_mexico, aes(x = especie, fill = habitat)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Especies en Peligro de Extinción en México y sus Hábitats",
x = "Especie",
y = "Frecuencia") +
theme_minimal()En RStudio quedaría de la siguiente manera:
Importante: Si vas a utilizar un conjunto de datos importado para generar el gráfico, primero necesitarías cargar el conjunto de datos en R y luego ajustar el script para usar las columnas correctas del conjunto de datos. Aquí te muestro cómo podrías hacerlo:
Suponiendo que tienes un archivo CSV llamado “datos_extincion.csv” con las columnas “Especie” y “Habitat”, y que este archivo está ubicado en tu directorio de trabajo, puedes importar los datos y ajustar el script de la siguiente manera:
# Cargar el conjunto de datos desde un archivo CSV
datos_extincion_mexico <- read.csv("datos_extincion.csv")
# Crear el gráfico de barras horizontal
ggplot(datos_extincion_mexico, aes(x = Especie, fill = Habitat)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Especies en Peligro de Extinción en México y sus Hábitats",
x = "Especie",
y = "Frecuencia") +
theme_minimal()Recuerda reemplazar “datos_extincion.csv” con el nombre real de tu archivo CSV y ajusta las columnas en la función aes() y en la llamada a ggplot() según las columnas reales en tu conjunto de datos.
Un gráfico circular, también conocido como gráfico de pastel o pie chart en inglés, es un tipo de gráfico que muestra proporciones de un todo dividido en diferentes categorías. En R, puedes crear un gráfico circular utilizando la función pie(). Esta función toma un vector numérico que representa las proporciones de cada categoría y opcionalmente un vector de etiquetas para cada categoría.
El siguiente script contiene la variable
proporciones contiene las proporciones de
cada categoría y categorias contiene las
etiquetas de las categorías. La función pie() creará un gráfico circular
con las proporciones dadas y las etiquetas especificadas. Puedes
personalizar el gráfico agregando colores, leyendas, títulos y otros
elementos según sea necesario:
# Datos de ejemplo
proporciones <- c(0.2, 0.3, 0.25, 0.15, 0.1)
categorias <- c("A", "B", "C", "D", "E")
# Crear el gráfico circular
pie(proporciones, labels = categorias)En RStudio quedaría de la siguiente manera:
El gráfico de barras es útil para contar observaciones en variables categóricas, pero no es adecuado para variables numéricas continuas. Para visualizar la distribución de mediciones continuas, se utilizan los histogramas, que representan visualmente la distribución de un conjunto de datos numéricos. Aunque a veces se confunden con gráficos de barras debido a su apariencia similar, los histogramas funcionan dividiendo el rango de los datos en intervalos (llamados “bins” o “clases”) y contando cuántas observaciones caen en cada uno. Luego, se dibujan barras rectangulares donde la altura de cada barra representa la frecuencia de observaciones en ese intervalo.
Veamos un ejemplo sencillo que muestra la distribución de alturas de árboles. alturas contiene las alturas en metros, `breaks = 5´ indica que se dividirá en 5 intervalos y col y border controlan el color de las barras y los bordes, respectivamente. xlab, ylab y main son etiquetas para los ejes y el título del histograma.
# Alturas de árboles en metros
alturas <- c(10, 12, 15, 13, 11, 14, 16, 12, 13, 15, 11, 13, 14, 15, 12, 14, 16, 13, 14, 15)
# Crear un histograma
hist(alturas, breaks = 5, col = "lightblue", border = "black", xlab = "Altura (m)", ylab = "Frecuencia",
main = "Distribución de Alturas de Árboles")En RStudio quedaría de la siguiente manera:
La precisión de un histograma como representación de la forma de una
distribución de medidas depende únicamente de los anchos de los
intervalos utilizados para agrupar los datos. Los anchos de los
intervalos se controlan en hist mediante
el argumento breaks. Puedes establecerlos
manualmente proporcionando un vector con cada punto de quiebre a
breaks. En el siguiente código lo
veremos:
# Crear un vector con 32 datos de humedad absoluta
humedad_absoluta <- c(10, 12, 15, 13, 11, 14, 16, 12, 13, 15,
11, 12, 14, 15, 13, 12, 14, 15, 16, 17,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
12, 13)
# Histograma con 8 intervalos
hist(humedad_absoluta, breaks = 8, col = "gray", main = "Histograma de Humedad Absoluta", xlab = "Humedad Absoluta")
# Agregar línea vertical para la media
abline(v = mean(humedad_absoluta), lty = 2, lwd = 2, col = "red")
# Agregar leyenda para la media
legend("topright", legend = "Media", lty = 2, lwd = 2, col = "red")Te recordamos que puedes importar los datos de un archivo CSV o Excel y luego creará un histograma de la humedad absoluta con los intervalos que necesites:
Importar datos desde un archivo CSV o Excel
# Asumiendo que el archivo tiene una columna llamada 'humedad_absoluta'
datos <- read.csv("ruta/del/archivo.csv") # Para archivos CSV
# datos <- read_excel("ruta/del/archivo.xlsx") # Para archivos ExcelComparemos dos variables por medio de histogramas: se crea un dataframe con 50 datos para cada una de las 3 variables biológicas. Luego, se utilizan los histogramas para comparar las frecuencias de la variable_1 y variable_2.
# Crear un dataframe con 50 datos y 3 variables biológicas
set.seed(123) # Para reproducibilidad
df <- data.frame(
variable_1 = rnorm(50, mean = 10, sd = 2),
variable_2 = rnorm(50, mean = 12, sd = 3),
variable_3 = rnorm(50, mean = 15, sd = 4)
)
# Comparar las frecuencias de variable_1 y variable_2 con histogramas
par(mfrow = c(1, 2)) # Para mostrar dos gráficos en una fila
# Histograma de variable_1
hist(df$variable_1, main = "Variable 1", xlab = "Valor", col = "lightblue")
# Histograma de variable_2
hist(df$variable_2, main = "Variable 2", xlab = "Valor", col = "lightblue")Ahora bien, otra forma mejor de representar las gráficas seria la siguiente: agregar los colores azul (rgb(0, 0, 1, alpha = 0.5)) y rojo (rgb(1, 0, 0, alpha = 0.5)) con un grado de transparencia (alpha = 0.5) para los histogramas de variable_1 y variable_2, respectivamente en la misma grafica ( con la instrucción add=TRUE).
# Crear un dataframe con 50 datos y 3 variables biológicas
set.seed(123) # Para reproducibilidad
df <- data.frame(
variable_1 = rnorm(50, mean = 10, sd = 2),
variable_2 = rnorm(50, mean = 12, sd = 3),
variable_3 = rnorm(50, mean = 15, sd = 4)
)
# Comparar las frecuencias de variable_1 y variable_2 con histogramas
par(mfrow = c(1, 1)) # Para mostrar un gráfico
# Histograma de variable_1 y variable_2 juntos
hist(df$variable_1, main = "Variables 1 y 2", xlab = "Valor", col = rgb(0, 0, 1, alpha = 0.5), ylim = c(0, max(hist(df$variable_1, plot = FALSE)$counts, hist(df$variable_2, plot = FALSE)$counts)))
hist(df$variable_2, add = TRUE, col = rgb(1, 0, 0, alpha = 0.5))La grafica resultante seria esta:
Y en RStudio quería de la siguiente manera:
Tambien existe la posibilidad de optar por una figura con una curva de densidad con Kernel Density Plot, quedando el script de la siguiente manera:
# Crear un dataframe con 50 datos y 3 variables biológicas
set.seed(123) # Para reproducibilidad
df <- data.frame(
variable_1 = rnorm(50, mean = 10, sd = 2),
variable_2 = rnorm(50, mean = 12, sd = 3),
variable_3 = rnorm(50, mean = 15, sd = 4)
)
# Establecer el tamaño de la figura
par(mfrow = c(1, 1), mar = c(4, 4, 2, 1))
# Histograma de variable_1 con curva de densidad
hist(df$variable_1, main = "Variable 1 con KDE", xlab = "Valor", ylab = "Frecuencia", col = "lightblue", xlim = c(5, 20), ylim = c(0, 0.4), prob = TRUE)
# Calcular la densidad
densidad <- density(df$variable_1)
# Graficar la curva de densidad
lines(densidad, col = "red", lwd = 2)
# Añadir polígono debajo de la curva de densidad
polygon(c(min(densidad$x), densidad$x, max(densidad$x)), c(0, densidad$y, 0), col = rgb(1, 0, 0, alpha = 0.3), border = NA)
# Añadir leyenda
legend("topright", legend = c("Histograma", "KDE"), fill = c("lightblue", "red"), border = NA)
# Añadir leyenda
legend("topright", legend = c("Variable 1", "Variable 2"), fill = c(rgb(0, 0, 1, alpha = 0.5), rgb(1, 0, 0, alpha = 0.5)))Que genera un grafica como la siguiente:
Los gráficos de caja y bigotes, también conocidos como boxplots en inglés, son una forma de visualización que muestra la distribución de un conjunto de datos y proporciona información sobre la mediana, los cuartiles y los valores atípicos.
La caja en el centro del gráfico representa el rango intercuartílico (IQR), que abarca desde el primer cuartil (Q1) hasta el tercer cuartil (Q3). La línea dentro de la caja representa la mediana.
Los “bigotes” (líneas que se extienden desde la caja) representan la variabilidad fuera de los cuartiles. La longitud de los bigotes suele ser 1.5 veces el IQR. Los valores que están más allá de los bigotes se consideran valores atípicos y se muestran como puntos individuales.
Los boxplots son útiles para comparar la distribución de varias muestras y para identificar valores atípicos. También permiten visualizar la simetría y la dispersión de los datos de manera más compacta que un histograma.
Aquí tienes un script para crear un gráfico de caja y bigote con los datos de humedad obtenidos de un archivo llamado Biodiversidad:
# Crear un vector con los datos de humedad
humedad <- c(83, 80.5, 85, 87.1, 89.5, 90.8, 96, 95, 85.3, 86, 83, 91.5, 45, 89)
# Crear el gráfico de caja y bigote
boxplot(humedad,
main = "Gráfico de Caja y Bigote de Humedad",
ylab = "Humedad",
col = "lightblue", border = "blue") La grafica quedaría de la siguiente manera:
Ahora generemos un gráfico de caja y bigote personalizado para tres variables: humedad, temperatura y viento, donde:
boxplot (datos)
horizontal = FALSE, # Horizontal o vertical
lwd = 3, # ancho de los bordes de la caja
col = "red", # Color de la caja
xlab = "Etiqueta eje X", # Etiqueta eje X
ylab = "Etiqueta eje Y", # Etiqueta eje Y
main = # Título
notch = TRUE, # Ańade intervalos de confianza para la mediana
border = "black", # Color del borde del boxplot
outpch = 25, # Símbolo para los outliers
outbg = "green", # Color de los datos atípicos
whiskcol = "blue",# Color de los bigotes
whisklty = 2, # Tipo de línea para los bigotes
lty = 1) # Tipo de línea 1 normal, 2 cortada (caja y mediana)El script quedaría de la siguiente manera:
# Crear un dataframe con los datos
datos <- data.frame(
Humedad = c(83, 80.5, 85, 87.1, 89.5, 90.8, 96, 95, 85.3, 86, 83, 91.5, 45, 89),
Temperatura = c(26.4, 27.9, 29, 26.9, 26.4, 27.2, 25, 26.8, 27.8, 18, 26, 28.3, 18, 24),
Viento = c(0.33, 0, 0.4, 0.4, 0.3, 0.4, 0.33, 0, 0.4, 0.4, 0.3, 0.4, 0.33, 0)
)
# Crear un gráfico de caja y bigote personalizado para cada variable
par(mfrow=c(1,3)) # Para mostrar tres gráficos en una fila
for (i in 1:ncol(datos)) {
boxplot(datos[, i],
main = names(datos)[i],
ylab = names(datos)[i],
col = "lightblue",
border = "blue",
lwd = 2, # Ancho de la línea del contorno de la caja
xlab = "Valor", # Etiqueta del eje xhttp://127.0.0.1:46821/graphics/plot_zoom_png?width=1582&height=984
notch = TRUE, # Indicador de muesca en la mediana
outpch = 19, # Tipo de punto para outliers
outbg = "red", # Color de fondo de outliers
whiskcol = "green", # Color de las líneas de los bigotes
whisklty = 2, # Tipo de línea de los bigotes
lty = 1 # Tipo de línea de la caja
)
# Etiquetas de los valores estadísticos
stats <- boxplot.stats(datos[, i])
text(1, stats$stats[1], paste("Min:", stats$stats[1]), pos = 1)
text(1, stats$stats[2], paste("1er Cuartil:", stats$stats[2]), pos = 1)
text(1, stats$stats[3], paste("Mediana:", stats$stats[3]), pos = 1)
text(1, stats$stats[4], paste("3er Cuartil:", stats$stats[4]), pos = 1)
text(1, stats$stats[5], paste("Max:", stats$stats[5]), pos = 1)
if (length(stats$out) > 0) {
text(rep(1, length(stats$out)), stats$out, "Outlier", pos = 4)
}
}El grafico generado sería el siguiente:
Veamos ahora un gráfico de caja y bigotes lado a lado. Un aspecto particularmente agradable de estos gráficos es la facilidad con la que se pueden comparar las distribuciones de los resúmenes de cinco números de diferentes grupos mediante boxplots contiguos.
# Crear datos de ejemplo
set.seed(123)
datos <- data.frame(
Estacion1 = rnorm(100, mean = 50, sd = 10),
Estacion2 = rnorm(100, mean = 60, sd = 15),
Estacion3 = rnorm(100, mean = 55, sd = 12),
Contaminante1 = rnorm(100, mean = 30, sd = 5),
Contaminante2 = rnorm(100, mean = 40, sd = 8),
Contaminante3 = rnorm(100, mean = 35, sd = 6)
)
# Crear boxplots lado a lado
boxplot(datos[, c("Estacion1", "Estacion2", "Estacion3")],
col = c("lightblue", "lightgreen", "lightyellow"),
names = c("Estacion 1", "Estacion 2", "Estacion 3"),
main = "Contaminantes por Estación",
ylab = "Concentración de Contaminantes")Este script genera un gráfico de boxplots lado a lado para las tres estaciones de monitoreo de contaminantes ambientales, mostrando la concentración de contaminantes en cada una. Puedes ajustar los colores, títulos y etiquetas con las instrucciones de personalización de gráficos mencionados en la página 156.
La grafica se vería de la siguiente manera:
Un scatterplot, o diagrama de dispersión, es una representación gráfica de datos que utiliza puntos para mostrar la relación entre dos variables ( continuas-numéricas) diferentes. Cada punto en el gráfico representa una observación en los datos y está ubicado en función de sus valores en las dos variables. Por lo general, la variable que se coloca en el eje x se considera la variable independiente, mientras que la variable en el eje y se considera la variable dependiente.
El scatterplot es útil para identificar patrones, tendencias y relaciones entre las dos variables. Por ejemplo, puede mostrar si existe una relación lineal positiva, una relación lineal negativa, o ninguna relación clara entre las variables. También puede identificar valores atípicos o puntos que se apartan significativamente de la tendencia general.
Veamos el primer ejemplo sencillo:
# Crear un dataframe con datos ficticios
set.seed(123) # Para reproducibilidad
datos <- data.frame(
Altura = rnorm(100, mean = 160, sd = 10),
Peso = rnorm(100, mean = 60, sd = 5)
)
# Crear el diagrama de dispersión
plot(datos$Altura, datos$Peso,
xlab = "Altura (cm)", ylab = "Peso (kg)",
main = "Diagrama de Dispersión de Altura vs. Peso")La grafica quedaría de la siguiente forma:
Ahora usemos el dataset de nombre iris, que cuenta con 150 filas y 5 columnas con medidas de pétalos y sépalos para tres especies de iris perennes: Iris setosa, Iris virginica e Iris versicolor (Anderson, 1935; Fisher, 1936).
# Crear el diagrama de dispersión con el dataset iris
plot(iris$Petal.Length, iris$Petal.Width,
xlab = "Longitud del Pétalo", ylab = "Ancho del Pétalo",
main = "Diagrama de Dispersión de Longitud vs. Ancho del Pétalo")
plot(iris[,4], iris[,3], type="n", xlab="Petal Width (cm)", ylab="Petal Length (cm)")
points(iris[iris$Species=="setosa",4], iris[iris$Species=="setosa",3], pch=19, col="black")
points(iris[iris$Species=="virginica",4], iris[iris$Species=="virginica",3], pch=19, col="gray")
points(iris[iris$Species=="versicolor",4], iris[iris$Species=="versicolor",3], pch=1, col="black")
legend("topleft", legend=c("setosa", "virginica", "versicolor"), col=c("black", "gray", "black"), pch=c(19, 19, 1))La grafica en RStudio quedaría de la siguiente manera:
Podemos personalizar un poco nuestra gráfica, de la siguiente manera:
# Crear datos de ejemplo (uso datos ficticios)
set.seed(123)
contaminacion <- data.frame(
PH = rnorm(100, mean = 7, sd = 0.5),
DBO = rnorm(100, mean = 20, sd = 5),
Coliformes = rnorm(100, mean = 100, sd = 50)
)
# Crear el diagrama de dispersión
plot(contaminacion$PH, contaminacion$DBO,
xlab = "PH", ylab = "DBO",
xlim = c(5, 9), ylim = c(10, 30),
col = "blue", pch = 16,
cex = 1.5,
main = "Diagrama de Dispersión de PH vs. DBO")La grafica resultante quedaría de la siguiente manera:
Ahora bien, tambien podemos generar matrices de gráficos de
dispersión, que son muy útiles para comparar dos o más variables de
interés que de otra forma no será posibles mostrar en una sola grafica.
Utilizaremos de nuestro dataset el conjunto de datos
Chiquiguaos correspondiente a la largo, alto y ancho de
caparazón de la especie chelydra rossignonii . Con la
funciónpair en el siguiente script,
generamos la matriz de gráficos de dispersión.
## ANALISIS DE REGRESION DE CHIQUIGUAOS
datos <-as.data.frame(Chiquiguaos_)
View(datos)
# Genera las gráficas de dispersión
pairs(datos)La grafica resultante en RStudio quedaría de la siguiente manera:
Tip: La manera en que se interpretan los gráficos de “pairs” depende de cómo se etiquetan los paneles diagonales, que van desde la esquina superior izquierda hasta la inferior derecha. Estas etiquetas aparecen en el mismo orden que las columnas especificadas como primer argumento. Los “paneles de etiquetas” facilitan la identificación de qué gráfico en la matriz corresponde a cada par de variables.
Ahora bien, si gustas trabajar con ggplot2 , lo natural es dividir los puntos según la variable categórica como en el siguiente ejemplo:
library(ggplot2)
# Cargar los datos y asignar un nombre adecuado a la columna
datos <- as.data.frame(Chiquiguaos_)
colnames(datos)[1] <- "Largo_caparazon"
# Generar la gráfica de dispersión
ggplot(datos, aes(x = Largo_caparazon, y = Peso)) +
geom_point() +
labs(x = "Largo del Caparazón", y = "Peso") +
ggtitle("Gráfico de Dispersión: Largo del Caparazón vs. Peso")El grafico resultante en RStudio quedaría asi: