Curso: Programación en lenguaje Estadístico.

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.

Un vector en R es la estructura básica que contiene elementos homogéneos (todos del mismo tipo: numeric, character, etc.); tiene indexación base-1, índices empiezan en 1.

v <- c(10, 20, 30)
v[1]
## [1] 10

Una lista en Python es una colección ordenada y mutable de objetos, que puede contener elementos heterogéneos (distintos tipos); índice base 0.

L = [10, "hola", 3.14]
print(L[0])
## 10

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?

En R indexa desde 1 y solo tiene indexación posicional, mientras que Python (pandas) indexa desde 0 y además permite indexación dual: por posición (.iloc) y por etiqueta (.loc). En R

#Ejemplo de R solo indexacion posicional
df <- data.frame(
  nombre = c("Ana", "Luis", "María"),
  edad = c(20, 22, 21))

#Muestra la 1era columna y 1era fila
df[1, 1]   
## [1] "Ana"

En Python

import pandas as pd

#Ejemplo de python indexacion dual
df = pd.DataFrame({
    "nombre": ["Ana", "Luis", "María"],
    "edad": [20, 22, 21]})

#Por posicion .iloc y empieza desde cero
print(df.iloc[0, 0])   
## Ana
#Por etiqueta .loc
print(df.loc[0, "nombre"])  
## Ana

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

# Datos dados
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?

class(numeros)  #class para saber el tipo de estructura de un vector
## [1] "numeric"

b) (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,notas = numeros)
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?

estudiantes$nombre[3] #diferentes formas de hallar el 3er estudiante
## [1] "Carlos"
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]
}

a) Importa pandas y crea el DataFrame

import pandas as pd
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

b) Muestra solo los productos con precio mayor a 100

df_mayor_100 = df[df['PRECIO'] > 100] #>100 para los precios mayores a 100
print(df_mayor_100)
##       PRODUCTO  PRECIO  STOCK
## 0       Laptop    1200     10
## 3      Monitor     300     15
## 4  Auriculares     150     25

c) Calcula el precio promedio de todos los productos

precio_promedio = df['PRECIO'].mean()
#mean para calcular la media(promedio)
print("Precio promedio:", precio_promedio)
## Precio promedio: 350.0

Agrega una nueva columna llamada categoria con valores [‘Computadora’, ‘Accesorio’, ‘Accesorio’, ‘Computadora’, ‘Accesorio’]

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

categorizar_notas <- function(notas) {
  categorias <- c()  # vector vacío para guardar las categorías
  
  for (nota in notas) {
    if (nota >= 18 && nota <= 20) {
      categorias <- c(categorias, "Excelente") #para notas 18-20
    } else if (nota >= 15 && nota < 18) {
      categorias <- c(categorias, "Bueno")     #notas de 15-18
    } else if (nota >= 11 && nota < 15) {
      categorias <- c(categorias, "Regular")   #notas de 11-15
    } else if (nota >= 0 && nota < 11) {
      categorias <- c(categorias, "Deficiente") #notas de 0-11
    }}
  
  return(categorias)
}

# Prueba que dio el problema
notas_prueba <- c(19, 12, 16, 8, 20, 14)
data.frame(Nota = notas_prueba, Categoria = categorizar_notas(notas_prueba)) #para que aparezca en una tabla
##   Nota  Categoria
## 1   19  Excelente
## 2   12    Regular
## 3   16      Bueno
## 4    8 Deficiente
## 5   20  Excelente
## 6   14    Regular

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

#Crea un programa en Python que simule un sistema de inventario simple.
inventario = {
    'manzanas': 50,
    'naranjas': 30,
    'plátanos': 0,
    'uvas': 20}

a) (0.5 puntos) Use un bucle for para mostrar cada producto y su cantidad

for producto, cantidad in inventario.items():
    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 < 25)

for producto, cantidad in inventario.items():
    if cantidad == 0:
        print(f"{producto} está agotado.") #para cantidad = 0
    elif cantidad < 25:
        print(f"{producto} tiene bajo stock ({cantidad}).") #cantidad<25
## plátanos está agotado.
## uvas tiene bajo stock (20).

c) (0.75 puntos) Cree una lista con los nombres de productos que necesitan reabastecimiento (cantidad ≤ 25)

reabastecer = [producto for producto, cantidad in inventario.items() if cantidad <= 25]
print("Necesitan reabastecimiento:", reabastecer)
## 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) {
  lista_resultados <- list(
    media = mean(vector_numerico),     #mean para la media
    mediana = median(vector_numerico), #median para la mediana
    minimo = min(vector_numerico),     #min = minimo
    maximo = max(vector_numerico))     #max = maximo
  return(lista_resultados)}

# Ejemplo para prueba
valores <- c(5, 8, 12, 3, 7, 10)
estadisticas_basicas(valores)
## $media
## [1] 7.5
## 
## $mediana
## [1] 7.5
## 
## $minimo
## [1] 3
## 
## $maximo
## [1] 12

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

import statistics     #statistics importar para la mediana

def estadisticas_basicas(lista_numeros):
    resultados = {
        "media": sum(lista_numeros) / len(lista_numeros),   
        #promedio, dividido en len que es los valores que tiene la lista
        "mediana": statistics.median(lista_numeros),        #mediana
        "minimo": min(lista_numeros),                       #mínimo
        "maximo": max(lista_numeros)}                     #máximo
    return resultados

# Ejemplo de prueba
valores = [5, 8, 12, 3, 7, 10]
print(estadisticas_basicas(valores))
## {'media': 7.5, 'mediana': 7.5, 'minimo': 3, 'maximo': 12}

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()?

install.packages(“nombre del paquete”):

Sirve para descargar e instalar el paquete desde CRAN (se hace solo una vez).

library(“nombre del paquete”):

Sirve para cargar el paquete ya instalado en la sesión actual de R. Esto se debe hacer cada vez que se qiera usar el paquete en un script.

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

pip install “nombre de la libreria” Sirve para descargar e instalar la librería desde PyPI. Se hace en la terminal/console (solo una vez).

import “nombre_libreria” Sirve para importar la librería ya instalada en tu script y usar sus funciones.

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

Instalar y cargar el paquete dplyr en R

install.packages(“dplyr”): Instala una sola vez

library(dplyr): Carga en la sesión

Instalar e importar la librería pandas en Python (con alias pd)

En la terminal instalar pandas con: pip install pandas

import pandas as pd #para importar pandas

Usar una función básica de cada uno (ej: filter() en dplyr, read_csv() en pandas)

#Cargar paquete
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
#Crear un data frame de ejemplo
df <- data.frame(
  nombre = c("Ana", "Luis", "Marta", "Juan"),
  edad = c(23, 30, 19, 25))
  
#Filter() para seleccionar mayores de 20
df_filtrado <- filter(df, edad > 20)
print(df_filtrado)
##   nombre edad
## 1    Ana   23
## 2   Luis   30
## 3   Juan   25
import pandas as pd

#Crear un DataFrame desde un diccionario 
df = pd.DataFrame({
    "nombre": ["Ana", "Luis", "Marta", "Juan"],
    "edad": [23, 30, 19, 25]})

#Guardo a CSV (simulación de un archivo)
df.to_csv("personas.csv", index=False)

#Uso read_csv() para leer el archivo
df_leido = pd.read_csv("personas.csv")

#Filtrar mayores de 20
df_filtrado = df_leido[df_leido["edad"] > 20]
print(df_filtrado)
##   nombre  edad
## 0    Ana    23
## 1   Luis    30
## 3   Juan    25

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.

#Ejemplo del escenario que pide
estudiantes <- data.frame(
  nombre = c("Carla", "Diego", "Valeria", "Andrés", "Sofía"),
  edad = c(20, 22, 19, 23, 21),
  carrera = c("Arquitectura", "Psicología", "Arquitectura", "Economía", "Psicología"),
  promedio = c(16.5, 14.0, 18.0, 12.5, 15.5))

#Guardo como csv
write.csv(estudiantes, "estudiantes.csv", row.names = FALSE)

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

estudiantes <- read.csv("estudiantes.csv", header = TRUE, sep = ",")
#header = true para que aparezca la columna con su categoria
#sep = "," indica que el archico esta separado por comas
print(estudiantes)
##    nombre edad      carrera promedio
## 1   Carla   20 Arquitectura     16.5
## 2   Diego   22   Psicología     14.0
## 3 Valeria   19 Arquitectura     18.0
## 4  Andrés   23     Economía     12.5
## 5   Sofía   21   Psicología     15.5

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

estudiantes = pd.read_csv("estudiantes.csv")
print(estudiantes)
##     nombre  edad       carrera  promedio
## 0    Carla    20  Arquitectura      16.5
## 1    Diego    22    Psicología      14.0
## 2  Valeria    19  Arquitectura      18.0
## 3   Andrés    23      Economía      12.5
## 4    Sofía    21    Psicología      15.5

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

library(dplyr)
estudiantes %>% filter(promedio > 15)
##    nombre edad      carrera promedio
## 1   Carla   20 Arquitectura     16.5
## 2 Valeria   19 Arquitectura     18.0
## 3   Sofía   21   Psicología     15.5
#muestra solo estudiantes con promedio mayor a 15

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

promedio_carrera = estudiantes.groupby("carrera")[["promedio"]].mean()
print(promedio_carrera)
##               promedio
## carrera               
## Arquitectura     17.25
## Economía         12.50
## Psicología       14.75
#mean para la media(promedio)

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

EN R

estudiantes <- read.csv("estudiantes.csv", fileEncoding = "UTF-8")

EN PYTHON

estudiantes = pd.read_csv("estudiantes.csv", encoding="utf-8")

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

EN PYTHON

import pandas as pd

datos_peru = {
    'departamento': ["Lima", "Arequipa", "La Libertad", "Piura", "Junín"],
    'poblacion_2020': [10628470, 1382730, 1905301, 2047954, 1246038]
}
df = pd.DataFrame(datos_peru)

a) Calcula qué porcentaje de la población total representa cada departamento

total = df["poblacion_2020"].sum()
df["porcentaje"] = (df["poblacion_2020"] / total * 100).round(2).astype(str) + "%"
#round(2) redondea a 2 decimales 
#.astype(str) convierte a texto
#% para que aparezca con signo
print(df[["departamento", "poblacion_2020", "porcentaje"]])
##   departamento  poblacion_2020 porcentaje
## 0         Lima        10628470     61.76%
## 1     Arequipa         1382730      8.03%
## 2  La Libertad         1905301     11.07%
## 3        Piura         2047954      11.9%
## 4        Junín         1246038      7.24%

b) Identifica el departamento más y menos poblado

mas_poblado = df.loc[df["poblacion_2020"].idxmax(), "departamento"]
#idxmax() devuelve el índice donde se encuentra el valor máximo

menos_poblado = df.loc[df["poblacion_2020"].idxmin(), "departamento"]
#idxmin() devuelve el índice donde se encuentra el valor máximo

print("Más poblado:", mas_poblado)
## Más poblado: Lima
print("Menos poblado:", menos_poblado)
## Menos poblado: Junín

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

#Categorizo por densidad
def categorizar(p):    #p=poblacion
    if p > 2000000:
        return "Alta densidad"
    elif p >= 1000000:
        return "Media densidad"
    else:             #si no cumple los anteriores sale baja densidad
        return "Baja densidad" 
      
df["densidad"] = df["poblacion_2020"].apply(categorizar)
print(df[["departamento", "poblacion_2020", "densidad"]])
##   departamento  poblacion_2020        densidad
## 0         Lima        10628470   Alta densidad
## 1     Arequipa         1382730  Media densidad
## 2  La Libertad         1905301  Media densidad
## 3        Piura         2047954   Alta densidad
## 4        Junín         1246038  Media densidad
#.apply aplica la funcion creada "categorizar" a cada uno

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

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

Especializado para estadistica: R esta mas enfocado a estadistica y en eso es mejor que python, porque tiene librerías nativas y muy maduras como stats, lme4, survival

Visualizacion integrada a estadistica: Con librerías como ggplot2 o lattice, R permite crear gráficos estadísticos muy específicos mejor que Python

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

Mayor versatilidad: Python no solo se usa para análisis de datos, sino también para desarrollo web, automatización, inteligencia artificial, machine learning, etc. Esto lo hace mas versatil a comparacion con R que es mas centralizado para estadistica.

Manejo de grandes volumenes de datos: Python, junto con librerías como Dask, PySpark o su integración con bases de datos SQL y entornos en la nube , permite trabajar con Big Data y conjuntos de datos que exceden la memoria RAM de un computador personal; en cambio R tiene limitaciones en eficiencia y escalabilidad al trabajar con volúmenes muy grandes.