# cargando librerias y configurando phyton
library(reticulate)
## Warning: package 'reticulate' was built under R version 4.5.1
use_python("C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/KTxE2_xKA4FdAEopmHAdA/Scripts/python.exe",
           required = TRUE)
py_config()
## python:         C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/KTxE2_xKA4FdAEopmHAdA/Scripts/python.exe
## libpython:      C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/python/cpython-3.11.13-windows-x86_64-none/python311.dll
## pythonhome:     C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/KTxE2_xKA4FdAEopmHAdA
## virtualenv:     C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/KTxE2_xKA4FdAEopmHAdA/Scripts/activate_this.py
## version:        3.11.13 (main, Jul 11 2025, 22:36:59) [MSC v.1944 64 bit (AMD64)]
## Architecture:   64bit
## numpy:          C:/Users/sebas/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/KTxE2_xKA4FdAEopmHAdA/Lib/site-packages/numpy
## numpy_version:  2.3.3
## 
## NOTE: Python version was forced by use_python() function

Pregunta 1 (1.5 puntos) - Conceptos básicos

Parte A. Diferencias entre un vector en R y una lista en Python

Parte B. Diferencia entre data.frame en R y DataFrame en pandas (Python)


Pregunta 2 (1.5 puntos) - Estructuras de datos en R

numeros <- c(10, 25, 30, 15, 40)
nombres <- c("Ana", "Bruno", "Carlos", "Diana", "Elena")
edades <- c(22, 25, 23, 24, 22)

class(numeros)
## [1] "numeric"
estudiantes <- data.frame(nombre=nombres, edad=edades, notas=numeros, stringsAsFactors=FALSE)
estudiantes
##   nombre edad notas
## 1    Ana   22    10
## 2  Bruno   25    25
## 3 Carlos   23    30
## 4  Diana   24    15
## 5  Elena   22    40
estudiantes[3, "nombre"]
## [1] "Carlos"

Pregunta 3 (2 puntos) - Estructuras de datos en Python

import pandas as pd
datos = {
    'producto': ['Laptop', 'Mouse', 'Teclado', 'Monitor', 'Auriculares'],
    'precio': [1200, 25, 75, 300, 150],
    'stock': [10, 50, 30, 15, 25]
}
df = pd.DataFrame(datos)
df
##       producto  precio  stock
## 0       Laptop    1200     10
## 1        Mouse      25     50
## 2      Teclado      75     30
## 3      Monitor     300     15
## 4  Auriculares     150     25
df[df["precio"] > 100]
##       producto  precio  stock
## 0       Laptop    1200     10
## 3      Monitor     300     15
## 4  Auriculares     150     25
df["precio"].mean()
## np.float64(350.0)
df["categoria"] = ["Computadora", "Accesorio", "Accesorio", "Computadora", "Accesorio"]
df
##       producto  precio  stock    categoria
## 0       Laptop    1200     10  Computadora
## 1        Mouse      25     50    Accesorio
## 2      Teclado      75     30    Accesorio
## 3      Monitor     300     15  Computadora
## 4  Auriculares     150     25    Accesorio

Pregunta 4 (2 puntos) - Control de flujo en R

categorizar_notas <- function(notas) {
  categorias <- character(length(notas))
  for (i in seq_along(notas)) {
    n <- notas[i]
    categorias[i] <- if (n >= 18 && n <= 20) "Excelente" else if (n >= 15 && n < 18) "Bueno" else if (n >= 11 && n < 15) "Regular" else if (n >= 0 && n < 11) "Deficiente" else "Nota invalida"
  }
  categorias
}
categorizar_notas(c(19,12,16,8,20,14))
## [1] "Excelente"  "Regular"    "Bueno"      "Deficiente" "Excelente" 
## [6] "Regular"

Pregunta 5 (2 puntos) - Control de flujo en Python

inventario = {'manzanas':50,'naranjas':30,'plátanos':0,'uvas':20}
for producto,cantidad in inventario.items():
    print(f"{producto}: {cantidad}")
## manzanas: 50
## naranjas: 30
## plátanos: 0
## uvas: 20
for producto,cantidad in inventario.items():
    if cantidad == 0:
        print(producto,"ESTA AGOTADO")
    elif cantidad < 25:
        print(producto,"bajo stock",cantidad)
    else:
        print(producto,"stock ok",cantidad)
## manzanas stock ok 50
## naranjas stock ok 30
## plátanos ESTA AGOTADO
## uvas bajo stock 20
[p for p,c in inventario.items() if c <= 25]
## ['plátanos', 'uvas']

Pregunta 6 (2.5 puntos) - Funciones en ambos lenguajes

estadisticas_basicas <- function(v) list(media=mean(v), mediana=median(v), minimo=min(v), maximo=max(v))
estadisticas_basicas(c(10,20,30,40,50))
## $media
## [1] 30
## 
## $mediana
## [1] 30
## 
## $minimo
## [1] 10
## 
## $maximo
## [1] 50
import statistics
def estadisticas_basicas_py(lst):
    return {"media":statistics.mean(lst),"mediana":statistics.median(lst),"minimo":min(lst),"maximo":max(lst)}
estadisticas_basicas_py([10,20,30,40,50])
## {'media': 30, 'mediana': 30, 'minimo': 10, 'maximo': 50}

Pregunta 7 (2.5 puntos) - Paquetes y librerías

En R:
- install.packages("dplyr") instala el paquete.
- library(dplyr) lo carga.

En Python:
- pip install pandas instala la librería.
- import pandas as pd la importa.

# Ejemplo en R (comentado si no tienes dplyr instalado)
# library(dplyr)
# estudiantes %>% filter(promedio > 15)
# Ejemplo en Python
import pandas as pd
# df = pd.read_csv("estudiantes.csv")

Pregunta 8 (2.5 puntos) - Lectura de datos

ruta_csv <- "estudiantes.csv"
if (file.exists(ruta_csv)) {
  estudiantes <- read.csv(ruta_csv, stringsAsFactors = FALSE)
  message("Archivo estudiantes.csv cargado desde: ", normalizePath(ruta_csv))
} else {
  message("Archivo 'estudiantes.csv' NO encontrado en ", getwd(), ". Se creará un dataset de ejemplo.")
  estudiantes <- data.frame(
    nombre = c("Ana","Bruno","Carlos","Diana","Elena"),
    edad = c(22,25,23,24,22),
    carrera = c("Economia","Ingenieria","Derecho","Medicina","Psicologia"),
    promedio = c(16.5,14.2,17.8,13.0,15.6),
    stringsAsFactors = FALSE
  )
  write.csv(estudiantes, "estudiantes_ejemplo_generado.csv", row.names = FALSE)
}
## Archivo 'estudiantes.csv' NO encontrado en C:/Users/sebas/OneDrive/Pictures/Desktop/seb/niversidad/prograest. Se creará un dataset de ejemplo.
knitr::kable(head(estudiantes))
nombre edad carrera promedio
Ana 22 Economia 16.5
Bruno 25 Ingenieria 14.2
Carlos 23 Derecho 17.8
Diana 24 Medicina 13.0
Elena 22 Psicologia 15.6
if ("promedio" %in% colnames(estudiantes)) {
  aggregate(promedio ~ carrera, data = estudiantes, FUN = mean)
} else {
  message("La tabla 'estudiantes' no tiene columna 'promedio'")
}
##      carrera promedio
## 1    Derecho     17.8
## 2   Economia     16.5
## 3 Ingenieria     14.2
## 4   Medicina     13.0
## 5 Psicologia     15.6
estudiantes = pd.DataFrame({
    "nombre":["Ana","Bruno","Carlos","Diana","Elena"],
    "edad":[22,25,23,24,22],
    "carrera":["Economia","Ingenieria","Derecho","Medicina","Psicologia"],
    "promedio":[16.5,14.2,17.8,13.0,15.6]
})
estudiantes.groupby("carrera")["promedio"].mean().reset_index()
##       carrera  promedio
## 0     Derecho      17.8
## 1    Economia      16.5
## 2  Ingenieria      14.2
## 3    Medicina      13.0
## 4  Psicologia      15.6

Pregunta 9 (2 puntos) - Problema integrador

datos_peru = {'departamento': ["Lima","Arequipa","La Libertad","Piura","Junín"],
              'poblacion_2020': [10628470,1382730,1905301,2047954,1246038]}
dfp = pd.DataFrame(datos_peru)
total = dfp["poblacion_2020"].sum()
dfp["porcentaje"] = (dfp["poblacion_2020"]/total)*100
dfp["porcentaje"] = dfp["porcentaje"].round(2)
dfp
##   departamento  poblacion_2020  porcentaje
## 0         Lima        10628470       61.76
## 1     Arequipa         1382730        8.03
## 2  La Libertad         1905301       11.07
## 3        Piura         2047954       11.90
## 4        Junín         1246038        7.24
mas = dfp.loc[dfp["poblacion_2020"].idxmax(),"departamento"]
menos = dfp.loc[dfp["poblacion_2020"].idxmin(),"departamento"]
mas, menos
## ('Lima', 'Junín')
def categoria(p):
    if p > 2000000: return "Alta densidad"
    elif p >= 1000000: return "Media densidad"
    else: return "Baja densidad"
dfp["categoria_densidad"] = dfp["poblacion_2020"].apply(categoria)
dfp
##   departamento  poblacion_2020  porcentaje categoria_densidad
## 0         Lima        10628470       61.76      Alta densidad
## 1     Arequipa         1382730        8.03     Media densidad
## 2  La Libertad         1905301       11.07     Media densidad
## 3        Piura         2047954       11.90      Alta densidad
## 4        Junín         1246038        7.24     Media densidad

Pregunta 10 (1.5 puntos) - Análisis crítico

Ventajas de R:
1. Ecosistema estadístico muy completo (ggplot2, dplyr).
2. Sintaxis clara para análisis y visualización.

Ventajas de Python:
1. Ecosistema de machine learning amplio (scikit-learn, TensorFlow, PyTorch).
2. Lenguaje general y flexible, fácil de usar en producción.