#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%.