Este documento muestra cómo realizar un análisis estadístico completo en R.
Incluye:
Cada sección incluye la fórmula estadística utilizada.
El análisis de datos en estadística tiene como uno de sus principales objetivos comprender la relación entre variables. Para ello existen diferentes métodos estadísticos que permiten identificar asociaciones, medir la intensidad de la relación y construir modelos predictivos.
En este informe se desarrollan tres enfoques fundamentales:
Estos métodos constituyen herramientas esenciales en investigación científica, ciencias sociales, ingeniería y análisis de datos.
library(readxl)
library(ggplot2)
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
library(haven)
library(moments)
library(nortest)
library(openxlsx)
Se carga el archivo desde el explorador.
Alumnos <- read_excel("D:/6. CICIED/Lección 7/Alumnos.xlsx")
str(Alumnos)
## tibble [124 × 9] (S3: tbl_df/tbl/data.frame)
## $ Id : num [1:124] 1 2 3 4 5 6 7 8 9 10 ...
## $ Sexo : chr [1:124] "M" "F" "F" "F" ...
## $ Edad : num [1:124] 70 63 16 30 24 57 27 49 33 64 ...
## $ Area : chr [1:124] "Sociales" "Sociales" "Ingenierías" "Biomédicas" ...
## $ Nivel.Socioeconomico: num [1:124] 3 3 2 2 2 2 2 1 2 3 ...
## $ TiempoDedicación : chr [1:124] "De 2 a 5 horas" "De 5 horas a más" "Menos de 2 horas" "De 5 horas a más" ...
## $ Trabaja : chr [1:124] "Si" "No" "No" "No" ...
## $ Rendimiento : chr [1:124] "Regular" "Regular" "Regular" "Regular" ...
## $ OpinionGestion : chr [1:124] "Desaprueba" "Desaprueba" "Desaprueba" "Desaprueba" ...
INTERPRETACIÓN Tenemos 6 variables categoricas y 3 variables numericas
summary(Alumnos)
## Id Sexo Edad Area
## Min. : 1.00 Length:124 Min. :15.00 Length:124
## 1st Qu.: 31.75 Class :character 1st Qu.:29.00 Class :character
## Median : 62.50 Mode :character Median :40.00 Mode :character
## Mean : 62.50 Mean :42.16
## 3rd Qu.: 93.25 3rd Qu.:57.00
## Max. :124.00 Max. :70.00
## Nivel.Socioeconomico TiempoDedicación Trabaja Rendimiento
## Min. :1.000 Length:124 Length:124 Length:124
## 1st Qu.:1.000 Class :character Class :character Class :character
## Median :2.000 Mode :character Mode :character Mode :character
## Mean :1.758
## 3rd Qu.:2.000
## Max. :3.000
## OpinionGestion
## Length:124
## Class :character
## Mode :character
##
##
##
Describir:
head(Alumnos)
## # A tibble: 6 × 9
## Id Sexo Edad Area Nivel.Socioeconomico TiempoDedicación Trabaja
## <dbl> <chr> <dbl> <chr> <dbl> <chr> <chr>
## 1 1 M 70 Sociales 3 De 2 a 5 horas Si
## 2 2 F 63 Sociales 3 De 5 horas a más No
## 3 3 F 16 Ingenierías 2 Menos de 2 horas No
## 4 4 F 30 Biomédicas 2 De 5 horas a más No
## 5 5 F 24 Ingenierías 2 De 2 a 5 horas Si
## 6 6 F 57 Sociales 2 De 2 a 5 horas No
## # ℹ 2 more variables: Rendimiento <chr>, OpinionGestion <chr>
Se usa rename().
names(Alumnos)[5] <- "NivelSocioeconomico"
names(Alumnos)
## [1] "Id" "Sexo" "Edad"
## [4] "Area" "NivelSocioeconomico" "TiempoDedicación"
## [7] "Trabaja" "Rendimiento" "OpinionGestion"
Edad <- Alumnos$Edad
Edad_cat <- cut(
Edad,
breaks = c(0,25,40,100),
labels = c("Joven","Adulto","Mayor")
)
table(Edad_cat)
## Edad_cat
## Joven Adulto Mayor
## 20 43 61
INTERPRETACIÓN
Analizar distribución de la edad.
datos <- Alumnos %>%
mutate(Area_cat = case_when(
Area %in% c("Educación","Psicología") ~ "Social",
Area == "Sociales" ~ "Social",
Area == "Ingenierías" ~ "Ingeniería",
TRUE ~ Area
))
table(datos$Area_cat)
##
## Biomédicas Ingeniería Matemáticas Social
## 47 35 3 39
tabla <- table(Alumnos$OpinionGestion, Alumnos$Sexo)
tabla
##
## F M
## Aprueba 21 31
## Desaprueba 44 28
FÓRMULA
Porcentaje por fila:
P_{ij} = (n_{ij} / n_{i}) * 100
Donde:
por_filas <- round(prop.table(tabla,1)*100,2)
por_filas
##
## F M
## Aprueba 40.38 59.62
## Desaprueba 61.11 38.89
FÓRMULA
P_{ij} = (n_{ij} / n_{j}) * 100
Donde:
por_columnas <- round(prop.table(tabla,2)*100,2)
por_columnas
##
## F M
## Aprueba 32.31 52.54
## Desaprueba 67.69 47.46
FÓRMULA
P_{ij} = (n_{ij} / N) * 100
Donde:
por_total <- round(prop.table(tabla)*100,2)
por_total
##
## F M
## Aprueba 16.94 25.00
## Desaprueba 35.48 22.58
df_tabla <- as.data.frame(tabla)
names(df_tabla)[1] = "OpinionGestion"
names(df_tabla)[2] = "Sexo"
grafico1 <- ggplot(df_tabla,
aes(x=Sexo,y=Freq,fill=OpinionGestion)) +
geom_bar(stat="identity",position="dodge") +
scale_fill_brewer(palette="Set2") +
labs(title="Opinión de gestión según sexo",
x="Sexo",
y="Frecuencia") +
theme_minimal()
grafico1
INTERPRETACIÓN
Analizar diferencias entre grupos.
FÓRMULA
\[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \]
Donde:
chi <- chisq.test(tabla, correct = FALSE)
chi
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 5.2005, df = 1, p-value = 0.02258
Interpretación:
Ejemplo1 <- read_sav("D:/6. CICIED/Lección 7/Ejemplo1.sav")
Tiempo <- Ejemplo1$Tiempo
Calif <- Ejemplo1$Calificación
grafico2 <- ggplot(Ejemplo1,aes(Tiempo,Calif))+
geom_point(color="blue")+
theme_minimal()
grafico2
Las pruebas evalúan si una variable sigue una distribución normal.
La prueba evalúa si una muestra proviene de una distribución normal.
FÓRMULA
\[ W = \frac{\left(\sum_{i=1}^{n} a_i x_{(i)} \right)^2} {\sum_{i=1}^{n} (x_i - \bar{x})^2} \]
Donde:
shapiro.test(Tiempo)
##
## Shapiro-Wilk normality test
##
## data: Tiempo
## W = 0.95077, p-value = 0.2815
shapiro.test(Calif)
##
## Shapiro-Wilk normality test
##
## data: Calif
## W = 0.9561, p-value = 0.3652
Esta prueba compara la distribución empírica con una distribución teórica.
FÓRMULA
\[ D = \max |F_n(x) - F(x)| \]
Donde:
ks.test(Tiempo,"pnorm",mean(Tiempo),sd(Tiempo))
## Warning in ks.test.default(Tiempo, "pnorm", mean(Tiempo), sd(Tiempo)): ties
## should not be present for the one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Tiempo
## D = 0.10837, p-value = 0.9407
## alternative hypothesis: two-sided
Evalúa si los datos siguen una distribución específica, dando mayor peso a las colas.
FÓRMULA
\[ A^2 = - n - \frac{1}{n} \sum_{i=1}^{n} (2i-1) \left[ \ln(F(x_i)) + \ln(1 - F(x_{n+1-i})) \right] \]
Donde:
ad.test(Tiempo)
##
## Anderson-Darling normality test
##
## data: Tiempo
## A = 0.45541, p-value = 0.2451
ad.test(Calif)
##
## Anderson-Darling normality test
##
## data: Calif
## A = 0.35682, p-value = 0.427
La asimetría mide la falta de simetría en la distribución.
FÓRMULA
\[ Skewness = \frac{E[(X-\mu)^3]}{\sigma^3} \]
Donde:
skewness(Tiempo)
## [1] 0.2812418
skewness(Calif)
## [1] 0.3442303
La curtosis mide el grado de concentración de los datos en las colas.
FÓRMULA
\[ Kurtosis = \frac{E[(X-\mu)^4]}{\sigma^4} \]
kurtosis(Tiempo)-3
## [1] -1.090299
kurtosis(Calif)-3
## [1] -0.8390218
La correlación mide la relación lineal entre dos variables.
\[ r = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})} {\sqrt{\sum (x_i - \bar{x})^2 \sum (y_i - \bar{y})^2}} \]
Donde:
cor(Tiempo,Calif,method="pearson")
## [1] 0.7233087
cor.test(Tiempo,Calif,method="pearson")
##
## Pearson's product-moment correlation
##
## data: Tiempo and Calif
## t = 4.9131, df = 22, p-value = 6.504e-05
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.4517130 0.8722113
## sample estimates:
## cor
## 0.7233087
INTERPRETACION:
Mide la relación monotónica entre dos variables usando rangos.
\[ \rho = 1 - \frac{6 \sum d_i^2} {n(n^2 -1)} \]
Donde:
cor(Tiempo,Calif,method="spearman")
## [1] 0.6700887
cor.test(Tiempo,Calif,method="spearman")
## Warning in cor.test.default(Tiempo, Calif, method = "spearman"): Cannot compute
## exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: Tiempo and Calif
## S = 758.8, p-value = 0.0003405
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.6700887
INTERPRETACION
Se basa en pares concordantes y discordantes.
\[ \tau = \frac{C - D} {\frac{1}{2} n (n-1)} \]
Donde:
cor(Tiempo,Calif,method="kendall")
## [1] 0.4833916
cor.test(Tiempo,Calif,method="kendall")
## Warning in cor.test.default(Tiempo, Calif, method = "kendall"): Cannot compute
## exact p-value with ties
##
## Kendall's rank correlation tau
##
## data: Tiempo and Calif
## z = 3.2405, p-value = 0.001193
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 0.4833916
Se divide el dataset para evaluar el modelo.
set.seed(2026)
ind <- sample(2,nrow(Ejemplo1),replace=TRUE,prob=c(0.8,0.2))
train <- Ejemplo1[ind==1,]
test <- Ejemplo1[ind==2,]
head(train)
## # A tibble: 6 × 3
## ID Tiempo Calificación
## <dbl> <dbl> <dbl>
## 1 1 250 5
## 2 2 298 13
## 3 3 338 7
## 4 4 534 13
## 5 5 205 11
## 6 6 478 18
FÓRMULA
\[ Y = \beta_0 + \beta_1 X + \varepsilon \]
Donde:
Tiempos <- train$Tiempo
Califs <- train$Calificación
modelo_train <- lm(Califs ~ Tiempos,data=train)
summary(modelo_train)
##
## Call:
## lm(formula = Califs ~ Tiempos, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.6808 -2.4923 0.8794 1.9868 4.7824
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.279768 1.690841 2.531 0.019865 *
## Tiempos 0.021604 0.004586 4.711 0.000134 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.815 on 20 degrees of freedom
## Multiple R-squared: 0.526, Adjusted R-squared: 0.5023
## F-statistic: 22.2 on 1 and 20 DF, p-value: 0.0001338
Tiempos <- test$Tiempo
Califs <- test$Calificación
pred <- predict(modelo_train,newdata=test)
real <- test$Calificación
data.frame(real,pred)
## real pred
## 1 12 15.211416
## 2 6 8.686994
FÓRMULA
\[ MSE = \frac{1}{n} \sum (y_i - \hat{y}_i)^2 \]
Donde:
MSE <- mean((real-pred)^2)
MSE
## [1] 8.766566
INTERPRETACIÓN
Mientras menor sea el MSE, mejor es el modelo.
grafico4 <- ggplot(data.frame(real,pred),
aes(real,pred))+
geom_point(color="darkgreen")+
geom_abline(slope=1,intercept=0,color="red")
grafico4
En este análisis aprendimos: