|
|
4 days ago | |
|---|---|---|
| README.md | 4 days ago | |
| analisis_med.R | 4 days ago | |
| med.csv | 4 days ago | |
README.md
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:
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
# 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
# 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
# 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)
# 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
# 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
# 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
# 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
# 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
# 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
# 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
- Abrir RStudio
- File → New File → R Script
- Copiar y pegar todo el código
- File → Save As → "analisis.R"
- Session → Set Working Directory → To Source File Location
- Ctrl + A (seleccionar todo) → Ctrl + Enter (ejecutar)
Interpretación de Resultados
- 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
- 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
- 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
- ¿Qué factor ambiental afecta más la producción?
Respuesta: La iluminación (luxes), con correlación de 0.951
- ¿Cuál es el patrón diario de producción?
Respuesta: Forma de campana con pico al mediodía
- ¿Hay relación entre temperatura y producción?
Respuesta: Sí, moderada (r = 0.292)
- ¿Cómo afecta la humedad?
Respuesta: Poco efecto (r = -0.155)
- ¿Se puede predecir la potencia con la iluminación?
Respuesta: Sí, con R² alto (aprox. 0.90)