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