Una sesión R representativa
Para brindar una visión clara del material esencial cubierto en este tema, los siguientes párrafos describen una sesión de análisis de R simple pero representativa, que proporciona algunas ilustraciones específicas de lo que R puede hacer.
La tarea general es una típica exploración preliminar de datos: se nos da un conjunto de datos desconocido y comenzamos intentando comprender qué contiene. En este caso particular, el conjunto de datos es un ejemplo de datos incorporado de R, uno de los muchos ejemplos incluidos en el lenguaje, pero las preguntas preliminares exploradas aquí son análogas a las que nos haríamos al caracterizar un conjunto de datos obtenido de Internet, de un almacén de datos de clientes en una aplicación comercial, o desde un sistema de recopilación de datos computarizado en un experimento científico o una aplicación de monitoreo de procesos industriales.
Las preguntas preliminares útiles incluyen:
El conjunto de datos específico que se considera en el siguiente ejemplo es el marco de datos (Data Frame) whiteside del paquete MASS, uno de los paquetes recomendados incluidos con casi todas las instalaciones de R. Al escribir “??whiteside” en el indicador “>”, se realiza una búsqueda aproximada a través de la documentación de todos los paquetes disponibles para su sesión de R, lo que abre una página con todas las coincidencias aproximadas del término. Al hacer clic en el enlace etiquetado MASS::whiteside nos lleva a una página de documentación con la siguiente descripción:
El Sr. Derek Whiteside de la Building Research Station del Reino Unido registró el consumo semanal de gas y la temperatura externa promedio en su propia casa en el sureste de Inglaterra durante dos temporadas de calefacción, una de 26 semanas antes y otra de 30 semanas después de que se instaló el aislamiento de la pared hueca. . El objeto del ejercicio fue evaluar el efecto del aislamiento en el consumo de gas.
Para analizar este conjunto de datos, primero es necesario que esté disponible cargando el paquete MASS con la función library() como se describe anteriormente:
library(MASS)Un marco de datos R es una matriz rectangular de N registros, cada uno representado como una fila, con M campos por registro, cada uno de los cuales representa un valor de una variable particular para ese registro. Esta estructura se puede ver aplicando la función head al marco de datos whiteside, que muestra sus primeros registros:
head(whiteside, n = 3)tail(whiteside, n=3)Más específicamente, la primera línea enumera los nombres de los campos, mientras que las siguientes tres líneas muestran los valores registrados en estos campos para los primeros tres registros del conjunto de datos.
Recuerde de la discusión anterior que el marco de datos de Whiteside caracteriza el consumo promedio semanal de gas de calefacción y la temperatura exterior promedio semanal durante dos inviernos sucesivos, el primero antes (Before) de que Whiteside instalara el aislamiento en su casa y el segundo después (After). Por lo tanto, cada registro en este marco de datos representa una observación semanal, enumerando si se realizó antes (Before) o después (After) de instalar el aislamiento (la variable Insul), la temperatura exterior promedio (Temp) y el consumo promedio de gas de calefacción (Gas).
La función str proporciona una vista más detallada de este marco de datos, que devuelve caracterizaciones estructurales de prácticamente cualquier objeto R. Aplicado al marco de datos whiteside, devuelve la siguiente información:
str(whiteside)## 'data.frame': 56 obs. of 3 variables:
## $ Insul: Factor w/ 2 levels "Before","After": 1 1 1 1 1 1 1 1 1 1 ...
## $ Temp : num -0.8 -0.7 0.4 2.5 2.9 3.2 3.6 3.9 4.2 4.3 ...
## $ Gas : num 7.2 6.9 6.4 6 5.8 5.8 5.6 4.7 5.8 5.2 ...
Aquí, la primera línea nos dice que whiteside es un marco de datos (data.frame), con 56 observaciones (filas o registros) y 3 variables. La segunda línea nos dice que la primera variable, Insul, es una variable factor con dos niveles: “Before” y “After”. (Los factores son un tipo de datos R importante que se utiliza para representar datos categóricos y se presenta brevemente en el siguiente párrafo). Las líneas tercera y cuarta nos dicen que Temp y Gas son variables numéricas.
Además, todas las líneas excepto la primera proporcionan resúmenes de los primeros (aquí, 10) valores observados para cada variable. Para las variables numéricas, estos valores son los mismos que se muestran con el comando principal presentado anteriormente, mientras que para los factores, str muestra un índice numérico que indica cuál de los posibles niveles de la variable está representado en cada uno de los primeros 10 registros.
Debido a que las variables factoriales son muy útiles y algo más complejas en su representación que las variables numéricas, vale la pena hacer una breve digresión aquí para hablar un poco más sobre ellas. Esencialmente, las variables de factor en R son vectores especiales que se utilizan para representar variables categóricas, codificándolas con dos componentes: un nivel, correspondiente al valor que vemos (por ejemplo, “Before” y “After” para el factor Insul en el marco de datos whiteside) y un índice que mapea cada elemento del vector en el nivel apropiado:
x <- whiteside$Insul
str(x)## Factor w/ 2 levels "Before","After": 1 1 1 1 1 1 1 1 1 1 ...
x[2]## [1] Before
## Levels: Before After
Aquí, la caracterización de str nos dice cuántos niveles tiene el factor y cuáles son los nombres de esos niveles (es decir, dos niveles, llamados “Before” y “After”), pero los valores que muestra str son los índices en lugar de los niveles ( es decir, los primeros 10 registros enumeran el primer valor, que es “Before”). R también admite vectores de caracteres y estos podrían usarse para representar variables categóricas, pero una diferencia importante es que los niveles definidos para una variable de factor representan su solo valores posibles: el intento de introducir un nuevo valor en una variable de factor falla, generando un valor faltante en su lugar, con una advertencia. Por ejemplo, si intentáramos cambiar el segundo elemento de esta variable de factor de “Before” a “Unknown”, recibiríamos una advertencia sobre un nivel de factor no válido y que el intento de asignación resultó en que este elemento tuviera el valor faltante NA. Por el contrario, si convertimos x en este ejemplo en un vector de caracteres, la nueva asignación de valor que se intentó anteriormente ahora funciona:
x <- as.character(whiteside$Insul)
str(x)## chr [1:56] "Before" "Before" "Before" "Before" "Before" "Before" "Before" ...
x[2] <- "Unknown"
str(x)## chr [1:56] "Before" "Unknown" "Before" "Before" "Before" "Before" "Before" ...
Además de str y head, la función summary() también puede proporcionar mucha información útil sobre marcos de datos y otros objetos R. De hecho, summary() es un ejemplo de una función genérica en R, que puede hacer diferentes cosas dependiendo de los atributos del objeto al que la apliquemos. Cuando la función genérica sumary() se aplica a un marco de datos como whiteside, devuelve una caracterización relativamente simple de los valores que puede asumir cada variable:
summary(whiteside)## Insul Temp Gas
## Before:26 Min. :-0.800 Min. :1.300
## After :30 1st Qu.: 3.050 1st Qu.:3.500
## Median : 4.900 Median :3.950
## Mean : 4.875 Mean :4.071
## 3rd Qu.: 7.125 3rd Qu.:4.625
## Max. :10.200 Max. :7.200
Este resultado se puede ver como una tabla con una columna para cada variable en el marco de datos whiteside (Insul, Temp y Gas) con un formato de columna que depende del tipo de variable que se caracteriza. Para el factor Insul de dos niveles, el resultado resumido da la cantidad de veces que ocurre cada nivel posible: 26 registros enumeran el valor “Before”, mientras que 30 enumeran el valor “After”. Para las variables numéricas, el resultado consta de dos componentes: uno es el valor medio, es decir, el promedio de la variable sobre todos los registros en el conjunto de datos, mientras que el otro es el resumen de cinco números de Tukey, que consta de estos cinco números:
\[ \bar x = \frac{1}{n} \sum_{i=1}^n x_i \] ## Estadística descriptiva de una variable del data.frame
summary(whiteside$Temp)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.800 3.050 4.900 4.875 7.125 10.200
De las 56 viviendas la temperatura vario desde un mínimo de -0.800 oF, hasta un máximo de 10.2 oF, con un valor promedio de 4.875 oF
Explicación de los cuartiles:
De las 56 viviendas el 25% de las viviendas mostraron una temperatura <= a 3.050 oF De las 56 viviendas el 50% de las viviendas mostraron una temperatura <= a 4.9 oF De las 56 viviendas el 75% de las viviendas mostraron una temperatura <= a 7.125 oF
# Mínimo
min(whiteside$Temp)## [1] -0.8
# Máximo
max(whiteside$Temp)## [1] 10.2
# Media aritmética
mean(whiteside$Temp)## [1] 4.875
# Mediana
median(whiteside$Temp)## [1] 4.9
# Cuartiles
# Primer cuartil: q1
quantile(whiteside$Temp,0.25)## 25%
## 3.05
# Segundo cuartil: q2
quantile(whiteside$Temp,0.5)## 50%
## 4.9
# Tercer cuartil: q3
quantile(whiteside$Temp,0.75)## 75%
## 7.125
library(readxl)
agregados <- read_excel("DATOS_2022_SEM_2.xlsx", sheet = "Agregados")
agregadoshead(agregados, n=3)tail(agregados)str(agregados)## tibble [60 × 18] (S3: tbl_df/tbl/data.frame)
## $ fgeo : chr [1:60] "SC" "SC" "SC" "SC" ...
## $ tmax : num [1:60] 5 3.81 3.81 3.81 3.81 3.81 3.81 3.81 3.81 3.81 ...
## $ tmaxnom: num [1:60] 3.81 3.81 3.81 2.54 2.54 3.81 3.81 3.81 3.81 3.81 ...
## $ pea : num [1:60] 1.93 2.46 2.57 2.5 2.5 2.51 2.5 2.69 2.61 2.57 ...
## $ psss : num [1:60] 1.97 2.55 2.61 2.56 2.56 2.57 2.55 2.75 2.63 2.59 ...
## $ pen : num [1:60] 2.02 2.71 2.69 2.65 2.65 2.65 2.64 2.86 2.68 2.63 ...
## $ abs : num [1:60] 2.15 3.7 1.79 2.25 2.33 2.12 2.26 2.24 1.01 0.94 ...
## $ iapla : num [1:60] 25.3 13.3 33.4 20.4 20.4 ...
## $ ialar : num [1:60] 24.8 22.4 28.5 39.9 34.9 ...
## $ pus : num [1:60] 1276 1385 1399 1347 1318 ...
## $ puc : num [1:60] 1490 1585 1599 1528 1542 ...
## $ vas : num [1:60] 33.9 43.7 45.5 46.1 47.3 ...
## $ vac : num [1:60] 22.8 35.6 37.8 38.9 38.3 ...
## $ trit : num [1:60] 26.1 25.6 23 27.5 25.7 ...
## $ desg : num [1:60] 28.2 28.8 28 29.2 28 ...
## $ rcompa : num [1:60] 233 254 340 340 417 ...
## $ denscon: num [1:60] 2296 2385 2213 2324 2368 ...
## $ rcompc : num [1:60] 246 250 230 251 246 ...
summary(agregados)## fgeo tmax tmaxnom pea
## Length:60 Min. :1.500 Min. :2.540 Min. :1.910
## Class :character 1st Qu.:3.232 1st Qu.:2.540 1st Qu.:2.493
## Mode :character Median :3.810 Median :3.810 Median :2.515
## Mean :3.273 Mean :3.408 Mean :2.491
## 3rd Qu.:3.810 3rd Qu.:3.810 3rd Qu.:2.540
## Max. :5.080 Max. :3.810 Max. :2.690
## psss pen abs iapla
## Min. :1.970 Min. :2.020 Min. :0.940 Min. :13.32
## 1st Qu.:2.550 1st Qu.:2.625 1st Qu.:1.975 1st Qu.:20.22
## Median :2.570 Median :2.650 Median :2.245 Median :22.98
## Mean :2.545 Mean :2.631 Mean :2.213 Mean :23.52
## 3rd Qu.:2.590 3rd Qu.:2.690 3rd Qu.:2.565 3rd Qu.:25.30
## Max. :2.750 Max. :2.860 Max. :3.700 Max. :39.91
## ialar pus puc vas vac
## Min. :18.37 Min. :1276 Min. :1452 Min. :22.81 Min. :22.81
## 1st Qu.:22.39 1st Qu.:1316 1st Qu.:1523 1st Qu.:41.00 1st Qu.:37.32
## Median :25.39 Median :1344 Median :1545 Median :46.04 Median :38.51
## Mean :27.30 Mean :1343 Mean :1545 Mean :43.99 Mean :38.02
## 3rd Qu.:32.57 3rd Qu.:1356 3rd Qu.:1580 3rd Qu.:47.10 3rd Qu.:39.33
## Max. :42.54 Max. :1436 Max. :1617 Max. :49.70 Max. :42.59
## trit desg rcompa denscon rcompc
## Min. :22.98 Min. :26.15 Min. :159.0 Min. :2173 Min. :179.0
## 1st Qu.:25.71 1st Qu.:27.47 1st Qu.:260.1 1st Qu.:2308 1st Qu.:262.1
## Median :27.19 Median :28.11 Median :319.1 Median :2334 Median :270.5
## Mean :26.73 Mean :28.19 Mean :334.1 Mean :2318 Mean :266.3
## 3rd Qu.:28.26 3rd Qu.:28.61 3rd Qu.:397.0 3rd Qu.:2355 3rd Qu.:277.2
## Max. :29.76 Max. :31.75 Max. :669.5 Max. :2385 Max. :282.2
names(agregados)## [1] "fgeo" "tmax" "tmaxnom" "pea" "psss" "pen" "abs"
## [8] "iapla" "ialar" "pus" "puc" "vas" "vac" "trit"
## [15] "desg" "rcompa" "denscon" "rcompc"
summary(agregados$rcompa)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 159.0 260.1 319.1 334.1 397.0 669.5
De las 60 muestras en las canteras de toluviejo, el agregado petreo mostró una resistencia a la compresión de 334.1 kg/cm2 en promedio. Variando desde un mínimo de 159.0 kg/cm2 hasta un máximo de 669.5 kg/cm2.
El 25% de las 60 muestras mostraron una RX menor o igual a 260.1 kg/cm2 El 50% de las 60 muestras mostraron una RX menor o igual a 319.1 kg/cm2 El 75% de las 60 muestras mostraron una RX menor o igual a 397.0 kg/cm2
\[ etm = s / \sqrt{n} \] Donde s es la desviación estándar que es la raíz cuadrada de la varianza, la cual es:
\[ s^2 = \frac{1}{n-1} \sum_{i=1}^n (x-\bar x)² \]
Las funciones en R para la varianza y la desviación estándar son var() y sd()
# El Error típico de la media
# Este error se utiliza para expresar correctamente el promedio aritmético
# Promedio aritmético
m = mean(agregados$rcompc)
etm = sd(agregados$rcompc) / sqrt(length(agregados$rcompc))
# Imprimo utilizando la función cat() que significa concatena e imprime
cat("El promedio es ", m, "mas o menos ", etm, "kg/cm2")## El promedio es 266.2547 mas o menos 2.156254 kg/cm2
Ejercicio: Crear una función que DESCRIBA las principales estadísticas descriptivas, mostrando los mensajes con sus interpretaciones.
Verificamos en la función describir que el parámetro x debe ser numérico con la función:
stopifnot {base} R Documentation Ensure the Truth of R Expressions
Description If any of the expressions (in … or exprs) are not all TRUE, stop is called, producing an error message indicating the first expression which was not (all) true.
El coeficiente de variación se define: \[ cv = s / \bar{x} * 100 \] Interpretación del coeficiente de variación
| CV | Dispersión |
|---|---|
| <10 | Concentrada |
| 10-30 | Homogenea |
| >30 | Dispersa |
# Crear una función de nombre describir que calcule las estadísticas descriptivas de un vector numérico
describir <- function(x,unidad){
#Comprueba que el parámetro x sea numérico con la función stopifnot()
stopifnot(is.numeric(x))
# Obtengo el número total de datos
n = length(x)
#Calculo mínimos y maximos
minimo=min(x)
maximo=max(x)
# Obtengo el promedio aritmético
m = mean(x,na.rm = T)
# Obtengo la desviación estándar
s = sd(x, na.rm = T)
# Obtengo el Error Típico de la Media
etm = s / sqrt(n)
# Imprimo resultados con la función cat()
cat("De los ", n, "datos, el valor promedio fue de ", m, unidad, ", mas o menos ",etm, unidad)
cat("\nVariando desde un mínimo de ", minimo, unidad, " hasta un máximo de ",maximo, unidad)
# Obtengo los cuartiles (q1, q2, y q3) con la función quantile()
q1 = quantile(x, 0.25)
q2 = quantile(x, 0.50)
q3 = quantile(x, 0.75)
# Interpretar los cuartiles
cat("\n\nDESCRIPCIÓN DE LOS CUARTILES:")
cat("\nEl 25% de los ", n, " datos está por debajo de ", q1, unidad)
cat("\nEl 50% de los ", n, " datos está por debajo de ", q2, unidad)
cat("\nEl 75% de los ", n, " datos está por debajo de ", q3, unidad)
# Calcula el coeficiente de Variación, se define como cv=s/
cv = s/m*100
# Interpretar el coeficiente de Variación
if (cv<10) {
cat("\n\nCV=",cv,", Dispersión Concentrada")
}
if (cv>=10 & cv<=30) {
cat("\nCV=",cv,", Dispersión Homogenea")
}
if (cv>30) {
cat("\nCV=",cv,", Dispersión Dispersa: REVISE EL DATO, POSIBLES OUTLIER")
}
boxplot(x)
}describir(agregados$rcompc,"kg/cm2")## De los 60 datos, el valor promedio fue de 266.2547 kg/cm2 , mas o menos 2.156254 kg/cm2
## Variando desde un mínimo de 178.99 kg/cm2 hasta un máximo de 282.16 kg/cm2
##
## DESCRIPCIÓN DE LOS CUARTILES:
## El 25% de los 60 datos está por debajo de 262.0975 kg/cm2
## El 50% de los 60 datos está por debajo de 270.535 kg/cm2
## El 75% de los 60 datos está por debajo de 277.215 kg/cm2
##
## CV= 6.273044 , Dispersión Concentrada
library(readxl)
concreto <- read_excel("DATOS_2022_SEM_2.xlsx",
sheet = "Concreto")## New names:
## • `` -> `...1`
names(concreto)## [1] "...1" "cemento" "ceniza1" "cenizav"
## [5] "agua" "plastificador" "agregadog" "agregadof"
## [9] "edad" "resistencia"
str(concreto)## tibble [1,030 × 10] (S3: tbl_df/tbl/data.frame)
## $ ...1 : num [1:1030] 0 1 2 3 4 5 6 7 8 9 ...
## $ cemento : num [1:1030] 540 540 332 332 199 ...
## $ ceniza1 : num [1:1030] 0 0 142 142 132 ...
## $ cenizav : num [1:1030] 0 0 0 0 0 0 0 0 0 0 ...
## $ agua : num [1:1030] 162 162 228 228 192 228 228 228 228 228 ...
## $ plastificador: num [1:1030] 2.5 2.5 0 0 0 0 0 0 0 0 ...
## $ agregadog : num [1:1030] 1040 1055 932 932 978 ...
## $ agregadof : num [1:1030] 676 676 594 594 826 ...
## $ edad : num [1:1030] 28 28 270 365 360 90 365 28 28 28 ...
## $ resistencia : num [1:1030] 80 61.9 40.3 41 44.3 ...
summary(concreto)## ...1 cemento ceniza1 cenizav
## Min. : 0.0 Min. :102.0 Min. : 0.0 Min. : 0.00
## 1st Qu.: 257.2 1st Qu.:192.4 1st Qu.: 0.0 1st Qu.: 0.00
## Median : 514.5 Median :272.9 Median : 22.0 Median : 0.00
## Mean : 514.5 Mean :281.2 Mean : 73.9 Mean : 54.19
## 3rd Qu.: 771.8 3rd Qu.:350.0 3rd Qu.:142.9 3rd Qu.:118.30
## Max. :1029.0 Max. :540.0 Max. :359.4 Max. :200.10
## agua plastificador agregadog agregadof
## Min. :121.8 Min. : 0.000 Min. : 801.0 Min. :594.0
## 1st Qu.:164.9 1st Qu.: 0.000 1st Qu.: 932.0 1st Qu.:731.0
## Median :185.0 Median : 6.400 Median : 968.0 Median :779.5
## Mean :181.6 Mean : 6.205 Mean : 972.9 Mean :773.6
## 3rd Qu.:192.0 3rd Qu.:10.200 3rd Qu.:1029.4 3rd Qu.:824.0
## Max. :247.0 Max. :32.200 Max. :1145.0 Max. :992.6
## edad resistencia
## Min. : 1.00 Min. : 2.33
## 1st Qu.: 7.00 1st Qu.:23.71
## Median : 28.00 Median :34.45
## Mean : 45.66 Mean :35.82
## 3rd Qu.: 56.00 3rd Qu.:46.13
## Max. :365.00 Max. :82.60
describir(concreto$resistencia,"kg/cm2")## De los 1030 datos, el valor promedio fue de 35.81796 kg/cm2 , mas o menos 0.5205317 kg/cm2
## Variando desde un mínimo de 2.33 kg/cm2 hasta un máximo de 82.6 kg/cm2
##
## DESCRIPCIÓN DE LOS CUARTILES:
## El 25% de los 1030 datos está por debajo de 23.71 kg/cm2
## El 50% de los 1030 datos está por debajo de 34.445 kg/cm2
## El 75% de los 1030 datos está por debajo de 46.135 kg/cm2
## CV= 46.64068 , Dispersión Dispersa: REVISE EL DATO, POSIBLES OUTLIER
QUEDAMOS AQUI PARA CONCLUIR LA PROXIMA CLASE EL USO DE subset() PARA EXTRAER SUBCONJUNTOS DE DATOS DE DF Y CONCLUIR LA FUNCIÓN DESCRIBIR()
names(agregados)## [1] "fgeo" "tmax" "tmaxnom" "pea" "psss" "pen" "abs"
## [8] "iapla" "ialar" "pus" "puc" "vas" "vac" "trit"
## [15] "desg" "rcompa" "denscon" "rcompc"
agregados$fgeo## [1] "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC"
## [16] "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC" "SC"
## [31] "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV"
## [46] "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV" "TV"
tv = subset(agregados, agregados$fgeo=="TV")
sc = subset(agregados,agregados$fgeo=="SC")describir(sc$rcompc,"kg/cm2")## De los 30 datos, el valor promedio fue de 256.3167 kg/cm2 , mas o menos 3.403708 kg/cm2
## Variando desde un mínimo de 178.99 kg/cm2 hasta un máximo de 271.49 kg/cm2
##
## DESCRIPCIÓN DE LOS CUARTILES:
## El 25% de los 30 datos está por debajo de 248.33 kg/cm2
## El 50% de los 30 datos está por debajo de 262.015 kg/cm2
## El 75% de los 30 datos está por debajo de 269.94 kg/cm2
##
## CV= 7.273376 , Dispersión Concentrada
describir(tv$rcompc,"kg/cm2")## De los 30 datos, el valor promedio fue de 276.1927 kg/cm2 , mas o menos 0.7223938 kg/cm2
## Variando desde un mínimo de 268.71 kg/cm2 hasta un máximo de 282.16 kg/cm2
##
## DESCRIPCIÓN DE LOS CUARTILES:
## El 25% de los 30 datos está por debajo de 272.765 kg/cm2
## El 50% de los 30 datos está por debajo de 277.54 kg/cm2
## El 75% de los 30 datos está por debajo de 279.355 kg/cm2
##
## CV= 1.432592 , Dispersión Concentrada