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
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:
Homogeneidad: Un vector en R es un conjunto de objetos del mismo tipo (numérico, carácter, lógico, etc.)
Estructura unidimensional :Si se mezcla tipos distintos, ocurre coerciónde datos para unificarlos.
Una lista en Python:
Heterogeneidad de datos: Pueden contener distintos tipos de datos sin coerción automatica como pasa en R
Son mutables y dinámicas
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)
class(numeros)
## [1] "numeric"
estudiantes <- data.frame(
nombre = nombres,
edad = edades,
nota = numeros
)
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
df[df['precio'] > 100]
## producto precio stock
## 0 Laptop 1200 10
## 3 Monitor 300 15
## 4 Auriculares 150 25
precio_promedio = df['precio'].mean()
print(precio_promedio)
## 350.0
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
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).
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}
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.
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”
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
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
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.