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.
# Distribución de la variable objetivo (Churn)
kable(table(df$Churn), caption = "Conteo de clientes por Rotación (Churn)")| Var1 | Freq |
|---|---|
| No | 5174 |
| Yes | 1869 |
## 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.
# 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.
p4 <- ggplot(df, aes(x = Churn, y = MonthlyCharges)) +
geom_boxplot(fill = "skyblue") +
labs(title = "Cargos mensuales vs Churn", x = "Churn", y = "MonthlyCharges") +
theme_minimal()
p4Interpretació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.
p5 <- ggplot(df, aes(x = Churn, y = TotalCharges)) +
geom_boxplot(fill = "orange") +
labs(title = "Cargos totales vs Churn", x = "Churn", y = "TotalCharges") +
theme_minimal()
p5Interpretació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.
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()
p6Interpretació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.
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## [1] 0.2478999
##
## 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.
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.