pair_probabilities_fl()
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer
Calcular várias probabilidades e métricas relacionadas para um par de variáveis categóricas.
A função pair_probabilities_fl()
é uma UDF (função definida pelo usuário) que calcula as seguintes probabilidades e métricas relacionadas para um par de variáveis categóricas, A e B, da seguinte maneira:
- P(A) é a probabilidade de cada valor A=a
- P(B) é a probabilidade de cada valor B=b
- P(A|B) é a probabilidade condicional de A = um dado B = b
- P(B|A) é a probabilidade condicional de B = b dada A = a
- P(A∪B) é a probabilidade de união (A=a ou B=b)
- P(A∩B) é a probabilidade de interseção (A=a e B=b)
- A métrica de comparação de precisão é calculada como P(A∩B)/P(A)*P(B). Para obter mais informações, consulte métrica de aumento.
- Um aumento próximo a 1 significa que a probabilidade conjunta de dois valores é semelhante ao esperado no caso de ambas as variáveis serem independentes.
- O Lift >> 1 significa que os valores coocorrem com mais frequência do que o esperado sob a suposição de independência.
- O aumento << 1 significa que os valores são menos prováveis de coocorrer do que o esperado sob a suposição de independência.
- O coeficiente de similaridade de Jaccard é calculado como P(A∩B)/P(A∪B). Para obter mais informações, consulte Coeficiente de similaridade de Jaccard.
- Um coeficiente de Jaccard alto, próximo a 1, significa que os valores tendem a ocorrer juntos.
- Um coeficiente de Jaccard baixo, próximo a 0, significa que os valores tendem a ficar separados.
Sintaxe
pair_probabilities_fl(
A, B, Escopo)
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
A | scalar | ✔️ | A primeira variável categórica. |
B | scalar | ✔️ | A segunda variável categórica. |
Escopo | scalar | ✔️ | O campo que contém o escopo, de modo que as probabilidades de A e B sejam calculadas independentemente para cada valor de escopo. |
Definição de função
Você pode definir a função inserindo seu código como uma função definida por consulta ou criando-a como uma função armazenada em seu banco de dados, da seguinte maneira:
Defina a função usando a instrução let a seguir. Nenhuma permissão é necessária.
Importante
Uma instrução let não pode ser executada sozinha. Ele deve ser seguido por uma instrução de expressão tabular. Para executar um exemplo funcional de pair_probabilities_fl()
, consulte Exemplo.
let pair_probabilities_fl = (tbl:(*), A_col:string, B_col:string, scope_col:string)
{
let T = materialize(tbl | extend _A = column_ifexists(A_col, ''), _B = column_ifexists(B_col, ''), _scope = column_ifexists(scope_col, ''));
let countOnScope = T | summarize countAllOnScope = count() by _scope;
let probAB = T | summarize countAB = count() by _A, _B, _scope | join kind = leftouter (countOnScope) on _scope | extend P_AB = todouble(countAB)/countAllOnScope;
let probA = probAB | summarize countA = sum(countAB), countAllOnScope = max(countAllOnScope) by _A, _scope | extend P_A = todouble(countA)/countAllOnScope;
let probB = probAB | summarize countB = sum(countAB), countAllOnScope = max(countAllOnScope) by _B, _scope | extend P_B = todouble(countB)/countAllOnScope;
probAB
| join kind = leftouter (probA) on _A, _scope // probability for each value of A
| join kind = leftouter (probB) on _B, _scope // probability for each value of B
| extend P_AUB = P_A + P_B - P_AB // union probability
, P_AIB = P_AB/P_B // conditional probability of A on B
, P_BIA = P_AB/P_A // conditional probability of B on A
| extend Lift_AB = P_AB/(P_A * P_B) // lift metric
, Jaccard_AB = P_AB/P_AUB // Jaccard similarity index
| project _A, _B, _scope, bin(P_A, 0.00001), bin(P_B, 0.00001), bin(P_AB, 0.00001), bin(P_AUB, 0.00001), bin(P_AIB, 0.00001)
, bin(P_BIA, 0.00001), bin(Lift_AB, 0.00001), bin(Jaccard_AB, 0.00001)
| sort by _scope, _A, _B
};
// Write your query to use the function here.
Exemplo
O exemplo a seguir usa o operador invoke para executar a função.
Para usar uma função definida por consulta, invoque-a após a definição da função inserida.
let pair_probabilities_fl = (tbl:(*), A_col:string, B_col:string, scope_col:string)
{
let T = materialize(tbl | extend _A = column_ifexists(A_col, ''), _B = column_ifexists(B_col, ''), _scope = column_ifexists(scope_col, ''));
let countOnScope = T | summarize countAllOnScope = count() by _scope;
let probAB = T | summarize countAB = count() by _A, _B, _scope | join kind = leftouter (countOnScope) on _scope | extend P_AB = todouble(countAB)/countAllOnScope;
let probA = probAB | summarize countA = sum(countAB), countAllOnScope = max(countAllOnScope) by _A, _scope | extend P_A = todouble(countA)/countAllOnScope;
let probB = probAB | summarize countB = sum(countAB), countAllOnScope = max(countAllOnScope) by _B, _scope | extend P_B = todouble(countB)/countAllOnScope;
probAB
| join kind = leftouter (probA) on _A, _scope // probability for each value of A
| join kind = leftouter (probB) on _B, _scope // probability for each value of B
| extend P_AUB = P_A + P_B - P_AB // union probability
, P_AIB = P_AB/P_B // conditional probability of A on B
, P_BIA = P_AB/P_A // conditional probability of B on A
| extend Lift_AB = P_AB/(P_A * P_B) // lift metric
, Jaccard_AB = P_AB/P_AUB // Jaccard similarity index
| project _A, _B, _scope, bin(P_A, 0.00001), bin(P_B, 0.00001), bin(P_AB, 0.00001), bin(P_AUB, 0.00001), bin(P_AIB, 0.00001)
, bin(P_BIA, 0.00001), bin(Lift_AB, 0.00001), bin(Jaccard_AB, 0.00001)
| sort by _scope, _A, _B
};
//
let dancePairs = datatable(boy:string, girl:string, dance_class:string)[
'James', 'Mary', 'Modern',
'James', 'Mary', 'Modern',
'Robert', 'Mary', 'Modern',
'Robert', 'Mary', 'Modern',
'Michael', 'Patricia', 'Modern',
'Michael', 'Patricia', 'Modern',
'James', 'Patricia', 'Modern',
'Robert', 'Patricia', 'Modern',
'Michael', 'Patricia', 'Modern',
'Michael', 'Patricia', 'Modern',
'James', 'Linda', 'Modern',
'James', 'Linda', 'Modern',
'Robert', 'Linda', 'Modern',
'Robert', 'Linda', 'Modern',
'James', 'Linda', 'Modern',
'Robert', 'Mary', 'Modern',
'Michael', 'Patricia', 'Modern',
'Michael', 'Patricia', 'Modern',
'James', 'Linda', 'Modern',
'Robert', 'Mary', 'Classic',
'Robert', 'Linda', 'Classic',
'James', 'Mary', 'Classic',
'James', 'Linda', 'Classic'
];
dancePairs
| invoke pair_probabilities_fl('boy','girl', 'dance_class')
Saída
Vejamos a lista de pares de pessoas dançando em duas aulas de dança supostamente aleatórias para descobrir se algo parece anômalo (ou seja, não aleatório). Começaremos examinando cada classe por si só.
O par Michael-Patricia tem uma métrica de aumento de 2,375, que está significativamente acima de 1. Esse valor significa que eles são vistos juntos com muito mais frequência do que o que seria esperado se esse emparelhamento fosse aleatório. Seu coeficiente de Jaccard é 0,75, que é próximo de 1. Quando a dupla dança, eles preferem dançar juntos.
A | B | scope | P_A | P_B | P_AB | P_AUB | P_AIB | P_BIA | Lift_AB | Jaccard_AB |
---|---|---|---|---|---|---|---|---|---|---|
Robert | Patricia | Moderno | 0.31578 | 0.42105 | 0.05263 | 0.68421 | 0.12499 | 0.16666 | 0.39583 | 0.07692 |
Robert | Mary | Moderno | 0.31578 | 0.26315 | 0.15789 | 0.42105 | 0.59999 | 0.49999 | 1.89999 | 0.37499 |
Robert | Linda | Moderno | 0.31578 | 0.31578 | 0.10526 | 0.52631 | 0.33333 | 0.33333 | 1.05555 | 0,2 |
Michael | Patricia | Moderno | 0.31578 | 0.42105 | 0.31578 | 0.42105 | 0,75 | 0.99999 | 2.375 | 0,75 |
James | Patricia | Moderno | 0.36842 | 0.42105 | 0.05263 | 0.73684 | 0.12499 | 0.14285 | 0.33928 | 0.07142 |
James | Mary | Moderno | 0.36842 | 0.26315 | 0.10526 | 0.52631 | 0,4 | 0.28571 | 1.08571 | 0,2 |
James | Linda | Moderno | 0.36842 | 0.31578 | 0.21052 | 0.47368 | 0.66666 | 0.57142 | 1.80952 | 0.44444 |
Robert | Mary | Clássico | 0.49999 | 0.49999 | 0.24999 | 0,75 | 0.49999 | 0.49999 | 0.99999 | 0.33333 |
Robert | Linda | Clássico | 0.49999 | 0.49999 | 0.24999 | 0,75 | 0.49999 | 0.49999 | 0.99999 | 0.33333 |
James | Mary | Clássico | 0.49999 | 0.49999 | 0.24999 | 0,75 | 0.49999 | 0.49999 | 0.99999 | 0.33333 |
James | Linda | Clássico | 0.49999 | 0.49999 | 0.24999 | 0,75 | 0.49999 | 0.49999 | 0.99999 | 0.33333 |