#Carga libreria y datos

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
df <- read.csv("datos_negocios_extra_finanzas.csv", stringsAsFactors = FALSE)
head(df)
##     Fondo Rendimiento_Anual Volatilidad Riesgo
## 1 Fondo C              8.74        4.63   Bajo
## 2 Fondo B              3.01        3.30   Alto
## 3 Fondo B              7.04        2.59   Bajo
## 4 Fondo C              1.23        2.68   Alto
## 5 Fondo C             12.98        2.92   Alto
## 6 Fondo A             -2.51        0.85   Alto
str(df)
## 'data.frame':    100 obs. of  4 variables:
##  $ Fondo            : chr  "Fondo C" "Fondo B" "Fondo B" "Fondo C" ...
##  $ Rendimiento_Anual: num  8.74 3.01 7.04 1.23 12.98 ...
##  $ Volatilidad      : num  4.63 3.3 2.59 2.68 2.92 0.85 1.38 3.61 1.7 4.61 ...
##  $ Riesgo           : chr  "Bajo" "Alto" "Bajo" "Alto" ...

Cargamos los datos y rectificamos qué las columnas tienen su base, esto nos sirve para confirmar que efectivamente hay 4 variables;Fondo,Riesgo,Rendimiento Anual y Volatilidad.

#Características generales

# Número de filas y columnas
dim(df)
## [1] 100   4
# Nombres de las variables
names(df)
## [1] "Fondo"             "Rendimiento_Anual" "Volatilidad"      
## [4] "Riesgo"
# Tipos de variables
sapply(df, class)
##             Fondo Rendimiento_Anual       Volatilidad            Riesgo 
##       "character"         "numeric"         "numeric"       "character"

Sacamos lo básico de la base: cuántos datos tiene (100 filas), cuántas columnas (4) y qué tipo de variable es cada una (numérica o categórica).

#Análisis de variables numéricas

# Resumen de Rendimiento_Anual
summary(df$Rendimiento_Anual)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -4.770   1.522   5.510   5.823  11.008  14.810
# Resumen de Volatilidad
summary(df$Volatilidad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.510   1.567   2.760   2.718   3.820   4.980
# Histogramas
hist(df$Rendimiento_Anual, main="Histograma Rendimiento Anual", col="skyblue")

hist(df$Volatilidad, main="Histograma Volatilidad", col="orange")

# Boxplots (para ver outliers)
boxplot(df$Rendimiento_Anual, main="Boxplot Rendimiento Anual", col="lightgreen")

boxplot(df$Volatilidad, main="Boxplot Volatilidad", col="lightpink")

El summary nos da medidas de tendencia (media, mediana) y de dispersión (mínimo, máximo, cuartiles).

Los histogramas nos permiten ver la forma de la distribución (si es simétrica o no).

Los boxplots ayudan nos ayudan a detectar valores atípicos (outliers).

#Análisis de variables categóricas

# Tablas de frecuencia
table(df$Fondo)
## 
## Fondo A Fondo B Fondo C 
##      35      33      32
table(df$Riesgo)
## 
##  Alto  Bajo Medio 
##    31    37    32
# Gráficos de barras
barplot(table(df$Fondo), main="Distribución de Fondos", col="lightblue", las=2)

barplot(table(df$Riesgo), main="Distribución de Riesgo", col="salmon")

Aqui podemos observar cuantos datos hay en cada categoría. Por ejemplo, qué tipo de fondo es más frecuente o qué nivel de riesgo domina en la base. Los gráficos de barras permiten visualizarlo rápido.

#Valores Faltantes

# Revisión de valores NA
colSums(is.na(df))
##             Fondo Rendimiento_Anual       Volatilidad            Riesgo 
##                 0                 0                 0                 0

Con esto confirmamos que si hay datos vacíos. En este caso, todas las columnas tienen 0 valores faltantes, lo que significa que la base está completa.

#Variables

df$Riesgo_Alto <- ifelse(tolower(df$Riesgo) == "alto", 1, 0)
table(df$Riesgo, df$Riesgo_Alto)
##        
##          0  1
##   Alto   0 31
##   Bajo  37  0
##   Medio 32  0

Necesitamos una variable 0/1 para trabajar proporciones para que se Transformé Riesgo en una binaria:

Si el riesgo es “Alto”, se le asigna 1.

Si es “Medio” o “Bajo”, se le asigna 0.

#Distribuciones muestrales

# Media y desviación estándar poblacional
mu <- mean(df$Rendimiento_Anual, na.rm = TRUE)
s <- sd(df$Rendimiento_Anual, na.rm = TRUE)
N <- nrow(df)
mu; s; N
## [1] 5.8231
## [1] 5.32964
## [1] 100
n <- 30
SE <- (s / sqrt(n)) * sqrt((N - n) / (N - 1))
SE
## [1] 0.8182173
# Probabilidad de que el promedio sea mayor a 0.07
c <- 0.07
p1 <- 1 - pnorm(c, mean = mu, sd = SE)
# Probabilidad de que el promedio esté entre 0.05 y 0.09
a <- 0.05; b <- 0.09
p2 <- pnorm(b, mean = mu, sd = SE) - pnorm(a, mean = mu, sd = SE)
p1; p2
## [1] 1
## [1] 3.603537e-13

Calculamos el promedio (mu) y desviación estándar (s) del rendimiento. Con n=30 construimosla distribución muestral de la media. Ejemplo: P(X̄ > 0.07): probabilidad de que el promedio sea mayor a 7%. P(0.05 < X̄ < 0.09): probabilidad de que esté entre 5% y 9%.

#Proporción Muestral

# Proporción poblacional
p <- mean(df$Riesgo_Alto)
N <- nrow(df)
# Tamaño de muestra
n <- 30
# Error estándar con corrección por población finita
SE_p <- sqrt(p*(1-p)/n) * sqrt((N-n)/(N-1))
SE_p
## [1] 0.07100292
# Probabilidad de que más del 30% tenga riesgo alto
c <- 0.3
p3 <- 1 - pnorm(c, mean = p, sd = SE_p)
# Probabilidad de que esté entre 20% y 40%
a <- 0.2; b <- 0.4
p4 <- pnorm(b, mean = p, sd = SE_p) - pnorm(a, mean = p, sd = SE_p)
p3; p4
## [1] 0.5560015
## [1] 0.8368583

La proporción poblacional (p) indica cuántos fondos tienen riesgo alto. Con n=30 se calcula la distribución muestral de esa proporción. Ejemplo: P(p̂ > 0.3): probabilidad de que más del 30% tenga riesgo alto. P(0.2 < p̂ < 0.4): probabilidad de que la proporción esté entre 20% y 40%.