setwd(file.path(Sys.getenv(“USERPROFILE”), “Downloads”)) # Cargar dataset Datos <- read.csv(“Datos.csv”, sep = “,”, dec = “.”, fileEncoding = “latin1”) # Estructura de los datos str(Datos)
library(dplyr) library(gt) library(e1071)
Variable <- na.omit(Datos$Max.Temperature) N <- length(Variable)
min_dec <- min(Variable) max_dec <- max(Variable) k_dec <- floor(1 + 3.322 * log10(N)) rango_dec <- max_dec - min_dec amplitud_dec <- rango_dec / k_dec
cortes_dec <- seq(min_dec, max_dec, length.out = k_dec + 1) cortes_dec[length(cortes_dec)] <- max_dec + 0.0001
inter_dec <- cut(Variable, breaks = cortes_dec, include.lowest = TRUE, right = FALSE) ni_dec <- as.vector(table(inter_dec))
hi_dec <- (ni_dec / N) * 100 Ni_asc_dec <- cumsum(ni_dec) Hi_asc_dec <- cumsum(hi_dec) Ni_desc_dec <- rev(cumsum(rev(ni_dec))) Hi_desc_dec <- rev(cumsum(rev(hi_dec)))
TDF_Decimal <- data.frame( Li = cortes_dec[1:k_dec], Ls = cortes_dec[2:(k_dec+1)], MC = (cortes_dec[1:k_dec] + cortes_dec[2:(k_dec+1)]) / 2, ni = ni_dec, hi = hi_dec, Ni_asc = Ni_asc_dec, Ni_desc = Ni_desc_dec, Hi_asc = Hi_asc_dec, Hi_desc = Hi_desc_dec )
BASE <- 1 min_int <- floor(min(Variable) / BASE) * BASE max_int <- ceiling(max(Variable) / BASE) * BASE k_int_sug <- floor(1 + 3.322 * log10(N)) Rango_int <- max_int - min_int Amplitud_raw <- Rango_int / k_int_sug Amplitud_int <- max(1, ceiling(Amplitud_raw))
cortes_int <- seq(from = min_int, by = Amplitud_int, length.out = k_int_sug + 2) cortes_int <- cortes_int[cortes_int <= (max_int + Amplitud_int)] while(max(cortes_int) < max(Variable)) { cortes_int <- c(cortes_int, max(cortes_int) + Amplitud_int) }
K_real <- length(cortes_int) - 1 lim_inf_int <- cortes_int[1:K_real] lim_sup_int <- cortes_int[2:(K_real+1)]
inter_int <- cut(Variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE) ni_int <- as.vector(table(inter_int))
hi_int <- (ni_int / N) * 100 Ni_asc_int <- cumsum(ni_int) Hi_asc_int <- cumsum(hi_int) Ni_desc_int <- rev(cumsum(rev(ni_int))) Hi_desc_int <- rev(cumsum(rev(hi_int)))
TDF_Enteros <- data.frame( Li = lim_inf_int, Ls = lim_sup_int, MC = (lim_inf_int + lim_sup_int) / 2, ni = ni_int, hi = hi_int, Ni_asc = Ni_asc_int, Ni_desc = Ni_desc_int, Hi_asc = Hi_asc_int, Hi_desc = Hi_desc_int )
TDF_Dec_Final <- data.frame( Li = as.character(round(TDF_Decimal\(Li, 2)), Ls = as.character(round(TDF_Decimal\)Ls, 2)), MC = as.character(round(TDF_Decimal\(MC, 2)), ni = as.character(TDF_Decimal\)ni), hi = as.character(round(TDF_Decimal\(hi, 2)), Ni_asc = as.character(TDF_Decimal\)Ni_asc), Ni_desc = as.character(TDF_Decimal\(Ni_desc), Hi_asc = as.character(round(TDF_Decimal\)Hi_asc, 2)), Hi_desc = as.character(round(TDF_Decimal$Hi_desc, 2)) )
totales_dec <- c(“TOTAL”, “-”, “-”, sum(TDF_Decimal\(ni), round(sum(TDF_Decimal\)hi), 2), “-”, “-”, “-”, “-”) TDF_Dec_Final <- rbind(TDF_Dec_Final, totales_dec)
library(gt) TDF_Dec_Final %>% gt() %>% tab_header( title = md(“Tabla N°1 de Distribución de Frecuencias de Temperatura Máxima (°C)”)) %>% cols_label( Li = “Lim. Inf”, Ls = “Lim. Sup”, MC = “Marca Clase”, ni = “Frec. Abs (ni)”, hi = “Frec. Rel (%)”, Ni_asc = “Ni (Asc)”, Ni_desc = “Ni (Desc)”, Hi_asc = “Hi Asc (%)”, Hi_desc = “Hi Desc (%)” ) %>% cols_align(align = “center”, columns = everything()) %>% tab_options( heading.title.font.size = px(14), column_labels.background.color = “#F0F0F0” ) ## 3.2 Tabla con Límites Enteros # Crear Dataframe TDF_Int_Final <- data.frame( Li = as.character(TDF_Enteros\(Li), Ls = as.character(TDF_Enteros\)Ls), MC = as.character(TDF_Enteros\(MC), ni = as.character(TDF_Enteros\)ni), hi = as.character(round(TDF_Enteros\(hi, 2)), Ni_asc = as.character(TDF_Enteros\)Ni_asc), Ni_desc = as.character(TDF_Enteros\(Ni_desc), Hi_asc = as.character(round(TDF_Enteros\)Hi_asc, 2)), Hi_desc = as.character(round(TDF_Enteros$Hi_desc, 2)) )
totales_int <- c(“TOTAL”, “-”, “-”, sum(TDF_Enteros\(ni), round(sum(TDF_Enteros\)hi), 2), “-”, “-”, “-”, “-”) TDF_Int_Final <- rbind(TDF_Int_Final, totales_int)
library(gt) TDF_Int_Final %>% gt() %>% tab_header( title = md(“Tabla N°2 de Distribución de Frecuencias de Temperatura Máxima (°C)”)) %>% cols_label( Li = “Lim. Inf”, Ls = “Lim. Sup”, MC = “Marca Clase”, ni = “Frec. Abs (ni)”, hi = “Frec. Rel (%)”, Ni_asc = “Ni (Asc)”, Ni_desc = “Ni (Desc)”, Hi_asc = “Hi Asc (%)”, Hi_desc = “Hi Desc (%)” ) %>% cols_align(align = “center”, columns = everything()) %>% tab_options( heading.title.font.size = px(14), column_labels.background.color = “#F0F0F0” ) # 4 Análisis Gráfico ## 4.1 Histogramas de Cantidad
par(mar = c(8, 5, 4, 2)) barplot(TDF_Enteros\(ni, names.arg = TDF_Enteros\)MC, main = ““, xlab =”“, ylab =”Cantidad (Días)“, col =”#B0C4DE”, space = 0, las = 2, cex.names = 0.7) mtext(“Temperatura Máxima (°C)”, side = 1, line = 4) mtext(“Gráfica N°1: Distribución de Cantidad del Volcan Antisana por Temperatura Máxima”, side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)
par(mar = c(8, 5, 4, 2)) barplot(TDF_Enteros\(ni, main = "", xlab = "", ylab = "Cantidad (Días)", names.arg = TDF_Enteros\)MC, col = “#B0C4DE”, space = 0, cex.names = 0.7, las = 2, ylim = c(0, sum(TDF_Enteros$ni))) mtext(“Temperatura Máxima (°C)”, side = 1, line = 4)
mtext(“Gráfica N°2: Distribución de Cantidad del Volcan Anrisana por Temperatura Máxima”, side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2) ## 4.2 Histogramas Porcentuales
par(mar = c(8, 5, 5, 2)) bp3 <- barplot(TDF_Enteros\(hi, main = "", xlab = "", ylab = "Porcentaje (%)", col = "#B0C4DE", space = 0, names.arg = TDF_Enteros\)MC, cex.names = 0.7, las = 2, ylim = c(0, max(TDF_Enteros\(hi) * 1.25)) # Aumentamos el margen superior para el texto mtext("Temperatura Máxima (°C)", side = 1, line = 4) mtext("Gráfica N°3: Distribución Porcentual del Volcan Antisana por Temperatura Máxima", side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2) text(x = bp3, y = TDF_Enteros\)hi, labels = paste0(round(TDF_Enteros$hi, 1), “%”), pos = 3, # Posición arriba de la barra cex = 0.7, # Tamaño del texto un poco más legible col = “black”)
par(mar = c(8, 5, 5, 2)) bp4 <- barplot(TDF_Enteros\(hi,
main = "",
xlab = "",
ylab = "Porcentaje (%)",
col = "#B0C4DE",
space = 0,
names.arg = TDF_Enteros\)MC, las = 2, cex.names =
0.7, ylim = c(0, 100)) # Eje Y fijo al 100% mtext(“Temperatura Máxima
(°C)”, side = 1, line = 4) mtext(“Gráfica N°4: Distribución Porcentual
del Volcan Antisana por Temperatura Máxima”, side = 3, line = 2, adj =
0.5, cex = 0.9, font = 2) text(x = bp4, y = TDF_Enteros\(hi,
labels = paste0(round(TDF_Enteros\)hi, 1), “%”), pos =
3,
cex = 0.6,
col = “black”)
par(mar = c(5, 5, 4, 2)) boxplot(Variable, horizontal = TRUE, # Mantenemos el formato horizontal col = “#B0C4DE”, # Color azul acero claro xlab = “Temperatura Máxima (°C)”, cex.main = 0.9, main = “Gráfica N°5: Distribución de la Temperatura Máxima en el Volcan Antisana”) grid(nx = NULL, ny = NA, lty = 2, col = “gray”)
par(mar = c(5, 5, 7, 10), xpd = TRUE)
x_asc <- TDF_Enteros\(Ls x_desc <- TDF_Enteros\)Li y_asc <- TDF_Enteros\(Ni_asc y_desc <- TDF_Enteros\)Ni_desc
plot(x_asc, y_asc, type = “b”, main = ““, xlab =”Temperatura Máxima (°C)“, ylab =”Frecuencia Acumulada (Días)“, col =”black”, pch = 19, xlim = c(min(x_desc), max(x_asc)), ylim = c(0, sum(TDF_Enteros$ni)))
lines(x_desc, y_desc, col = “blue”, type = “b”, pch = 19)
grid() mtext(“Gráfica N°6: Ojivas Ascendentes y Descendentes de lade la Temperatura Máxima en el Volcan Antisana”, side = 3, line = 3, adj = 0.5, cex = 0.9, font = 2)
legend(“right”, legend = c(“Ascendente (Ni <)”, “Descendente (Ni >)”), col = c(“black”, “blue”), lty = 1, pch = 19, cex = 0.6, inset = c(-0.2, 0), bty = “n”)
media <- round(mean(Variable), 2)
mediana <- round(median(Variable), 2)
max_frecuencia <- max(TDF_Enteros\(ni) moda_vals <- TDF_Enteros\)MC[TDF_Enteros$ni == max_frecuencia] moda_txt <- paste(round(moda_vals, 2), collapse = “,”)
varianza <- var(Variable)
sd_val <- sd(Variable)
cv <- round((sd_val / abs(media)) * 100, 2)
asimetria <- skewness(Variable, type = 2)
curtosis <- kurtosis(Variable)
Q1 <- quantile(Variable, 0.25) Q3 <- quantile(Variable, 0.75) IQR_val <- Q3 - Q1 lim_inf <- Q1 - 1.5 * IQR_val lim_sup <- Q3 + 1.5 * IQR_val outliers_data <- Variable[Variable < lim_inf | Variable > lim_sup] num_outliers <- length(outliers_data)
if(num_outliers > 0){ rango_outliers <- paste0(num_outliers, ” [“, round(min(outliers_data), 2),”; “, round(max(outliers_data), 2),”]“) } else { rango_outliers <-”0 [Sin Outliers]” }
tabla_indicadores <- data.frame( “Variable” = c(“Temp. Máxima (°C)”), “Rango_MinMax” = paste0(“[”, round(min(Variable), 2), ”; ”, round(max(Variable), 2), ”]”), “X” = c(media), “Me” = c(mediana), “Mo” = c(moda_txt), “V” = c(varianza), “Sd” = c(sd_val), “Cv” = c(cv), “As” = c(asimetria), “K” = c(curtosis), “Outliers” = rango_outliers )
library(gt) tabla_conclusiones_gt <- tabla_indicadores %>% gt() %>% tab_header(title = md(“Tabla N°3 de Conclusiones de Temperatura Máxima en el Volcan Antisana”)) %>% tab_source_note(source_note = “Autor: Carlos Ramirez”) %>% cols_label( Variable = “Variable”, Rango_MinMax = “Rango”, X = “Media (X)”, Me = “Mediana (Me)”, Mo = “Moda (Mo)”, V = “Varianza (V)”, Sd = “Desv. Est. (Sd)”, Cv = “C.V. (%)”, As = “Asimetría (As)”, K = “Curtosis (K)”, Outliers = “Outliers [Intervalo]” ) %>% tab_options( heading.title.font.size = px(16), column_labels.background.color = “#F0F0F0” )
tabla_conclusiones_gt