R.version
##                _                                
## platform       x86_64-w64-mingw32               
## arch           x86_64                           
## os             mingw32                          
## crt            ucrt                             
## system         x86_64, mingw32                  
## status                                          
## major          4                                
## minor          5.1                              
## year           2025                             
## month          06                               
## day            13                               
## svn rev        88306                            
## language       R                                
## version.string R version 4.5.1 (2025-06-13 ucrt)
## nickname       Great Square Root
reticulate::py_config()
## python:         C:/Users/Jamir/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/UAW4YrHk8iZ9nN6trucP8/Scripts/python.exe
## libpython:      C:/Users/Jamir/AppData/Local/R/cache/R/reticulate/uv/python/cpython-3.11.13-windows-x86_64-none/python311.dll
## pythonhome:     C:/Users/Jamir/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/UAW4YrHk8iZ9nN6trucP8
## virtualenv:     C:/Users/Jamir/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/UAW4YrHk8iZ9nN6trucP8/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/Jamir/AppData/Local/R/cache/R/reticulate/uv/cache/archive-v0/UAW4YrHk8iZ9nN6trucP8/Lib/site-packages/numpy
## numpy_version:  2.3.3
## 
## NOTE: Python version was forced by VIRTUAL_ENV

Pregunta 1 (1.5 puntos) - Conceptos básicos

Parte A (0.75 puntos): Explica brevemente las diferencias entre un vector en R y una lista en Python. Menciona al menos dos características distintivas de cada uno.

Vector en R:

Una lista en Python:

Parte B (0.75 puntos): ¿Cuál es la principal diferencia entre un DataFrame en Python (pandas) y un data.frame en R en términos de indexación?

La diferencia central está en que el índice de las filas en un data.frame de R es implícito, numérico, secuencial y comienza en 1, mientras que el índice de un DataFrame de pandas es explícito, personalizable (puede ser de cualquier tipo de dato) y la indexación por posición (con .iloc[]) empieza en 0, como en la norma de Python.

Pregunta 2 (1.5 puntos) - Estructuras de datos en R Dado el siguiente código en R:

# Crear estructuras de datos
numeros <- c(10, 25, 30, 15, 40)
nombres <- c("Ana", "Bruno", "Carlos", "Diana", "Elena")
edades <- c(22, 25, 23, 24, 22)
  1. (0.5 puntos) ¿Qué tipo de estructura de datos es numeros?
class(numeros)
## [1] "numeric"
  1. (0.5 puntos) Escribe el código para crear un data.frame llamado estudiantes que combine nombres, edades y numeros (como columna “notas”).
estudiantes <- data.frame(
  nombre = nombres,
  edad = edades,
  nota = numeros
)
  1. (0.5 puntos) ¿Cómo accederías al nombre del tercer estudiante?
nombres[3]
## [1] "Carlos"

Pregunta 3 (2 puntos) - Estructuras de datos en Python Parte práctica: Convierte el siguiente diccionario Python en un DataFrame de pandas y realiza las operaciones solicitadas:

datos = { ‘producto’: [‘Laptop’, ‘Mouse’, ‘Teclado’, ‘Monitor’, ‘Auriculares’], ‘precio’: [1200, 25, 75, 300, 150], ‘stock’: [10, 50, 30, 15, 25] }

Tareas (0.5 puntos cada una): a) Importa pandas y crea el DataFrame

nota: Importe pandas para poder crear la DataFrame

import pandas as pd

# Creación del DataFrame
datos = {
    'producto': ['Laptop', 'Mouse', 'Teclado', 'Monitor', 'Auriculares'],
    'precio': [1200, 25, 75, 300, 150],
    'stock': [10, 50, 30, 15, 25]
}

df = pd.DataFrame(datos)
print(df)
##       producto  precio  stock
## 0       Laptop    1200     10
## 1        Mouse      25     50
## 2      Teclado      75     30
## 3      Monitor     300     15
## 4  Auriculares     150     25
  1. Muestra solo los productos con precio mayor a 100
df[df['precio'] > 100]
##       producto  precio  stock
## 0       Laptop    1200     10
## 3      Monitor     300     15
## 4  Auriculares     150     25
  1. Calcula el precio promedio de todos los productos ( con la función mean se calcula el promedio)
precio_promedio = df['precio'].mean()
print(precio_promedio)
## 350.0
  1. Agrega una nueva columna llamada ‘categoria’
df['categoria'] = ['Computadora', 'Accesorio', 'Accesorio', 'Computadora', 'Accesorio']
print(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 Problema práctico: Una universidad categoriza a sus estudiantes según su promedio: Excelente: 18-20 Bueno: 15-17.9 Regular: 11-14.9 Deficiente: 0-10.9 Escribe una función en R que: Reciba un vector de calificaciones

Retorne un vector con las categorías correspondientes

Código base completada:

categorizar_notas <- function(notas) {
  
  # Crea un vector vacío para guardar los resultados
  categorias <- c()
  #  Itera a través de cada nota en el vector 'notas'
  for (nota in notas) {
    if (nota >= 18 & nota <= 20) {
      categorias <- c(categorias, "Excelente")
    } else if (nota >= 15 & nota < 18) {
      categorias <- c(categorias, "Bueno")
    } else if (nota >= 11 & nota < 15) {
      categorias <- c(categorias, "Regular")
    } else {
      categorias <- c(categorias, "Deficiente")
    }
  }
  #Retorno un vector con las categorias correspondientes
  return(categorias)
}
#vector de calificaciones
notas_prueba <- c(19, 12, 16, 8, 20, 14)
resultados <- categorizar_notas(notas_prueba)

print(resultados)
## [1] "Excelente"  "Regular"    "Bueno"      "Deficiente" "Excelente" 
## [6] "Regular"

Pregunta 5 (2 puntos) - Control de flujo en Python Problema práctico: Crea un programa en Python que simule un sistema de inventario simple.

inventario = {
 'manzanas': 50,
'naranjas': 30,
'plátanos': 0,
'uvas': 20
}

Escribe código que: a) (0.5 puntos) Use un bucle for para mostrar cada producto y su cantidad

for producto, cantidad in inventario.items():
    print(f"Producto: {producto}, Cantidad: {cantidad}")
## Producto: manzanas, Cantidad: 50
## Producto: naranjas, Cantidad: 30
## Producto: plátanos, Cantidad: 0
## Producto: uvas, Cantidad: 20
  1. (0.75 puntos) Use condicionales para identificar productos agotados (cantidad = 0) y productos con bajo stock (cantidad < 25)
for producto, cantidad in inventario.items():
    if cantidad == 0:
        print(f"¡{producto} está agotado")
    elif cantidad < 25:
        print(f"{producto} tiene bajo stock ({cantidad}).")
    else:
        print(f"{producto} tiene stock suficiente ({cantidad}).")
## manzanas tiene stock suficiente (50).
## naranjas tiene stock suficiente (30).
## ¡plátanos está agotado
## uvas tiene bajo stock (20).
  1. (0.75 puntos) Cree una lista con los nombres de productos que necesitan reabastecimiento (cantidad ≤ 25)
necesitan_reabastecimiento = []
for producto, cantidad in inventario.items():
    if cantidad <= 25:
        necesitan_reabastecimiento.append(producto)

print("Productos que necesitan reabastecimiento:")
## Productos que necesitan reabastecimiento:
print(necesitan_reabastecimiento)
## ['plátanos', 'uvas']

Pregunta 6 (2.5 puntos) - Funciones en ambos lenguajes Parte A - R (1.25 puntos): Escribe una función que calcule estadísticas básicas de un vector numérico:

estadisticas_basicas <- function(vector_numerico) {
    media <- mean(vector_numerico)
    mediana <- median(vector_numerico)
    minimo <- min(vector_numerico)
    maximo <- max(vector_numerico)
    
    return(list(
        media = media,
        mediana = mediana,
        minimo = minimo,
        maximo = maximo
    ))
}

vector_prueba <- c(15, 25, 50, 5, 38)
resultados_r <- estadisticas_basicas(vector_prueba)
print(resultados_r)
## $media
## [1] 26.6
## 
## $mediana
## [1] 25
## 
## $minimo
## [1] 5
## 
## $maximo
## [1] 50

Parte B - Python (1.25 puntos): Escribe la función equivalente en Python:

def estadisticas_basicas(lista_numeros):
    # Calcular la media
    media = sum(lista_numeros) / len(lista_numeros)
    
    # Ordenar la lista para hallar la mediana
    lista_numeros.sort()
    n = len(lista_numeros)
    if n % 2 == 0:
        # Si la lista tiene un número par de elementos
        mediana = (lista_numeros[n // 2 - 1] + lista_numeros[n // 2]) / 2
    else:
        # Si la lista tiene un número impar de elementos
        mediana = lista_numeros[n // 2]
    
    # Calcular mínimo y máximo
    minimo = min(lista_numeros)
    maximo = max(lista_numeros)
    
    # Retornar un diccionario con los resultados
    return {
        "media": media,
        "mediana": mediana,
        "minimo": minimo,
        "maximo": maximo
    }

# Ejemplo
lista_prueba = [15, 25, 50, 5, 38]
resultados_python = estadisticas_basicas(lista_prueba)
print(resultados_python)
## {'media': 26.6, 'mediana': 25, 'minimo': 5, 'maximo': 50}

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

Parte A (1 punto): Explica el proceso de instalación y carga de paquetes: En R: ¿Cuál es la diferencia entre install.packages() y library()?

La diferencia entre intall.pakages() y library(), es que intall.pakages() se usa para instalar un paquete desde CRAN o otro repositorio por primera vez y se ejecuta una sola vez, en cambio, library() se usa para cargar un paquete ya instalado en la sesión actual de R,se ejecuta cada sesión donde se necesitemos usar el paquete.

En Python: ¿Cuál es la diferencia entre pip install y import?

La diferencia entre pipi install y import es que pip install se ejecuta en la terminal/consola para instalar un paquete desde PyPI por primera vez , en cambio, impor se usa dentro del código de Python para cargar una librería ya instalada (pandas, numpy , etc) asi poder usar sus funciones en cada script

Parte B (1.5 puntos): Escribe el código para: Instalar y cargar el paquete dplyr en R Instalar e importar la librería pandas en Python (con alias pd) Usar una función básica de cada uno (ej: filter() en dplyr, read_csv() en pandas)

En R

# Instalar dplyr (ejecutar en consola una vez)
#install.packages("dplyr") (lo ponemos asi porque sino luego me pedira que reinicie la instalacion, pero ya esta instalado)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
autos_lentos <- filter(mtcars, mpg > 20)
print(autos_lentos)
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# Usar filter() con el dataset 'mtcars' (built-in de R)
autos_lentos <- filter(mtcars, mpg > 20)

# Nota: mtcars es un dataset incluido en R por defecto.

En python

# Instalación de pandas (ejecutar en terminal una vez):
# pip install pandas

# Importar pandas con alias pd
import pandas as pd

# Simular un archivo CSV en memoria para usar read_csv()
from io import StringIO

# Datos de ejemplo en formato CSV (¡cerrar con triple comilla!)
datos_csv_ejemplo = """
producto,precio,stock
Laptop,1200,10
Mouse,25,50
Teclado,75,30
Monitor,300,15
Auriculares,150,25
"""

# Usar read_csv() con los datos simulados (¡nombre correcto!)
df = pd.read_csv(StringIO(datos_csv_ejemplo)) 

# Mostrar las primeras filas del DataFrame
print("DataFrame creado con read_csv():")
## DataFrame creado con read_csv():
print(df.head())
##       producto  precio  stock
## 0       Laptop    1200     10
## 1        Mouse      25     50
## 2      Teclado      75     30
## 3      Monitor     300     15
## 4  Auriculares     150     25
#Se utilizó StringIO para simular un archivo CSV en memoria y garantizar 
# que el código sea autónomo y reproducible sin dependencia de archivos externos.

**Pregunta 8 (2.5 puntos) - Lectura de datos

Escenario: Tienes un archivo CSV con datos de estudiantes que contiene las columnas: nombre, edad, carrera, promedio.** Tareas:

a) (0.5 puntos) Escribe el código en R para leer el archivo “estudiantes.csv”

Usaría este código

estudiantes <- read.csv(“estudiantes.csv”)

b) (0.5 puntos) Escribe el código en Python para leer el mismo archivo

import pandas as pd

estudiantes = pd.read_csv.(“estudiantes.csv”)

Nota: tendría que importar pandas para poder leer el archivo

c) (0.75 puntos) En R, filtra estudiantes con promedio > 15 usando dplyr

library(dplyr)

estudiantes_filtrados <- estudiantes %>% filter(promedio > 15)

d) (0.75 puntos) En Python, calcula el promedio por carrera usando pandas

promedio_por_carrera = estudiantes.groupby(‘carrera’)[‘promedio’].mean().reset_index()

Si queremos ver el resultado

ponemos:

print(promedio_por_carrera)

e) (0.5 puntos) ¿Qué parámetro usarías si el archivo tiene problemas de codificación (tildes, ñ)?

En R usaría : fileEncoding= “UTF-8” o fileEncoding = “Latin-1”

En python usaría: enconding = “utf-8” o enconding = ” latin-1”

Pregunta 9 (2 puntos) - Problema integrador

Caso práctico con datos del INEI: Supón que tienes datos de población por departamento del Perú.

departamentos <- c("Lima", "Arequipa", "La Libertad", "Piura", "Junín")
poblacion_2020 <- c(10628470, 1382730, 1905301, 2047954, 1246038)
import pandas as pd
datos_peru = {
 'departamento': ["Lima", "Arequipa", "La Libertad", "Piura", "Junín"],
 'poblacion_2020': [10628470, 1382730, 1905301, 2047954, 1246038]
}

Tareas (elige R o Python):
En esta ocasión usamos R a) Calcula qué porcentaje de la población total representa cada departamento

# Convertir los datos a un data.frame
datos_peru_r <- data.frame(departamentos, poblacion_2020)

# Calcular la poblacion total
poblacion_total <- sum(datos_peru_r$poblacion_2020)

# Calcular el porcentaje y lo ponemos con nueva columna
datos_peru_r$porcentaje <- (datos_peru_r$poblacion_2020 / poblacion_total) * 100

print(datos_peru_r)
##   departamentos poblacion_2020 porcentaje
## 1          Lima       10628470  61.755756
## 2      Arequipa        1382730   8.034227
## 3   La Libertad        1905301  11.070578
## 4         Piura        2047954  11.899450
## 5         Junín        1246038   7.239990

b) Identifica el departamento más y menos poblado

# Encontrar el departamento mas poblado
depto_mas_poblado <- datos_peru_r$departamentos[which.max(datos_peru_r$poblacion_2020)]

# Encontrar el departamento menos poblado
depto_menos_poblado <- datos_peru_r$departamentos[which.min(datos_peru_r$poblacion_2020)]

print(paste("El departamento mas poblado es:", depto_mas_poblado))
## [1] "El departamento mas poblado es: Lima"
print(paste("El departamento menos poblado es:", depto_menos_poblado))
## [1] "El departamento menos poblado es: Junín"

c) Crea una categorización: “Alta densidad” (>2M hab), “Media densidad” (1-2M hab), “Baja densidad” (<1M hab)

datos_peru_r$categoria <- ifelse(datos_peru_r$poblacion_2020 > 2000000, "Alta densidad",
                                ifelse(datos_peru_r$poblacion_2020 >= 1000000 & datos_peru_r$poblacion_2020 <= 2000000, "Media densidad",
                                       "Baja densidad"))

print(datos_peru_r)
##   departamentos poblacion_2020 porcentaje      categoria
## 1          Lima       10628470  61.755756  Alta densidad
## 2      Arequipa        1382730   8.034227 Media densidad
## 3   La Libertad        1905301  11.070578 Media densidad
## 4         Piura        2047954  11.899450  Alta densidad
## 5         Junín        1246038   7.239990 Media densidad

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

Reflexión: Un compañero te dice: “Es mejor usar siempre Python porque es más moderno que R”. Responde: a) (0.75 puntos) Menciona 2 ventajas de R sobre Python para análisis estadístico**

1)Programa mas especializado:R fue creado por y para estadísticos, de tal modo que su sintaxis y sus paquetes están optimizados para el análisis exploratorio y la visualización de datos de forma más directa.

2)Visualización con ggplot2: La gramática de gráficos de gglot2 en R es más poderosa y flexible para crear gráficos estadísticos complejos y publicables.

b) (0.75 puntos) Menciona 2 ventajas de Python sobre R para ciencia de datos en general

  1. Mayor versatilidad en proyectos integrados: Python es un lenguaje que se puede usar en diversas áreas (web, automatización, IA), lo que facilita integrar el análisis de datos en proyectos de software más grandes.

2)Dominio en Machine Learning e IA: Librerías como scikit-learn, tensorflow, entre otras, hacen de Python el estándar en modelos predictivos y deep learning, habilidades muy valoradas en el mercado laboral peruano e internacional.