sd(DatosNuevos3$Currentprice)
## [1] 183.8171
sd(DatosNuevos3$Marketcap)
## [1] 1.67007e+11
sd(DatosNuevos3$Revenuegrowth)
## [1] 0.2440448
sd(DatosNuevos3$Weight)
## [1] 0.003004667
sd(DatosNuevos3$Currentprice)/mean(DatosNuevos3$Currentprice)*100
## [1] 90.82266
sd(DatosNuevos3$Marketcap)/mean(DatosNuevos3$Marketcap)*100
## [1] 157.4172
sd(DatosNuevos3$Revenuegrowth)/mean(DatosNuevos3$Revenuegrowth)*100
## [1] 198.4827
sd(DatosNuevos3$Weight)/mean(DatosNuevos3$Weight)*100
## [1] 157.4172
ggplot(DatosNuevos3,aes(x=Industry))+
geom_bar(fill="blue")+
labs(title="Diagrama de barras para conteo por industria",x="Industria",y="Conteo")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
ggplot(DatosNuevos3,aes(x=City))+
geom_bar(fill="red")+
labs(title="Diagrama de barras para conteo por ciudad",x="Ciudad",y="Conteo")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
g1=ggplot(DatosNuevos3,aes(x=Currentprice))+
geom_histogram(fill="green")+
labs(title="Histograma para Precio actual",x="Precio (USD Dollars)",y="Conteo")
g2=ggplot(DatosNuevos3,aes(x=Marketcap))+
geom_histogram(fill="yellow")+
labs(title="Histograma para Capitalización de Mercados",x="Precio (USD Dollars)",y="Conteo")
g3=ggplot(DatosNuevos3,aes(x=Revenuegrowth))+
geom_histogram(fill="purple")+
labs(title="Histograma para Crecimiento de ingresos",x="% (Crecimiento)",y="Conteo")
g4=ggplot(DatosNuevos3,aes(x=Weight))+
geom_histogram(fill="brown")+
labs(title="Histograma para Porcentaje de participación en el índice S&P500",x="%(Participación en S&P500)",y="Conteo")
grid.arrange(g1,g2,g3,g4)
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
d1=ggplot(DatosNuevos3,aes(x=Currentprice))+
geom_boxplot(fill="gold")+
labs(title="Diagrama de cajas para Precio actual",x="Precio (USD Dollars)")
d2=ggplot(DatosNuevos3,aes(x=Marketcap))+
geom_boxplot(fill="aquamarine4")+
labs(title="Diagrama de cajas para Capitalización de Mercados",x="Precio (USD Dollars)")
d3=ggplot(DatosNuevos3,aes(x=Revenuegrowth))+
geom_boxplot(fill="pink")+
labs(title="Diagrama de cajas para Crecimiento de ingresos",x="Precio (USD Dollars)")
d4=ggplot(DatosNuevos3,aes(x=Weight))+
geom_boxplot(fill="darkolivegreen1")+
labs(title="Diagrama de cajas para Porcentaje de participación en el índice S&P500",x="%(Participación en S&P500)")
grid.arrange(d1,d2,d3,d4)
ggplot(DatosNuevos3,aes(x=Industry,y=Currentprice))+
geom_boxplot(fill="#BF3EFF")+
labs(title="Diagrama de cajas por grupos",x="Industria",y="Precio actual")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
ggplot(DatosNuevos3,aes(x=City,y=Currentprice))+
geom_boxplot(fill="#BF3EFF")+
labs(title="Diagrama de cajas por grupos",x="Ciudad",y="Precio actual")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
cor(DatosCuantitativos)
## Currentprice Marketcap Revenuegrowth Weight
## Currentprice 1.00000000 0.29244814 0.08680647 0.29244814
## Marketcap 0.29244814 1.00000000 -0.05920392 1.00000000
## Revenuegrowth 0.08680647 -0.05920392 1.00000000 -0.05920392
## Weight 0.29244814 1.00000000 -0.05920392 1.00000000
ggplot(DatosCuantitativos, aes(x=Marketcap,y=Revenuegrowth))+
geom_jitter(color="hotpink")+
geom_smooth(method = lm, color="maroon")+
labs(x="Capitalización de Mercado",y="Crecimiento de ingresos")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(DatosCuantitativos, aes(x=Weight,y=Currentprice))+
geom_jitter(color="hotpink2")+
geom_smooth(method = lm, color="maroon1")+
labs(x="Porcentaje de participación en el índice S&P500",y="Precio actual")
## `geom_smooth()` using formula = 'y ~ x'
# Mostrar tabla
knitr::kable(tabla_variables, caption = "Descripción de las variables utilizadas en el análisis")
| Variable | Descripción | Tipo |
|---|---|---|
| Currentprice | Precio actual del activo | numeric |
| Marketcap | Capitalización de mercado | numeric |
| Revenuegrowth | Crecimiento de ingresos | numeric |
| Weight | Peso asignado en el portafolio | numeric |
Currentprice), se estima que el valor medio
poblacional se encuentra entre 158.38 USD y
246.41 USD, lo que indica una dispersión moderada en
los precios de las acciones dentro del sector financiero.Marketcap), el promedio poblacional se ubica
entre 66.10 mil millones USD y 146.08 mil
millones USD, lo que refleja una alta heterogeneidad en el
tamaño de las empresas analizadas.Revenuegrowth), se estima que el crecimiento
medio poblacional se encuentra entre 6.45% y
18.14%, lo que sugiere un comportamiento financiero
variable entre las compañías del sector.Weight), el promedio poblacional se encuentra
entre 0.00119 y 0.00263, lo que
confirma que la mayoría de las empresas tienen una participación baja en
el índice S&P 500, aunque con algunas diferencias entre ellas.City: empresas
ubicadas en las Top 5 ciudades y aquellas en
Otras ciudades. Esta comparación permite identificar
diferencias relevantes en magnitud y dispersión entre los grupos.City, que
clasifica las observaciones en dos grupos: Top 5
ciudades y Otras ciudades. Esta proporción
permite conocer la distribución relativa de las empresas dentro de cada
subpoblación geográfica y sirve como base para los análisis comparativos
posteriores.City. Esta estimación
permite evaluar si existe una diferencia significativa en la proporción
de éxito (según el criterio definido previamente) entre empresas
ubicadas en las Top 5 ciudades y aquellas en Otras ciudades.Marketcap) de las empresas del sector financiero supera
los 90,000 millones USD. Para ello, se plantea una
hipótesis nula (H0) que establece que el valor medio
poblacional es igual a 90,000 millones USD, frente a una hipótesis
alternativa (H1) que propone que dicho valor es
mayor.Currentprice entre los dos grupos.Definimos la variable respuesta \(Y_i\) como: \[ Y_i = \begin{cases} 1, & \text{si } \text{Currentprice}_i > 400 \\ 0, & \text{si } \text{Currentprice}_i \le 400 \end{cases} \]
\[ \log\left(\frac{\pi_i}{1 - \pi_i}\right) = \beta_0 + \beta_1 \,\text{Marketcap}_i + \beta_2 \,\text{Revenuegrowth}_i + \beta_3 \,\text{Weight}_i + \beta_4 \,\text{City\_top5}_i \]
\[ \pi_i=P(Y_i=1\mid X_i) \]
##########################################
# 1. Preparación de la base de datos #
##########################################
# (DatosNuevos3 ya existe, con las variables:
# Currentprice, Marketcap, Revenuegrowth, Weight, City)
# 1.1 Variable binaria de "éxito":
# Yi = 1 si Currentprice > 400 USD (precio alto)
# Yi = 0 si Currentprice <= 400 USD (precio no alto)
DatosNuevos3 <- DatosNuevos3 %>%
mutate(
Yi = if_else(Currentprice > 400, 1, 0)
)
# Verificar conteo de 0 y 1
table(DatosNuevos3$Yi)
##
## 0 1
## 57 10
# 1.2 Variable indicadora para City (Top 5 vs Otras)
# City_top5 = 1 si City es "Top 5"
# City_top5 = 0 si City es "Otras ciudades"
DatosNuevos3 <- DatosNuevos3 %>%
mutate(
City_top5 = if_else(City == "Top 5", 1, 0)
) %>%
as.data.table()
# Verificar recodificación
table(DatosNuevos3$City, DatosNuevos3$City_top5)
##
## 0 1
## Otras ciudades 38 0
## Top 5 0 29
##########################################
# 2. Ajuste del modelo de regresión logística
##########################################
# Modelo:
# logit(P(Yi = 1)) = β0 + β1*Marketcap + β2*Revenuegrowth +
# β3*Weight + β4*City_top5
mod_logit_fin <- glm(
Yi ~ Marketcap + Revenuegrowth + Weight + City_top5,
family = binomial(link = "logit"),
data = DatosNuevos3
)
summary(mod_logit_fin)
##
## Call:
## glm(formula = Yi ~ Marketcap + Revenuegrowth + Weight + City_top5,
## family = binomial(link = "logit"), data = DatosNuevos3)
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.395e+00 6.348e-01 -3.772 0.000162 ***
## Marketcap 3.336e-12 1.687e-12 1.977 0.048044 *
## Revenuegrowth 2.484e-01 1.575e+00 0.158 0.874720
## Weight NA NA NA NA
## City_top5 3.653e-01 7.192e-01 0.508 0.611469
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 56.469 on 66 degrees of freedom
## Residual deviance: 52.299 on 63 degrees of freedom
## AIC: 60.299
##
## Number of Fisher Scoring iterations: 4
##########################################
# 3. Odds Ratios e intervalos de confianza
##########################################
# Odds ratios (OR) de los coeficientes
OR <- exp(coef(mod_logit_fin))
OR
## (Intercept) Marketcap Revenuegrowth Weight City_top5
## 0.09118781 1.00000000 1.28192322 NA 1.44101369
# Intervalos de confianza al 95% para los coeficientes
IC_OR <- exp(confint(mod_logit_fin))
## Waiting for profiling to be done...
IC_OR
## 2.5 % 97.5 %
## (Intercept) 0.02139144 0.2734556
## Marketcap 1.00000000 1.0000000
## Revenuegrowth 0.03988312 20.9282281
## Weight NA NA
## City_top5 0.34438271 6.2155445
# Redondeando:
round(OR, 3)
## (Intercept) Marketcap Revenuegrowth Weight City_top5
## 0.091 1.000 1.282 NA 1.441
round(IC_OR, 3)
## 2.5 % 97.5 %
## (Intercept) 0.021 0.273
## Marketcap 1.000 1.000
## Revenuegrowth 0.040 20.928
## Weight NA NA
## City_top5 0.344 6.216
##########################################
# 4. Predicciones y curva ROC / AUC #
##########################################
# 4.1 Probabilidades predichas de Yi = 1
DatosNuevos3$predicted_prob <- predict(
mod_logit_fin,
type = "response"
)
# Ver un resumen de las probabilidades
summary(DatosNuevos3$predicted_prob)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.07672 0.09441 0.12419 0.14925 0.15476 0.70469
# 4.2 Curva ROC y AUC (usando pROC)
roc_obj <- roc(
response = DatosNuevos3$Yi, # Valores reales 0/1
predictor = DatosNuevos3$predicted_prob, # Probabilidades predichas
levels = c(0, 1), # 0 = "control", 1 = "caso"
direction = "<"
)
# AUC (Area Under the Curve)
auc(roc_obj)
## Area under the curve: 0.6754
# 4.3 Gráfico de la curva ROC
plot(
roc_obj,
main = "Curva ROC - Modelo logístico (Precio alto > 400 USD)"
)
##########################################
# 5. Punto de corte óptimo (criterio de Youden)
##########################################
optimal_coords <- coords(
roc_obj,
x = "best",
best.method = "youden",
ret = c("threshold", "sensitivity", "specificity")
)
optimal_coords
## threshold sensitivity specificity
## 1 0.1553343 0.6 0.8245614
# Umbral de probabilidad óptimo
threshold <- optimal_coords["threshold"]
threshold
## threshold
## 1 0.1553343
##########################################
# 6. Clasificación binaria y matriz de confusión
##########################################
# 6.1 Clasificación según el umbral óptimo
DatosNuevos3$Yi_pred <- if_else(
DatosNuevos3$predicted_prob >= threshold,
1, 0
)
# 6.2 Matriz de confusión
Tabla <- table(
Predicho = DatosNuevos3$Yi_pred,
Real = DatosNuevos3$Yi
)
Tabla
## Real
## Predicho 0 1
## 1 57 10
ggplot(DatosNuevos3, aes(x = predicted_prob, fill = as.factor(Yi))) +
geom_histogram(bins = 30, alpha = 0.6, position = "identity") +
labs(
x = "Probabilidad predicha de precio alto (> 400 USD)",
y = "Frecuencia",
fill = "Yi (0 = no alto, 1 = alto)",
title = "Distribución de probabilidades predichas\nModelo logístico S&P 500 financiero"
)