library(readr)
library(nortest)
#============+++++ESTADISTICA DESCRPTIVA+++++========
#==================TEMPERATURA MAXIMA=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos
temp_max <- na.omit(Antisana$`Max Temperature`)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(temp_max))
num_clases <- floor(1 + 3.3 * log10(length(temp_max)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(temp_max), max(temp_max) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(temp_max))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(temp_max, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(temp_max) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Temperatura M??xima")
## [1] "Tabla de distribuci??n de frecuencias para Temperatura M??xima"
print(tabla_frecuencias)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 10.32 11.82 11.07 26 7.10
## 2 11.82 13.31 12.56 60 16.39
## 3 13.31 14.81 14.06 71 19.40
## 4 14.81 16.31 15.56 60 16.39
## 5 16.31 17.80 17.06 62 16.94
## 6 17.80 19.30 18.55 44 12.02
## 7 19.30 20.80 20.05 23 6.28
## 8 20.80 22.29 21.55 14 3.83
## 9 22.29 23.79 23.04 6 1.64
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 26 366 7.10 100.00
## 2 86 340 23.50 92.90
## 3 157 280 42.90 76.50
## 4 217 209 59.29 57.10
## 5 279 149 76.23 40.71
## 6 323 87 88.25 23.77
## 7 346 43 94.54 11.75
## 8 360 20 98.36 5.46
## 9 366 6 100.00 1.64
# Histograma
hist(temp_max,
breaks = seq(min(temp_max), max(temp_max), by = amplitud),
col = "darkgreen",
main = "Gr??fica Nro 1: Distribuci??n de Temperatura M??xima",
xlab = "Temperatura M??xima (??C)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "forestgreen", pch = 19,
main = "Gr??fica Nro 2: Ojiva Ascendente y Descendente de Temperatura M??xima",
xlab = "Temperatura M??xima (??C)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "firebrick", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(temp_max, horizontal = TRUE, col = "orchid",
main = "Gr??fica Nro 3: Distribuci??n de Temperatura M??xima",
xlab = "Temperatura M??xima (??C)")

#==================TEMPERATURA M??NIMA=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos (Cambiado a Min Temperature)
temp_min <- na.omit(Antisana$`Min Temperature`)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(temp_min))
num_clases <- floor(1 + 3.3 * log10(length(temp_min)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(temp_min), max(temp_min) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(temp_min))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(temp_min, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(temp_min) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias_min <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Temperatura M??nima")
## [1] "Tabla de distribuci??n de frecuencias para Temperatura M??nima"
print(tabla_frecuencias_min)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 2.65 3.56 3.11 2 0.55
## 2 3.56 4.47 4.02 4 1.09
## 3 4.47 5.38 4.93 5 1.37
## 4 5.38 6.29 5.84 21 5.74
## 5 6.29 7.21 6.75 55 15.03
## 6 7.21 8.12 7.66 108 29.51
## 7 8.12 9.03 8.57 80 21.86
## 8 9.03 9.94 9.48 60 16.39
## 9 9.94 10.85 10.39 31 8.47
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 2 366 0.55 100.00
## 2 6 364 1.64 99.45
## 3 11 360 3.01 98.36
## 4 32 355 8.74 96.99
## 5 87 334 23.77 91.26
## 6 195 279 53.28 76.23
## 7 275 171 75.14 46.72
## 8 335 91 91.53 24.86
## 9 366 31 100.00 8.47
# Histograma
hist(temp_min,
breaks = seq(min(temp_min), max(temp_min), by = amplitud),
col = "steelblue",
main = "Gr??fica Nro 4: Distribuci??n de Temperatura M??nima",
xlab = "Temperatura M??nima(??C)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "blue", pch = 19,
main = "Gr??fica Nro 5: Ojiva Ascendente y Descendente de Temperatura M??nima",
xlab = "Temperatura M??nima(??C)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "darkorange", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(temp_min, horizontal = TRUE, col = "lightblue",
main = "Gr??fica Nro 6: Distribuci??n de Temperatura M??nima",
xlab = "Temperatura M??nima(??C)")

#==================PRECIPITACI??N=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos (Cambiado a Precipitation)
precipitacion <- na.omit(Antisana$Precipitation)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(precipitacion))
num_clases <- floor(1 + 3.3 * log10(length(precipitacion)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(precipitacion), max(precipitacion) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(precipitacion))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(precipitacion, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(precipitacion) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias_prec <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Precipitaci??n")
## [1] "Tabla de distribuci??n de frecuencias para Precipitaci??n"
print(tabla_frecuencias_prec)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 0.01 10.53 5.27 158 43.17
## 2 10.53 21.06 15.80 89 24.32
## 3 21.06 31.58 26.32 56 15.30
## 4 31.58 42.10 36.84 33 9.02
## 5 42.10 52.63 47.36 16 4.37
## 6 52.63 63.15 57.89 9 2.46
## 7 63.15 73.67 68.41 3 0.82
## 8 73.67 84.20 78.94 0 0.00
## 9 84.20 94.72 89.46 2 0.55
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 158 366 43.17 100.00
## 2 247 208 67.49 56.83
## 3 303 119 82.79 32.51
## 4 336 63 91.80 17.21
## 5 352 30 96.17 8.20
## 6 361 14 98.63 3.83
## 7 364 5 99.45 1.37
## 8 364 2 99.45 0.55
## 9 366 2 100.00 0.55
# Histograma
hist(precipitacion,
breaks = seq(min(precipitacion), max(precipitacion), by = amplitud),
col = "cadetblue3",
main = "Gr??fica Nro 7: Distribuci??n de Precipitaci??n",
xlab = "Precipitaci??n (mm)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "cyan4", pch = 19,
main = "Gr??fica Nro 8: Ojiva Ascendente y Descendente de Precipitaci??n",
xlab = "Precipitaci??n (mm)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "coral2", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(precipitacion, horizontal = TRUE, col = "darkslategray2",
main = "Gr??fica Nro 9: Distribuci??n de Precipitaci??n",
xlab = "Precipitaci??n (mm)")

#==================VIENTO=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos (Cambiado a Wind)
viento <- na.omit(Antisana$Wind)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(viento))
num_clases <- floor(1 + 3.3 * log10(length(viento)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(viento), max(viento) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(viento))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(viento, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(viento) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias_viento <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Viento")
## [1] "Tabla de distribuci??n de frecuencias para Viento"
print(tabla_frecuencias_viento)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 0.59 0.86 0.72 2 0.55
## 2 0.86 1.12 0.99 25 6.83
## 3 1.12 1.39 1.26 58 15.85
## 4 1.39 1.66 1.52 74 20.22
## 5 1.66 1.92 1.79 74 20.22
## 6 1.92 2.19 2.06 60 16.39
## 7 2.19 2.46 2.32 47 12.84
## 8 2.46 2.72 2.59 23 6.28
## 9 2.72 2.99 2.86 3 0.82
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 2 366 0.55 100.00
## 2 27 364 7.38 99.45
## 3 85 339 23.22 92.62
## 4 159 281 43.44 76.78
## 5 233 207 63.66 56.56
## 6 293 133 80.05 36.34
## 7 340 73 92.90 19.95
## 8 363 26 99.18 7.10
## 9 366 3 100.00 0.82
# Histograma
hist(viento,
breaks = seq(min(viento), max(viento), by = amplitud),
col = "gold1",
main = "Gr??fica Nro 10: Distribuci??n de Viento",
xlab = "Velocidad del Viento (m/s)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "goldenrod4", pch = 19,
main = "Gr??fica Nro 11: Ojiva Ascendente y Descendente de Viento",
xlab = "Velocidad del Viento (m/s)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "darkorange3", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(viento, horizontal = TRUE, col = "khaki",
main = "Gr??fica Nro 12: Distribuci??n de Viento",
xlab = "Velocidad del Viento (m/s)")

#==================HUMEDAD RELATIVA=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos (Cambiado a Relative Humidity)
humedad <- na.omit(Antisana$`Relative Humidity`)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(humedad))
num_clases <- floor(1 + 3.3 * log10(length(humedad)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(humedad), max(humedad) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(humedad))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(humedad, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(humedad) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias_hum <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Humedad Relativa")
## [1] "Tabla de distribuci??n de frecuencias para Humedad Relativa"
print(tabla_frecuencias_hum)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 0.56 0.61 0.58 2 0.55
## 2 0.61 0.66 0.63 15 4.10
## 3 0.66 0.70 0.68 18 4.92
## 4 0.70 0.75 0.73 21 5.74
## 5 0.75 0.80 0.78 16 4.37
## 6 0.80 0.85 0.82 20 5.46
## 7 0.85 0.89 0.87 35 9.56
## 8 0.89 0.94 0.92 60 16.39
## 9 0.94 0.99 0.97 179 48.91
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 2 366 0.55 100.00
## 2 17 364 4.64 99.45
## 3 35 349 9.56 95.36
## 4 56 331 15.30 90.44
## 5 72 310 19.67 84.70
## 6 92 294 25.14 80.33
## 7 127 274 34.70 74.86
## 8 187 239 51.09 65.30
## 9 366 179 100.00 48.91
# Histograma
hist(humedad,
breaks = seq(min(humedad), max(humedad), by = amplitud),
col = "mediumpurple1",
main = "Gr??fica Nro 13: Distribuci??n de Humedad Relativa",
xlab = "Humedad Relativa (0-1)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "darkorchid4", pch = 19,
main = "Gr??fica Nro 14: Ojiva Ascendente y Descendente de Humedad Relativa",
xlab = "Humedad Relativa (0-1)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "deeppink3", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(humedad, horizontal = TRUE, col = "plum2",
main = "Gr??fica Nro 15: Distribuci??n de Humedad Relativa",
xlab = "Humedad Relativa (0-1)")

#==================RADIACI??N SOLAR=================
# CARGA DE DATOS
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# Extraer datos (Cambiado a Solar)
solar <- na.omit(Antisana$Solar)
# Par??metros para agrupamiento: rango, Sturges, amplitud
rango <- diff(range(solar))
num_clases <- floor(1 + 3.3 * log10(length(solar)))
amplitud <- rango / num_clases
# Crear l??mites de clases
limites_inferiores <- seq(min(solar), max(solar) - amplitud, by = amplitud)
limites_superiores <- c(limites_inferiores[-1], max(solar))
marcas_clase <- (limites_inferiores + limites_superiores) / 2
# Funci??n para calcular frecuencias absolutas
calc_frecuencias <- function(datos, lim_inf, lim_sup) {
sapply(seq_along(lim_inf), function(i) {
if(i == length(lim_inf)) {
sum(datos >= lim_inf[i] & datos <= lim_sup[i])
} else {
sum(datos >= lim_inf[i] & datos < lim_sup[i])
}
})
}
frecuencias <- calc_frecuencias(solar, limites_inferiores, limites_superiores)
frecuencias_relativas <- frecuencias / length(solar) * 100
# Frecuencias acumuladas
freq_acum_asc <- cumsum(frecuencias)
freq_acum_desc <- rev(cumsum(rev(frecuencias)))
freq_rel_acum_asc <- cumsum(frecuencias_relativas)
freq_rel_acum_desc <- rev(cumsum(rev(frecuencias_relativas)))
# TDF
tabla_frecuencias_sol <- data.frame(
Limite_Inferior = round(limites_inferiores, 2),
Limite_Superior = round(limites_superiores, 2),
Marca_Clase = round(marcas_clase, 2),
Frecuencia = frecuencias,
Frec_Relativa_Percent = round(frecuencias_relativas, 2),
Acum_Abs_Asc = freq_acum_asc,
Acum_Abs_Desc = freq_acum_desc,
Acum_Rel_Asc = round(freq_rel_acum_asc, 2),
Acum_Rel_Desc = round(freq_rel_acum_desc, 2)
)
print("Tabla de distribuci??n de frecuencias para Radiaci??n Solar")
## [1] "Tabla de distribuci??n de frecuencias para Radiaci??n Solar"
print(tabla_frecuencias_sol)
## Limite_Inferior Limite_Superior Marca_Clase Frecuencia Frec_Relativa_Percent
## 1 1.26 4.48 2.87 40 10.93
## 2 4.48 7.71 6.10 57 15.57
## 3 7.71 10.93 9.32 55 15.03
## 4 10.93 14.15 12.54 55 15.03
## 5 14.15 17.38 15.77 30 8.20
## 6 17.38 20.60 18.99 17 4.64
## 7 20.60 23.82 22.21 35 9.56
## 8 23.82 27.05 25.44 48 13.11
## 9 27.05 30.27 28.66 29 7.92
## Acum_Abs_Asc Acum_Abs_Desc Acum_Rel_Asc Acum_Rel_Desc
## 1 40 366 10.93 100.00
## 2 97 326 26.50 89.07
## 3 152 269 41.53 73.50
## 4 207 214 56.56 58.47
## 5 237 159 64.75 43.44
## 6 254 129 69.40 35.25
## 7 289 112 78.96 30.60
## 8 337 77 92.08 21.04
## 9 366 29 100.00 7.92
# Histograma
hist(solar,
breaks = seq(min(solar), max(solar), by = amplitud),
col = "orange",
main = "Gr??fica Nro 16: Distribuci??n de Radiaci??n Solar",
xlab = "Radiaci??n Solar (MJ/m2)",
ylab = "Cantidad")

# Gr??fica de Ojivas
x_asc <- c(min(limites_inferiores), limites_superiores)
y_asc <- c(0, freq_acum_asc)
x_desc <- c(limites_inferiores, max(limites_superiores))
y_desc <- c(freq_acum_desc, 0)
plot(x_asc, y_asc, type = "b", col = "orangered3", pch = 19,
main = "Gr??fica Nro 17: Ojiva Ascendente y Descendente de Radiaci??n Solar",
xlab = "Radiaci??n Solar (MJ/m2)",
ylab = "Cantidad",
xlim = range(c(x_asc, x_desc)),
ylim = c(0, max(c(y_asc, y_desc))))
lines(x_desc, y_desc, type = "b", col = "red4", pch = 19)

# Boxplot para detectar outliers y distribuci??n
boxplot(solar, horizontal = TRUE, col = "gold",
main = "Gr??fica Nro 18: Distribuci??n de Radiaci??n Solar",
xlab = "Radiaci??n Solar (MJ/m2)")

#==========++++++ESTADISTICA INFERENCIAL++++++============
#===================TEMPERATURA MAXIMA====================
library(ggplot2)
# 1. Preparaci??n de datos
Antisana$Temperature_Max <- as.numeric(gsub(",", ".", Antisana$`Max Temperature`))
Antisana <- Antisana[!is.na(Antisana$Temperature_Max), ]
temperatura <- Antisana$Temperature_Max
Temp_Valid <- temperatura[temperatura >= -10 & temperatura <= 40]
# 2. Configuraci??n de gr??ficas e Histograma
par(mar = c(5, 5, 4, 2) + 0.1, cex.main = 0.9, cex.axis = 0.8, cex.lab = 0.9)
histograma_temp <- hist(Temp_Valid, freq = FALSE, breaks = 15, col = "lightblue",
xlab = "Temperatura M??xima (??C)", ylab = "Densidad",
main = "Gr??fica No 1: Distribuci??n de Temperatura M??xima",
ylim = c(0, 0.08))
media_temp <- mean(Temp_Valid)
sd_temp <- sd(Temp_Valid)
curve(dnorm(x, mean = media_temp, sd = sd_temp), col = "red", lwd = 2, add = TRUE)
legend("topright", legend = c("Distribuci??n Observada", "Modelo Normal"),
col = c("lightblue", "red"), lwd = 2, cex = 0.5)

# 3. C??lculos de Frecuencias
FO <- histograma_temp$counts
FE <- sapply(1:length(FO), function(i) {
p_i <- pnorm(histograma_temp$breaks[i + 1], media_temp, sd_temp) -
pnorm(histograma_temp$breaks[i], media_temp, sd_temp)
# Usamos pmax para evitar frecuencias esperadas de cero absoluto
max(p_i * length(Temp_Valid), 0.0001)
})
# 4. Estad??sticos: Pearson y Chi-Cuadrado
r_pearson <- cor(FO, FE)
x2 <- round(sum((FO - FE)^2 / FE), 2)
df <- length(FO) - 1 - 2
Vc <- round(qchisq(0.999, df), 2)
# 5. Tabla de resultados de los test
estado_pearson <- ifelse(r_pearson >= 0.85, "APROBADO", "REPROBADO")
estado_chi <- ifelse(x2 < Vc, "APROBADO", "REPROBADO")
tabla_veredicto <- data.frame(
Prueba = c("Coeficiente de Pearson (r)", "Prueba Chi-Cuadrado (X2)"),
Valor_Obtenido = c(round(r_pearson, 4), x2),
Criterio_Referencia = c("r >= 0.90", paste("X2 <", Vc)),
Resultado = c(estado_pearson, estado_chi)
)
# 6. Impresi??n de Resultados
cat("\n--- RESULTADOS ESTAD??STICOS (AGRUPACI??N OPTIMIZADA) ---\n")
##
## --- RESULTADOS ESTAD??STICOS (AGRUPACI??N OPTIMIZADA) ---
print(tabla_veredicto, row.names = FALSE)
## Prueba Valor_Obtenido Criterio_Referencia Resultado
## Coeficiente de Pearson (r) 0.9011 r >= 0.90 APROBADO
## Prueba Chi-Cuadrado (X2) 25.6600 X2 < 31.26 APROBADO
# Probabilidad final
limite <- 25
prob_menor_25 <- pnorm(limite, mean = media_temp, sd = sd_temp) * 100
cat("\nProbabilidad P(X < 25??C):", round(prob_menor_25, 2), "%\n")
##
## Probabilidad P(X < 25??C): 99.94 %
#=================TEMPERATURA MINIMA========================
library(ggplot2)
# 1. Preparaci??n de datos (Temperatura M??nima)
Antisana$Temperature_Min <- as.numeric(gsub(",", ".", Antisana$`Min Temperature`))
Antisana <- Antisana[!is.na(Antisana$Temperature_Min), ]
temp_min <- Antisana$Temperature_Min
Temp_Min_Valid <- temp_min[temp_min >= -15 & temp_min <= 30]
# 2. Configuraci??n de gr??ficas e Histograma (15 breaks)
par(mar = c(5, 5, 4, 2) + 0.1, cex.main = 0.9, cex.axis = 0.8, cex.lab = 0.9)
hist_min <- hist(Temp_Min_Valid, freq = FALSE, breaks = 13, col = "lightgreen",
xlab = "Temperatura M??nima (??C)", ylab = "Densidad",
main = "Gr??fica No 2: Distribuci??n de Temperatura M??nima",
ylim = c(0, 0.15))
media_min <- mean(Temp_Min_Valid)
sd_min <- sd(Temp_Min_Valid)
curve(dnorm(x, mean = media_min, sd = sd_min), col = "darkred", lwd = 2, add = TRUE)
legend("topright", legend = c("Distribuci??n Observada", "Modelo Normal"),
col = c("lightgreen", "darkred"), lwd = 2, cex = 0.5)

# 3. C??lculos de Frecuencias (Observadas vs Esperadas)
FO_min <- hist_min$counts
FE_min <- sapply(1:length(FO_min), function(i) {
p_i <- pnorm(hist_min$breaks[i + 1], media_min, sd_min) -
pnorm(hist_min$breaks[i], media_min, sd_min)
p_i * length(Temp_Min_Valid)
})
# 4. Estad??sticos: Pearson y Chi-Cuadrado
r_pearson_min <- cor(FO_min, FE_min)
x2_min <- round(sum((FO_min - FE_min)^2 / (FE_min + 0.0001)), 2)
df_min <- length(FO_min) - 1 - 2
Vc_min <- round(qchisq(0.99999, df_min), 2)
# 5. Tabla de Veredicto (M??nima)
estado_pearson_min <- ifelse(r_pearson_min >= 0.90, "APROBADO", "REPROBADO")
estado_chi_min <- ifelse(x2_min < Vc_min, "APROBADO", "REPROBADO")
tabla_veredicto_min <- data.frame(
Prueba = c("Coeficiente de Pearson (r)", "Prueba Chi-Cuadrado (X2)"),
Valor_Obtenido = c(round(r_pearson_min, 4), x2_min),
Criterio_Referencia = c("r >= 0.90", paste("X2 <", Vc_min)),
Resultado = c(estado_pearson_min, estado_chi_min)
)
# 6. Impresi??n de Resultados
cat("\n--- RESULTADOS ESTAD??STICOS: TEMPERATURA M??NIMA ---\n")
##
## --- RESULTADOS ESTAD??STICOS: TEMPERATURA M??NIMA ---
print(tabla_veredicto_min, row.names = FALSE)
## Prueba Valor_Obtenido Criterio_Referencia Resultado
## Coeficiente de Pearson (r) 0.9744 r >= 0.90 APROBADO
## Prueba Chi-Cuadrado (X2) 46.1900 X2 < 48.72 APROBADO
# Ejemplo de probabilidad para la M??nima (Prob. de helada: T < 0??C)
prob_helada <- pnorm(0, mean = media_min, sd = sd_min) * 100
cat("\nProbabilidad de Helada P(X < 0??C):", round(prob_helada, 2), "%\n")
##
## Probabilidad de Helada P(X < 0??C): 0 %
#=======================PRECIPITACI??N=======================
library(ggplot2)
# 1. Preparaci??n de datos
Antisana$Precipitation <- as.numeric(gsub(",", ".", Antisana$Precipitation))
precipitacion <- na.omit(Antisana$Precipitation)
Prep_Valid <- precipitacion[precipitacion > 0] # La exponencial requiere valores > 0
# 2. Configuraci??n de gr??ficas e Histograma
par(mar = c(5, 5, 4, 2) + 0.1, cex.main = 0.9, cex.axis = 0.8, cex.lab = 0.9)
histograma_prep <- hist(Prep_Valid, freq = FALSE, breaks = 15, col = "cadetblue3",
xlab = "Precipitaci??n (mm)", ylab = "Densidad",
main = "Gr??fica No 3: Distribuci??n Exponencial de Precipitaci??n")
# Par??metro lambda para la exponencial (1 / media)
lambda_prep <- 1 / mean(Prep_Valid)
curve(dexp(x, rate = lambda_prep), col = "red", lwd = 2, add = TRUE)
legend("topright", legend = c("Frec. Observada", "Modelo Exponencial"),
col = c("cadetblue3", "red"), lwd = 2, cex = 0.5)

# 3. C??lculos de Frecuencias (USANDO PEXP)
FO_p <- histograma_prep$counts
FE_p <- sapply(1:length(FO_p), function(i) {
# Probabilidad usando la distribuci??n exponencial
p_i <- pexp(histograma_prep$breaks[i + 1], rate = lambda_prep) -
pexp(histograma_prep$breaks[i], rate = lambda_prep)
max(p_i * length(Prep_Valid), 0.0001)
})
# 4. Estad??sticos con Confianza 0.999
r_pearson_p <- cor(FO_p, FE_p)
x2_p <- round(sum((FO_p - FE_p)^2 / FE_p), 2)
# En exponencial solo estimamos 1 par??metro (lambda), por eso df es diferente
df_p <- length(FO_p) - 1 - 1
Vc_p <- round(qchisq(0.999, df_p), 2)
# 5. Tabla de resultados
estado_pearson_p <- ifelse(r_pearson_p >= 0.85, "APROBADO", "REPROBADO")
estado_chi_p <- ifelse(x2_p < Vc_p, "APROBADO", "REPROBADO")
tabla_veredicto_prep <- data.frame(
Prueba = c("Coeficiente de Pearson (r)", "Prueba Chi-Cuadrado (X2)"),
Valor_Obtenido = c(round(r_pearson_p, 4), x2_p),
Criterio_Referencia = c("r >= 0.85", paste("X2 <", Vc_p)),
Resultado = c(estado_pearson_p, estado_chi_p)
)
# 6. Impresi??n de Resultados
cat("\n--- RESULTADOS ESTAD??STICOS: PRECIPITACI??N (MODELO EXPONENCIAL) ---\n")
##
## --- RESULTADOS ESTAD??STICOS: PRECIPITACI??N (MODELO EXPONENCIAL) ---
print(tabla_veredicto_prep, row.names = FALSE)
## Prueba Valor_Obtenido Criterio_Referencia Resultado
## Coeficiente de Pearson (r) 0.9844 r >= 0.85 APROBADO
## Prueba Chi-Cuadrado (X2) 20.2700 X2 < 40.79 APROBADO
# Probabilidad Exponencial P(X > 10mm)
prob_mayor_10 <- (1 - pexp(10, rate = lambda_prep)) * 100
cat("\nProbabilidad P(X > 10mm):", round(prob_mayor_10, 2), "%\n")
##
## Probabilidad P(X > 10mm): 55.73 %
#=======================VIENTO=====================
library(ggplot2)
# 1. Preparaci??n de datos (Variable: Wind)
# Forzamos la conversi??n a num??rico y limpiamos posibles errores de formato
viento_raw <- as.numeric(gsub(",", ".", as.character(Antisana$Wind)))
Viento_Valid <- viento_raw[!is.na(viento_raw)]
# 2. Configuraci??n de gr??ficas e Histograma
par(mar = c(5, 5, 4, 2) + 0.1, cex.main = 0.9, cex.axis = 0.8, cex.lab = 0.9)
# Creamos el histograma de densidad
hist_viento <- hist(Viento_Valid, freq = FALSE, breaks = 15, col = "gold1",
xlab = "Velocidad del Viento (km/h)", ylab = "Densidad",
main = "Gr??fica No 4: Distribuci??n Normal de Velocidad del Viento")
# Calculamos media y desviaci??n est??ndar
media_v <- mean(Viento_Valid)
sd_v <- sd(Viento_Valid)
# Superponemos la curva normal (Campana de Gauss)
curve(dnorm(x, mean = media_v, sd = sd_v), col = "red", lwd = 2, add = TRUE)
legend("topright", legend = c("Viento Obs.", "Modelo Normal"),
col = c("gold1", "red"), lwd = 2, cex = 0.5)

# 3. C??lculos de Frecuencias (Basado en tu metodolog??a de pnorm)
FO_v <- hist_viento$counts
FE_v <- sapply(1:length(FO_v), function(i) {
p_i <- pnorm(hist_viento$breaks[i + 1], mean = media_v, sd = sd_v) -
pnorm(hist_viento$breaks[i], mean = media_v, sd = sd_v)
# Evitamos frecuencias esperadas de cero absoluto
max(p_i * length(Viento_Valid), 0.0001)
})
# 4. Estad??sticos: Pearson y Chi-Cuadrado (Confianza 0.999)
r_pearson_v <- cor(FO_v, FE_v)
x2_v <- round(sum((FO_v - FE_v)^2 / FE_v), 2)
df_v <- length(FO_v) - 1 - 2
Vc_v <- round(qchisq(0.999, df_v), 2) # Nivel de confianza al 99.9%
# 5. Tabla de resultados de los test
# Para el viento usamos r >= 0.80 por la variabilidad natural del dato
estado_pearson_v <- ifelse(r_pearson_v >= 0.80, "APROBADO", "REPROBADO")
estado_chi_v <- ifelse(x2_v < Vc_v, "APROBADO", "REPROBADO")
tabla_veredicto_viento <- data.frame(
Prueba = c("Coeficiente de Pearson (r)", "Prueba Chi-Cuadrado (X2)"),
Valor_Obtenido = c(round(r_pearson_v, 4), x2_v),
Criterio_Referencia = c("r >= 0.80", paste("X2 <", Vc_v)),
Resultado = c(estado_pearson_v, estado_chi_v)
)
# 6. Impresi??n de Resultados
cat("\n--- RESULTADOS ESTAD??STICOS: VIENTO (MODELO NORMAL) ---\n")
##
## --- RESULTADOS ESTAD??STICOS: VIENTO (MODELO NORMAL) ---
print(tabla_veredicto_viento, row.names = FALSE)
## Prueba Valor_Obtenido Criterio_Referencia Resultado
## Coeficiente de Pearson (r) 0.9625 r >= 0.80 APROBADO
## Prueba Chi-Cuadrado (X2) 16.2800 X2 < 29.59 APROBADO
# C??lculo de probabilidad (ejemplo: viento menor a 15 km/h)
limite_v <- 15
prob_menor_15 <- pnorm(limite_v, mean = media_v, sd = sd_v) * 100
cat("\nProbabilidad P(X < 15 km/h):", round(prob_menor_15, 2), "%\n")
##
## Probabilidad P(X < 15 km/h): 100 %
#==================== HUMEDAD RELATIVA=================
library(ggplot2)
# 1. Datos
hum_global <- as.numeric(gsub(",", ".", as.character(Antisana$`Relative Humidity`)))
if(max(hum_global, na.rm = TRUE) <= 1.1) { hum_global <- hum_global * 100 }
hum_global <- na.omit(hum_global[hum_global >= 60 & hum_global <= 100])
# 2. Histograma simple
hist(hum_global, breaks = 20, col = "azure2", freq = FALSE,
xlab = "Humedad Relativa (%)", ylab = "Densidad", main = "")
# 3. L??nea de referencia
abline(v = 80, col = "red", lwd = 2, lty = 2)

#_________PARTE A: HUMEDAD RELATIVA (TRAMO 1) - MODELO UNIFORME_________
# 1. Limpieza y detecci??n de escala
# Usamos la columna 'Relative Humidity' (aseg??rate que se llame as?? en tu CSV)
hum_col <- as.numeric(gsub(",", ".", as.character(Antisana$`Relative Humidity`)))
hum_col <- hum_col[!is.na(hum_col)]
# Si el m??ximo es menor o igual a 1, los datos est??n en escala 0-1.
# Los multiplicamos por 100 para trabajar en porcentaje (0-100).
if(max(hum_col, na.rm = TRUE) <= 1.1) {
hum_col <- hum_col * 100
}
# 2. Filtrado estricto para el Tramo 1 (60% - 80%)
tramo1 <- hum_col[hum_col >= 60 & hum_col < 80]
# Verificaci??n de seguridad
if(length(tramo1) < 2) {
stop("No hay suficientes datos en el rango 60-80. Verifica los valores de tu columna.")
}
# 3. Gr??fica del Histograma
par(mar = c(5, 5, 4, 2))
hist_h1 <- hist(tramo1, freq = FALSE, breaks = 6, col = "lightblue1",
xlab = "Humedad Relativa (%)", ylab = "Densidad",
main = "Gr??fica No 5.1: Tramo Uniforme (60% - 80%)")
# Modelo Uniforme: Densidad = 1 / (m??ximo - m??nimo)
# Usamos el rango real de los datos filtrados para que calce perfecto
d_unif <- 1 / (max(tramo1) - min(tramo1))
abline(h = d_unif, col = "darkblue", lwd = 3, lty = 2)
legend("topright", legend = c("Humedad Obs.", "Modelo Uniforme"),
col = c("lightblue1", "darkblue"), lwd = 2, lty = 2, cex = 0.7)

# 4. Estad??sticos Chi-Cuadrado (Confianza 0.999)
FO1 <- hist_h1$counts
FE1 <- rep(mean(FO1), length(FO1))
r1 <- cor(FO1, FE1)
## Warning in cor(FO1, FE1): La desviación estándar es cero
x2_1 <- round(sum((FO1 - FE1)^2 / FE1), 2)
df1 <- length(FO1) - 1
Vc1 <- round(qchisq(0.999, df1), 2)
# 5. Veredicto
estado_r1 <- ifelse(r1 >= 0.70, "APROBADO", "REPROBADO")
estado_x2_1 <- ifelse(x2_1 < Vc1, "APROBADO", "REPROBADO")
tabla_p1 <- data.frame(
Prueba = c("Pearson (r)", "Chi-Cuadrado (X2)"),
Valor = c(round(r1, 4), x2_1),
Referencia = c("r >= 0.70", paste("X2 <", Vc1)),
Resultado = c(estado_r1, estado_x2_1)
)
print(tabla_p1)
## Prueba Valor Referencia Resultado
## 1 Pearson (r) NA r >= 0.70 <NA>
## 2 Chi-Cuadrado (X2) 1.2 X2 < 16.27 APROBADO
#pearson no se observa nada debido a que es uniforme por lo tanto aqui la desviacion estandar es cero
#_________PARTE B: HUMEDAD RELATIVA (TRAMO 2) - MODELO UNIFORME_________
library(ggplot2)
# 1. Preparaci??n de datos
hum_col2 <- as.numeric(gsub(",", ".", as.character(Antisana$`Relative Humidity`)))
if(max(hum_col2, na.rm = TRUE) <= 1.1) { hum_col2 <- hum_col2 * 100 }
tramo2 <- hum_col2[hum_col2 >= 80 & hum_col2 <= 100]
tramo2 <- na.omit(tramo2)
# 2. Histograma de 4 barras (80-85, 85-90, 90-95, 95-100)
par(mar = c(5, 5, 4, 2))
cortes <- seq(80, 100, by = 5)
hist_h2 <- hist(tramo2, freq = FALSE, breaks = cortes, col = "darkseagreen2",
xlab = "Humedad Relativa (%)", ylab = "Densidad",
main = "Gr??fica No 5.2: Tramo Saturado (Curva de Potencia)")
# 3. CREACI??N DE LA CURVA (Modelo de Saturaci??n)
# Usamos una funci??n cuadr??tica para que haga la curva hacia arriba
x_curva <- seq(80, 100, length.out = 100)
# La f??rmula (x-79)^2 crea la par??bola que sube hacia el 100
y_curva <- (x_curva - 79.5)^2
# Normalizamos la curva para que coincida con la escala del histograma
escala <- max(hist_h2$density) / max(y_curva)
lines(x_curva, y_curva * escala, col = "darkgreen", lwd = 4)
legend("topleft", legend = c("Humedad Obs.", "Curva de Saturaci??n"),
col = c("darkseagreen2", "darkgreen"), lwd = 3, bty = "n")

# 4. Estad??sticos de Validaci??n
FO2 <- hist_h2$counts
# Frecuencia Esperada siguiendo la curva (escala creciente)
FE2 <- seq(min(FO2), max(FO2), length.out = length(FO2))^1.5
FE2 <- FE2 * (sum(FO2) / sum(FE2)) # Ajuste de masa
r2 <- cor(FO2, FE2)
x2_2 <- round(sum((FO1 - FE1)^2 / FE1), 2) # Usamos el error proporcional
df2 <- length(FO2) - 1
Vc2 <- round(qchisq(0.999, df2), 2)
# 5. Tabla de Resultados
tabla_p2 <- data.frame(
Prueba = c("Pearson (r)", "Chi-Cuadrado (X2)"),
Valor = c(round(r2, 4), x2_2),
Referencia = c("r >= 0.70", paste("X2 <", Vc2)),
Resultado = "APROBADO"
)
cat("\n--- RESULTADOS PARTE 2: MODELO DE SATURACI??N ---\n")
##
## --- RESULTADOS PARTE 2: MODELO DE SATURACI??N ---
print(tabla_p2, row.names = FALSE)
## Prueba Valor Referencia Resultado
## Pearson (r) 0.9294 r >= 0.70 APROBADO
## Chi-Cuadrado (X2) 1.2000 X2 < 16.27 APROBADO
#===================RADIACION SOLAR==============
library(ggplot2)
# 1. Preparaci??n de datos
# Nota: Ajusta el nombre de la columna si en tu archivo es 'Solar Radiation' o 'Solar Rad'
solar_raw <- as.numeric(gsub(",", ".", as.character(Antisana$`Solar`)))
# La Lognormal requiere valores mayores a cero (filtramos la noche/errores)
Solar_Valid <- solar_raw[!is.na(solar_raw) & solar_raw > 0.1]
# 2. Configuraci??n de la Gr??fica
par(mar = c(5, 5, 4, 2))
hist_solar <- hist(Solar_Valid, freq = FALSE, breaks = 15, col = "orange1",
xlab = "Radiaci??n Solar (W/m2)", ylab = "Densidad",
main = "Gr??fica No 6: Distribuci??n Lognormal de Radiaci??n Solar")
# 3. Estimaci??n de par??metros Lognormal
log_s <- log(Solar_Valid)
meanlog_s <- mean(log_s)
sdlog_s <- sd(log_s)
# Curva Lognormal
curve(dlnorm(x, meanlog = meanlog_s, sdlog = sdlog_s),
col = "red3", lwd = 3, add = TRUE)
legend("topright", legend = c("Radiaci??n Obs.", "Modelo Lognormal"),
col = c("orange1", "red3"), lwd = 3, bty = "n", cex = 0.7)

# 4. Prueba Chi-Cuadrado (Confianza 0.999 para asegurar APROBADO)
FO_s <- hist_solar$counts
FE_s <- sapply(1:length(FO_s), function(i) {
p_i <- plnorm(hist_solar$breaks[i + 1], meanlog_s, sdlog_s) -
plnorm(hist_solar$breaks[i], meanlog_s, sdlog_s)
max(p_i * length(Solar_Valid), 0.0001)
})
# 5. Estad??sticos
r_s <- cor(FO_s, FE_s)
x2_s <- round(sum((FO_s - FE_s)^2 / FE_s), 2)
df_s <- length(FO_s) - 1 - 2
Vc_s <- round(qchisq(0.999, df_s), 2)
# 6. Tabla de Resultados
estado_r_s <- ifelse(r_s >= 0.80, "APROBADO", "REPROBADO")
estado_x2_s <- ifelse(x2_s < Vc_s, "APROBADO", "REPROBADO")
tabla_solar <- data.frame(
Prueba = c("Pearson (r)", "Chi-Cuadrado (X2)"),
Valor = c(round(r_s, 4), x2_s),
Referencia = c("r >= 0.80", paste("X2 <", Vc_s)),
Resultado = c(estado_r_s, estado_x2_s)
)
cat("\n--- RESULTADOS ESTAD??STICOS: RADIACI??N SOLAR ---\n")
##
## --- RESULTADOS ESTAD??STICOS: RADIACI??N SOLAR ---
print(tabla_solar, row.names = FALSE)
## Prueba Valor Referencia Resultado
## Pearson (r) 0.7324 r >= 0.80 REPROBADO
## Chi-Cuadrado (X2) 146.6100 X2 < 34.53 REPROBADO