es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seaborn: Cómo escalar el eje Y al 100 por ciento para cada valor categórico.

Objetivo:
Deseo crear un histograma de barras apiladas de la característica categórica “PaperlessBilling” (conjunto de datos de Churn de clientes de telecomunicaciones), mostrar el eje Y como un porcentaje y mostrar la distribución de churn como el tono. Pero, el porcentaje no se calcula de manera acumulativa.

Aquí está lo que esperaba si se utiliza R:

ggplot(Churn, aes(SeniorCitizen, fill = Churn)) +
  geom_bar(position = "fill") +
  xlab("Estado del Ciudadano Mayor") +
  ylab("Porcentaje") +
  scale_y_continuous(labels = scales::percent) +
  scale_x_discrete(labels = c("No Ciudadanos Mayores", "Ciudadanos Mayores")) +
  scale_fill_manual(name = "Estado de Churn", values = c("green2", "red1"), labels = c("No", "Sí")) +
  ggtitle("La Proporción de Churns por Estado de Ciudadano Mayor") +
  theme_classic() +
  theme(legend.position = "bottom",
        plot.title = element_text(hjust = 0.5, size = 15))

Aquí está la salida del código anterior (observa que ambas categorías suman un total del 100%):

Imagen

Esto es lo que he hecho:

fig, axs = plt.subplots(figsize=(5, 5))

sns.histplot(
    df,
    x = "PaperlessBilling",
    hue = "Churn",
    multiple = "stack",
    stat = "percent"
)

Esta es la salida del código anterior:

Imagen

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un histograma de barras apiladas del atributo categórico PaperlessBilling con la distribución de churn como color de la medida, y mostrar el eje Y como un porcentaje pero sin realizar cálculos acumulativos, se puede utilizar el siguiente código:

    fig, axs = plt.subplots(figsize=(5, 5))
    
    sns.histplot(
        df,
        x="PaperlessBilling",
        hue="Churn",
        multiple="fill",
        stat="probability",
        element="step",
        common_norm=False,
        shrink=0.8,
        binwidth=0.5,
    )
    
    axs.yaxis.set_major_formatter(mtick.PercentFormatter(1.0))
    
    plt.title("Porcentaje de Distribución de Churn por Paperless Billing")
    plt.xlabel("Paperless Billing")
    plt.ylabel("Porcentaje")
    
    plt.show()
    

    En este fragmento de código, hemos modificado algunos argumentos de la función sns.histplot() para obtener el resultado deseado.

    • El argumento multiple está configurado en "fill" para que cada gráfica tenga un color diferente en lugar de apilarse una sobre otra.
    • El argumento stat está configurado en "probability" para calcular el porcentaje de cada grupo en lugar del porcentaje acumulativo.
    • El argumento element está configurado en "step" para visualizar las barras apiladas como una función escalonada, lo que ayuda a distinguir claramente las barras.
    • El argumento common_norm está configurado en False para normalizar cada barra de manera independiente.
    • El argumento shrink está configurado en 0.8 para reducir ligeramente el ancho de cada barra y evitar que se toquen entre sí.
    • Finalmente, hemos agregado un PercentFormatter al eje Y para mostrar el eje Y como un porcentaje.

    La visualización resultante se vería así:

    Imagen de salida para el histograma de Distribución de Churn por PaperlessBilling utilizando Seaborn

Comments are closed.