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(ggplot2) # Para gráficos adicionales si es necesario
# Cargar el dataset desde un archivo remoto
url <- "https://raw.githubusercontent.com/Lenis14183/QM206/refs/heads/main/orthopedicpatients.csv"
orthopedic_data <- read.csv(url)
# Mostrar las primeras filas del dataset
head(orthopedic_data)
## pelvic_incidence pelvic_tilt.numeric lumbar_lordosis_angle sacral_slope
## 1 63.02782 22.552586 39.60912 40.47523
## 2 39.05695 10.060991 25.01538 28.99596
## 3 68.83202 22.218482 50.09219 46.61354
## 4 69.29701 24.652878 44.31124 44.64413
## 5 49.71286 9.652075 28.31741 40.06078
## 6 40.25020 13.921907 25.12495 26.32829
## pelvic_radius degree_spondylolisthesis class
## 1 98.67292 -0.254400 Abnormal
## 2 114.40543 4.564259 Abnormal
## 3 105.98514 -3.530317 Abnormal
## 4 101.86850 11.211523 Abnormal
## 5 108.16872 7.918501 Abnormal
## 6 130.32787 2.230652 Abnormal
# Verificar los nombres de las columnas
colnames(orthopedic_data)
## [1] "pelvic_incidence" "pelvic_tilt.numeric"
## [3] "lumbar_lordosis_angle" "sacral_slope"
## [5] "pelvic_radius" "degree_spondylolisthesis"
## [7] "class"
# Filtrar datos donde la clase es "Abnormal"
df <- orthopedic_data %>% filter(class == "Abnormal")
# Mostrar las primeras filas del dataframe filtrado
head(df)
## pelvic_incidence pelvic_tilt.numeric lumbar_lordosis_angle sacral_slope
## 1 63.02782 22.552586 39.60912 40.47523
## 2 39.05695 10.060991 25.01538 28.99596
## 3 68.83202 22.218482 50.09219 46.61354
## 4 69.29701 24.652878 44.31124 44.64413
## 5 49.71286 9.652075 28.31741 40.06078
## 6 40.25020 13.921907 25.12495 26.32829
## pelvic_radius degree_spondylolisthesis class
## 1 98.67292 -0.254400 Abnormal
## 2 114.40543 4.564259 Abnormal
## 3 105.98514 -3.530317 Abnormal
## 4 101.86850 11.211523 Abnormal
## 5 108.16872 7.918501 Abnormal
## 6 130.32787 2.230652 Abnormal
colnames(orthopedic_data)
## [1] "pelvic_incidence" "pelvic_tilt.numeric"
## [3] "lumbar_lordosis_angle" "sacral_slope"
## [5] "pelvic_radius" "degree_spondylolisthesis"
## [7] "class"
# Crear una nueva columna con el promedio entre "pelvic_incidence" y "pelvic_tilt.numeric"
df2 <- orthopedic_data %>%
mutate(pelvic_avg = (pelvic_incidence + pelvic_tilt.numeric) / 2)
# Mostrar las primeras filas del dataframe resultante
head(df2)
## pelvic_incidence pelvic_tilt.numeric lumbar_lordosis_angle sacral_slope
## 1 63.02782 22.552586 39.60912 40.47523
## 2 39.05695 10.060991 25.01538 28.99596
## 3 68.83202 22.218482 50.09219 46.61354
## 4 69.29701 24.652878 44.31124 44.64413
## 5 49.71286 9.652075 28.31741 40.06078
## 6 40.25020 13.921907 25.12495 26.32829
## pelvic_radius degree_spondylolisthesis class pelvic_avg
## 1 98.67292 -0.254400 Abnormal 42.79020
## 2 114.40543 4.564259 Abnormal 24.55897
## 3 105.98514 -3.530317 Abnormal 45.52525
## 4 101.86850 11.211523 Abnormal 46.97494
## 5 108.16872 7.918501 Abnormal 29.68247
## 6 130.32787 2.230652 Abnormal 27.08605
# Agrupar por 'class' y calcular estadísticas
df3 <- orthopedic_data %>%
group_by(class) %>%
summarize(
count = n(),
mean_pelvic_incidence = mean(pelvic_incidence, na.rm = TRUE),
sd_pelvic_incidence = sd(pelvic_incidence, na.rm = TRUE)
)
# Mostrar el dataframe resultante
df3
## # A tibble: 2 × 4
## class count mean_pelvic_incidence sd_pelvic_incidence
## <chr> <int> <dbl> <dbl>
## 1 Abnormal 210 64.7 17.7
## 2 Normal 100 51.7 12.4
# Gráfico de dispersión de 'pelvic_incidence' vs 'pelvic_tilt.numeric'
plot(
orthopedic_data$pelvic_incidence, orthopedic_data$pelvic_tilt.numeric,
col = ifelse(orthopedic_data$class == "Abnormal", "red", "blue"),
main = "Relación entre Pelvic Incidence y Pelvic Tilt",
xlab = "Pelvic Incidence",
ylab = "Pelvic Tilt"
)
# Ajustar una línea de regresión
modelo <- lm(pelvic_tilt.numeric ~ pelvic_incidence, data = orthopedic_data)
abline(modelo, col = "green")

# Mostrar el resumen del modelo de regresión
summary(modelo)
##
## Call:
## lm(formula = pelvic_tilt.numeric ~ pelvic_incidence, data = orthopedic_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -34.470 -4.781 -0.838 4.480 28.884
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.55916 1.61742 -2.819 0.00513 **
## pelvic_incidence 0.36534 0.02572 14.207 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.792 on 308 degrees of freedom
## Multiple R-squared: 0.3959, Adjusted R-squared: 0.3939
## F-statistic: 201.8 on 1 and 308 DF, p-value: < 2.2e-16