|
|
|
|
@ -0,0 +1,235 @@
|
|
|
|
|
# Análisis de Datos Fotovoltaicos - Ciencia de Datos
|
|
|
|
|
|
|
|
|
|
## Descripción del Proyecto
|
|
|
|
|
|
|
|
|
|
Proyecto de análisis exploratorio de datos (EDA) utilizando R para estudiar mediciones de producción de paneles solares fotovoltaicos. El dataset contiene mediciones tomadas cada 5 minutos durante 15 días, incluyendo variables ambientales y eléctricas.
|
|
|
|
|
|
|
|
|
|
##📁 Dataset: med.csv
|
|
|
|
|
|
|
|
|
|
Estructura de los datos
|
|
|
|
|
|
|
|
|
|
| Variable | Descripción | Unidades | Tipo |
|
|
|
|
|
|----------|-------------------------------------------|-----------------|-----------|
|
|
|
|
|
| luxes | Nivel de iluminación en el panel | Lux (lx) | Numérico |
|
|
|
|
|
| temp | Temperatura ambiente | °C | Entero |
|
|
|
|
|
| hum | Humedad relativa | %RH | Entero |
|
|
|
|
|
| curr | Corriente eléctrica producida | Amperios (A) | Numérico |
|
|
|
|
|
| volt | Voltaje eléctrico producido | Voltios (V) | Numérico |
|
|
|
|
|
| power | Potencia calculada (curr × volt) | Watts (W) | Numérico |
|
|
|
|
|
| dd | Día del mes | 1-31 | Entero |
|
|
|
|
|
| hh | Hora del día | 0-23 | Entero |
|
|
|
|
|
| mm | Minuto de la hora | 0-59 | Entero |
|
|
|
|
|
|
|
|
|
|
Características principales
|
|
|
|
|
|
|
|
|
|
- 4320 registros (15 días × 24 horas × 12 mediciones/hora)
|
|
|
|
|
- Mediciones cada 5 minutos
|
|
|
|
|
- 9 variables por registro
|
|
|
|
|
- Sin valores faltantes (dataset limpio)
|
|
|
|
|
## Reqsuititos
|
|
|
|
|
- Tener el lenguaje R intalado en tu computadora
|
|
|
|
|
- Tener unstalado el IDE R Studio, con que que vamos a ejecutar el scrip
|
|
|
|
|
- Tener instalados los paquetes de tidyverse y ggplot2 con el siguiente comando:
|
|
|
|
|
```r
|
|
|
|
|
install.packages("tidyverse")
|
|
|
|
|
install.packages("ggplot2")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Script de Análisis Completo
|
|
|
|
|
|
|
|
|
|
A continuación se presenta el código completo con explicaciones detalladas:
|
|
|
|
|
### Configuración inicial y carga de datos
|
|
|
|
|
```r
|
|
|
|
|
# 1. CARGAR LIBRERÍAS (solo las esenciales)
|
|
|
|
|
library(tidyverse) # Para manipulación de datos (dplyr, tidyr)
|
|
|
|
|
library(ggplot2) # Para creación de gráficos
|
|
|
|
|
```
|
|
|
|
|
- Carga las librerías necesarias para el análisis
|
|
|
|
|
- tidyverse: Conjunto de paquetes para ciencia de datos
|
|
|
|
|
- ggplot2: Sistema de gráficos avanzado
|
|
|
|
|
### Carga y exploración inicial
|
|
|
|
|
```r
|
|
|
|
|
# 2. LEER LOS DATOS
|
|
|
|
|
datos <- read.csv("med.csv") # Lee el archivo CSV
|
|
|
|
|
|
|
|
|
|
# 3. VISTAZO INICIAL
|
|
|
|
|
cat("=== INFORMACIÓN BÁSICA ===\n")
|
|
|
|
|
cat("Filas:", nrow(datos), "\n") # Cuenta número de filas
|
|
|
|
|
cat("Columnas:", ncol(datos), "\n\n") # Cuenta número de columnas
|
|
|
|
|
|
|
|
|
|
cat("Primeras 6 filas:\n")
|
|
|
|
|
print(head(datos)) # Muestra las primeras 6 filas
|
|
|
|
|
cat("\n")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Carga los datos desde el archivo med.csv
|
|
|
|
|
- Muestra información básica sobre el dataset
|
|
|
|
|
- Permite verificar que los datos se cargaron correctamente
|
|
|
|
|
|
|
|
|
|
### Análisis estadístico descriptivo
|
|
|
|
|
```r
|
|
|
|
|
# 4. ESTADÍSTICAS DESCRIPTIVAS
|
|
|
|
|
cat("=== ESTADÍSTICAS DESCRIPTIVAS ===\n")
|
|
|
|
|
print(summary(datos)) # Resumen estadístico de todas las variables
|
|
|
|
|
|
|
|
|
|
# 5. VALORES FALTANTES
|
|
|
|
|
cat("\n=== VALORES FALTANTES ===\n")
|
|
|
|
|
cat("Total NA:", sum(is.na(datos)), "\n") # Cuenta valores faltantes
|
|
|
|
|
```
|
|
|
|
|
- summary(): Calcula estadísticas básicas (mínimo, máximo, media, cuartiles)
|
|
|
|
|
- is.na(): Detecta valores faltantes en el dataset
|
|
|
|
|
- Proporciona un primer vistazo a la distribución de los datos
|
|
|
|
|
|
|
|
|
|
### Visualización de datos (Gráficos)
|
|
|
|
|
|
|
|
|
|
```r
|
|
|
|
|
# 6.1 Histograma de potencia - Distribución de valores
|
|
|
|
|
ggplot(datos, aes(x = power)) +
|
|
|
|
|
geom_histogram(bins = 30, fill = "blue", alpha = 0.7) +
|
|
|
|
|
labs(title = "Distribución de Potencia Generada",
|
|
|
|
|
x = "Potencia (W)", y = "Frecuencia") +
|
|
|
|
|
theme_minimal()
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
- Muestra cómo se distribuyen los valores de potencia
|
|
|
|
|
- Ayuda a identificar patrones y valores atípicos
|
|
|
|
|
- bins=30: Divide los datos en 30 intervalos
|
|
|
|
|
|
|
|
|
|
```r
|
|
|
|
|
# 6.2 Relación entre luz y potencia - Análisis de correlación
|
|
|
|
|
ggplot(datos, aes(x = luxes, y = power)) +
|
|
|
|
|
geom_point(alpha = 0.3, color = "darkgreen") + # Puntos semitransparentes
|
|
|
|
|
geom_smooth(method = "lm", color = "red") + # Línea de tendencia
|
|
|
|
|
labs(title = "Luxes vs Potencia",
|
|
|
|
|
x = "Iluminación (lux)", y = "Potencia (W)") +
|
|
|
|
|
theme_minimal()
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
- Analiza la relación entre iluminación y potencia
|
|
|
|
|
- geom_smooth(): Ajusta una línea de regresión lineal
|
|
|
|
|
- alpha=0.3: Hace los puntos semitransparentes para evitar sobreposición
|
|
|
|
|
|
|
|
|
|
```r
|
|
|
|
|
# 6.3 Potencia por hora del día - Análisis temporal
|
|
|
|
|
datos %>%
|
|
|
|
|
group_by(hh) %>% # Agrupa por hora
|
|
|
|
|
summarise(potencia_promedio = mean(power)) %>% # Calcula promedio por hora
|
|
|
|
|
ggplot(aes(x = factor(hh), y = potencia_promedio)) +
|
|
|
|
|
geom_col(fill = "orange") + # Gráfico de barras
|
|
|
|
|
labs(title = "Potencia Promedio por Hora",
|
|
|
|
|
x = "Hora del día", y = "Potencia promedio (W)") +
|
|
|
|
|
theme_minimal()
|
|
|
|
|
```
|
|
|
|
|
- group_by(hh): Agrupa los datos por hora (0-23)
|
|
|
|
|
- summarise(): Calcula el promedio de potencia para cada hora
|
|
|
|
|
- Muestra el patrón diario de producción
|
|
|
|
|
|
|
|
|
|
### Análisis de correlaciones
|
|
|
|
|
```r
|
|
|
|
|
# 7. CORRELACIONES BÁSICAS
|
|
|
|
|
cat("\n=== CORRELACIONES ===\n")
|
|
|
|
|
# Selecciona solo variables numéricas clave
|
|
|
|
|
correlaciones <- cor(datos[, c("luxes", "temp", "hum", "power")])
|
|
|
|
|
print(round(correlaciones, 3)) # Muestra con 3 decimales
|
|
|
|
|
```
|
|
|
|
|
- cor(): Calcula la matriz de correlación de Pearson
|
|
|
|
|
- Las correlaciones van de -1 a 1:
|
|
|
|
|
1: Correlación positiva perfecta
|
|
|
|
|
0: No hay correlación
|
|
|
|
|
-1: Correlación negativa perfecta
|
|
|
|
|
- round(..., 3): Redondea a 3 decimales para mejor legibilidad
|
|
|
|
|
|
|
|
|
|
### Análisis por día
|
|
|
|
|
```r
|
|
|
|
|
# 8. ANÁLISIS POR DÍA
|
|
|
|
|
cat("\n=== PRODUCCIÓN POR DÍA ===\n")
|
|
|
|
|
produccion_dia <- datos %>%
|
|
|
|
|
group_by(dd) %>% # Agrupa por día del mes
|
|
|
|
|
summarise(
|
|
|
|
|
potencia_total = sum(power), # Suma toda la potencia del día
|
|
|
|
|
potencia_promedio = mean(power), # Promedio de potencia
|
|
|
|
|
mediciones = n() # Cuenta número de mediciones
|
|
|
|
|
)
|
|
|
|
|
print(produccion_dia) # Muestra la tabla
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
- group_by(dd): Separa los datos por día (dd = día del mes)
|
|
|
|
|
- sum(power): Calcula la producción total diaria
|
|
|
|
|
- mean(power): Calcula la potencia promedio
|
|
|
|
|
- n(): Cuenta cuántas mediciones hay por día
|
|
|
|
|
### Modelado predictivo simple
|
|
|
|
|
```r
|
|
|
|
|
# 9. MODELO LINEAL SIMPLE
|
|
|
|
|
cat("\n=== MODELO LINEAL (Potencia ~ Luxes) ===\n")
|
|
|
|
|
modelo_simple <- lm(power ~ luxes, data = datos) # Ajusta modelo lineal
|
|
|
|
|
print(summary(modelo_simple)) # Muestra resultados del modelo
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
- lm(): Ajusta un modelo de regresión lineal
|
|
|
|
|
- power ~ luxes: Predice potencia en función de la iluminación
|
|
|
|
|
- summary(): Muestra coeficientes, R², estadísticas del modelo
|
|
|
|
|
- R²: Indica qué porcentaje de la variación en potencia es explicado por luxe
|
|
|
|
|
|
|
|
|
|
### Conclusiones y exportación
|
|
|
|
|
```r
|
|
|
|
|
# 10. RESUMEN FINAL
|
|
|
|
|
cat("\n=== HALLAZGOS PRINCIPALES ===\n")
|
|
|
|
|
cat("1. La potencia máxima observada es:", max(datos$power), "W\n")
|
|
|
|
|
cat("2. Horas de mayor producción: 11:00 - 15:00\n")
|
|
|
|
|
cat("3. Correlación luxes-power:", round(cor(datos$luxes, datos$power), 3), "\n")
|
|
|
|
|
cat("4. Temperatura promedio:", round(mean(datos$temp), 1), "°C\n")
|
|
|
|
|
cat("5. Humedad promedio:", round(mean(datos$hum), 1), "%\n")
|
|
|
|
|
|
|
|
|
|
# Guardar resultados si es necesario
|
|
|
|
|
write.csv(produccion_dia, "produccion_por_dia.csv", row.names = FALSE)
|
|
|
|
|
```
|
|
|
|
|
- Resumen de los hallazgos más importantes
|
|
|
|
|
- write.csv(): Guarda los resultados en un archivo CSV
|
|
|
|
|
- row.names=FALSE: Evita incluir números de fila en el CSV
|
|
|
|
|
|
|
|
|
|
## Ejecucion de scrip
|
|
|
|
|
|
|
|
|
|
1. Abrir RStudio
|
|
|
|
|
2. File → New File → R Script
|
|
|
|
|
3. Copiar y pegar todo el código
|
|
|
|
|
4. File → Save As → "analisis.R"
|
|
|
|
|
5. Session → Set Working Directory → To Source File Location
|
|
|
|
|
6. Ctrl + A (seleccionar todo) → Ctrl + Enter (ejecutar)
|
|
|
|
|
|
|
|
|
|
## Interpretación de Resultados
|
|
|
|
|
|
|
|
|
|
1. Correlación luxes-power = 0.951
|
|
|
|
|
|
|
|
|
|
Interpretación: Relación muy fuerte y positiva
|
|
|
|
|
Significado: Cuando aumenta la iluminación, la potencia aumenta proporcionalmente
|
|
|
|
|
Conclusión: La iluminación es el factor más importante para predecir producción
|
|
|
|
|
2. Patrón diario de producción
|
|
|
|
|
|
|
|
|
|
Noche (0:00-6:00): Producción cero (sin luz solar)
|
|
|
|
|
Mañana (6:00-11:00): Producción creciente
|
|
|
|
|
Mediodía (11:00-15:00): Producción máxima
|
|
|
|
|
Tarde (15:00-20:00): Producción decreciente
|
|
|
|
|
3. Eficiencia del panel
|
|
|
|
|
|
|
|
|
|
Voltaje constante: ~14.7V (sistema estable)
|
|
|
|
|
Corriente variable: Depende de la iluminación
|
|
|
|
|
Potencia máxima: 2.97W (capacidad del panel)
|
|
|
|
|
## Archivos Generados
|
|
|
|
|
|
|
|
|
|
Gráficos en pantalla:
|
|
|
|
|
- distribucion_potencia.png - Histograma de potencia
|
|
|
|
|
- luxes_vs_potencia.png - Dispersión con línea de tendencia
|
|
|
|
|
- potencia_por_hora.png - Barras de producción horaria
|
|
|
|
|
|
|
|
|
|
## Preguntas de Investigación Respondidas
|
|
|
|
|
|
|
|
|
|
1. ¿Qué factor ambiental afecta más la producción?
|
|
|
|
|
Respuesta: La iluminación (luxes), con correlación de 0.951
|
|
|
|
|
2. ¿Cuál es el patrón diario de producción?
|
|
|
|
|
Respuesta: Forma de campana con pico al mediodía
|
|
|
|
|
3. ¿Hay relación entre temperatura y producción?
|
|
|
|
|
Respuesta: Sí, moderada (r = 0.292)
|
|
|
|
|
4. ¿Cómo afecta la humedad?
|
|
|
|
|
Respuesta: Poco efecto (r = -0.155)
|
|
|
|
|
5. ¿Se puede predecir la potencia con la iluminación?
|
|
|
|
|
Respuesta: Sí, con R² alto (aprox. 0.90)
|