Curva de supervivencia de KM en Power BI

Un usuario Pregunto ✅

Buzzshot43

Hola,

Me preguntaba si es posible recrear esta guía y funcionalidad en PowerBI:

https://www.linkedin.com/pulse/survival-curves-tableau-hr-data-chris-short/

Gracias.

Greg_Deckler

@ Buzzshot43 – Tengo la solución completa publicada en un artículo de blog aquí:

https://www.linkedin.com/pulse/kaplan-meier-survival-curves-power-bi-greg-deckler-microsoft-mvp-

Greg_Deckler

@ Buzzshot43 – Tengo la solución completa publicada en un artículo de blog aquí:

https://www.linkedin.com/pulse/kaplan-meier-survival-curves-power-bi-greg-deckler-microsoft-mvp-

Greg_Deckler

Sí, eso parece bastante básico. Veré si puedo simular algunos datos y recrearlos en Power BI DAX, pero definitivamente es posible.

Buzzshot43

En respuesta a Greg_Deckler

Muchas gracias @Greg_Deckler. Será muy apreciado.

Greg_Deckler

En respuesta a Buzzshot43

@ Buzzshot43, publiqué esto en otro hilo, pero pensé que también lo publicaría aquí. El otro hilo está aquí:

https: //community.powerbi.com/t5/Desktop/Kaplan-Meier-Survival-Curves/mp/330094/highlight/false#M14 …

Esta solución está cerca y creo que es una forma viable de resolver esto, pero no obtengo exactamente los mismos resultados, por lo que es posible que necesite algunos ajustes. Artículo original aquí: https://www.linkedin.com/pulse/survival-curves-tableau-hr-data-chris-short/

Mi ego me haría creer que el artículo original es un error, pero eso probablemente no sea cierto y tengo algo en mis cálculos, si alguien pudiera ayudarme a encontrar dónde las cosas van mal, ¡sería genial! 🙂

Bien, empiezo con la tabla HRData del artículo mencionado anteriormente. Lo publicaría aquí, pero serían demasiados datos. Aquí están las primeras 10 filas:

IDENTIFICACIÓN Nombre Fecha de contratación Fecha de conclusión Estado Departamento
0 1/1/2010 1/1/2010 Inactivo HORA
0 1/1/2010 1/1/2010 Inactivo Ventas
1 Inez Laurie 23/4/2010 2/9/2015 Inactivo HORA
2 Yasuko Scruton 20/01/2010 Activo HORA
3 Kristopher Walkes 18/4/2010 Activo HORA
4 Geraldine Mclennon 12/6/2010 Activo HORA
5 Pilar Willard 14/01/2010 Activo HORA
6 Candace Molton 19/4/2010 4/4/2012 Inactivo HORA
7 Evelyne Kneeland 22/4/2010 Activo HORA
8 Elois contrata 26/5/2010 11/8/2013 Inactivo HORA
9 Keeley Dewolf 11/01/2010 27/05/2012 Inactivo HORA
10 Melisa Padua 16/05/2010 Activo HORA

Entonces, creé una tabla KM como esta:

KM = SUMMARIZE(HRData,HRData[Years],"Count",SUM(HRData[Count]),"d_i",SUM(HRData[Event]))

Luego agregué estas columnas:

Running = SUMX(FILTER(ALL(KM),[Years]<EARLIER([Years])),KM[Count])

n_i = [Count] + CALCULATE(SUM([Count]),ALL(KM)) - [Running]

d_i/n_i = KM[d_i]/KM[n_i]

1-d_i/n_i = 1-KM[d_i/n_i]

Entonces esta medida:

MyKM = 
CALCULATE(
	PRODUCT('KM'[1-d_i/n_i]),
	FILTER(
		ALLSELECTED('KM'[Years]),
		ISONORAFTER('KM'[Years], MAX('KM'[Years]), DESC)
	)
)

A continuación, puede trazar KM[Years] en el eje xy MyKm en el eje y en un gráfico de líneas.

Bien, entonces quería hacer esto por Departamento, así que creé una tabla KMDept como esta:

KMDept = SUMMARIZE(HRData,HRData[DeptYears],"Years",MAX(HRData[Years]),"Department",MAX(HRData[Department]),"Count",SUM(HRData[Count]),"d_i",SUM(HRData[Event]))

Y columnas como estas:

Running = SUMX(FILTER(ALL(KMDept),[DeptYears]<EARLIER([DeptYears]) && KMDept[Department]=EARLIER(KMDept[Department])),KMDept[Count])

n_i = [Count] + CALCULATE(SUM([Count]),ALL(KMDept),FILTER(KMDept,KMDept[Department]=EARLIER(KMDept[Department]))) - [Running]

d_i/n_i = KMDept[d_i]/KMDept[n_i]

1-d_i/n_i = 1-KMDept[d_i/n_i]

Y luego una medida como esta:

MyKMDept = 
CALCULATE(
	PRODUCT('KMDept'[1-d_i/n_i]),
	FILTER(
		ALLSELECTED('KMDept'[Years]),
		ISONORAFTER('KMDept'[Years], MAX('KMDept'[Years]), DESC)
	)
)

Entonces, puede trazar KMDept[Years] en el eje xy MyKMDept en el eje y.

Nuevamente, los resultados son similares, pero no 100% iguales y no estoy seguro de qué se puede hacer para mejorar la solución. Seguiré trabajando en eso, pero es un problema interesante. Y si alguien tiene una mejor manera de resolverlo, ¡estoy dispuesto!

Greg_Deckler

En respuesta a Greg_Deckler

Primero, lo siento, olvidé decirte las columnas originales que creé en la tabla HRData:

Years = IF([Status]="Active",DATEDIFF(HRData[Hire Date],TODAY(),YEAR),DATEDIFF(HRData[Hire Date],HRData[Termination Date],YEAR))

Event = IF(HRData[Status] = "Inactive",1,0)

Count = 1

Y, como una actualización adicional de esto, primero me olvidé de mencionar que después de crear la tabla, debe relacionar las dos tablas en Years o DeptYears. Además, por una corazonada, creé una columna Días en HRData al igual que la columna Años pero con DÍA especificado en DATEDIFF versus YEAR. Luego creé una tabla KMDays como antes e hice todos los cálculos usando esta tabla, pero todo está en Días y las dos tablas están relacionadas en la columna Días. Aquí está la fórmula de la tabla inicial.

KMDays = SUMMARIZE(HRData,HRData[Days],"Count",SUM(HRData[Count]),"d_i",SUM(HRData[Event]))

Después de tener eso, simplemente agregue el resto de la columna y mida los equivalentes para esa tabla. Cuando trazo KMDays[Days] y la medida MyKMDays, luego obtengo lo que parecen ser los resultados exactos del artículo original. A los 372 días, la medida es del 80,26%, que parece estar muerta al artículo original. Creo que la capacidad de Tableau para generar un verdadero eje continuo es la principal diferencia al hacer esto por año.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *