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