A sample churn prevention solution for a FinTech app. Purpose of this project is to show how to segmentize users to 2 possible segments: of engaged users, and un-engaged users. This is useful for designing some A/B tests, to see if deliberative interacting (with inactive users) can engage some of them.
-
Define a target metric to measure user engagement. How would you define an engaged vs. unengaged user?
- Please provide the business justification and associated visualisations / rationale in choosing your definition of engagement
-
Using your logic from above, build a model (heuristic/statistical/ML) to classify engaged and unengaged users
- Note that features which are directly correlated with your target metric could lead to overfitting
-
Let’s assume an unengaged user is a churned user. Now suppose we use your model to identify unengaged users and implement some business actions try to convert them to engaged users (commonly known as reducing churn)
- How would you set up a test/experiment to check whether we are actually reducing churn?
- What metrics and techniques would you use to assess the impact of the business action?
-
devices.csv - a table of devices associated with a user
- brand: string corresponding to the phone brand
- user_id: string uniquely identifying the user
-
users.csv - a table of user data
- user_id: string uniquely identifying the user
- birth_year: integer corresponding to the user’s birth year
- country: two letter string corresponding to the user’s country of residence
- city: two string corresponding to the user’s city of residence
- created_date: datetime corresponding to the user’s created date
- ser_settings_crypto_unlocked: integer indicating if the user has unlocked the crypto currencies in the app
- plan: string indicating on which plan the user is on
- attributes_notifications_marketing_push: float indicating if the user has accepted to receive marketing push notifications
- attributes_notifications_marketing_email: float indicating if the user has accepted to receive marketing email notifications
- num_contacts: integer corresponding to the number of contacts the user has on Revolut
- num_referrals: integer corresponding to the number of users referred by the selected user
- num_successful_referrals: integer corresponding to the number of users successfully referred by the selected user (successfully means users who have actually installed the app and are able to use the product)
-
notifications.csv - a table of notifications that a user has received
- reason: string indicating the purpose of the notification
- channel: string indicating how the user has been notified
- status: string indicating the status of the notification
- user_id: string uniquely identifying the user
- created_date: datetime indicating when the notification has been sent
-
transactions.csv - a table with transactions that a user made
- transaction_id: string uniquely identifying the transaction
- transactions_type: string indicating the type of the transaction
- transactions_currency: string indicating the currency of the transaction
- amount_usd: float corresponding to the transaction amount in USD
- transactions_state: string indicating the state of a transaction
- COMPLETED - the transaction was completed and the user's balance was changed
- DECLINED/FAILED - the transaction was declined for some reason, usually pertains to insufficient balance
- REVERTED - the associated transaction was completed first but was then rolled back later in time potentially due to customer reaching out to Revolut
- ea_cardholderpresence: string indicating if the card holder was present when the transaction happened
- ea_merchant_mcc: float corresponding to the Merchant Category Code (MCC)
- ea_merchant_city: string corresponding to the merchant’s city
- ea_merchant_country: string corresponding to the merchant’s country
- direction: string indicating the direction of the transaction
- user_id: string uniquely identifying the user
- created_date: datetime corresponding to the transaction’s created date
See a slideshare presentation for some additional comments and findings.
Tested on Python 3.7+
and Macbook Pro (OS version 10.15.4
)
Customer loyalty can be measured by a metric called "RFV".
Inspired by The Financial Times journal:
Recency – when did they last make a transaction?
Frequency – how often do they make transactions?
Volume – how many transactions have they made?
Responsivity - how long it takes to make a transaction since last notification?
Let's modify the RFV metric by adding another dimension - response to "push" notifications. Such RFV-R metric should be validated against 3 segments defined above (super-commited, engaged, unengaged) by adjusting importance weights.