-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5e20263
commit cb7bde6
Showing
6 changed files
with
201 additions
and
102 deletions.
There are no files selected for viewing
85 changes: 85 additions & 0 deletions
85
frontend/src/scenes/funnels/funnelCorrelationDetailsLogic.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
import { expectLogic } from 'kea-test-utils' | ||
import { initKeaTests } from '~/test/init' | ||
import { FunnelCorrelationResultsType, FunnelCorrelationType, InsightLogicProps, InsightType } from '~/types' | ||
|
||
import { funnelCorrelationDetailsLogic } from './funnelCorrelationDetailsLogic' | ||
|
||
const funnelResults = [ | ||
{ | ||
action_id: '$pageview', | ||
count: 19, | ||
name: '$pageview', | ||
order: 0, | ||
type: 'events', | ||
}, | ||
{ | ||
action_id: '$pageview', | ||
count: 7, | ||
name: '$pageview', | ||
order: 1, | ||
type: 'events', | ||
}, | ||
{ | ||
action_id: '$pageview', | ||
count: 4, | ||
name: '$pageview', | ||
order: 2, | ||
type: 'events', | ||
}, | ||
] | ||
|
||
describe('funnelCorrelationDetailsLogic', () => { | ||
let logic: ReturnType<typeof funnelCorrelationDetailsLogic.build> | ||
|
||
beforeEach(() => { | ||
initKeaTests(false) | ||
}) | ||
|
||
const defaultProps: InsightLogicProps = { | ||
dashboardItemId: undefined, | ||
cachedInsight: { | ||
short_id: undefined, | ||
filters: { | ||
insight: InsightType.FUNNELS, | ||
actions: [ | ||
{ id: '$pageview', order: 0 }, | ||
{ id: '$pageview', order: 1 }, | ||
], | ||
}, | ||
result: funnelResults, | ||
}, | ||
} | ||
|
||
beforeEach(async () => { | ||
logic = funnelCorrelationDetailsLogic(defaultProps) | ||
logic.mount() | ||
}) | ||
|
||
describe('correlationMatrixAndScore', () => { | ||
it('returns calculated values based on selected details', async () => { | ||
await expectLogic(logic, () => | ||
logic.actions.setFunnelCorrelationDetails({ | ||
event: { event: 'some event', elements: [], properties: {} }, | ||
success_people_url: '', | ||
failure_people_url: '', | ||
success_count: 2, | ||
failure_count: 4, | ||
odds_ratio: 3, | ||
correlation_type: FunnelCorrelationType.Success, | ||
result_type: FunnelCorrelationResultsType.Events, | ||
}) | ||
).toMatchValues({ | ||
correlationMatrixAndScore: { | ||
correlationScore: expect.anything(), | ||
correlationScoreStrength: 'weak', | ||
truePositive: 2, | ||
falsePositive: 2, | ||
trueNegative: 11, | ||
falseNegative: 4, | ||
}, | ||
}) | ||
|
||
expect(logic.values.correlationMatrixAndScore.correlationScore).toBeCloseTo(0.204) | ||
}) | ||
}) | ||
}) |
105 changes: 105 additions & 0 deletions
105
frontend/src/scenes/funnels/funnelCorrelationDetailsLogic.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
import { kea, props, key, path, connect, selectors, reducers, actions } from 'kea' | ||
import { keyForInsightLogicProps } from 'scenes/insights/sharedUtils' | ||
import { FunnelCorrelation, InsightLogicProps } from '~/types' | ||
|
||
import { insightLogic } from 'scenes/insights/insightLogic' | ||
import { funnelLogic } from './funnelLogic' | ||
import { funnelDataLogic } from './funnelDataLogic' | ||
|
||
import type { funnelCorrelationDetailsLogicType } from './funnelCorrelationDetailsLogicType' | ||
|
||
export const funnelCorrelationDetailsLogic = kea<funnelCorrelationDetailsLogicType>([ | ||
props({} as InsightLogicProps), | ||
key(keyForInsightLogicProps('insight_funnel')), | ||
path((key) => ['scenes', 'funnels', 'funnelCorrelationDetailsLogic', key]), | ||
connect((props: InsightLogicProps) => ({ | ||
values: [ | ||
insightLogic(props), | ||
['isUsingDataExploration'], | ||
funnelLogic(props), | ||
['steps as legacySteps'], | ||
funnelDataLogic(props), | ||
['steps as dataExplorationSteps'], | ||
], | ||
})), | ||
|
||
actions({ | ||
setFunnelCorrelationDetails: (payload: FunnelCorrelation | null) => ({ payload }), | ||
}), | ||
|
||
reducers({ | ||
funnelCorrelationDetails: [ | ||
null as null | FunnelCorrelation, | ||
{ | ||
setFunnelCorrelationDetails: (_, { payload }) => payload, | ||
}, | ||
], | ||
}), | ||
|
||
selectors({ | ||
steps: [ | ||
(s) => [s.isUsingDataExploration, s.dataExplorationSteps, s.legacySteps], | ||
(isUsingDataExploration, dataExplorationApiParams, legacyApiParams) => { | ||
return isUsingDataExploration ? dataExplorationApiParams : legacyApiParams | ||
}, | ||
], | ||
|
||
correlationMatrixAndScore: [ | ||
(s) => [s.funnelCorrelationDetails, s.steps], | ||
( | ||
funnelCorrelationDetails, | ||
steps | ||
): { | ||
truePositive: number | ||
falsePositive: number | ||
trueNegative: number | ||
falseNegative: number | ||
correlationScore: number | ||
correlationScoreStrength: 'weak' | 'moderate' | 'strong' | null | ||
} => { | ||
if (!funnelCorrelationDetails) { | ||
return { | ||
truePositive: 0, | ||
falsePositive: 0, | ||
trueNegative: 0, | ||
falseNegative: 0, | ||
correlationScore: 0, | ||
correlationScoreStrength: null, | ||
} | ||
} | ||
|
||
const successTotal = steps[steps.length - 1].count | ||
const failureTotal = steps[0].count - successTotal | ||
const success = funnelCorrelationDetails.success_count | ||
const failure = funnelCorrelationDetails.failure_count | ||
|
||
const truePositive = success // has property, converted | ||
const falseNegative = failure // has property, but dropped off | ||
const trueNegative = failureTotal - failure // doesn't have property, dropped off | ||
const falsePositive = successTotal - success // doesn't have property, converted | ||
|
||
// Phi coefficient: https://en.wikipedia.org/wiki/Phi_coefficient | ||
const correlationScore = | ||
(truePositive * trueNegative - falsePositive * falseNegative) / | ||
Math.sqrt( | ||
(truePositive + falsePositive) * | ||
(truePositive + falseNegative) * | ||
(trueNegative + falsePositive) * | ||
(trueNegative + falseNegative) | ||
) | ||
|
||
const correlationScoreStrength = | ||
Math.abs(correlationScore) > 0.5 ? 'strong' : Math.abs(correlationScore) > 0.3 ? 'moderate' : 'weak' | ||
|
||
return { | ||
correlationScore, | ||
truePositive, | ||
falsePositive, | ||
trueNegative, | ||
falseNegative, | ||
correlationScoreStrength, | ||
} | ||
}, | ||
], | ||
}), | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters