first commit

main
Israel Herrera Gonzalez 6 days ago
commit 36859da4b2

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

@ -0,0 +1,86 @@
# ===========================================
# ANÁLISIS BÁSICO - DATOS DE PANELES SOLARES
# ===========================================
# 1. CARGAR LIBRERÍAS (solo las esenciales)
library(tidyverse)
library(ggplot2)
# 2. LEER LOS DATOS
datos <- read.csv("/Users/sakura/Documents/Maestria/R/med.csv")
# 3. VISTAZO INICIAL
cat("=== INFORMACIÓN BÁSICA ===\n")
cat("Filas:", nrow(datos), "\n")
cat("Columnas:", ncol(datos), "\n\n")
cat("Primeras 6 filas:\n")
print(head(datos))
cat("\n")
# 4. ESTADÍSTICAS DESCRIPTIVAS
cat("=== ESTADÍSTICAS DESCRIPTIVAS ===\n")
print(summary(datos))
# 5. VALORES FALTANTES
cat("\n=== VALORES FALTANTES ===\n")
cat("Total NA:", sum(is.na(datos)), "\n")
# 6. GRÁFICOS ESENCIALES
# 6.1 Histograma de potencia
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()
# 6.2 Relación entre luz y potencia
ggplot(datos, aes(x = luxes, y = power)) +
geom_point(alpha = 0.3, color = "darkgreen") +
geom_smooth(method = "lm", color = "red") +
labs(title = "Luxes vs Potencia",
x = "Iluminación (lux)", y = "Potencia (W)") +
theme_minimal()
# 6.3 Potencia por hora del día
datos %>%
group_by(hh) %>%
summarise(potencia_promedio = mean(power)) %>%
ggplot(aes(x = factor(hh), y = potencia_promedio)) +
geom_col(fill = "orange") +
labs(title = "Potencia Promedio por Hora",
x = "Hora del día", y = "Potencia promedio (W)") +
theme_minimal()
# 7. CORRELACIONES BÁSICAS
cat("\n=== CORRELACIONES ===\n")
correlaciones <- cor(datos[, c("luxes", "temp", "hum", "power")])
print(round(correlaciones, 3))
# 8. ANÁLISIS POR DÍA
cat("\n=== PRODUCCIÓN POR DÍA ===\n")
produccion_dia <- datos %>%
group_by(dd) %>%
summarise(
potencia_total = sum(power),
potencia_promedio = mean(power),
mediciones = n()
)
print(produccion_dia)
# 9. MODELO LINEAL SIMPLE
cat("\n=== MODELO LINEAL (Potencia ~ Luxes) ===\n")
modelo_simple <- lm(power ~ luxes, data = datos)
print(summary(modelo_simple))
# 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)

4066
med.csv

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save