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