# Cerramos correctamente el bloque de configuración
setwd("C:/Users/ASUS/OneDrive/Escritorio/ESTADÍSTICA/EXPO/ACTIVIDADES")
library(knitr)
knitr::opts_chunk$set(echo = TRUE)
# --- BLOQUE DE CONFIGURACION MAESTRA ---
library(knitr)

# Este comando hace que TODAS las gráficas del documento
# tengan las letras un 20% más pequeñas automáticamente (cex = 0.8)
opts_chunk$set(echo = TRUE, dev = "png", dpi = 300, cex = 0.8)

# También configuramos los parámetros de R base para que sean más limpios
# cex.main: Título, cex.lab: Ejes, cex.axis: Números
options(OutDec = ",")

1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

Variable de Estudio: Tipo de Aptitud Solar (Solar_aptitude_class)

Se identifica la variable como Cualitativa Ordinal, categorizada en niveles jerárquicos: Baja (1), Media (2) y Alta (3). Debido a su naturaleza, se aplicó la siguiente estrategia de validación:

Procesamiento: Se extrajo la frecuencia de cada nivel y se implementó una asignación numérica para transformar los atributos en una escala de progresión energética, facilitando su análisis gráfico y tabular.

Modelado y Validación: Se conjeturó una Distribución Binomial \(B(2, p)\) para contrastar la realidad observada frente a la teórica. El modelo fue validado exitosamente mediante el Test de Pearson y la Prueba Chi-cuadrado (\(\chi^2\)), demostrando que la distribución de la aptitud solar es estadísticamente coherente y confiable para el diseño del proyecto.

2 CARGA DE DATOS

# 1. CARGA DE LIBRERÍAS (Silenciadas para el informe)
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(readxl))

# 2. CARGAR EL ARCHIVO
# Mantenemos tu ruta original
Datos <- read_excel(file.choose(), sheet = "Dataset_Mundial_Final")
# 3. VERIFICAR DATOS
str(Datos)
## tibble [58.978 × 29] (S3: tbl_df/tbl/data.frame)
##  $ OBJECTID              : num [1:58978] 2 3 4 5 6 7 8 9 10 11 ...
##  $ code                  : chr [1:58978] "00001-AFG-P" "00002-AFG-P" "00003-AFG-P" "00004-AFG-P" ...
##  $ plant_name            : chr [1:58978] "Badghis Solar Power Plant" "Balkh solar farm" "Behsood solar farm" "Dab Pal 4 solar farm" ...
##  $ country               : chr [1:58978] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ operational_status    : chr [1:58978] "cancelled - inferred 4 y" "cancelled - inferred 4 y" "cancelled - inferred 4 y" "shelved - inferred 2 y" ...
##  $ longitude             : num [1:58978] 62,9 67,1 70,4 66,2 65,7 ...
##  $ latitude              : num [1:58978] 35,1 36,7 34,4 33,8 31,7 ...
##  $ elevation             : num [1:58978] 918 359 629 2288 1060 ...
##  $ area                  : num [1:58978] 6,74 10,72 487,73 111,8 1929,96 ...
##  $ size                  : chr [1:58978] "Small" "Small" "Small" "Small" ...
##  $ slope                 : num [1:58978] 7,38 0,49 1,1 6,16 1,23 ...
##  $ slope_type            : chr [1:58978] "Moderado" "Plano o casi plano" "Plano o casi plano" "Moderado" ...
##  $ curvature             : num [1:58978] -0,024 0 0 0,045 -0,005 -0,005 -0,015 0 0 -0,009 ...
##  $ curvature_type        : chr [1:58978] "Superficies cóncavas / Valles" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies convexas / Crestas" ...
##  $ aspect                : num [1:58978] 96,8 358,5 36,2 305,8 248,4 ...
##  $ aspect_type           : chr [1:58978] "East" "North" "Northeast" "Northwest" ...
##  $ dist_to_road          : num [1:58978] 7037,1 92,7 112,1 1705,3 115,8 ...
##  $ ambient_temperature   : num [1:58978] 14,4 17,88 21,32 8,86 19,64 ...
##  $ ghi                   : num [1:58978] 5,82 5,58 5,8 6,75 6,62 ...
##  $ humidity              : num [1:58978] 47,7 42,3 36,4 37,3 24,2 ...
##  $ wind_speed            : num [1:58978] 0,039 0,954 0,234 0,943 0,37 ...
##  $ wind_direction        : num [1:58978] 187,5 207,4 255,6 160,3 97,7 ...
##  $ dt_wind               : chr [1:58978] "South" "Southwest" "West" "South" ...
##  $ solar_aptitude        : num [1:58978] 0,72 0,635 0,685 0,659 0,819 0,819 0,818 0,642 0,63 0,374 ...
##  $ solar_aptitude_rounded: num [1:58978] 7 6 7 7 8 8 8 6 6 4 ...
##  $ solar_aptittude_class : chr [1:58978] "Alta" "Alta" "Alta" "Alta" ...
##  $ capacity              : num [1:58978] 32 40 60 3000 100 100 36 50 25 100 ...
##  $ optimal_tilt          : num [1:58978] 30 31 31,1 33 31 ...
##  $ pv_potential          : num [1:58978] 4,61 4,41 4,57 5,42 5,17 ...

3 EXTRAER VARIABLE

Extraemos la variable solar_aptittude_class, omitimos las celdas en blanco y verificamos el tamaño muestral.

# 1. Extraemos la columna y definimos el orden lógico (Ordinal)
# Usamos el nombre exacto de tu variable: solar_aptittude_class
Solar_Vec <- factor(Datos$solar_aptittude_class, 
                    levels = c("Baja", "Media", "Alta"), 
                    ordered = TRUE)

# 2. Creamos el conteo (ni)
conteo <- table(Solar_Vec)

4 TABLA DE DISTRIBUCIÓN DE FRECUENCIA

Extraemos la variable solar_aptittude_class para obtener su frecuencia absoluta (ni) y calculamos el porcentaje (hi) sobre el total. Finalmente, añadimos una Asignación jerárquica y consolidamos todo en el data frame TDF_Solar con un diseño profesional y centrado.

# 1. CARGA DE LIBRERÍAS (Silenciadas)
suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(readxl)
})

# 2. PREPARACIÓN DE LA VARIABLE ORDINAL
# Extraemos y ordenamos la variable
solar_vec <- factor(Datos$solar_aptittude_class, 
                    levels = c("Baja", "Media", "Alta"), 
                    ordered = TRUE)

# 3. CONSTRUCCIÓN DE LA DATA (ni y hi)
conteo_raw <- table(solar_vec)
ni_val <- as.numeric(conteo_raw)
hi_val <- (ni_val / sum(ni_val)) * 100

df_solar_final <- data.frame(
  Asignacion = 1:3,
  Tipo = names(conteo_raw),
  ni = ni_val,
  hi = hi_val
)

# 4. GENERACIÓN DE LA TABLA GT (Diseño Adaptado)
df_solar_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DE LA APTITUD SOLAR**"),
  ) %>%
  cols_label(
    Asignacion = "Asignaci\u00f3n", 
    Tipo = "Tipo de Aptitud Solar", 
    ni = "ni", 
    hi = "hi (%)"
  ) %>%
  fmt_number(columns = hi, decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  # Estilo de encabezados (Gris claro y negrita)
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  # Opciones de espaciado para que no se vea "pegado"
  tab_options(
    table.width = pct(90),              # Ancho de la tabla al 90% para mejor visualización
    data_row.padding = px(12),           # Espacio vertical entre filas
    column_labels.padding = px(15),      # Espacio en los títulos
    table.border.top.style = "solid",
    table.border.top.color = "#2E4053",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "#2E4053"
  )
TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA APTITUD SOLAR
Asignación Tipo de Aptitud Solar ni hi (%)
1 Baja 1892 3.21
2 Media 12791 21.69
3 Alta 44295 75.10

5 ANÁLISIS GRÁFICO

5.1 DIAGRAMA DE BARRAS

# 1. Configuracion de margenes (ajustado para etiquetas horizontales)
par(mar = c(5, 4, 4, 2))

# 2. Creacion del grafico de barras usando tu dataframe: df_solar_final
barplot(df_solar_final$hi,
        main = "GRAFICO No 1: PORCENTAJE DE LA APTITUD SOLAR",
        ylab = "Porcentaje (%)",
        col = "#B0C4DE",      # Azul profesional
        names.arg = c("1", "2", "3"), 
        las = 1,              # 1 = Etiquetas siempre horizontales (Normales)
        cex.names = 1.0,      # Tamaño de los números "1, 2, 3"
        cex.axis = 0.8,       # Tamaño de los números del eje Y
        cex.main = 1.1,       # Tamaño del título principal
        ylim = c(0, max(df_solar_final$hi) + 10)) # Espacio extra arriba

# 3. Titulo del eje horizontal
mtext("Tipo de Aptitud Solar", side = 1, line = 3)

6 CONJETURA DEL MODELO

Se aplicó un modelo de Distribución Binomial \(B(2, p)\) para validar la consistencia de la Aptitud Solar. A diferencia de otros modelos, el Binomial se ajusta con precisión a variables ordinales de categorías fijas, permitiendo contrastar la realidad observada frente a una tendencia teórica. El alto grado de similitud entre las barras demuestra que el potencial solar sigue una distribución probabilística coherente, fortaleciendo la validez del análisis de campo.

# 1. PARÁMETROS DEL MODELO
n_total_Solar <- sum(df_solar_final$ni)
size_binom <- 2   # Representa los 2 saltos entre 3 categorías (0 a 2)
X_indices <- 0:2  # Mapeo: Bajo=0, Medio=1, Alto=2

# 2. CÁLCULO DE LA PROBABILIDAD DE ÉXITO (p)
# Calculamos la media real para que el modelo "copie" la forma de tus datos
media_obs <- sum(X_indices * df_solar_final$ni) / n_total_Solar
prob_p <- media_obs / size_binom

# 3. CÁLCULO DEL MODELO BINOMIAL (Lo esperado)
P_Binomial <- dbinom(X_indices, size = size_binom, prob = prob_p) * 100

# 4. GRÁFICA COMPARATIVA "PRIME"
par(mar = c(9, 4, 4, 2))
max_y <- max(max(df_solar_final$hi), max(P_Binomial))

# Dibujamos las barras juntas para comparar
barplot(rbind(df_solar_final$hi, P_Binomial), 
        beside = TRUE,
        main = "GR\u00c1FICO N\u00ba 2: Comparado de lo Observado frente a lo Esperado de la Aptitud Solar",
        ylab = "Porcentaje (%)",
        names.arg = c("1", "2", "2"), 
        col = c("#B0C4DE", "#AED6F1"), # Azul fuerte y Azul claro
        ylim = c(0, max_y + 25), 
        las = 1, 
        cex.names = 0.9,
        cex.main = 0.85)

# Leyenda bien posicionada para que no estorbe
legend("topright", 
       legend = c("Realidad", "Modelo"), 
       fill = c("#B0C4DE", "#AED6F1"), 
       bty = "n", cex = 0.8)

mtext("Nivel de Aptitud Solar", side = 1, line = 6)

6.1 TEST DE PEARSON

# 1. DEFINICIÓN DE VARIABLES PARA EL TEST
# Fo = Frecuencia Observada (hi de tu tabla)
# Fe = Frecuencia Esperada (P_Binomial que calculamos antes)
Fo_S <- df_solar_final$hi
Fe_S <- P_Binomial # Asegúrate de haber corrido el bloque anterior

# 2. CÁLCULO DEL TEST DE PEARSON
test_correlacion <- cor.test(Fo_S, Fe_S)
r_valor <- round(test_correlacion$estimate, 4) # El coeficiente 'r'

# 3. GRÁFICA DE CORRELACIÓN
par(mar = c(5, 5, 4, 2)) # Ajustamos márgenes estándar para scatterplot

plot(Fo_S, Fe_S, 
     main = "GR\u00c1FICO N\u00ba 4: CORRELACI\u00d3N DEL MODELO (OBSERVADO VS. ESPERADO)",
     cex.main = 0.85,
     xlab = "Frecuencia Observada (%)", 
     ylab = "Frecuencia Esperada (%)", 
     pch = 19,           # Punto sólido
     col = "#2E4053",    # Azul oscuro profesional
     cex = 1.5)          # Tamaño del punto

# Añadimos la línea de tendencia (Regresión lineal)
abline(lm(Fe_S ~ Fo_S), col = "red", lwd = 2)

# Añadimos el valor de R en la esquina para que se vea más técnico
text(x = min(Fo_S), y = max(Fe_S), 
     labels = paste("r =", r_valor), 
     pos = 4, font = 2, col = "#2E4053")

# 1. CÁLCULO DE LA CORRELACIÓN (Escala 0-100)
# Fo_S son tus datos reales (hi) y Fe_S es tu modelo (Binomial)
Correlacion_S <- cor(Fo_S, Fe_S) * 100

# 2. MOSTRAR EL RESULTADO
Correlacion_S
## [1] 99,8438

6.2 TEST DE CHI-CUADRADO

# 1. CÁLCULO DEL ESTADÍSTICO CHI-CUADRADO (Calculado)
# Fo_S: Observado (hi) | Fe_S: Esperado (Binomial)
x2_S <- sum(((Fo_S - Fe_S)^2) / Fe_S)

# 2. GRADOS DE LIBERTAD
# k - 1 (donde k es el número de categorías: Bajo, Medio, Alto)
gl_S <- length(Fo_S) - 1

# 3. VALOR CRÍTICO (De la tabla Chi-cuadrado al 95% de confianza)
vc_S <- qchisq(0.95, gl_S)

# 4. RESULTADOS EN CONSOLA
cat("Estad\u00edstico Chi-cuadrado (Calculado):", round(x2_S, 4), "\n")
## Estadístico Chi-cuadrado (Calculado): 1,043
cat("Valor Cr\u00edtico (Tabla):", round(vc_S, 4), "\n")
## Valor Crítico (Tabla): 5,9915
cat("\u00bfSe acepta el modelo? (Calculado < Cr\u00edtico):", x2_S < vc_S, "\n")
## ¿Se acepta el modelo? (Calculado < Crítico): TRUE

7 TABLA RESUMEN DE BONDAD DEL AJUSTE

# 1. CREACIÓN DEL DATAFRAME RESUMEN
# Usamos ifelse para que el resultado diga "Aceptado" o "Rechazado" en lugar de TRUE/FALSE
tabla_resumen_S <- data.frame(
  Variable = "Aptitud Solar",
  Pearson = round(Correlacion_S, 2),
  Chi2    = round(x2_S, 4),
  Umbral  = round(vc_S, 2),
  Resultado = ifelse(x2_S < vc_S, "Modelo Aceptado", "Modelo Rechazado")
)

# 2. GENERACIÓN DE LA TABLA GT
tabla_resumen_S %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA N\u00ba 3: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD**")
  ) %>%
  cols_label(
    Variable = "Variable",       
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptaci\u00f3n",
    Resultado = "Resultado Final"
  ) %>%
  tab_source_note(
    source_note = "Autor: Grupo 1"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  # Estilo del Título (Azul Oscuro y Blanco)
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  # Estilo de Encabezados (Gris y Azul Oscuro)
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  # Opciones de diseño y bordes
  tab_options(
    table.width = pct(95),
    table.border.top.color = "#2E4053",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(10) # Un poco más de espacio para que no esté pegada
  )
TABLA Nº 3: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado Final
Aptitud Solar 99,84 1,043 5,99 Modelo Aceptado
Autor: Grupo 1

8 CÁLCULO DE PROBABILIDADES

  1. ¿Cuál es la probabilidad de que un punto del terreno seleccionado al azar presente una aptitud solar de nivel “Alta”?
# Probabilidad de aptitud "Alta"
prob_alta <- df_solar_final$hi[df_solar_final$Tipo == "Alta"]

# Mostramos el resultado
prob_alta
## [1] 75,10428

La probabilidad de que un punto seleccionado al azar presente una aptitud solar Alta es del 75.10428%. Este valor es fundamental para el proyecto, ya que confirma la proporción del terreno que posee las condiciones óptimas de radiación para maximizar la eficiencia de los paneles fotovoltaicos.

  1. ¿Cuál es la probabilidad de encontrar zonas con restricciones de radiación (Aptitud Baja)?
# Probabilidad de Aptitud Solar "Baja"
prob_baja <- df_solar_final$hi[df_solar_final$Tipo == "Baja"]

# Resultado
prob_baja
## [1] 3,207976

La probabilidad de encontrar puntos con Aptitud Baja es apenas del 3.207976%. Este valor es excelente para el proyecto, ya que confirma que el riesgo de seleccionar un terreno con baja eficiencia energética es mínimo, asegurando que la mayor parte del área es técnicamente aprovechable.

9 CONCLUSIÓN

El análisis modeló la Aptitud Solar mediante una distribución binomial, confirmando un predominio de zonas con alto potencial energético. Las pruebas de bondad de ajuste validaron la coherencia entre los datos observados y el modelo teórico, brindando un respaldo estadístico sólido para la zonificación técnica del proyecto.