TALLER Programación Estadística RStudio

Taller en R con vectores, matrices, funciones y data frames; incluye dos alternativas de solución en ejercicios clave para comparar enfoques.

PUNTO 1 - Edades Clientes

En el Punto 1 se trabajó con la variable edad de una base de clientes, simulando 40 registros mediante un vector en R generado con la función sample(). A partir de estos datos, se calcularon los estadísticos descriptivos fundamentales —media, mediana, valor máximo y valor mínimo—, con el fin de ilustrar cómo estas medidas permiten segmentar el mercado, personalizar campañas y comprender patrones de consumo en el sector retail.

#======= ======= ======= ======= ======= ======= ======= PUNTO 1. ==============

# Creo un Edadvp1 le asigno vector c, asigno un sample con un rango de 18 a 70 años y creo 40 numeros
#REPLACE, permite repetir numeros
Edadvp1=c(sample(18:70, 40, replace =TRUE)) 
Edadvp1
##  [1] 55 33 38 60 56 39 24 47 51 23 69 36 54 63 38 29 32 18 45 66 21 58 35 66 20
## [26] 49 69 62 55 67 45 62 46 41 40 46 41 51 53 20
MEAN1 <- mean(Edadvp1)
MEDIAN1 <- median(Edadvp1)
MAX1 <- max(Edadvp1)
MIN1 <- min(Edadvp1)

cat("\nLa media de la edad es:",MEAN1, "\nLa Mediana es:",MEDIAN1,"\n La Máxima es:",MAX1,"\n la Mínima es:",MIN1)
## 
## La media de la edad es: 45.575 
## La Mediana es: 46 
##  La Máxima es: 69 
##  la Mínima es: 18

Paso a paso

  1. Genero el vector Edadvp1 con 40 edades aleatorias entre 18 y 70 usando sample(18:70, 40, replace = TRUE). El argumento replace=TRUE permite repeticiones.
  2. Reviso el contenido imprimiendo Edadvp1 para confirmar los valores simulados.
  3. Calculo estadísticos: mean(Edadvp1) (media), median(Edadvp1) (mediana), max(Edadvp1) (máximo) y min(Edadvp1) (mínimo).
  4. Conclusión breve: estos resultados ofrecen una primera caracterización de la distribución de edades simuladas.

PUNTO 2 - Venta Productos

En el Punto 2 se planteó la construcción de una matriz en R para simular el rendimiento anual de cinco productos más vendidos en una empresa de comercio electrónico. Cada fila representa un producto y cada columna un trimestre del año (Q1, Q2, Q3 y Q4), con datos ficticios de ventas en unidades o dólares. Además de asignar nombres a filas y columnas, se calcularon los totales de ventas anuales por producto (suma por filas) y los totales de ventas por trimestre (suma por columnas), utilizando funciones como rowSums() y colSums(). Este ejercicio permite organizar la información de manera estructurada y obtener un análisis comparativo entre productos y periodos de venta.

#======= ======= ======= ======= ======= ======= ======= PUNTO 2. ==============
#para este ejercicio voy a crear 3 matrices la primera para los precios, 
#serán aletorios, aunque en el mundo real no es algo normal, quiero porbar dos matrices aleatorias
#La segunda matriz esta orientada a crear las unidades vendidas tambien de manera aletoria entre 0 y 100 Productos
#La 3ra matriz es para multiplicar

#MATRIZ 1
#Creo una Matriz de Precios de 5 filas y 4 columnas, con llenado aleatorio entre 10 y 50, con 20 elementos, se pueden repetir  valores
PrecioM=matrix(sample(10:50,20, replace = FALSE,), nrow = 5, ncol = 4) 
row.names(PrecioM)=c("P1Arroz","P2Panela","P3Cafe","P4Pan","P5Aceite") # Asgino los nombres de cada Fila
colnames(PrecioM)=c("Q1","Q2","Q3","Q4") #asigno los nombres de cada Columna
PrecioM  # Muestro la matriz
##          Q1 Q2 Q3 Q4
## P1Arroz  11 45 25 49
## P2Panela 16 41 19 27
## P3Cafe   21 48 34 18
## P4Pan    22 20 13 12
## P5Aceite 37 28 40 23
#MATRIZ 2
#creo una matriz de unidades en esta se generan numeros aleatorios de unidades vendidas
UnidadesM=matrix(sample(0:100, 20, replace = TRUE), # De 0 a 100, se pueden repetir numeros y vamos a crear 20 numeros
                 nrow = 5, #5 filas 
                 ncol = 4) #4 columnas 
row.names(UnidadesM)=c("P1Arroz","P2Panela","P3Cafe","P4Pan","P5Aceite") # Asgino los nombres de cada Fila
colnames(UnidadesM)=c("Q1","Q2","Q3","Q4") #asigno los nombres de cada Columna
UnidadesM #Muestro Matriz
##          Q1 Q2  Q3 Q4
## P1Arroz  36 73  61 13
## P2Panela 97 79 100 30
## P3Cafe   56 35  49 83
## P4Pan    64 13  40 39
## P5Aceite 14 76  40 22
#MATRIZ 3
VentasM=(UnidadesM*PrecioM) # Cree una matriz VentasM para que multiplique Las unidades  y el precio 
VentasM # Acá Muestro la Tabla
##            Q1   Q2   Q3   Q4
## P1Arroz   396 3285 1525  637
## P2Panela 1552 3239 1900  810
## P3Cafe   1176 1680 1666 1494
## P4Pan    1408  260  520  468
## P5Aceite  518 2128 1600  506
#SUMA DE PRODUCTO Y MATRICES
#Creo un objeto Llamado SumaUnidades y aplico ROWSUMS- Genero que en ese objeto se guarde la suma de las Filas (Productos)
SumaUnidades=rowSums(VentasM) 
#Creo un objeto llamado SumaVentas aplico COLSUMS-El objeto va a recibir el valor de la suma de las Columnas Q1 hasta Q4
SumaVentas=colSums(VentasM)

#Crear una Fila y una Columna para mostar los totales que guarde con el RowSums y el ColSums
#Creo una Tabla para almacenar los datos nuevos, CBin=crea una nueva columna 
#Tomo la Matriz3, donde almacene los valores*unidades,la columna nueva se Llama TotalAñoQ y le asigno SumaUnidades. 
Tabla1=cbind(VentasM, TotalAñoQ=SumaUnidades) 
Tabla1 #Muestro la Tabla Para ver la nueva columna
##            Q1   Q2   Q3   Q4 TotalAñoQ
## P1Arroz   396 3285 1525  637      5843
## P2Panela 1552 3239 1900  810      7501
## P3Cafe   1176 1680 1666 1494      6016
## P4Pan    1408  260  520  468      2656
## P5Aceite  518 2128 1600  506      4752
#A la Tabla1, que ya le había creado una columna, le creo una Fila rbind para unificar datos
#En la Tabla 1, La fila nueva se llama Total Año, y le asigno como vectores, la Suma Ventas, y le suma de estas. 
Tabla1=rbind(Tabla1,TotalAño=c(SumaVentas,sum(SumaVentas)))
Tabla1
##            Q1    Q2   Q3   Q4 TotalAñoQ
## P1Arroz   396  3285 1525  637      5843
## P2Panela 1552  3239 1900  810      7501
## P3Cafe   1176  1680 1666 1494      6016
## P4Pan    1408   260  520  468      2656
## P5Aceite  518  2128 1600  506      4752
## TotalAño 5050 10592 7211 3915     26768
#Creo un objeto para asignar los datos de la Tabla 1, ademas va a recorrer la tabla agregando el $
TablaImpresa=apply(Tabla1,c(1,2), function(x) paste0("$",x))

cat("\n=== Unidades ===\n"); print(UnidadesM)
## 
## === Unidades ===
##          Q1 Q2  Q3 Q4
## P1Arroz  36 73  61 13
## P2Panela 97 79 100 30
## P3Cafe   56 35  49 83
## P4Pan    64 13  40 39
## P5Aceite 14 76  40 22
cat("\n=== Precios Dolares $ x Unidad ===\n");print(PrecioM)
## 
## === Precios Dolares $ x Unidad ===
##          Q1 Q2 Q3 Q4
## P1Arroz  11 45 25 49
## P2Panela 16 41 19 27
## P3Cafe   21 48 34 18
## P4Pan    22 20 13 12
## P5Aceite 37 28 40 23
cat("\n=== Ventas Totales US ===\n"); print(noquote(TablaImpresa))
## 
## === Ventas Totales US ===
##          Q1    Q2     Q3    Q4    TotalAñoQ
## P1Arroz  $396  $3285  $1525 $637  $5843    
## P2Panela $1552 $3239  $1900 $810  $7501    
## P3Cafe   $1176 $1680  $1666 $1494 $6016    
## P4Pan    $1408 $260   $520  $468  $2656    
## P5Aceite $518  $2128  $1600 $506  $4752    
## TotalAño $5050 $10592 $7211 $3915 $26768
#Crear un clico FOR para imprimir un mensaje con cada producto las venta de unidades totales y el valor Total
#creo un objeto llamado productos y le asigno los nombres de la tabla VentasM
productos=rownames(VentasM) 
#Creo el ciclo FOR
for (i in 1:length(productos)) { #El length me permite saber cuantos elementos tiene productos y le indica al For cuando parar
  #Uso cat para unir los mensajes
  cat( "\n El producto", productos[i], 
       "Vendió al año", sum(UnidadesM[i]),"Unidades",
       "El total de ventas fue $",SumaUnidades[i], "Dolares.\n")
  } # cierro el corchete FOR
## 
##  El producto P1Arroz Vendió al año 36 Unidades El total de ventas fue $ 5843 Dolares.
## 
##  El producto P2Panela Vendió al año 97 Unidades El total de ventas fue $ 7501 Dolares.
## 
##  El producto P3Cafe Vendió al año 56 Unidades El total de ventas fue $ 6016 Dolares.
## 
##  El producto P4Pan Vendió al año 64 Unidades El total de ventas fue $ 2656 Dolares.
## 
##  El producto P5Aceite Vendió al año 14 Unidades El total de ventas fue $ 4752 Dolares.

Paso a paso

  1. Inicio del ciclo: abro un repeat { ... }, el cual se ejecuta indefinidamente hasta encontrar un break.
  2. Generación de datos: dentro del ciclo creo 100 temperaturas aleatorias entre 20 °C y 35 °C con runif(100, 20, 35) y las redondeo con round(..., 0).
  3. Chequeo global: aplico any(Temperature > 30) para verificar si al menos una de las 100 lecturas supera los 30 °C.
  4. Alerta y corte: si la condición se cumple, imprimo el mensaje de alerta y utilizo break para salir del repeat.
  5. Cálculo de estadísticos: fuera del ciclo, calculo sobre el vector Temperature la media (mean()), la desviación estándar (sd()) y la mediana (median()).
  6. Salida: muestro el vector Temperature completo y reporto los tres estadísticos formateados con cat(sprintf(...)).

PUNTO 3A - Análisis Clientes Compleja

El ejercicio automatiza el registro de 32 clientes, asigna un ID, simula sus datos, clasifica su riesgo financiero según el saldo y consolida todo en un data frame listo para análisis.

#======= ======= ======= ======= ======= ======= ======= PUNTO 3======= complejo VECTOR, FUNCIÓN, LISTA, DATA FRAME


# ======= 1. Creo una base de posibles nombres , lista de la clase de fundamentos

NombreAlt=c( "KAKELLY ALVARADO","DARNEYI ASTUDILLO","YULIETH BENAVIDES","HERNAN CAICEDO","JOSE CASTELLANOS",
             "MARGGY CASTILLO","HERNAN CRUZ","MAIRA DIAZ","CRISTINA GARNICA","LUIS GUTIERREZ",
             "CLAUDIA GUTIERREZ","ANDRES JIMENEZ","JAMES MARMOLEJO","JHONATAN MARQUEZ","MARIA MORALES",
             "BRAYAN MORAN","UBALDO MUÑOZ","JESUS NIETO","MARIA POLO","JENNY QUINTERO",
             "LUIS RAMIREZ","MARIA RESTREPO","DIEGO RIAÑO","JUAN RIOS","DIEGO ROA",
             "JUAN RODRIGUEZ","ADRIANA RODRIGUEZ","GISELLE ROJAS","MANUEL ROMERO","MARIA SANCHEZ",
             "JEINER VELANDIA","ALEXANDER VERA")
NombreAlt# Imprime el objeto
##  [1] "KAKELLY ALVARADO"  "DARNEYI ASTUDILLO" "YULIETH BENAVIDES"
##  [4] "HERNAN CAICEDO"    "JOSE CASTELLANOS"  "MARGGY CASTILLO"  
##  [7] "HERNAN CRUZ"       "MAIRA DIAZ"        "CRISTINA GARNICA" 
## [10] "LUIS GUTIERREZ"    "CLAUDIA GUTIERREZ" "ANDRES JIMENEZ"   
## [13] "JAMES MARMOLEJO"   "JHONATAN MARQUEZ"  "MARIA MORALES"    
## [16] "BRAYAN MORAN"      "UBALDO MUÑOZ"      "JESUS NIETO"      
## [19] "MARIA POLO"        "JENNY QUINTERO"    "LUIS RAMIREZ"     
## [22] "MARIA RESTREPO"    "DIEGO RIAÑO"       "JUAN RIOS"        
## [25] "DIEGO ROA"         "JUAN RODRIGUEZ"    "ADRIANA RODRIGUEZ"
## [28] "GISELLE ROJAS"     "MANUEL ROMERO"     "MARIA SANCHEZ"    
## [31] "JEINER VELANDIA"   "ALEXANDER VERA"
# ======= 2. creo una función ID 

IdAut<-function(){ #voy a crear la función con 32 datos adentro, tengo 32 clientes
  #sprintf: Formatea texto con patrones específicos
  #C: Texto fijo del codigo Cliente 
  #%02d -> 02 son los digitos que voy a usar, %d -> indica que son un numero entero
  sprintf("C%02d", 1:32) 
}
print(IdAut()) #muestra los ID
##  [1] "C01" "C02" "C03" "C04" "C05" "C06" "C07" "C08" "C09" "C10" "C11" "C12"
## [13] "C13" "C14" "C15" "C16" "C17" "C18" "C19" "C20" "C21" "C22" "C23" "C24"
## [25] "C25" "C26" "C27" "C28" "C29" "C30" "C31" "C32"
#============ 3. FUNCIÓN LISTA======

cliente_crear<-function(id,nombre,edad,ing_men,saldo_now)#cierro función
  {#Ciclo IF  para evaluar el riesgo 
  if(saldo_now<0){cate_riesgo="RIESGO ALTO"}
  else {cate_riesgo= "ESTABLE"}
   
 #cierro IF función 

#============== 4.  CREAR LISTA==========
cliente_lista<-list(
  id=id,
  nombre=nombre,
  edad=edad,
  ing_men=ing_men,
  saldo_now = saldo_now,
  cate_riesgo=cate_riesgo
)
return(cliente_lista)
 }
#================ VOY A CREAR UN DATA FRAME==========

ids<-IdAut() #Uso mi funcion para crear ID punto 2
#voy a crear datos aleatorios con los puntos 1 y 2 
edades1=sample(25:65,32, replace = TRUE)
ingresos=sample(2000:8000,32,replace = TRUE)
saldos<-sample(-3000:5000,32,replace = TRUE)

### Crear otra funcion para empezar a llenar los objetos por medio de una Lista 

clientes_full<-list()
for (i  in 1:32) {
  
  clientes_full[[i]]<-cliente_crear(
    id=ids[i], # acá estoy creado la lista con los datos que ya tenai de la función
    nombre=NombreAlt[i], #esta hciendo un recorrido por le ciclo for i hasta llegar a 32
    edad=edades1[i],
    ing_men=ingresos[i],
    saldo_now=saldos[i]
  )
  
}

###### DATA FRAME 
Tb_clientes<-data.frame( # 
  
  ID=sapply(clientes_full,function(x)x$id),
  Nombre=sapply(clientes_full,function(x)x$nombre),
  Edad = sapply(clientes_full, function(x) x$edad),
  Ingreso_Mensual = sapply(clientes_full, function(x) x$ing_men),
  Saldo_Actual = sapply(clientes_full, function(x) x$saldo_now),
  Categoria_Riesgo = sapply(clientes_full, function(x) x$cate_riesgo)
  
  )
#Mostar Tabla 

print(Tb_clientes)
##     ID            Nombre Edad Ingreso_Mensual Saldo_Actual Categoria_Riesgo
## 1  C01  KAKELLY ALVARADO   51            2997        -1343      RIESGO ALTO
## 2  C02 DARNEYI ASTUDILLO   26            4817         -656      RIESGO ALTO
## 3  C03 YULIETH BENAVIDES   45            6349         -972      RIESGO ALTO
## 4  C04    HERNAN CAICEDO   65            5150          228          ESTABLE
## 5  C05  JOSE CASTELLANOS   43            2634         3902          ESTABLE
## 6  C06   MARGGY CASTILLO   46            6818        -1357      RIESGO ALTO
## 7  C07       HERNAN CRUZ   50            5672        -1633      RIESGO ALTO
## 8  C08        MAIRA DIAZ   27            3115         2719          ESTABLE
## 9  C09  CRISTINA GARNICA   33            4806         1363          ESTABLE
## 10 C10    LUIS GUTIERREZ   48            7769         -715      RIESGO ALTO
## 11 C11 CLAUDIA GUTIERREZ   31            6794        -2587      RIESGO ALTO
## 12 C12    ANDRES JIMENEZ   51            7076         3005          ESTABLE
## 13 C13   JAMES MARMOLEJO   54            2275          622          ESTABLE
## 14 C14  JHONATAN MARQUEZ   42            6991        -1905      RIESGO ALTO
## 15 C15     MARIA MORALES   60            3409         4378          ESTABLE
## 16 C16      BRAYAN MORAN   25            4239        -1945      RIESGO ALTO
## 17 C17      UBALDO MUÑOZ   47            7032         2371          ESTABLE
## 18 C18       JESUS NIETO   32            4033         1528          ESTABLE
## 19 C19        MARIA POLO   56            6600         1281          ESTABLE
## 20 C20    JENNY QUINTERO   47            5778          186          ESTABLE
## 21 C21      LUIS RAMIREZ   31            6138        -1873      RIESGO ALTO
## 22 C22    MARIA RESTREPO   45            4512        -1387      RIESGO ALTO
## 23 C23       DIEGO RIAÑO   61            7819          508          ESTABLE
## 24 C24         JUAN RIOS   45            6465        -2589      RIESGO ALTO
## 25 C25         DIEGO ROA   61            5890        -1947      RIESGO ALTO
## 26 C26    JUAN RODRIGUEZ   60            6305        -2712      RIESGO ALTO
## 27 C27 ADRIANA RODRIGUEZ   49            3999          196          ESTABLE
## 28 C28     GISELLE ROJAS   32            6016         -423      RIESGO ALTO
## 29 C29     MANUEL ROMERO   52            6854          335          ESTABLE
## 30 C30     MARIA SANCHEZ   27            5916         1994          ESTABLE
## 31 C31   JEINER VELANDIA   61            2766         2881          ESTABLE
## 32 C32    ALEXANDER VERA   62            6373         4514          ESTABLE

Paso a paso

  1. Defino la base de nombres: creo el vector NombreAlt con 32 nombres.
  2. Genero IDs automáticos: escribo IdAut() que usa sprintf("C%02d", 1:32) para producir C01C32.
  3. Creo la función del cliente: cliente_crear(id, nombre, edad, ing_men, saldo_now) clasifica el riesgo con if (saldo_now < 0)"RIESGO ALTO"; en caso contrario "ESTABLE", y devuelve una lista con todos los campos + cate_riesgo.
  4. Simulo datos: genero edades1, ingresos y saldos aleatorios; asigno ids <- IdAut().
  5. Construyo la lista de clientes: recorro 1:32 y guardo en clientes_full[[i]] la lista devuelta por cliente_crear(...) para cada persona.
  6. Armo el data frame: uso sapply() para extraer cada campo y creo Tb_clientes con las columnas ID, Nombre, Edad, Ingreso_Mensual, Saldo_Actual y Categoria_Riesgo.
  7. Verifico: imprimo Tb_clientes para confirmar que cada cliente quedó registrado y clasificado.

PUNTO 3B - Análisis Clientes Sencilla

Esta versión encapsula todo en una sola función: recibe los datos de un cliente, calcula su nivel de riesgo según el saldo y entrega una lista con la información lista para usar o almacenar. Ideal para crear y revisar casos individuales de forma rápida.

#======= ======= ======= ======= ======= ======= ======= PUNTO 3 SENCILLO, lista y función, IF
## Paso 1 ##
## Crar una función que tiene dos elementos 1- Validador de Riesgo con un IF 
# 2-Crea una lista 
CLIENTRISK <-function(ID,NOMBRE,EDAD,INGRESOMEN,SALDOACT) # DECLARO LOS OBJETOS QUE VA A TENER LA FUNCIÓN
{#ABRO LA FUNCIÓN
  #VALIDO CON UN IF NIVEL DE RIESGO
  if (SALDOACT>=0)
    {NVLRIESGO <- "ESTABLE"}
  else{NVLRIESGO <- "RIESGO ALTO"}
  
  ##AHORA CREO LA LISTA , LA LISTA ESTÁ DENTRO DE LA FUNCTION POR ESO NO REQUIERO LLAMARLA DESPUES ESTÁ INTEGRADA 
  CLIENT <- list(
    ID=ID,
    NOMBRE=NOMBRE,
    EDAD=EDAD,
    INGRESOMEN=INGRESOMEN,
    SALDOACT=SALDOACT,
    NVLRIESGO=NVLRIESGO
  )
  return(CLIENT)
  
}
####### Ahora voy a crear un cliente usando la función creada CLIENTRISK

ClienteC001 <- CLIENTRISK("C001", "JEINER VELANDIA", 37,6000,-200)

print(ClienteC001)#imprimo clientes, a diferencia del ejercioa anterior solo me va a mostar los datos de los clientes creados.
## $ID
## [1] "C001"
## 
## $NOMBRE
## [1] "JEINER VELANDIA"
## 
## $EDAD
## [1] 37
## 
## $INGRESOMEN
## [1] 6000
## 
## $SALDOACT
## [1] -200
## 
## $NVLRIESGO
## [1] "RIESGO ALTO"

Paso a paso

  1. Defino la función CLIENTRISK(ID, NOMBRE, EDAD, INGRESOMEN, SALDOACT).
  2. Valido el riesgo con if: si SALDOACT >= 0NVLRIESGO = "ESTABLE"; de lo contrario NVLRIESGO = "RIESGO ALTO".
  3. Creo la lista CLIENT que reúne todos los campos más NVLRIESGO.
  4. Devuelvo la lista con return(CLIENT).
  5. Genero un ejemplo: ClienteC001 <- CLIENTRISK("C001", "JEINER VELANDIA", 37, 6000, -200).
  6. Imprimo el resultado para verificar los datos y la clasificación de riesgo.

PUNTO 4 - Clasificación Ingresos

se solicitó crear un data frame en R con información ficticia de 50 clientes, incluyendo nombre, edad, ingresos mensuales y estado civil. La columna de estado civil debía transformarse en un factor para permitir un análisis estadístico más preciso. A partir de este conjunto de datos, se realizó un análisis descriptivo con la función summary(), interpretando medidas de tendencia central y dispersión para edad e ingresos, así como la distribución de categorías de estado civil. Finalmente, se aplicaron filtros para identificar clientes solteros con ingresos superiores a 3000 y se programó un ciclo for para clasificar los ingresos en tres categorías: Bajo (<2000), Medio (2000–4000) y Alto (>4000).

#======= ======= ======= ======= ======= ======= ======= PUNTO 4 ===============================

#### 1ER PASO ===
#### Crear un vector con los nombres 
# Estos nombres son los 32 de la clase mas 18 creados aletoriament

NAMESBD <- c("KAKELLY ALVARADO","DARNEYI ASTUDILLO","YULIETH BENAVIDES","HERNAN CAICEDO","JOSE CASTELLANOS",
             "MARGGY CASTILLO","HERNAN CRUZ","MAIRA DIAZ","CRISTINA GARNICA","LUIS GUTIERREZ",
             "CLAUDIA GUTIERREZ","ANDRES JIMENEZ","JAMES MARMOLEJO","JHONATAN MARQUEZ","MARIA MORALES",
             "BRAYAN MORAN","UBALDO MUÑOZ","JESUS NIETO","MARIA POLO","JENNY QUINTERO",
             "LUIS RAMIREZ","MARIA RESTREPO","DIEGO RIAÑO","JUAN RIOS","DIEGO ROA",
             "JUAN RODRIGUEZ","ADRIANA RODRIGUEZ","GISELLE ROJAS","MANUEL ROMERO","MARIA SANCHEZ",
             "JEINER VELANDIA","ALEXANDER VERA", "SOFIA MENDEZ","NICOLAS CAMPO","FABIOLA CORDOBA","MATEO BERMUDEZ","ANGELA TAFUR",
             "JORGE SALAMANCA","NATALIA CARDENAS","HUGO BELTRAN","VICTOR MONTENEGRO","CAMILA PEÑA",
             "MARIO CARRILLO","ANDREA MURILLO","OSCAR PARRA","CAROLINA LOPEZ","FERNANDO PRIETO",
             "KAREN ORTIZ","EDUARDO PEREZ","VALENTINA TORO")

###2DO PASO 
##Crear un SED para datos aleatorios 
set.seed(123)
n <- length(NAMESBD)# EVITA ESCRIBIR EL NUMERO 5 EN LOS SAMPLES Y LO REMPLAZO POR n 

EDAD <- sample(18:65,n, replace = TRUE) #Creo un Sample para crear edades aletorias entre 18 y 65 con 50 datos se pueden repetir
INGRESO <- sample(1000:8000,n,replace = TRUE)#creo los ingresos aleatorios entre 2000 y 8000

### Creo un objeto llamado estado civil, le agrego un obj llamado prob, lo que busco es que soltero salga70%, casado 25%, divorciado=5%
ESTADO_CIVIL <- sample( c("SOLTERO", "CASADO", "DIVORCIADO"),n, replace = TRUE, prob=c(0.7,0.25,0.05))
FESTADO_CIVIL <- factor(ESTADO_CIVIL,levels = c("Soltero", "Casado", "Divorciado")) #creo un objeto donde almaceno el factor estado civil

##3er paso Creo un data frame Clientes ING 
CLIENTES_ING <- data.frame( #mi data frame se llama CLIENTES_ING
  Nombre=NAMESBD, #DENTRO DEL DATA FRAME / HOJA DE EXCEL, ESTOY cargando los datos que cree. 
  Edad=EDAD,
  Ingresos=INGRESO,
  EstadoCivil=ESTADO_CIVIL

)

##### 4TO PASO ANALISIS ESTIDISTICO BASICO 

summary(CLIENTES_ING)
##     Nombre               Edad          Ingresos    EstadoCivil       
##  Length:50          Min.   :20.00   Min.   :1040   Length:50         
##  Class :character   1st Qu.:29.00   1st Qu.:2864   Class :character  
##  Mode  :character   Median :42.50   Median :4641   Mode  :character  
##                     Mean   :40.26   Mean   :4483                     
##                     3rd Qu.:50.50   3rd Qu.:6202                     
##                     Max.   :62.00   Max.   :7741
# aca hago el promedio, mediana, desviación estandar  desde el data frame y le digo que tome Edad
mean(CLIENTES_ING$edad); median(CLIENTES_ING$edad); sd(CLIENTES_ING$edad)  
## Warning in mean.default(CLIENTES_ING$edad): argument is not numeric or logical:
## returning NA
## [1] NA
## NULL
## [1] NA
# aca hago el promedio, mediana, desviación estandar  desde el data frame y le digo que tome INGRESOS
mean(CLIENTES_ING$Ingresos); median(CLIENTES_ING$Ingresos); sd(CLIENTES_ING$Ingresos)
## [1] 4483.36
## [1] 4641
## [1] 2057.642
# Acá voy a usar el table para saber la distribución de cattegorias

table(CLIENTES_ING$EstadoCivil)
## 
##     CASADO DIVORCIADO    SOLTERO 
##          8          2         40
prop.table(table(CLIENTES_ING$EstadoCivil)) # Uso el prop.table para saber los porcentajes % relativas de estado civil
## 
##     CASADO DIVORCIADO    SOLTERO 
##       0.16       0.04       0.80
#### 5to paso
### Filtro para solteros alto 

CLIENTES_ING ### QUIERO VER EL DATA FRAME COMPLETO
##               Nombre Edad Ingresos EstadoCivil
## 1   KAKELLY ALVARADO   48     5817     SOLTERO
## 2  DARNEYI ASTUDILLO   32     4936     SOLTERO
## 3  YULIETH BENAVIDES   31     5088     SOLTERO
## 4     HERNAN CAICEDO   20     3906  DIVORCIADO
## 5   JOSE CASTELLANOS   59     5248     SOLTERO
## 6    MARGGY CASTILLO   60     1293     SOLTERO
## 7        HERNAN CRUZ   54     1276     SOLTERO
## 8         MAIRA DIAZ   31     6582     SOLTERO
## 9   CRISTINA GARNICA   42     1040     SOLTERO
## 10    LUIS GUTIERREZ   43     7574      CASADO
## 11 CLAUDIA GUTIERREZ   44     7233     SOLTERO
## 12    ANDRES JIMENEZ   22     1315      CASADO
## 13   JAMES MARMOLEJO   44     7671     SOLTERO
## 14  JHONATAN MARQUEZ   45     3821     SOLTERO
## 15     MARIA MORALES   26     3794      CASADO
## 16      BRAYAN MORAN   46     3503      CASADO
## 17      UBALDO MUÑOZ   52     7741  DIVORCIADO
## 18       JESUS NIETO   25     4925     SOLTERO
## 19        MARIA POLO   43     2182     SOLTERO
## 20    JENNY QUINTERO   24     1751     SOLTERO
## 21      LUIS RAMIREZ   59     4280     SOLTERO
## 22    MARIA RESTREPO   26     1373     SOLTERO
## 23       DIEGO RIAÑO   36     2841      CASADO
## 24         JUAN RIOS   53     7128     SOLTERO
## 25         DIEGO ROA   31     3081     SOLTERO
## 26    JUAN RODRIGUEZ   34     5611     SOLTERO
## 27 ADRIANA RODRIGUEZ   60     5108     SOLTERO
## 28     GISELLE ROJAS   56     3116      CASADO
## 29     MANUEL ROMERO   29     7133      CASADO
## 30     MARIA SANCHEZ   32     7014     SOLTERO
## 31   JEINER VELANDIA   49     1754     SOLTERO
## 32    ALEXANDER VERA   59     7552     SOLTERO
## 33      SOFIA MENDEZ   62     6427     SOLTERO
## 34     NICOLAS CAMPO   24     6208     SOLTERO
## 35   FABIOLA CORDOBA   26     2005     SOLTERO
## 36    MATEO BERMUDEZ   58     3584     SOLTERO
## 37      ANGELA TAFUR   27     3338     SOLTERO
## 38   JORGE SALAMANCA   40     2447     SOLTERO
## 39  NATALIA CARDENAS   44     4951     SOLTERO
## 40      HUGO BELTRAN   24     4357     SOLTERO
## 41 VICTOR MONTENEGRO   44     4979     SOLTERO
## 42       CAMILA PEÑA   49     5766     SOLTERO
## 43    MARIO CARRILLO   55     7264     SOLTERO
## 44    ANDREA MURILLO   42     2133     SOLTERO
## 45       OSCAR PARRA   51     4229      CASADO
## 46    CAROLINA LOPEZ   46     6183     SOLTERO
## 47   FERNANDO PRIETO   22     6602     SOLTERO
## 48       KAREN ORTIZ   25     2933     SOLTERO
## 49     EDUARDO PEREZ   29     2500     SOLTERO
## 50    VALENTINA TORO   30     5575     SOLTERO
SINGLE_HIGH <- subset(CLIENTES_ING, Ingresos>3000 & EstadoCivil=="SOLTERO") #CREO EL FILTRO 
SINGLE_HIGH #MUESTRO EL FILTRTO 
##               Nombre Edad Ingresos EstadoCivil
## 1   KAKELLY ALVARADO   48     5817     SOLTERO
## 2  DARNEYI ASTUDILLO   32     4936     SOLTERO
## 3  YULIETH BENAVIDES   31     5088     SOLTERO
## 5   JOSE CASTELLANOS   59     5248     SOLTERO
## 8         MAIRA DIAZ   31     6582     SOLTERO
## 11 CLAUDIA GUTIERREZ   44     7233     SOLTERO
## 13   JAMES MARMOLEJO   44     7671     SOLTERO
## 14  JHONATAN MARQUEZ   45     3821     SOLTERO
## 18       JESUS NIETO   25     4925     SOLTERO
## 21      LUIS RAMIREZ   59     4280     SOLTERO
## 24         JUAN RIOS   53     7128     SOLTERO
## 25         DIEGO ROA   31     3081     SOLTERO
## 26    JUAN RODRIGUEZ   34     5611     SOLTERO
## 27 ADRIANA RODRIGUEZ   60     5108     SOLTERO
## 30     MARIA SANCHEZ   32     7014     SOLTERO
## 32    ALEXANDER VERA   59     7552     SOLTERO
## 33      SOFIA MENDEZ   62     6427     SOLTERO
## 34     NICOLAS CAMPO   24     6208     SOLTERO
## 36    MATEO BERMUDEZ   58     3584     SOLTERO
## 37      ANGELA TAFUR   27     3338     SOLTERO
## 39  NATALIA CARDENAS   44     4951     SOLTERO
## 40      HUGO BELTRAN   24     4357     SOLTERO
## 41 VICTOR MONTENEGRO   44     4979     SOLTERO
## 42       CAMILA PEÑA   49     5766     SOLTERO
## 43    MARIO CARRILLO   55     7264     SOLTERO
## 46    CAROLINA LOPEZ   46     6183     SOLTERO
## 47   FERNANDO PRIETO   22     6602     SOLTERO
## 50    VALENTINA TORO   30     5575     SOLTERO
### 5TO PASO  voy a crear un data Frame para guardar los datos 

### CICLO FOR PARA 

for (i in 1:nrow(CLIENTES_ING))
{ # Abro ciclo FOR
  ING_FOR <- CLIENTES_ING$Ingresos[i] #### Acá estoy creando el objeto ING_FOR el cual va traer la información del DF Ingresos,  y se va a guiar por el i
  NAM_FOR <- CLIENTES_ING$Nombre[i]#### Acá estoy creando el objeto ING_FOR el cual va traer la información del DF Nombre,  y se va a guiar por el i
  
  ### condicional======
  
  if(ING_FOR<2000){cat(i,NAM_FOR, "INGRESO ES DE",ING_FOR,"CATEGORIA  BAJO \n")} ## INICIO CON El i para que aparezca la numeración
  else if(ING_FOR<=4000){cat(i,NAM_FOR,"INGRESO ES DE",ING_FOR,"CATEGORIA  MEDIO\n" )}
  else {cat(i,NAM_FOR,"INGRESO ES DE",ING_FOR,"CATEGORIA  ALTO\n")}
 
   }
## 1 KAKELLY ALVARADO INGRESO ES DE 5817 CATEGORIA  ALTO
## 2 DARNEYI ASTUDILLO INGRESO ES DE 4936 CATEGORIA  ALTO
## 3 YULIETH BENAVIDES INGRESO ES DE 5088 CATEGORIA  ALTO
## 4 HERNAN CAICEDO INGRESO ES DE 3906 CATEGORIA  MEDIO
## 5 JOSE CASTELLANOS INGRESO ES DE 5248 CATEGORIA  ALTO
## 6 MARGGY CASTILLO INGRESO ES DE 1293 CATEGORIA  BAJO 
## 7 HERNAN CRUZ INGRESO ES DE 1276 CATEGORIA  BAJO 
## 8 MAIRA DIAZ INGRESO ES DE 6582 CATEGORIA  ALTO
## 9 CRISTINA GARNICA INGRESO ES DE 1040 CATEGORIA  BAJO 
## 10 LUIS GUTIERREZ INGRESO ES DE 7574 CATEGORIA  ALTO
## 11 CLAUDIA GUTIERREZ INGRESO ES DE 7233 CATEGORIA  ALTO
## 12 ANDRES JIMENEZ INGRESO ES DE 1315 CATEGORIA  BAJO 
## 13 JAMES MARMOLEJO INGRESO ES DE 7671 CATEGORIA  ALTO
## 14 JHONATAN MARQUEZ INGRESO ES DE 3821 CATEGORIA  MEDIO
## 15 MARIA MORALES INGRESO ES DE 3794 CATEGORIA  MEDIO
## 16 BRAYAN MORAN INGRESO ES DE 3503 CATEGORIA  MEDIO
## 17 UBALDO MUÑOZ INGRESO ES DE 7741 CATEGORIA  ALTO
## 18 JESUS NIETO INGRESO ES DE 4925 CATEGORIA  ALTO
## 19 MARIA POLO INGRESO ES DE 2182 CATEGORIA  MEDIO
## 20 JENNY QUINTERO INGRESO ES DE 1751 CATEGORIA  BAJO 
## 21 LUIS RAMIREZ INGRESO ES DE 4280 CATEGORIA  ALTO
## 22 MARIA RESTREPO INGRESO ES DE 1373 CATEGORIA  BAJO 
## 23 DIEGO RIAÑO INGRESO ES DE 2841 CATEGORIA  MEDIO
## 24 JUAN RIOS INGRESO ES DE 7128 CATEGORIA  ALTO
## 25 DIEGO ROA INGRESO ES DE 3081 CATEGORIA  MEDIO
## 26 JUAN RODRIGUEZ INGRESO ES DE 5611 CATEGORIA  ALTO
## 27 ADRIANA RODRIGUEZ INGRESO ES DE 5108 CATEGORIA  ALTO
## 28 GISELLE ROJAS INGRESO ES DE 3116 CATEGORIA  MEDIO
## 29 MANUEL ROMERO INGRESO ES DE 7133 CATEGORIA  ALTO
## 30 MARIA SANCHEZ INGRESO ES DE 7014 CATEGORIA  ALTO
## 31 JEINER VELANDIA INGRESO ES DE 1754 CATEGORIA  BAJO 
## 32 ALEXANDER VERA INGRESO ES DE 7552 CATEGORIA  ALTO
## 33 SOFIA MENDEZ INGRESO ES DE 6427 CATEGORIA  ALTO
## 34 NICOLAS CAMPO INGRESO ES DE 6208 CATEGORIA  ALTO
## 35 FABIOLA CORDOBA INGRESO ES DE 2005 CATEGORIA  MEDIO
## 36 MATEO BERMUDEZ INGRESO ES DE 3584 CATEGORIA  MEDIO
## 37 ANGELA TAFUR INGRESO ES DE 3338 CATEGORIA  MEDIO
## 38 JORGE SALAMANCA INGRESO ES DE 2447 CATEGORIA  MEDIO
## 39 NATALIA CARDENAS INGRESO ES DE 4951 CATEGORIA  ALTO
## 40 HUGO BELTRAN INGRESO ES DE 4357 CATEGORIA  ALTO
## 41 VICTOR MONTENEGRO INGRESO ES DE 4979 CATEGORIA  ALTO
## 42 CAMILA PEÑA INGRESO ES DE 5766 CATEGORIA  ALTO
## 43 MARIO CARRILLO INGRESO ES DE 7264 CATEGORIA  ALTO
## 44 ANDREA MURILLO INGRESO ES DE 2133 CATEGORIA  MEDIO
## 45 OSCAR PARRA INGRESO ES DE 4229 CATEGORIA  ALTO
## 46 CAROLINA LOPEZ INGRESO ES DE 6183 CATEGORIA  ALTO
## 47 FERNANDO PRIETO INGRESO ES DE 6602 CATEGORIA  ALTO
## 48 KAREN ORTIZ INGRESO ES DE 2933 CATEGORIA  MEDIO
## 49 EDUARDO PEREZ INGRESO ES DE 2500 CATEGORIA  MEDIO
## 50 VALENTINA TORO INGRESO ES DE 5575 CATEGORIA  ALTO

Paso a paso

  1. Defino la función CLIENTRISK(ID, NOMBRE, EDAD, INGRESOMEN, SALDOACT).
  2. Valido el riesgo con if: si SALDOACT >= 0NVLRIESGO = "ESTABLE"; de lo contrario NVLRIESGO = "RIESGO ALTO".
  3. Creo la lista CLIENT que reúne todos los campos más NVLRIESGO.
  4. Devuelvo la lista con return(CLIENT).
  5. Genero un ejemplo: ClienteC001 <- CLIENTRISK("C001", "JEINER VELANDIA", 37, 6000, -200).
  6. Imprimo el resultado para verificar los datos y la clasificación de riesgo.

PUNTO 5A - Runif 100 datos

En el Punto 5 se planteó la simulación de un sistema de control de calidad automatizado en una planta de alimentos, donde se monitorea la temperatura de un lote durante el empaquetado. El ejercicio consiste en generar lecturas aleatorias de temperatura entre 20 °C y 35 °C usando un bucle repeat, imprimir cada valor y detener el proceso con un break cuando se registre una temperatura superior a 30 °C. Todas las temperaturas previas se almacenan en un vector y, con ellas, se calcula la media, la mediana y la desviación estándar hasta el momento de corte. De este modo se simula cómo un sistema automático puede prevenir riesgos en la calidad del producto.

#========================================= PUNTO 5==================================
#USANDO ANY  en el REPEAT en este caso correo 100 RUN IF y luego evalua, en este caso el va a crear los 100 datos 

#Abre REPEAT 
repeat {
  
#CREO LAS VARIABLE PARA LA TEMPERATURA DE MANERA ALETAORIA CON UN RUNIF Y UN ROUND PARA DEJARLO SIN DECIMALES
  
  Temperature <- runif(100,min = 20, max = 35)
  Temperature <- round(Temperature,digits =0 )
  
  # ABRO IF # QUIERO PROBAR UN ANY, EL any revisa todos los 100 vectores 
  
  if(any(Temperature>30)){ 
    
    print("ALERTA !!!! LA TEMPERATURA HA SUPERADO LOS 30ºC")
    
    #El break va dentro del IF 
    break 
  } # CIERRO IF
  

  } # CIERRO REPEAT
## [1] "ALERTA !!!! LA TEMPERATURA HA SUPERADO LOS 30ºC"
#Estadistico, como use el Any calcurala sobre 100
PROMEDIO <- mean(Temperature)
DSV <- sd(Temperature)
MEDIANA <- median(Temperature)


####IMPRIMIR 
Temperature
##   [1] 33 31 30 29 26 28 33 29 33 25 31 24 29 27 24 28 34 34 24 25 35 29 34 27 26
##  [26] 30 22 29 24 34 29 28 26 33 25 24 23 23 27 24 23 30 21 31 25 26 32 34 24 34
##  [51] 31 30 21 26 27 28 30 34 29 26 28 21 24 26 23 32 22 32 28 30 23 29 25 31 26
##  [76] 35 35 31 24 23 29 24 28 32 23 26 27 33 34 33 30 34 28 29 25 25 20 28 33 20
cat(sprintf("El promedio de temperatura ha sido de: %.2f ºC \n La Desviación estándar de la temperatura es de %.2f ºC \n La Mediana de la temperatura ha sido de %.2f",
PROMEDIO, DSV,MEDIANA))
## El promedio de temperatura ha sido de: 28.00 ºC 
##  La Desviación estándar de la temperatura es de 4.01 ºC 
##  La Mediana de la temperatura ha sido de 28.00

Paso a paso

  1. Inicio del ciclo: abro un repeat { ... } (se ejecuta indefinidamente hasta un break).
  2. Generación de datos: dentro del ciclo creo 100 temperaturas aleatorias entre 20 y 35 con runif(100, 20, 35) y las redondeo a enteros con round(..., 0).
  3. Chequeo global: uso any(Temperature > 30) para verificar si al menos una de las 100 lecturas supera 30 °C.
  4. Alerta y corte: si la condición es verdadera, imprimo el mensaje de alerta y ejecuto break para salir del repeat.
  5. Cálculo de estadísticos: fuera del ciclo, calculo sobre el vector Temperature la media con mean(), la desviación estándar con sd() y la mediana con median().
  6. Salida: muestro el vector de temperaturas y reporto los tres estadísticos formateados con cat(sprintf(...)).

PUNTO 5B - Run if - Inmediato

En este ejercicio se simula un sistema de control de calidad que registra temperaturas una por una, deteniendo el proceso inmediatamente cuando aparece un valor mayor a 30 °C. Todas las mediciones registradas hasta ese punto se almacenan en un vector, y con ellas se calculan estadísticos descriptivos (media, desviación estándar y mediana). De esta forma se representa cómo un sistema automatizado puede detenerse ante un riesgo y analizar la información previa.

#========================================= PUNTO 5==================================
#ACA EL CICLO SE ROMPE APENAS DETECTE UN VALOR POR ENCIMA DE 3O 
Temperature2 <- NULL## Usare Temperature2 como objeto, le asigno un NULL para evitar que al volver a correr el Ciclo quedé con datos
Temperature2 # El Null garantiza que no tendre datos adentro cuando repita el  ciclo 
## NULL
#Abre REPEAT 
repeat {
  
  #DEBO CREAR DOS VARIABLES UNA TEMP Y OTRA TEMPERATURE2, LA RAZÓN ES QUE QUIEREO QUE EL SISTEMA PARE APENAS DETECTE POR ENCIMA DE 30ºC
  
  Temp <- round(runif(1, min = 20, max = 35),0) # Acá usare un Round para dejar sin decimales la temperatura, el EL RUNIF solo creará de a un
 
  #CREO UN VECTOR QUE VA GUARDANDO LOS DATOS GENERADOS 
  
  Temperature2 <- c(Temperature2,Temp)#Va guardando el vector a medida que lo genero con el RUN IF en estte caso Temperature2 Es mi VECTOR
  
  cat("Temperatura registrada",Temp," ºC\n")
  
  if(Temp>30){ 
    
   print("ALERTA !!!! LA TEMPERATURA HA SUPERADO LOS 30ºC")
    
    #El break va dentro del IF 
    break 
  } # CIERRO IF
  
  
} # CIERRO REPEAT
## Temperatura registrada 21  ºC
## Temperatura registrada 22  ºC
## Temperatura registrada 32  ºC
## [1] "ALERTA !!!! LA TEMPERATURA HA SUPERADO LOS 30ºC"
#Estadistico, como use el Any calcurala sobre 100
PROMEDIO <- mean(Temperature2)
DSV <- sd(Temperature2)
MEDIANA <- median(Temperature2)


####IMPRIMIR 
Temperature2 # Muestro los valores que guardo el Vector para comprobar que si paro el ciclo en la primera de >30
## [1] 21 22 32
cat(sprintf(" 1.El promedio de temperatura ha sido de: %.2f ºC \n 2.La Desviación estándar de la temperatura es de %.2f ºC \n 3.La Mediana de la temperatura ha sido de %.2f ºC",
            PROMEDIO, DSV,MEDIANA))
##  1.El promedio de temperatura ha sido de: 25.00 ºC 
##  2.La Desviación estándar de la temperatura es de 6.08 ºC 
##  3.La Mediana de la temperatura ha sido de 22.00 ºC

Paso a paso

  1. Inicialización: creo el objeto Temperature2 <- NULL para asegurar que empiece vacío y pueda almacenar las lecturas.
  2. Bucle repeat: inicio un ciclo infinito que solo terminará con un break.
  3. Generación de datos: en cada iteración genero una temperatura aleatoria entre 20 °C y 35 °C con runif(1, 20, 35) y la redondeo sin decimales.
  4. Almacenamiento: agrego la nueva lectura al vector Temperature2 para conservar el historial de valores.
  5. Impresión: muestro en pantalla cada temperatura registrada con cat().
  6. Condición de corte: si el valor generado es mayor a 30 °C, imprimo un mensaje de alerta y ejecuto break para detener el ciclo.
  7. Estadísticos: calculo la media (mean()), la desviación estándar (sd()) y la mediana (median()) sobre los valores acumulados en Temperature2.
  8. Resultados: muestro el vector completo de temperaturas y los estadísticos resumidos en un formato claro con cat(sprintf(...)).