Cálculo del coeficiente de variación

Un usuario Pregunto ✅

Schmidtmayer

Hola a todos 😃

Tengo una tabla que contiene las siguientes columnas:

Número personal, fecha, equipo, proyecto, categoría de tiempo, tiempo

Hay múltiples números personales por equipo, múltiples equipos por proyecto y también múltiples categorías de tiempo por fecha y número personal.

Mi objetivo es determinar si las altas cuotas de enfermedad se deben a algunos ejemplos extremos de altas tasas de enfermedad oa un caso de tasas de enfermedad altas en general.

Para responder a esta pregunta, quiero usar una herramienta estadística llamada coeficiente de variación. Esta es la desviación estándar dividida por el valor esperado.

https://en.wikipedia.org/wiki/Coeficiente_de_variación

Debido a las diferentes duraciones de los contratos, no utilizaré una distribución equitativa de las cuotas.
Usaré la cuota de enfermedad por empleado como una variable aleatoria con probabilidad igual a la proporción de las horas de los empleados a las horas del equipo/proyecto dentro del período de tiempo seleccionado.

Los tiempos relevantes se pueden filtrar usando la columna TimeCategory.

Sé cómo usar CALUCATE() en combinación con FILTER(), ALL(), ALLEXCEPT(), pero estoy perdido aquí.
Mi problema es: los datos deben preagregarse dinámicamente por número personal para obtener los resultados correctos. Y no sé cómo hacer esto.

La fórmula en sí se verá así:

CV = (((Cuota de enfermedad del empleado A- Cuota de enfermedad del equipo)^2)*(Horas totales del empleado A)/(Horas totales del equipo) +…..+((Cuota de enfermedad del empleado Y- Enfermedad Cuota del equipo)^2)*(Total de horas del empleado Y)/(Total de horas del equipo) )/(Cuota de enfermedad del equipo)

Como se dijo: Mi problema es el hecho de que los datos no están preagregados por número personal.

¡Necesitas ayuda!

Anónimo

En respuesta a Schmidtmayer

Todo el filtrado es unidireccional desde una dimensión a la tabla de hechos.

// Dimensions:
// 		Employee connected to FactTable[PIN] (1:*)
// 		Calendar connected to FactTable[Date] (1:*)
// 		Team connected to FactTable[TeamId] (1:*)
// 		Project connected to FactTable[ProjectId] (1:*)
// 		TimeCategory connected to FactTable[TimeCategoryId] (1:*)
// All *Id fields are hidden in dimensions.
//
// All columns in the FactTable must be hidden.
// Only measures can be visible. All slicing is
// done through dimensions. This is the correct
// star schema model.

// Define the following measures. They work for any
// slice for any dimension. In particular for 
// slices on Employee.

[Total] = SUM( FactTable[Hours] )

[Illness] =
	CALCULATE(
		[Total],
		KEEPFILTERS( TimeCategory[TimeCategoryId] = "Illness" )
	)

[IllnessQuota] = DIVIDE( [Illness], [Total] )
	
[Proportion To Team] =
var __totalForEmps = [Total]
var __teamsOfEmps =
	summarize(
		FactTable,
		Team[TeamId]
	)
var __totalForTeams =
	calculate(
		[Total],
		__teamsOfEmps,
		all( Employee ),
		all( Team )
	)
var __result =
	divide( __totalForEmps, __totalForTeams )
return
	__result
	
	
[VC for Team] =
var __oneTeamVisible = hasonevalue( Team[TeamId] )
var __team = 
	SUMMARIZE(
		FactTable,
		Team[TeamId]
	)
var __employees =
	SUMMARIZE(
		FactTable,
		Employee[PIN]
	)
var __numerator =
	SQRT(
		SUMX(
		
			__employees,
			
			var __iqForEmp = [IllnessQuota]
			var __iqForTeam =
				calculate(
					[IllnessQuota],
					__team,
					all( Team ),
					all( Employee )
				)
			var __propToTeam = [Proportion To Team]
			var __result =
				__propToTeam
					* POWER( __iqForEmp - __iqForTeam, 2 )
			return
				__result
			
		)
	)
var __denominator = 
	calculate(
		[IllnessQuota],
		__team,
		all( Team ),
		all( Employee )
	)
var __varCoeff =
	DIVIDE( __numerator, __denominator )
return
	if( __oneTeamVisible, __varCoeff )

Una vez que haya implementado el modelo correcto, hágame saber cómo va. Gracias 🙂

Mejor

D

greg_deckler

Tendré que mirar, creo que cubro Covariance en mi próximo libro, DAX Cookbook. Sale la próxima semana. Pero necesitaría datos de muestra. Consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

greg_deckler

En respuesta a greg_deckler

Ah, sí, aquí está la fórmula que estaba usando para la covarianza.

Covariance = 
    VAR __Table="R04_Table"
    VAR __Count = COUNTROWS(__Table)
    VAR __AvgA = AVERAGEX(__Table,[A])
    VAR __AvgB = AVERAGEX(__Table,[B])
    VAR __Table1 = 
        ADDCOLUMNS(
            __Table,
            "__Covariance",
            DIVIDE(
                ([A] - __AvgA) * ([B] - __AvgB),
                __Count
            )
        )
RETURN
    SUMX(__Table1,[__Covariance])

Anónimo

Hola.

Compañero, ¿podrías hacer esto más comprensible? Tenga en cuenta que no estamos trabajando con su modelo y lo que es fácil de entender para usted no es necesariamente fácil de entender para nosotros. Se está refiriendo en sus fórmulas a campos que no se encuentran en ninguna parte de su descripción. La tabla de arriba que mencionas no nos da casi ninguna información. Por ejemplo, ¿dónde y qué es la ‘cuota de enfermedad del empleado’? Entiendo que hay dimensiones y algunas tablas de hechos en su modelo, pero ¿podría ser más explícito, por favor? Indique qué tablas tiene, qué medidas, qué columnas… y cómo se unen entre sí.

Si la gente no entiende su problema, no obtendrá ninguna respuesta.

Mejor
D

Schmidtmayer

En respuesta a Anónimo

En primer lugar, gracias por la respuesta.
Seré más específico.

Solo hay una tabla hasta ahora, con las columnas mencionadas:

Número personal – Identificación única para identificar a los empleados
Fecha: no se requiere más información, supongo
Equipo – el equipo actual del empleado
Proyecto -el proyecto actual del empleado
TimeCategory – Clasificación de horas, incluye las categorías Enfermedad, Productivo, Vacaciones
Horas – Tiempo registrado del empleado

En lo siguiente, sea X el conjunto de números personales, T el conjunto de equipos

Para x de X definimos:

Total(x) = CALCULAR(SUMA(Horas); Número personal = x)
Enfermedad (x) = CALCULAR (SUMA (Horas); Número personal = x; Categoría de tiempo = Enfermedad)

Para t de T definimos:

Total

Anónimo

En respuesta a Schmidtmayer

Todo el filtrado es unidireccional desde una dimensión a la tabla de hechos.

// Dimensions:
// 		Employee connected to FactTable[PIN] (1:*)
// 		Calendar connected to FactTable[Date] (1:*)
// 		Team connected to FactTable[TeamId] (1:*)
// 		Project connected to FactTable[ProjectId] (1:*)
// 		TimeCategory connected to FactTable[TimeCategoryId] (1:*)
// All *Id fields are hidden in dimensions.
//
// All columns in the FactTable must be hidden.
// Only measures can be visible. All slicing is
// done through dimensions. This is the correct
// star schema model.

// Define the following measures. They work for any
// slice for any dimension. In particular for 
// slices on Employee.

[Total] = SUM( FactTable[Hours] )

[Illness] =
	CALCULATE(
		[Total],
		KEEPFILTERS( TimeCategory[TimeCategoryId] = "Illness" )
	)

[IllnessQuota] = DIVIDE( [Illness], [Total] )
	
[Proportion To Team] =
var __totalForEmps = [Total]
var __teamsOfEmps =
	summarize(
		FactTable,
		Team[TeamId]
	)
var __totalForTeams =
	calculate(
		[Total],
		__teamsOfEmps,
		all( Employee ),
		all( Team )
	)
var __result =
	divide( __totalForEmps, __totalForTeams )
return
	__result
	
	
[VC for Team] =
var __oneTeamVisible = hasonevalue( Team[TeamId] )
var __team = 
	SUMMARIZE(
		FactTable,
		Team[TeamId]
	)
var __employees =
	SUMMARIZE(
		FactTable,
		Employee[PIN]
	)
var __numerator =
	SQRT(
		SUMX(
		
			__employees,
			
			var __iqForEmp = [IllnessQuota]
			var __iqForTeam =
				calculate(
					[IllnessQuota],
					__team,
					all( Team ),
					all( Employee )
				)
			var __propToTeam = [Proportion To Team]
			var __result =
				__propToTeam
					* POWER( __iqForEmp - __iqForTeam, 2 )
			return
				__result
			
		)
	)
var __denominator = 
	calculate(
		[IllnessQuota],
		__team,
		all( Team ),
		all( Employee )
	)
var __varCoeff =
	DIVIDE( __numerator, __denominator )
return
	if( __oneTeamVisible, __varCoeff )

Una vez que haya implementado el modelo correcto, hágame saber cómo va. Gracias 🙂

Mejor

D

Schmidtmayer

En respuesta a Anónimo

@Anónimo Muchas gracias.
SUMMARIZE era todo lo que realmente necesitaba. Pude ponerlo todo en una medida más pequeña:

[coefficient of variation] =
var __tablapersonalnumero =
RESUMIR(
FactsTable
FactsTable[PersonalNumber];
«Total»; [Total];
«Enfermedad»; [Illness];
«Cuota»; [IllnessQuota]
)

var __tablacompleta =
RESUMEN (
Tabla de hechos
;
«GrupoTotal» ;[Total];
«GrupoEnfermedad»; [Illness];
«CuotaGrupo»; [IllnessQuota]
)

var __tablejoin =
CROSSJOIN(__tabla completa; __tablapersonalnúmero)

RETURN SQRT(SUMX(__tablejoin; (Cuota – QuotaGroup)*(Cuota-QuotaGroup)*Total/TotalGroup))/AVERAGEX(__tablecomplete; QuotaGroup)

Illness, Total y IllnessQuota definidos como en su publicación.

@Greg_Deckler: Su medida no fue tan útil, ya que la covarianza describe la dependencia/independencia de 2 variables aleatorias. Aquí, solo tengo una variable aleatoria, siendo las cuotas de enfermedad de los empleados. Quizás lo necesite más tarde. Gracias por eso 😃

greg_deckler

En respuesta a Schmidtmayer

Sí, lo siento @Schmidtmayer, ¡léelo demasiado rápido!

Anónimo

En respuesta a Schmidtmayer

Hola. Antes de pensar que tiene la solución correcta, eche un vistazo a este artículo:

https://www.sqlbi.com/articles/todos-los-secretos-de-resumir/

He aquí un extracto de la misma:

ACTUALIZACIÓN 2018-01-24: El contenido de este artículo está obsoleto a partir de enero de 2018. Las versiones recientes de Excel 2016, Power BI y Analysis Services tienen un comportamiento de RESUMEN que es diferente al descrito en este artículo. Como se indica a continuación, el uso de SUMMARIZE debe quedar obsoleto para las agregaciones y debe usar SUMMARIZECOLUMNS en su lugar. Obtenga más información en Introducción a SUMMARIZECOLUMNS.

Ignore la nota «obsoleta». No es relevante para tu caso. No debe usar SUMMARIZE para hacer ningún cálculo dentro de él. En su lugar, siempre debe usar la combinación SUMMARIZE/ADDCOLUMNS.

Lea el artículo si desea asegurarse de que su DAX sea siempre correcto. Pero hay más. También debe tener el diseño dimensional adecuado (como describí en mi medida en el preámbulo) si quiere estar seguro sabiendo que sus medidas siempre funcionan correctamente en cualquier circunstancia. Si quiere saber qué puede pasar si no hace esto, vaya y lea esto: https://www.sqlbi.com/articles/understanding-dax-auto-exist/

Tenga cuidado con la forma en que estructura sus modelos porque la exactitud de las cifras que produce DAX depende de ello.

Mejor
D

Schmidtmayer

En respuesta a Anónimo

@Anónimo:

Gracias por señalar Me di cuenta de esto durante la prueba de mi medida. Todos los valores eran basura completa la primera vez que lo probé. Es por eso que usé la segunda tabla para los valores de todo el grupo que estoy mirando y cruzándolo. Hasta ahora, todo funciona bien. También verificó los valores a través de una calculadora de bolsillo.

Con respecto al DataModell: Perdón por ignorarlo. Estamos usando este modelo como estándar dentro de nuestro departamento, así que no respondí esto.

saludos tom

Anónimo

En respuesta a Schmidtmayer

Hola.

Solo la última palabra de advertencia: si tiene un modelo que consiste en una gran tabla de hechos, entonces nunca sabrá cuándo el problema con la existencia automática lo atacará porque es casi aleatorio (en realidad no es así, pero si sucede o no depende de la distribución de datos en su tabla).

Entonces, en una palabra, corre el riesgo de producir números incorrectos sin siquiera saberlo. Si usted y su departamento pueden vivir con eso… entonces todo está bien.

Mejor
D

Deja un comentario

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