#               UNIVERSIDAD CENTRAL DEL ECUADOR
#FACULTAD DE INGENIERIA EN GEOLOGIA, MINAS, PETROLEOS Y AMBIENTAL
#               ESTADISTICA Y PROBABILIDADES
# AUTOR: GRUPO 4
# FECHA: 09-02-2026

#=====TEMA=====
print("An??lisis de la variaci??n de la temperatura en el Volc??n Antisana y su 
comportamiento clim??tico en los ??ltimos a??os")
## [1] "An??lisis de la variaci??n de la temperatura en el Volc??n Antisana y su \ncomportamiento clim??tico en los ??ltimos a??os"
#=======PLANTEAMIENTO DEL PROBLEMA=======
print("El an??lisis de los datos meteorol??gicos registrados en la zona del Antisana permite 
identificar tendencias, fluctuaciones y posibles anomal??as t??rmicas. Mediante la 
estad??stica, convertiremos los datos obtenidos en informaci??n ??til para evaluar cambios 
significativos en el comportamiento clim??tico local y cu??les podr??an ser sus 
implicaciones ambientales.")
## [1] "El an??lisis de los datos meteorol??gicos registrados en la zona del Antisana permite \nidentificar tendencias, fluctuaciones y posibles anomal??as t??rmicas. Mediante la \nestad??stica, convertiremos los datos obtenidos en informaci??n ??til para evaluar cambios \nsignificativos en el comportamiento clim??tico local y cu??les podr??an ser sus \nimplicaciones ambientales."
#==========MAPA ANTISANA========
library(magick)
## Linking to ImageMagick 6.9.13.29
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
ruta <- "C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/Mapa/MAPA ANTISANA.png"
img <- image_read(ruta)
plot(img)

#========OBJETIVO GENERAL========
print("Aplicar m??todos estad??sticos y machine learning para identificar tendencias 
clim??ticas y posibles cambios en el comportamiento t??rmico de la zona.")
## [1] "Aplicar m??todos estad??sticos y machine learning para identificar tendencias \nclim??ticas y posibles cambios en el comportamiento t??rmico de la zona."
#======OBJETIVOS ESPECIFICOS======
print("1. Conocer la descripci??n estad??stica de los datos de temperatura del volc??n 
Antisana mediante el c??lculo de medidas de tendencia central y dispersi??n, para 
caracterizar su comportamiento t??rmico.")
## [1] "1. Conocer la descripci??n estad??stica de los datos de temperatura del volc??n \nAntisana mediante el c??lculo de medidas de tendencia central y dispersi??n, para \ncaracterizar su comportamiento t??rmico."
print("2. Emplear modelos de probabilidad para analizar la distribuci??n de los datos de 
temperatura y estimar la ocurrencia de determinados valores t??rmicos.")
## [1] "2. Emplear modelos de probabilidad para analizar la distribuci??n de los datos de \ntemperatura y estimar la ocurrencia de determinados valores t??rmicos."
print("3. Deducir las relaciones existentes entre la temperatura y otras variables 
meteorol??gicas registradas, a fin de identificar posibles patrones o dependencias 
clim??ticas.")
## [1] "3. Deducir las relaciones existentes entre la temperatura y otras variables \nmeteorol??gicas registradas, a fin de identificar posibles patrones o dependencias \nclim??ticas."
#====================+++++ESTADISTICA DESCRPTIVA+++++==================
cat("

                                  INDIVIDUO
Textual: Cada observaci??n individual de temperatura registrada en el volc??n Antisana 
en un instante espec??fico de tiempo.

Simb??lico:
  xi donde i=1,2,3,........366")
## 
## 
##                                   INDIVIDUO
## Textual: Cada observaci??n individual de temperatura registrada en el volc??n Antisana 
## en un instante espec??fico de tiempo.
## 
## Simb??lico:
##   xi donde i=1,2,3,........366
cat("
                                POBLACI??N
Textual:
  Conjunto de todos los registros de temperatura medidos en el volc??n Antisana 
    durante el per??odo de estudio considerado.                                           
simbolico    
  U={x???x???RegistrosMeteorologicos???Variable(x)=Temperatura???Ubicacion(x)=Antisana}")
## 
##                                 POBLACI??N
## Textual:
##   Conjunto de todos los registros de temperatura medidos en el volc??n Antisana 
##     durante el per??odo de estudio considerado.                                           
## simbolico    
##   U={x???x???RegistrosMeteorologicos???Variable(x)=Temperatura???Ubicacion(x)=Antisana}
cat(" 
                                  MUESTRA
Textual:
  Subconjunto  y representativo de la poblaci??n de registros de 
temperatura seleccionados para realizar el an??lisis estad??stico. 
M={x???x???RegistrosTemperatura???Ubicacion(x)=Antisana???Periodo(x)???PeriodoEstudio???x???Seleccion}")
##  
##                                   MUESTRA
## Textual:
##   Subconjunto  y representativo de la poblaci??n de registros de 
## temperatura seleccionados para realizar el an??lisis estad??stico. 
## M={x???x???RegistrosTemperatura???Ubicacion(x)=Antisana???Periodo(x)???PeriodoEstudio???x???Seleccion}
#===================VARIABLE ORDINAL - MESES=========================
library(readr)
library(nortest)
library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
setwd("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA")
datos <- read.csv("DATASET ANTISANA.csv", header = TRUE, sep = ",", dec = ".")

# VARIABLE: MES (Transformaci??n de Date a Ordinal)
datos$Date <- as.Date(datos$Date, format = "%d/%m/%Y")
datos$Mes <- month(datos$Date, label = TRUE, abbr = FALSE)

niveles_meses <- c("enero", "febrero", "marzo", "abril", "mayo", "junio", 
                   "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre")

# Creamos el factor ordenado
g_meses <- factor(datos$Mes, levels = niveles_meses, ordered = TRUE)

TDFmes <- table(g_meses)
Tablames <- as.data.frame(TDFmes)

# Nombres de columnas
names(Tablames) <- c("MES", "ni") 
Tablames$hi_porcentaje <- (Tablames$ni / sum(Tablames$ni)) * 100

# A??ADIMOS EL NUMERO DE FILA (N)
Tablames <- cbind(N = 1:nrow(Tablames), Tablames)

# A??ADIMOS LA FILA TOTAL
TDFmesFinal <- rbind(
  Tablames,
  data.frame(N = NA, MES = "TOTAL", ni = sum(Tablames$ni), 
             hi_porcentaje = 100)
)

TDFmesFinal$hi_porcentaje <- round(TDFmesFinal$hi_porcentaje, 2)
print(TDFmesFinal)
##     N        MES  ni hi_porcentaje
## 1   1      enero  31          8.47
## 2   2    febrero  29          7.92
## 3   3      marzo  31          8.47
## 4   4      abril  30          8.20
## 5   5       mayo  31          8.47
## 6   6      junio  30          8.20
## 7   7      julio  31          8.47
## 8   8     agosto  31          8.47
## 9   9 septiembre  30          8.20
## 10 10    octubre  31          8.47
## 11 11  noviembre  30          8.20
## 12 12  diciembre  31          8.47
## 13 NA      TOTAL 366        100.00
#---TDF---
tabla_gt_resultado <- gt(TDFmesFinal) %>%
  tab_header(
    title = "DistribuciOn de Registros Mensuales - Proyecto Antisana",
  ) %>%
  cols_label(
    N = "Nro.",                
    MES = "Mes",  
    ni = "ni", 
    hi_porcentaje = "hi (%)"
  ) %>%
  sub_missing(columns = N, missing_text = "") %>% 
  tab_style(
    style = list(cell_fill(color = "gray90"), cell_text(weight = "bold")),
    locations = cells_body(rows = MES == "TOTAL")
  ) %>%
  tab_options(table.width = pct(95))

tabla_gt_resultado
DistribuciOn de Registros Mensuales - Proyecto Antisana
Nro. Mes ni hi (%)
1 enero 31 8.47
2 febrero 29 7.92
3 marzo 31 8.47
4 abril 30 8.20
5 mayo 31 8.47
6 junio 30 8.20
7 julio 31 8.47
8 agosto 31 8.47
9 septiembre 30 8.20
10 octubre 31 8.47
11 noviembre 30 8.20
12 diciembre 31 8.47

TOTAL 366 100.00
#-----DFA---
par(mfrow = c(1, 1)) # Asegura gr??ficos individuales
par(mar = c(8, 4, 4, 2) + 0.1) 
barplot(TDFmes,
        main = "Distribuci??n de Meses (ni Local)",
        xlab = "MES", ylab = "CANTIDAD", col = "grey30",
        las = 2, cex.names = 0.8)

#-----DFAG---
par(mar = c(8, 4, 4, 2) + 0.1) 
barplot(TDFmes,
        main = "Distribuci??n de Meses (ni Global)",
        xlab = "MES", ylab = "CANTIDAD", col = "grey40",
        las = 2, ylim = c(0, sum(Tablames$ni)), cex.names = 0.8)

#---DFRL---
par(mar = c(8, 4, 4, 2) + 0.1) 
barplot(TDFmesFinal$hi_porcentaje[TDFmesFinal$MES != "TOTAL"],
        main = "Distribuci??n de Meses (hi Local)",
        xlab = "MES", ylab = "PORCENTAJE", col = "grey50",
        las = 2, cex.names = 0.8,
        names.arg = TDFmesFinal$MES[TDFmesFinal$MES != "TOTAL"])

#----DFRG---
par(mar = c(8, 4, 4, 2) + 0.1) 
barplot(TDFmesFinal$hi_porcentaje[TDFmesFinal$MES != "TOTAL"],
        main = "Distribuci??n de Meses (hi Global)",
        xlab = "MES", ylab = "PORCENTAJE", col = "grey60",
        las = 2, cex.names = 0.8, ylim = c(0, 100),
        names.arg = TDFmesFinal$MES[TDFmesFinal$MES != "TOTAL"])

#---DC---
par(mar = c(2, 2, 2, 8), xpd = TRUE)
etiqueta <- paste(TDFmesFinal$hi_porcentaje[TDFmesFinal$MES != "TOTAL"], "%")
colores <- terrain.colors(12) # 12 colores para los 12 meses

pie(TDFmesFinal$hi_porcentaje[TDFmesFinal$MES != "TOTAL"],
    main = "Distribuci??n Porcentual Mensual",
    radius = 0.8,
    col = colores,
    labels = etiqueta,
    cex = 0.8)

legend("topright",
       inset = c(-0.2, 0),
       legend = TDFmesFinal$MES[TDFmesFinal$MES != "TOTAL"],
       title = "Meses",
       fill = colores,
       cex = 0.7,
       bty = "n")

#---INDICADORES ESTADISTICOS---
moda_mes <- names(TDFmes)[which.max(TDFmes)]
print(paste("Conclusi??n: La variable Mes tiene como moda:", moda_mes))

#---- MEDIANA---
g_mesesORD <- sort(g_meses)
mediana_mes <- g_mesesORD[ceiling(length(g_mesesORD)/2)]
print(paste("Conclusi??n: La mediana de los registros se ubica en el mes:", mediana_mes))

#==================VARIABLE CONTINUA - 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")
print(tabla_frecuencias)

# 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)")

#==================VARIABLE CONTINUA - TEMPERATURA MINIMA=================
# 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")
print(tabla_frecuencias_min)

# 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)")



#==================VARIABLE CONTINUA - PRECIPITACION=================
# 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")
print(tabla_frecuencias_prec)

# 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)")



#==================VARIABLE CONTINUA - 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")
print(tabla_frecuencias_viento)

# 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)")



#==================VARIABLE CONTINUA - 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")
print(tabla_frecuencias_hum)

# 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)")



#==================VARIABLE CONTINUA - RADIACION 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")
print(tabla_frecuencias_sol)

# 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. Preparacion 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. Configuracion de graficas 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 Maxima (C)", ylab = "Densidad",
                        main = "Grafica No 1: Distribucion de Temperatura Maxima",
                        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("Distribucion Observada", "Modelo Normal"),
       col = c("lightblue", "red"), lwd = 2, cex = 0.5)

# 3. Calculos 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. Estadisticos: 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.80, "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. Impresion de Resultados
cat("\n--- RESULTADOS ESTADISTICOS (AGRUPACION OPTIMIZADA) ---\n")
print(tabla_veredicto, row.names = FALSE)

# Probabilidad final
limite <- 25
prob_menor_25 <- pnorm(limite, mean = media_temp, sd = sd_temp) * 100
cat("\nProbabilidad P(X < 25C):", round(prob_menor_25, 2), "%\n")


#=================TEMPERATURA MINIMA========================
library(ggplot2)
# 1. Preparacion de datos (Temperatura Minima)
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. Configuracion de graficas 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 Minima (C)", ylab = "Densidad",
                 main = "Grafica No 2: Distribucion de Temperatura Minima",
                 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("Distribucion Observada", "Modelo Normal"),
       col = c("lightgreen", "darkred"), lwd = 2, cex = 0.5)

# 3. Calculos 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. Estadisticos: 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 (Minima)
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. Impresion de Resultados
cat("\n--- RESULTADOS ESTADISTICOS: TEMPERATURA MINIMA ---\n")
print(tabla_veredicto_min, row.names = FALSE)

# Ejemplo de probabilidad para la Minima (Prob. de helada: T < 0C)
prob_helada <- pnorm(0, mean = media_min, sd = sd_min) * 100
cat("\nProbabilidad de Helada P(X < 0C):", round(prob_helada, 2), "%\n")



#=======================PRECIPITACION=======================

library(ggplot2)

# 1. Preparacion 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. Configuracion de graficas 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 = "Precipitacion (mm)", ylab = "Densidad",
                        main = "Grafica No 3: Distribucion Exponencial de Precipitacion")

# Parametro 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. Calculos de Frecuencias (USANDO PEXP)
FO_p <- histograma_prep$counts
FE_p <- sapply(1:length(FO_p), function(i) {
  # Probabilidad usando la distribucion 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. Estadisticos 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 parametro (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.80, "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.80", paste("X2 <", Vc_p)),
  Resultado = c(estado_pearson_p, estado_chi_p)
)

# 6. Impresion de Resultados
cat("\n--- RESULTADOS ESTADISTICOS: PRECIPITACION (MODELO EXPONENCIAL) ---\n")
print(tabla_veredicto_prep, row.names = FALSE)

# 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")


#=======================VIENTO=====================

library(ggplot2)

# 1. Preparacion de datos (Variable: Wind)
# Forzamos la conversion a numerico y limpiamos posibles errores de formato
viento_raw <- as.numeric(gsub(",", ".", as.character(Antisana$Wind)))
Viento_Valid <- viento_raw[!is.na(viento_raw)] 

# 2. Configuracion de graficas 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 = "Grafica No 4: Distribucion Normal de Velocidad del Viento")

# Calculamos media y desviacion estandar
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. Calculos de Frecuencias (Basado en tu metodologia 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. Estadisticos: 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. Impresion de Resultados
cat("\n--- RESULTADOS ESTADISTICOS: VIENTO (MODELO NORMAL) ---\n")
print(tabla_veredicto_viento, row.names = FALSE)

# Calculo 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")


#==================== HUMEDAD RELATIVA=================
library(ggplot2)
# 1. 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)

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. Linea de referencia
abline(v = 80, col = "red", lwd = 2, lty = 2)



#_________PARTE A: HUMEDAD RELATIVA (TRAMO 1) - MODELO UNIFORME_________

# 1. Limpieza y deteccion de escala
# Usamos la columna 'Relative Humidity'
hum_col <- as.numeric(gsub(",", ".", as.character(Antisana$`Relative Humidity`)))
hum_col <- hum_col[!is.na(hum_col)]

# Si el maximo es menor o igual a 1, los datos estan 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]

# Verificacion de seguridad
if(length(tramo1) < 2) {
  stop("No hay suficientes datos en el rango 60-80. Verifica los valores de tu columna.")
}

# 3. Grafica 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 = "Grafica No 5.1: Tramo Uniforme (60% - 80%)")

# Modelo Uniforme: Densidad = 1 / (maximo - minimo)
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. Estadisticos Chi-Cuadrado (Confianza 0.999)
FO1 <- hist_h1$counts
FE1 <- rep(mean(FO1), length(FO1))

r1 <- cor(FO1, FE1)
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)


#_________PARTE B: HUMEDAD RELATIVA (TRAMO 2) - MODELO SATURACION_________

library(ggplot2)

# 1. Preparacion 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 = "Grafica No 5.2: Tramo Saturado (Curva de Potencia)")

# 3. CREACION DE LA CURVA (Modelo de Saturacion)
x_curva <- seq(80, 100, length.out = 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 Saturacion"),
       col = c("darkseagreen2", "darkgreen"), lwd = 3, bty = "n")

# 4. Estadisticicos de Validacion
FO2 <- hist_h2$counts
FE2 <- seq(min(FO2), max(FO2), length.out = length(FO2))^1.5 
FE2 <- FE2 * (sum(FO2) / sum(FE2)) 

r2 <- cor(FO2, FE2)
x2_2 <- round(sum((FO2 - FE2)^2 / FE2), 2)
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 SATURACION ---\n")
print(tabla_p2, row.names = FALSE)


#===================RADIACION SOLAR==============
library(ggplot2)

Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv", 
                       delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)

# 1. Preparacion de datos
solar_raw <- as.numeric(gsub(",", ".", as.character(Antisana$`Solar`)))
Solar_Valid <- solar_raw[!is.na(solar_raw) & solar_raw > 0.1]

# 2. Configuracion de la Grafica
par(mar = c(5, 5, 4, 2))
hist_solar <- hist(Solar_Valid, freq = FALSE, breaks = 15, col = "orange1",
                   xlab = "Radiacion Solar (W/m2)", ylab = "Densidad",
                   main = "Grafica No 6: Distribucion Lognormal de Radiacion Solar")

# 3. Estimacion de parametros 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("Radiacion Obs.", "Modelo Lognormal"),
       col = c("orange1", "red3"), lwd = 3, bty = "n", cex = 0.7)

# 4. Prueba Chi-Cuadrado
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. Estadisticos
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 ESTADISTICOS: RADIACION SOLAR ---\n")
print(tabla_solar, row.names = FALSE)



#============++++++++REGRESIONES++++++++===============

#---------REGRESION LINEAL SIMPLE: SOLAR y TEMPERATURA--------

library(dplyr)
library(ggplot2)
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv", 
                       delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)

#DIAGRAMA DE DISPERSION Y CREACION DE TPV
x <- as.numeric(gsub(",", ".", as.character(Antisana$Solar)))
y <- as.numeric(gsub(",", ".", as.character(Antisana$`Max Temperature`)))

# Creamos el data frame TPV 
TPV <- data.frame(x, y)
TPV <- na.omit(TPV[TPV$x > 0.1, ]) # Solo valores diurnos para x
x <- TPV$x
y <- TPV$y

#GRAFICA 
plot(x, y, 
     main = "Grafica Nro.1: Diagrama de dispersion",
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Temperatura (C)", 
     pch = 16, col = "gray70")

#CONJETURA
# En base a la tendencia de los puntos en el grafico, conjeturamos un modelo de tipo Lineal.

#REGRESION LINEAL Y PARAMETROS (Calculo del modelo)
regresion_lineal <- lm(y ~ x)

# Parametros: a (pendiente) y b (intercepto)
# Nota: En R coef[2] es la pendiente y coef[1] es el intercepto
a_pendiente <- coef(regresion_lineal)[2]
b_intercepto <- coef(regresion_lineal)[1]

#DIBUJO CON RECTA
plot(x, y, col = "lightblue", pch = 16,
     main = "Modelo de Regresion Lineal",
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Temperatura (C)")
abline(regresion_lineal, col = "red", lwd = 2)

#TEST DE PEARSON
r <- cor(x, y)
cat("Coeficiente de correlacion (r):", round(r, 4), "\n")

#COEFICIENTE DE DETERMINACION
r2 <- r^2 * 100
cat("Coeficiente de determinacion (r2):", round(r2, 2), "%\n")

#CALCULO DE ESTIMACIONES
# Ejemplo de estimacion usando la formula Y = (x * a) + b
# Si x = 800 W/m2
valor_x_prueba <- 800
Tmaxesp <- (valor_x_prueba * a_pendiente) + b_intercepto
cat("Estimacion: Para x =", valor_x_prueba, "la Tmax esperada es:", round(Tmaxesp, 2), "C\n")

#ANALISIS DE RESTRICCIONES
# a) Dominio de x: Radiacion Solar (R+ unido al cero)
dom_x_min <- min(x)
dom_x_max <- max(x)

# b) Dominio de y: Temperatura (Reales R)
dom_y_min <- min(y)
dom_y_max <- max(y)

# c) Verificacion de restriccion
# ??Existe un valor de x que genere un y fuera de los limites observados?
# Probamos con el x maximo:
y_pred_max <- (dom_x_max * a_pendiente) + b_intercepto
existe_restriccion <- ifelse(y_pred_max > 45 | y_pred_max < -15, "SI", "NO")

cat("\n--- ANALISIS DE DOMINIOS Y RESTRICCIONES ---\n")
cat("Dominio observado x: [", round(dom_x_min, 2), ",", round(dom_x_max, 2), "]\n")
cat("Dominio observado y: [", round(dom_y_min, 2), ",", round(dom_y_max, 2), "]\n")
cat("??Existe restriccion fisica en el modelo?:", existe_restriccion, "\n")


#TABLA FINAL DE RESULTADOS

# 1. Creacion de la tabla eliminando los limites del dominio X
tabla_final_regresion <- data.frame(
  Indicador = c(
    "Coeficiente de Correlacion (r)",
    "Coeficiente de Determinacion (R2)",
    "Pendiente (a)",
    "Intercepto (b)",
    "Restriccion de Modelo"
  ),
  Valor = c(
    round(r, 4),
    paste0(round(r2, 2), "%"),
    round(a_pendiente, 6),
    round(b_intercepto, 4),
    existe_restriccion
  )
)

#Impresion de la tabla organizada
library(knitr)
kable(tabla_final_regresion, format = "markdown", align = "lc")

#conclusion
cat("\nConclusion: Entre la radiacion solar y la temperatura maxima del volcan Antisana existe una 
    relacion de forma lineal, donde el modelo matematico es y=0.31x+11.22 siendo x la radiacion
    solar en J/m^2 y la temperatura maxima en grados centigrados y podemos decir que no existe
    restriccion y la temperatura maxima se ve influenciado en 82.57% por radiacion solar y el 17.43%
    se debe a otros factores.")



#---------REGRESION POTENCIAL: PRECIPITACION y HUMEDAD RELATIVA--------

library(readr)
library(dplyr)

# 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)

# 1. SELECCION DE VARIABLES
# Filtramos valores mayores a 0 para poder aplicar logaritmos
datos_filtrados <- Antisana %>% 
  filter(Precipitation > 0, `Relative Humidity` > 0)

x <- datos_filtrados$Precipitation
y <- datos_filtrados$`Relative Humidity`

# 2. GRAFICO Nro. 1
plot(x, y, 
     main = "Grafica Nro. 1: Distribucion de Humedad y Precipitacion", 
     xlab = "Precipitacion", 
     ylab = "Humedad relativa", 
     pch = 16, col = "gray")

# TRANSFORMACION Y MODELO
x1 <- log(x)
y1 <- log(y)

regresionpotencial <- lm(y1 ~ x1)
summary(regresionpotencial)

# PARAMETROS
beta0 <- coef(regresionpotencial)[1]
beta1 <- coef(regresionpotencial)[2]
b <- beta1
a <- exp(beta0)

# GRAFICO Nro. 2
plot(x, y, 
     main = "Grafica Nro. 2: Curva de Regresion Potencial", 
     xlab = "Precipitacion", 
     ylab = "Humedad relativa", 
     pch = 16, col = "blue")
curve(a * x^b, add = TRUE, col = "red", lwd = 2)

# 3. TEST DE PEARSON
r <- cor(x1, y1)
cat("Coeficiente de correlacion (r):", r, "\n")

# 4. CONCLUSIONES Y RESTRICCIONES
cat("\n--- ANALISIS DE RESTRICCIONES ---\n")

# Definicion de dominios segun tu esquema
# Dominio x: (todos los R^+ unidos al cero)
# Dominio y: (los R^+ entre 0 y 1)

# Calculo de x cuando y = 1
log_x_limite <- (log(1) - log(a)) / b
valor_x_critico <- exp(log_x_limite)

cat("Dominio de x: [0, +inf)\n")
cat("Dominio de y: [0, 1]\n")
cat("Punto critico (y=1) ocurre en x =", valor_x_critico, "\n")

# Verificacion de restriccion
# ??Existe algun valor del dominio de x que genere un y fuera de su dominio?
# Evaluamos con el valor maximo de x observado
y_max_predicho <- a * max(x)^b

if (y_max_predicho > 1) {
  cat("Respuesta: SI existe restriccion. El modelo predice valores de humedad mayores a 1.\n")
} else {
  cat("Respuesta: NO existe restriccion. El modelo funciona perfectamente.\n")
}

# Ecuacion final para la conclusion
cat("\nModelo matematico: y =", round(a, 4), "*(x ^", round(b, 4), ")\n")
# Definici??n de variables faltantes para la conclusi??n
texto_restriccion <- "existe restricci??n f??sica en el modelo (la humedad no puede superar el 100%)"
r2_porcentaje <- round(r^2 * 100, 2)
otros_factores <- round((1 - r^2) * 100, 2)
cat("Conclusion: Entre la precipitacion y la humedad relativa del volcan Antisana existe una 
    relacion de forma potencial, donde el modelo matematico es y =", round(a, 4), "*(x^", round(b, 4), ") 
    siendo x la precipitacion en mm y la humedad relativa en proporcion (0-1) y podemos decir que", 
    texto_restriccion, "y la humedad relativa se ve influenciada en", r2_porcentaje, "% por la 
    precipitacion y el", otros_factores, "% se debe a otros factores.")



#===========REGRESION EXPONENCIAL: SOLAR Y PRECIPITACION===========

# 1. SELECCION Y CARGA DE VARIABLES
# Solo filtramos y > 0 porque ln(y) es lo que se calcula. x (Solar) puede ser 0.

Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv", 
                       delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)

datos_filtrados <- Antisana %>% 
  filter(Precipitation > 0) 

x <- datos_filtrados$Solar
y <- datos_filtrados$Precipitation

# 2. GRAFICO Nro. 1
plot(x, y, 
     main = "Grafica Nro. 1: Distribucion de Precipitacion y Radiacion Solar", 
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Precipitacion (mm)", 
     pch = 16, col = "gray")

# TRANSFORMACION Y MODELO
y1 <- log(y) # Solo transformamos la Y

regresionexponencial <- lm(y1 ~ x)
summary(regresionexponencial)

# PARAMETROS
beta0 <- coef(regresionexponencial)[1]
beta1 <- coef(regresionexponencial)[2]
b <- beta1
a <- exp(beta0)

# GRAFICO Nro. 2
plot(x, y, 
     main = "Grafica Nro. 2: Curva de Regresion Exponencial", 
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Precipitacion (mm)", 
     pch = 16, col = "orange")
# Dibujamos la curva
curve(a * exp(b * x), add = TRUE, col = "red", lwd = 2, from = 0)

# 3. TEST DE PEARSON
r <- cor(x, y1)

cat("Valor de a (intercepto):", a, "\n")
cat("Valor de b (pendiente):", b, "\n")

# TABLA SIMPLE DE RESULTADOS CALCULADOS
tabla_resultados <- data.frame(
  Indicador = c("Intercepto (a)", 
                "Exponente (b)", 
                "Correlacion (r)", 
                "Determinacion (R2 %)", 
                "Otros factores (%)",
                "Valor critico x (para y=100)"),
  Valor = c(round(a, 4), 
            round(b, 4), 
            round(r, 4), 
            paste0(round(r^2 * 100, 2), "%"), 
            paste0(round((1 - r^2) * 100, 2), "%"),
            round(log(100/a)/b, 2))
)

print(tabla_resultados)


#================ REGRESION LOGARITMICA: SOLAR Y PRECIPITACION==========

library(readr)
library(dplyr)

# 1. CARGA Y FILTRADO
# Importante: Filtramos x > 0 porque aplicaremos logaritmo a la radiacion solar
datos_filtrados <- Antisana %>% 
  filter(Solar > 0)

x <- datos_filtrados$Solar
y <- datos_filtrados$Precipitation

# 2. GRAFICO Nro. 1: Dispersion Original
plot(x, y, 
     main = "Grafica Nro. 1: Distribucion Logaritmica (Solar vs Precip)", 
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Precipitacion (mm)", 
     pch = 16, col = "gray")

# 3. TRANSFORMACION Y MODELO LOGARITMICO
x1 <- log(x) # Transformamos la X

regresionlogaritmica <- lm(y ~ x1)
summary(regresionlogaritmica)

# PARAMETROS (a y b)
# En el modelo logaritmico y = a + b * ln(x)
# No hace falta usar exp() para los coeficientes
a <- coef(regresionlogaritmica)[1] # Intercepto
b <- coef(regresionlogaritmica)[2] # Pendiente

# 4. GRAFICO Nro. 2: Curva Logaritmica
plot(x, y, 
     main = "Grafica Nro. 2: Regresion Logaritmica", 
     xlab = "Radiacion Solar (W/m2)", 
     ylab = "Precipitacion (mm)", 
     pch = 16, col = "darkgreen")

# Dibujamos la curva: a + b * log(x)
curve(a + b * log(x), add = TRUE, col = "red", lwd = 2, from = min(x))

# 5. TEST DE PEARSON
# La correlacion se mide entre la x transformada (x1) y la y normal
r <- cor(x1, y)

# 6. ESTIMACIONES (Ejemplo)
# ??Cuanta lluvia habra si la radiacion solar es de 50 W/m2?
valor_solar_estimar <- 50
estimacion_y <- a + b * log(valor_solar_estimar)

# TABLA DE RESULTADOS
tabla_logaritmica <- data.frame(
  Indicador = c("Intercepto (a)", 
                "Pendiente (b)", 
                "Correlacion (r)", 
                "Determinacion (R2 %)", 
                "Otros factores (%)",
                "Estimacion (x=50)"),
  Valor = c(round(a, 4), 
            round(b, 4), 
            round(r, 4), 
            paste0(round(r^2 * 100, 2), "%"), 
            paste0(round((1 - r^2) * 100, 2), "%"),
            round(estimacion_y, 2))
)

print(tabla_logaritmica)

#conclusion: 

#========== REGRESION POLINOMICA: TEMPERATURA MINIMA Y VIENTO=============


library(readr)
library(dplyr)

# 1. SELECCION Y CARGA DE VARIABLES
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv", 
                       delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)

x <- Antisana$`Min Temperature`
y <- Antisana$Wind

# 2. GRAFICO Nro. 1: Dispersion
plot(x, y, 
     main = "Grafica Nro. 1: Distribucion entre Temperatura minima y Viento", 
     xlab = "Temperatura Minima (C)", 
     ylab = "Velocidad del Viento (m/s)", 
     pch = 16, col = "gray")

# 3. CREACION DE POTENCIAS Y MODELO
x2 <- x^2
x3 <- x^3
x4 <- x^4

# Modelo polinomico de cuarto grado: y = b0 + b1x + b2x^2 + b3x^3 + b4x^4
regresionpolinomica <- lm(y ~ x + x2 + x3 + x4)
summary(regresionpolinomica)

# PARAMETROS 
beta <- coef(regresionpolinomica)
a <- beta[1] # Intercepto
b <- beta[2]
c <- beta[3]
d <- beta[4]
e <- beta[5]

# 4. GRAFICO Nro. 2: Curva Polinomica
plot(x, y, 
     main = "Grafica Nro. 2: Regresion entre Temperatura minima y Viento", 
     xlab = "Temperatura Minima (C)", 
     ylab = "Velocidad del Viento (m/s)", 
     pch = 16, col = "purple")

# Dibujamos la curva usando la ecuacion completa
curve(a + b*x + c*x^2 + d*x^3 + e*x^4, add = TRUE, col = "red", lwd = 2)

# 5. TEST DE PEARSON

r2 <- summary(regresionpolinomica)$r.squared
r <- sqrt(r2) 

# TABLA DE RESULTADOS
tabla_polinomica <- data.frame(
  Coeficiente = c("a (Intercepto)", "b (x)", "c (x^2)", "d (x^3)", "e (x^4)"),
  Valor = c(round(a, 4), round(b, 4), round(c, 4), round(d, 4), round(e, 4))
)
print(tabla_polinomica)

cat("\nCorrelacion (r):", round(r, 4))
cat("\nPorcentaje de influencia (R2):", round(r2 * 100, 2), "%")

#conclusion: la velocidad del viento se ve influenciada en un 32.35%  por la temperatura minima


#===== REGRESION MULTIMPLE: TEMPERATURA MAXIMA, HUMEDAD RELATIVA, SOLAR====

# 1. CARGA DE LIBRER??AS Y DATOS
library(scatterplot3d)
library(dplyr)
Antisana <- read_delim("C:/Users/HP/Documents/MINI PROYECTO_ANTISANA/DATASET ANTISANA.csv", 
                       delim = ",", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# SELECCI??N DE VARIABLES
y <- Antisana$`Max Temperature`
x1 <- Antisana$`Relative Humidity`
x2 <- Antisana$Solar

# 2. MODELO DE REGRESI??N M??LTIPLE
# Ecuaci??n: y = beta0 + beta1*x1 + beta2*x2
regresionmultiple <- lm(y ~ x1 + x2)
summary(regresionmultiple)

# 3. EXTRACCI??N DE PAR??METROS
beta0 <- coef(regresionmultiple)[1] # Intercepto
beta1 <- coef(regresionmultiple)[2] # Coeficiente Humedad
beta2 <- coef(regresionmultiple)[3] # Coeficiente Solar

# 4. GR??FICA DE DISPERSI??N 3D
grafica_3d <- scatterplot3d(x1, x2, y, 
                            main = "Regresi??n M??ltiple entre Temperatura Maxima, Humedad y Solar",
                            xlab = "Humedad Relativa (%)",
                            ylab = "Radiaci??n Solar (W/m2)",
                            zlab = "Temp M??xima (C)",
                            pch = 16, color = "steelblue",
                            angle = 225)
grafica_3d$plane3d(regresionmultiple, col = "red", lty = "dashed")

# 5. C??LCULO DE PEARSON Y DETERMINACI??N

r2_ajustado <- summary(regresionmultiple)$adj.r.squared
r_multiple <- sqrt(r2_ajustado)

# TABLA DE RESULTADOS (Tu tabla TPV)
tabla_TPV <- data.frame(
  Variable = c("Intercepto (B0)", "Humedad (B1)", "Solar (B2)"),
  Coeficiente = c(round(beta0, 4), round(beta1, 4), round(beta2, 4))
)
print(tabla_TPV)

cat("\nCorrelaci??n M??ltiple (r):", round(r_multiple, 4))
cat("\nInfluencia Combinada (R2):", round(r2_ajustado * 100, 2), "%")

#conclusion: la temperatura esta influenciada en un 84% por la combiancion de radiacion solar
# y humedad relativa que se debe a otros factores siendo de 18,83%


#==========+++++MACHINE LEARNING+++++=========
# Adjunto el link del Machine Learnining
cat("https://colab.research.google.com/drive/18Gt1W1gXBZGAKXQuVHgwX9QEuSDcs1to?usp=sharing#scrollTo=PiFPsGSHgvR3")