# Paquetes
library(tidyverse)
library(knitr)
library(patchwork)
library(ggcorrplot)

Punto 1: Importar los datos

df <- read_csv("Telco_Cusomer_Churn.csv")

# Conversión de variables clave
df <- df %>%
  mutate(
    TotalCharges = as.numeric(TotalCharges),
    Churn = factor(Churn, levels = c("No","Yes"))
  )

glimpse(df)
## Rows: 7,043
## Columns: 21
## $ customerID       <chr> "7590-VHVEG", "5575-GNVDE", "3668-QPYBK", "7795-CFOCW…
## $ gender           <chr> "Female", "Male", "Male", "Male", "Female", "Female",…
## $ SeniorCitizen    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ Partner          <chr> "Yes", "No", "No", "No", "No", "No", "No", "No", "Yes…
## $ Dependents       <chr> "No", "No", "No", "No", "No", "No", "Yes", "No", "No"…
## $ tenure           <dbl> 1, 34, 2, 45, 2, 8, 22, 10, 28, 62, 13, 16, 58, 49, 2…
## $ PhoneService     <chr> "No", "Yes", "Yes", "No", "Yes", "Yes", "Yes", "No", …
## $ MultipleLines    <chr> "No phone service", "No", "No", "No phone service", "…
## $ InternetService  <chr> "DSL", "DSL", "DSL", "DSL", "Fiber optic", "Fiber opt…
## $ OnlineSecurity   <chr> "No", "Yes", "Yes", "Yes", "No", "No", "No", "Yes", "…
## $ OnlineBackup     <chr> "Yes", "No", "Yes", "No", "No", "No", "Yes", "No", "N…
## $ DeviceProtection <chr> "No", "Yes", "No", "Yes", "No", "Yes", "No", "No", "Y…
## $ TechSupport      <chr> "No", "No", "No", "Yes", "No", "No", "No", "No", "Yes…
## $ StreamingTV      <chr> "No", "No", "No", "No", "No", "Yes", "Yes", "No", "Ye…
## $ StreamingMovies  <chr> "No", "No", "No", "No", "No", "Yes", "No", "No", "Yes…
## $ Contract         <chr> "Month-to-month", "One year", "Month-to-month", "One …
## $ PaperlessBilling <chr> "Yes", "No", "Yes", "No", "Yes", "Yes", "Yes", "No", …
## $ PaymentMethod    <chr> "Electronic check", "Mailed check", "Mailed check", "…
## $ MonthlyCharges   <dbl> 29.85, 56.95, 53.85, 42.30, 70.70, 99.65, 89.10, 29.7…
## $ TotalCharges     <dbl> 29.85, 1889.50, 108.15, 1840.75, 151.65, 820.50, 1949…
## $ Churn            <fct> No, No, Yes, No, Yes, Yes, No, No, Yes, No, No, No, N…

Interpretación: El conjunto de datos tiene 7043 clientes y 21 variables, entre categóricas y numéricas, como se describe en el PDF del laboratorio.


Punto 2: Estadísticas descriptivas

# Distribución de la variable objetivo (Churn)
kable(table(df$Churn), caption = "Conteo de clientes por Rotación (Churn)")
Conteo de clientes por Rotación (Churn)
Var1 Freq
No 5174
Yes 1869
# Resumen de variables numéricas
summary(select(df, tenure, MonthlyCharges, TotalCharges))
##      tenure      MonthlyCharges    TotalCharges   
##  Min.   : 0.00   Min.   : 18.25   Min.   :  18.8  
##  1st Qu.: 9.00   1st Qu.: 35.50   1st Qu.: 401.4  
##  Median :29.00   Median : 70.35   Median :1397.5  
##  Mean   :32.37   Mean   : 64.76   Mean   :2283.3  
##  3rd Qu.:55.00   3rd Qu.: 89.85   3rd Qu.:3794.7  
##  Max.   :72.00   Max.   :118.75   Max.   :8684.8  
##                                   NA's   :11

Interpretación: El análisis muestra que aproximadamente un 27% de los clientes abandonan la compañía, lo que refleja un nivel considerable de fuga. Se observa que los clientes con menor antigüedad, contratos mes a mes y cargos mensuales más altos son los que presentan mayor riesgo de rotación. Los cargos totales, en cambio, son más bajos en quienes se retiran, lo que indica que se van en etapas tempranas de la relación. Variables como género no parecen tener un efecto marcado en el comportamiento de fuga.


Punto 3: Matriz de correlación

# Selección de variables numéricas
num_vars <- df %>% select(tenure, MonthlyCharges, TotalCharges)

# Calcular correlación
corr_matrix <- cor(num_vars, use = "pairwise.complete.obs")

# Mostrar matriz de correlación bonita
ggcorrplot(corr_matrix, 
           lab = TRUE,              # muestra los valores
           lab_size = 4,            # tamaño del texto
           colors = c("red", "white", "blue"), # escala de colores
           title = "Matriz de correlación (numéricas)",
           ggtheme = theme_minimal)

Interpretación: La matriz evidencia una fuerte correlación positiva entre la antigüedad del cliente (tenure) y los cargos totales (TotalCharges), lo cual es lógico, pues a mayor tiempo acumulado en la empresa, mayor gasto total. En contraste, la relación entre MonthlyCharges y las demás variables es más débil, lo que indica que el cargo mensual no crece de forma lineal con el tiempo. Este hallazgo resalta la importancia de separar entre variables acumulativas y variables recurrentes.


Punto 4: Boxplot MonthlyCharges vs Churn

p4 <- ggplot(df, aes(x = Churn, y = MonthlyCharges)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Cargos mensuales vs Churn", x = "Churn", y = "MonthlyCharges") +
  theme_minimal()
p4

Interpretación: El diagrama de cajas muestra que los clientes que abandonan tienden a pagar cargos mensuales más elevados. Esto sugiere que los planes con precios altos pueden estar asociados a un mayor descontento o dificultad para mantener el servicio. Además, la dispersión es mayor en el grupo de fuga, indicando que dentro de estos clientes existe más variabilidad en los valores de pago.


Punto 5: Boxplot TotalCharges vs Churn

p5 <- ggplot(df, aes(x = Churn, y = TotalCharges)) +
  geom_boxplot(fill = "orange") +
  labs(title = "Cargos totales vs Churn", x = "Churn", y = "TotalCharges") +
  theme_minimal()
p5

Interpretación: Los clientes que se van suelen registrar cargos totales acumulados significativamente menores que los que permanecen. Esto implica que, en promedio, quienes abandonan son clientes recientes que no han alcanzado a generar un historial de facturación prolongado. Se refuerza así la idea de que la fidelización en los primeros meses es clave para reducir la rotación.


Punto 6: Barras apiladas Churn y Gender

p6 <- ggplot(df, aes(x = Churn, fill = gender)) +
  geom_bar(position = "stack") +
  labs(title = "Distribución de género dentro de Churn", x = "Churn", y = "Cuenta") +
  theme_minimal()
p6

Interpretación: La gráfica muestra que la proporción de hombres y mujeres dentro de los grupos de fuga y no fuga es bastante similar. Esto indica que el género no es una variable que influya de manera significativa en la rotación de clientes. La fuga parece estar mucho más asociada a factores de tipo contractual y económico que a características demográficas.


Punto 7: Relación lineal Tenure vs MonthlyCharges

p7 <- ggplot(df, aes(x = tenure, y = MonthlyCharges)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  labs(title = "Tenure vs MonthlyCharges", x = "Tenure (meses)", y = "MonthlyCharges") +
  theme_minimal()
p7

# Correlación
cor(df$tenure, df$MonthlyCharges, use = "pairwise.complete.obs")
## [1] 0.2478999
# Modelo lineal simple
modelo <- lm(MonthlyCharges ~ tenure, data = df)
summary(modelo)
## 
## Call:
## lm(formula = MonthlyCharges ~ tenure, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -57.498 -27.251   6.245  24.943  54.376 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 54.92978    0.57476   95.57   <2e-16 ***
## tenure       0.30372    0.01415   21.47   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.15 on 7041 degrees of freedom
## Multiple R-squared:  0.06145,    Adjusted R-squared:  0.06132 
## F-statistic:   461 on 1 and 7041 DF,  p-value: < 2.2e-16

Interpretación: El diagrama de dispersión y la correlación calculada evidencian una relación prácticamente nula entre la antigüedad y los cargos mensuales. El modelo lineal ajustado arroja una pendiente muy baja, lo que confirma que el tiempo que un cliente lleva en la empresa no determina el valor de su cargo mensual. Por tanto, los planes parecen estar definidos desde el inicio y no varían con la permanencia.


Punto 8: Panel de gráficos

library(gridExtra)  # viene en R base, sin instalar

grid.arrange(p4, p5, p6, p7, ncol = 2)


Conclusiones

El análisis evidencia que cerca de un 27% de los clientes abandona la compañía, principalmente aquellos con cargos mensuales más altos, contratos mes a mes y baja antigüedad. La matriz de correlación muestra que TotalCharges está fuertemente ligado al tiempo de permanencia, mientras que MonthlyCharges no depende de la antigüedad. Además, el género no influye significativamente en la fuga. En síntesis, los clientes más recientes y con planes costosos son los que presentan mayor riesgo de rotación, por lo que las estrategias de retención deben enfocarse en este grupo.