PREGUNTA 1

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 sus caracteristicas
 #Tiene una estructura homogenea, esto quiere decir que todos sus elemnetos deben ser del mismo tipo
 #Tambien es unidimensional y se maneja como una secuencia ordenada de datos del mismo tipo
#  lista en python sus caracteristicas
 #Tiene una estructura heterogénea, puede contener elementos de distinto tipo como booleanos, enteros , etc
  #Es mutable, sus elementos se pueden modificar y también puede crecer dinámicamente.

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?

# DataFrame en Python (pandas) 
 #utiliza un índice explícito y flexible, que puede ser numérico, texto o fechas.Se accede a filas mediante .loc[] ; tambien por .iloc[] 
# data.frame en R en términos de indexación
  #la indexación de filas es numérica por defecto (1, 2, 3, …),aunque también permite nombres de columna que se  accede con corchetes [fila, columna] o trambien con $ para columnas.

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

Dado el siguiente código en R:

# Crear 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)

# a) (0.5 puntos) ¿Qué tipo de estructura de datos es numeros? 

  # Es un vector numerico en R 

# b) (0.5 puntos) Escribe el código para crear un data.frame llamado estudiantes que combine nombres, edades y numeros (como columna “notas”). 

   # Crear un vector numérico con las notas
numeros <- c(10, 25, 30, 15, 40)

# Crear un vector de caracteres con los nombres
nombres <- c("Ana", "Bruno", "Carlos", "Diana", "Elena")

# Crear un vector numérico con las edades
edades  <- c(22, 25, 23, 24, 22)

# Combinar los vectores en un data.frame llamado 'estudiantes'
estudiantes <- data.frame(
  nombre = nombres,  # Columna con los nombres
  edad   = edades,   # Columna con las edades
  notas  = numeros   # Columna con las notas
)

# Mostrar el contenido del data.frame
estudiantes
##   nombre edad notas
## 1    Ana   22    10
## 2  Bruno   25    25
## 3 Carlos   23    30
## 4  Diana   24    15
## 5  Elena   22    40
# c) (0.5 puntos) ¿Cómo accederías al nombre del tercer estudiante?
 
# Usando índices de fila y columna:
# [fila, columna] → fila 3, columna 1 (que corresponde a 'nombre')
estudiantes[3, 1]
## [1] "Carlos"
# Usando el nombre de la columna y el índice del elemento
# Accedemos a la columna 'nombre' y pedimos el 3er valor
estudiantes$nombre[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:

# esto me manda a poner, porque no me permite publicar para guardarlo
# Configurar el repositorio
options(repos = c(CRAN = "https://cloud.r-project.org"))
# Vamor a instalar un paquete para luego poder instalar pandas, porque al importar panda, no se puede ejecutar, porque con el paquete reticule puede correr python, pero luego debemos instalar pandas

# Ahora sí puedes instalar cualquier paquete sin problema
install.packages("reticulate") # si aún no lo tienes
## Installing package into 'C:/Users/magno/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'reticulate' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'reticulate'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\magno\AppData\Local\R\win-library\4.5\00LOCK\reticulate\libs\x64\reticulate.dll
## a
## C:\Users\magno\AppData\Local\R\win-library\4.5\reticulate\libs\x64\reticulate.dll:
## Permission denied
## Warning: restored 'reticulate'
## 
## The downloaded binary packages are in
##  C:\Users\magno\AppData\Local\Temp\RtmpIvmr9p\downloaded_packages
# a) Importa pandas y crea el DataFrame
  # ahora que ya lo instalamos, podemos impotar pandas
  
# Importar la librería pandas
import pandas as pd

# Crear el diccionario de datos
datos = {
    'producto': ['Laptop', 'Mouse', 'Teclado', 'Monitor', 'Auriculares'],
    'precio': [1200, 25, 75, 300, 150],
    'stock': [10, 50, 30, 15, 25]
}

# Convertir el diccionario en un DataFrame de pandas
df = pd.DataFrame(datos)

# Mostrar el DataFrame completo
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
#b) Muestra solo los productos con precio mayor a 100

 # Filtrar filas donde el precio sea mayor a 100
productos_caros = df[df['precio'] > 100]

# Mostrar el resultado
print(productos_caros)
##       producto  precio  stock
## 0       Laptop    1200     10
## 3      Monitor     300     15
## 4  Auriculares     150     25
#c) Calcula el precio promedio de todos los productos
# 1. Calcular el precio promedio de todos los productos
precio_promedio = df['precio'].mean()

# 2. Mostrar el resultado
print("El precio promedio de los productos es:", precio_promedio)
## El precio promedio de los productos es: 350.0
#d) Agrega una nueva columna llamada ‘categoria’ con valores [‘Computadora’, ‘Accesorio’, ‘Accesorio’,‘Computadora’, ‘Accesorio’]

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

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  Use estructuras condicionales para categorizar cada calificación  Retorne un vector con las categorías correspondientes # Código base para completar:

categorizar_notas <- function(notas) {
  categorias <- c()  # vector vacío para guardar las categorías
  
  for (n in notas) {
    if (n >= 18 && n <= 20) {categorias <- c(categorias, "Excelente")} 
    else if (n >= 15 && n < 18) {categorias <- c(categorias, "Bueno")} 
    else if (n >= 11 && n < 15) {categorias <- c(categorias, "Regular")} 
    else if (n >= 0 && n < 11) {categorias <- c(categorias, "Deficiente")} 
    else {categorias <- c(categorias, "Nota inválida")  # por si se pasa de rango
    }}
    return(categorias)}

# Prueba
notas_prueba <- c(19, 12, 16, 8, 20, 14)
categorizar_notas(notas_prueba)
## [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.

# Diccionario de inventario
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

# Mostrar un encabezado para indicar que se listará el inventario actual
print("Inventario actual:")
## Inventario actual:
# Recorrer el diccionario 'inventario' con un bucle for
# .items() devuelve pares (clave, valor) → (producto, cantidad)
for producto, cantidad in inventario.items():
    # Mostrar el nombre del producto y su cantidad
    print(f"{producto}: {cantidad}")
## manzanas: 50
## naranjas: 30
## plátanos: 0
## uvas: 20
#b) (0.75 puntos) Use condicionales para identificar productos agotados (cantidad = 0) y productos con bajo stock (cantidad &lt; 25)

# Mostrar un encabezado para la revisión de stock
print("\nRevisión de stock:")
## 
## Revisión de stock:
# Recorrer cada producto y su cantidad en el inventario
for producto, cantidad in inventario.items():
    # Caso 1: si la cantidad es 0, significa que está agotado
    if cantidad == 0:
        print(f"{producto} está agotado.")
    # Caso 2: si la cantidad es menor que 25, consideramos que tiene bajo stock
    elif cantidad < 25:
        print(f"{producto} tiene bajo stock ({cantidad} unidades).")
## plátanos está agotado.
## uvas tiene bajo stock (20 unidades).
#c) (0.75 puntos) Cree una lista con los nombres de productos que necesitan reabastecimiento (cantidad ≤25)

# Crear una lista por comprensión con los productos que necesitan reabastecimiento
# La condición es que su cantidad sea menor o igual a 25
reabastecer = [producto for producto, cantidad in inventario.items() if cantidad <= 25]

# Mostrar el resultado en pantalla
print("\nProductos que necesitan reabastecimiento:", reabastecer)
## 
## Productos que 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:

# Función que calcula estadísticas básicas de un vector numérico
estadisticas_basicas <- function(vector_numerico) {
  # Crear una lista con los resultados de cada estadística
  lista_resultados <- list(
    media = mean(vector_numerico),     # Calcula el promedio
    mediana = median(vector_numerico), # Calcula la mediana
    minimo = min(vector_numerico),     # Encuentra el valor mínimo
    maximo = max(vector_numerico)      # Encuentra el valor máximo
  )
  
  # Retorna la lista con todas las estadísticas
  return(lista_resultados)
}

# Ejemplo de prueba con un vector de valores
valores <- c(1, 2, 3, 5, 4)
estadisticas_basicas(valores)
## $media
## [1] 3
## 
## $mediana
## [1] 3
## 
## $minimo
## [1] 1
## 
## $maximo
## [1] 5

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

# Función que calcula estadísticas básicas de una lista numérica
def estadisticas_basicas(lista_numeros):
    # Calcular la media (suma de elementos / cantidad de elementos)
    media = sum(lista_numeros) / len(lista_numeros)
    
    # Calcular la mediana:
    # 1. Ordenamos la lista
    lista_ordenada = sorted(lista_numeros)
    n = len(lista_ordenada)
    
    # 2. Verificamos si la cantidad de elementos es par o impar
    if n % 2 == 1:  # Si es impar, tomamos el valor del medio
        mediana = lista_ordenada[n // 2]
    else:  # Si es par, sacamos el promedio de los dos valores centrales
        mediana = (lista_ordenada[n // 2 - 1] + lista_ordenada[n // 2]) / 2
    
    # Calcular mínimo y máximo usando funciones built-in
    minimo = min(lista_numeros)
    maximo = max(lista_numeros)
    
    # Retornar un diccionario con los resultados
    return {
        "media": media,
        "mediana": mediana,
        "minimo": minimo,
        "maximo": maximo
    }

# Ejemplo de prueba con una lista de números
valores = [1, 2, 3, 5, 4]

# Llamamos a la función y mostramos los resultados
print(estadisticas_basicas(valores))
## {'media': 3.0, 'mediana': 3, 'minimo': 1, 'maximo': 5}

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

Parte A (1 punto): Explica el proceso de instalación y carga de paquetes:

 #¿Cuál es la diferencia entre install.packages() y library ()?
  
# 1.install.packages("nombre"): se usa para descargar e instalar el paquete desde CRAN en la computadora. Solo se hace una vez (o cuando se actualiza el paquete).

# 2.library(nombre): se usa para cargar el paquete en la sesión actual de R y así poder usar sus funciones, y esto se hace cada qie iniciamos en R
#  ¿Cuál es la diferencia entre pip install y import?
# 1.pip install nombre_paquete: sirve para descargar e instalar el paquete desde PyPI en la computadora. Solo se hace una vez (o al actualizarlo).

#2.import nombre_paquete: sirve para cargar el paquete en el programa o script actual y así poder usar sus funciones. Esto se hace cada vez que se ejecuta el código.

Parte B (1.5 puntos): Escribe el código para:

# Instalar y cargar el paquete dplyr en R

# Instalar el paquete dplyr (solo se hace una vez)
install.packages("dplyr")
## Installing package into 'C:/Users/magno/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'dplyr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'dplyr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\magno\AppData\Local\R\win-library\4.5\00LOCK\dplyr\libs\x64\dplyr.dll
## a C:\Users\magno\AppData\Local\R\win-library\4.5\dplyr\libs\x64\dplyr.dll:
## Permission denied
## Warning: restored 'dplyr'
## 
## The downloaded binary packages are in
##  C:\Users\magno\AppData\Local\Temp\RtmpIvmr9p\downloaded_packages
# Cargar el paquete dplyr en la sesión actual (esto se hace cada vez que se abre R)
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
# Instalar e importar la librería pandas en Python (con alias pd)

# Instalar la librería pandas (solo se hace una vez en la computadora)
# Esto se ejecuta en la terminal o consola de Python, no dentro del script
# pip install pandas  

# Importar la librería pandas en el script y asignarle el alias "pd"
import pandas as pd
#Usar una función básica de cada uno (ej: filter() en dplyr
# Cargar el paquete dplyr
library(dplyr)

# Crear un data.frame de ejemplo
df <- data.frame(
  nombre = c("Ana", "Bruno", "Carlos", "Diana"),
  nota   = c(18, 14, 16, 20)
)

# Usar filter() para seleccionar estudiantes con nota mayor a 15
df_filtrado <- filter(df, nota > 15)
df_filtrado
##   nombre nota
## 1    Ana   18
## 2 Carlos   16
## 3  Diana   20
#Usar una función básica de cada uno (ej:read_csv() en pandas)
import pandas as pd

# Crear un DataFrame de ejemplo
df = pd.DataFrame({
    "nombre": ["Ana", "Bruno", "Carlos", "Diana"],
    "nota": [18, 14, 16, 20]
})

# Usar read_csv() para leer un archivo CSV (ejemplo) 
# df = pd.read_csv("archivo.csv")

# Aquí, mostramos cómo filtrar notas mayores a 15
df_filtrado = df[df["nota"] > 15]
print(df_filtrado)
##    nombre  nota
## 0     Ana    18
## 2  Carlos    16
## 3   Diana    20

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.

# Crear un data frame de ejemplo
estudiantes <- data.frame(
  nombre = c("Ana", "Luis", "María", "José", "Claudia"),
  edad = c(20, 22, 19, 21, 23),
  carrera = c("Ingeniería", "Medicina", "Ingeniería", "Derecho", "Medicina"),
  promedio = c(16, 14, 17, 13, 15)
)

# Guardar como CSV
write.csv(estudiantes, "estudiantes.csv", row.names = FALSE, fileEncoding = "UTF-8")
import pandas as pd

# Crear un DataFrame de ejemplo
estudiantes = pd.DataFrame({
    "nombre": ["Ana", "Luis", "María", "José", "Claudia"],
    "edad": [20, 22, 19, 21, 23],
    "carrera": ["Ingeniería", "Medicina", "Ingeniería", "Derecho", "Medicina"],
    "promedio": [16, 14, 17, 13, 15]
})

# Guardar como CSV
estudiantes.to_csv("estudiantes.csv", index=False, encoding="utf-8")

Tareas:

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

estudiantes <- read.csv("estudiantes.csv", header = TRUE, sep = ",", fileEncoding = "UTF-8")
head(estudiantes)
##    nombre edad    carrera promedio
## 1     Ana   20 Ingeniería       16
## 2    Luis   22   Medicina       14
## 3   María   19 Ingeniería       17
## 4    José   21    Derecho       13
## 5 Claudia   23   Medicina       15

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

estudiantes = pd.read_csv("estudiantes.csv", encoding="utf-8")
print(estudiantes.head())
##     nombre  edad     carrera  promedio
## 0      Ana    20  Ingeniería        16
## 1     Luis    22    Medicina        14
## 2    María    19  Ingeniería        17
## 3     José    21     Derecho        13
## 4  Claudia    23    Medicina        15

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

library(dplyr)

estudiantes_filtrados <- estudiantes %>% filter(promedio > 15)
print(estudiantes_filtrados)
##   nombre edad    carrera promedio
## 1    Ana   20 Ingeniería       16
## 2  María   19 Ingeniería       17

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

promedio_por_carrera = estudiantes.groupby("carrera")["promedio"].mean()
print(promedio_por_carrera)
## carrera
## Derecho       13.0
## Ingeniería    16.5
## Medicina      14.5
## Name: promedio, dtype: float64

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

En R: usar el parámetro fileEncoding = “UTF-8” en read.csv(). En Python: usar el parámetro encoding=“utf-8” en pd.read_csv().

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ú.

# Crear vectores con departamentos y población
departamentos <- c("Lima", "Arequipa", "La Libertad", "Piura", "Junín")
poblacion_2020 <- c(10628470, 1382730, 1905301, 2047954, 1246038)

# Crear un data.frame con los datos
datos_peru <- data.frame(
  departamento = departamentos,
  poblacion_2020 = poblacion_2020
)

# a) Calcular qué porcentaje de la población total representa cada departamento
total_poblacion <- sum(datos_peru$poblacion_2020)  
datos_peru$porcentaje <- round((datos_peru$poblacion_2020 / total_poblacion) * 100, 2)
# b) Identificar el departamento más y menos poblado

mas_poblado <- datos_peru$departamento[which.max(datos_peru$poblacion_2020)]
menos_poblado <- datos_peru$departamento[which.min(datos_peru$poblacion_2020)]

# c) Categorización de densidad poblacional
datos_peru$categoria <- ifelse(datos_peru$poblacion_2020 > 2000000, "Alta densidad",
                        ifelse(datos_peru$poblacion_2020 >= 1000000 & datos_peru$poblacion_2020 <= 2000000,
                               "Media densidad", "Baja densidad"))

# Mostrar resultados finales
print(datos_peru)
##   departamento poblacion_2020 porcentaje      categoria
## 1         Lima       10628470      61.76  Alta densidad
## 2     Arequipa        1382730       8.03 Media densidad
## 3  La Libertad        1905301      11.07 Media densidad
## 4        Piura        2047954      11.90  Alta densidad
## 5        Junín        1246038       7.24 Media densidad
cat("\nDepartamento más poblado:", mas_poblado, "\n")
## 
## Departamento más poblado: Lima
cat("Departamento menos poblado:", menos_poblado, "\n")
## Departamento menos poblado: Junín

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”. YO CONSIDERO QUE R ES MEJOR POR EL MOTIVO QUE FUE PARA ANALISIS ESTADISTICO Y VISUALIZAR DATOS, Y POR EL LADO DE PYTHON ES UN LENGUAJE BASICO, PERO EN SI NO DEBEMOS SIEMPRE IRNOS POR EL MAS MODERNO, SINO POR CUAL ES MAS ADECUADA PARA CADA SITUACION. PYTHON: ES MEJOR MACHINE LEARNING , AUTOMATIZACION R: ES MEJOR PARA ESTADISTICA AVANZADA , VISUALIZACION DE DATO

Responde:  a) (0.75 puntos) Menciona 2 ventajas de R sobre Python para análisis estadístico

R fue diseñado específicamente para análisis estadístico.

Tiene una gran cantidad de paquetes especializados como dplyr, ggplot2, caret; que facilitan análisis y visualizaciones de alta calidad.

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

Python es un lenguaje multipropósito, lo que permite no solo analizar datos, sino también desarrollar aplicaciones, inteligencia artificial, automatización , etc..

Tiene gran escalabilidad e integración con librerías de machine learning