SECTION 1: LEARNING OBJECTIVES
By the end of this lesson, you will be able to:
-
Define personalisation and its importance in digital banking.
-
Identify the key data sources for personalisation.
-
Understand the different levels of personalisation.
-
Apply segmentation and targeting techniques.
-
Implement recommendation systems for banking products.
-
Use AI and machine learning for real-time personalisation.
-
Measure the impact of personalisation on business outcomes.
-
Develop a personalisation strategy for a bank.
SECTION 2: WHAT IS PERSONALISATION?
2.1 Definition
Personalisation is the use of customer data to deliver tailored experiences, products, and communications to individual customers or segments, based on their preferences, behaviour, and needs.
2.2 The Personalisation Maturity Model
| Level | Description | Characteristics | Examples |
|---|---|---|---|
| Level 1: Basic | Use of name and basic segmentation. | Generic communications, one-size-fits-all. | “Dear Customer” emails. |
| Level 2: Segmented | Based on customer segments. | Targeted campaigns, segment-specific offers. | Student vs professional offers. |
| Level 3: Behavioural | Based on customer behaviour. | Triggered communications, behavioural targeting. | Abandoned cart reminders. |
| Level 4: Contextual | Based on time, location, and context. | Real-time, context-aware interactions. | Location-based offers. |
| Level 5: Predictive | Anticipate customer needs. | Proactive recommendations, next-best-action. | Savings advice, product suggestions. |
| Level 6: Hyper-Personalisation | Real-time, AI-driven, individualised. | Dynamic content, personalised journeys. | Unique app experience for each user. |
2.3 Why Personalisation Matters in Banking
| Statistic | Implication |
|---|---|
| 73% of customers expect personalisation. | Personalisation is no longer optional. |
| 80% of customers are more likely to do business with a company that offers personalised experiences. | Personalisation drives loyalty. |
| Banks with superior personalisation grow revenue 2x faster. | Personalisation is a competitive advantage. |
| 74% of customers feel frustrated when website content is not personalised. | Poor personalisation leads to dissatisfaction. |
SECTION 3: DATA SOURCES FOR PERSONALISATION
3.1 Types of Customer Data
┌─────────────────────────────────────────────────────────────────────────────┐ │ DATA SOURCES FOR PERSONALISATION │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ DEMOGRAPHIC DATA │ │ │ │ Age, gender, income, location, occupation, education │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ TRANSACTIONAL DATA │ │ │ │ Transaction history, spending patterns, payment behaviour │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ BEHAVIOURAL DATA │ │ │ │ Website/app usage, clickstream, session duration, feature usage │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ INTERACTION DATA │ │ │ │ Customer service interactions, chatbot conversations, surveys │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ EXTERNAL DATA │ │ │ │ Credit bureau, social media, public records, third-party data │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ REAL-TIME DATA │ │ │ │ Location, device, time, context, session activity │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘
3.2 Data Integration for Personalisation
| Component | Description | Example |
|---|---|---|
| Customer Data Platform (CDP) | Centralised customer data repository. | Segment, Adobe CDP, Salesforce CDP. |
| 360° Customer View | Unified view of customer across all touchpoints. | Single customer ID, all interactions. |
| Real-Time Data Processing | Process data as it arrives. | Event streaming, Kafka, real-time APIs. |
| Identity Resolution | Match customer identities across channels. | Deterministic/probabilistic matching. |
SECTION 4: SEGMENTATION AND TARGETING
4.1 Segmentation Types
| Type | Description | Examples |
|---|---|---|
| Demographic | Age, income, location, gender. | Students, professionals, retirees. |
| Behavioural | Spending patterns, product usage. | High spenders, frequent users, dormant. |
| Psychographic | Lifestyle, values, attitudes. | Savers, investors, spenders. |
| Life Stage | Life events and phases. | Students, young professionals, families, retirees. |
| Value-Based | Customer lifetime value. | High-value, medium-value, low-value. |
4.2 Targeting Strategies
| Strategy | Description | Application |
|---|---|---|
| Mass Marketing | One-size-fits-all. | Brand awareness. |
| Segmented Marketing | Tailored to segments. | Segment-specific offers. |
| Personalised Marketing | Individualised. | Behavioural targeting. |
| Contextual Marketing | Real-time, context-aware. | Location-based offers. |
| Predictive Marketing | Anticipate needs. | Next-best-action. |
SECTION 5: RECOMMENDATION SYSTEMS
5.1 Types of Recommendation Systems
| Type | Description | Banking Application |
|---|---|---|
| Content-Based Filtering | Recommend similar products. | Product recommendations based on customer profile. |
| Collaborative Filtering | Recommend based on similar customers. | “Customers like you also liked…” |
| Hybrid Systems | Combination of approaches. | More accurate recommendations. |
| Rule-Based | Business rules and logic. | “If customer has salary account, offer savings account.” |
| AI/ML-Based | Machine learning predictions. | Next-best-action predictions. |
5.2 Recommendation System Architecture
┌─────────────────────────────────────────────────────────────────────────────┐ │ RECOMMENDATION SYSTEM ARCHITECTURE │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ DATA LAYER │ │ │ │ Customer data, product data, transaction data, behavioural data │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ v │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ FEATURE ENGINEERING │ │ │ │ Customer features, product features, historical interactions │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ v │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ MODEL TRAINING │ │ │ │ Collaborative filtering, content-based, hybrid, ML models │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ v │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ REAL-TIME INFERENCE │ │ │ │ Generate recommendations in real-time │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ v │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ PRESENTATION │ │ │ │ App, web, email, push notifications │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘
SECTION 6: IMPLEMENTATION IN PYTHON – PERSONALISATION TOOLS
# =================================================================== # MODULE 2, LESSON 3: PERSONALISATION IN DIGITAL BANKING # =================================================================== import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.metrics.pairwise import cosine_similarity from datetime import datetime, timedelta import warnings warnings.filterwarnings('ignore') print("="*70) print("PERSONALISATION IN DIGITAL BANKING") print("="*70) # ---------------------------------------------------------------- # PART A: CUSTOMER SEGMENTATION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART A: Customer Segmentation") print("-"*60) # Generate synthetic customer data np.random.seed(42) n_customers = 1000 customer_data = pd.DataFrame({ 'customer_id': range(1, n_customers+1), 'age': np.random.normal(45, 15, n_customers).clip(18, 80).astype(int), 'income': np.random.gamma(5, 20, n_customers) + 20, 'transaction_count': np.random.gamma(2, 20, n_customers).clip(0, 200).astype(int), 'avg_transaction': np.random.gamma(2, 50, n_customers).clip(10, 500), 'account_balance': np.random.gamma(3, 100, n_customers).clip(0, 50000), 'tenure': np.random.gamma(2, 5, n_customers).clip(0, 20).astype(int), 'products_count': np.random.choice([1, 2, 3, 4, 5, 6], n_customers, p=[0.2, 0.3, 0.2, 0.15, 0.1, 0.05]) }) print("Customer Data Sample:") print(customer_data.head()) # Feature engineering for segmentation features = ['age', 'income', 'transaction_count', 'avg_transaction', 'account_balance', 'tenure', 'products_count'] X = customer_data[features] # Standardise scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # K-Means clustering kmeans = KMeans(n_clusters=4, random_state=42, n_init=10) customer_data['segment'] = kmeans.fit_predict(X_scaled) # Segment profiles segment_profiles = customer_data.groupby('segment').agg({ 'age': 'mean', 'income': 'mean', 'transaction_count': 'mean', 'avg_transaction': 'mean', 'account_balance': 'mean', 'tenure': 'mean', 'products_count': 'mean', 'customer_id': 'count' }).round(2) segment_profiles.columns = ['Age', 'Income ($k)', 'Transactions', 'Avg Trans ($)', 'Balance ($)', 'Tenure (years)', 'Products', 'Count'] print("\nCustomer Segment Profiles:") print(segment_profiles) # Visualise segments fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # Income vs Age ax = axes[0, 0] for segment in customer_data['segment'].unique(): subset = customer_data[customer_data['segment'] == segment] ax.scatter(subset['age'], subset['income'], label=f'Segment {segment}', alpha=0.6) ax.set_xlabel('Age') ax.set_ylabel('Income ($k)') ax.set_title('Customer Segments') ax.legend() # Transaction Count vs Average Transaction ax = axes[0, 1] for segment in customer_data['segment'].unique(): subset = customer_data[customer_data['segment'] == segment] ax.scatter(subset['transaction_count'], subset['avg_transaction'], label=f'Segment {segment}', alpha=0.6) ax.set_xlabel('Transaction Count') ax.set_ylabel('Average Transaction ($)') ax.set_title('Transaction Behaviour') ax.legend() # Product Count by Segment ax = axes[1, 0] segment_products = customer_data.groupby('segment')['products_count'].mean() ax.bar(segment_products.index, segment_products.values, color='teal', alpha=0.7) ax.set_xlabel('Segment') ax.set_ylabel('Average Products Count') ax.set_title('Product Adoption by Segment') # Segment Distribution ax = axes[1, 1] segment_counts = customer_data['segment'].value_counts() ax.pie(segment_counts.values, labels=segment_counts.index, autopct='%1.1f%%') ax.set_title('Segment Distribution') plt.tight_layout() plt.savefig('customer_segmentation.png', dpi=300, bbox_inches='tight') plt.show() print("Customer segmentation visualisation saved as 'customer_segmentation.png'") # ---------------------------------------------------------------- # PART B: PRODUCT RECOMMENDATION SYSTEM # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART B: Product Recommendation System") print("-"*60) # Define products products = ['Savings Account', 'Checking Account', 'Credit Card', 'Personal Loan', 'Mortgage', 'Investment Account', 'Insurance', 'Business Account'] # Simulate customer-product interactions (0 = not owned, 1 = owned) np.random.seed(42) interactions = np.random.choice([0, 1], (n_customers, len(products)), p=[0.7, 0.3]) # Ensure customers have at least one product for i in range(n_customers): if interactions[i].sum() == 0: interactions[i, np.random.randint(0, len(products))] = 1 # Create product interaction matrix interaction_df = pd.DataFrame(interactions, columns=products) customer_data = pd.concat([customer_data, interaction_df], axis=1) print("Product Interaction Matrix (Sample):") print(interaction_df.head()) # Collaborative filtering recommendations def get_product_recommendations(customer_id, interaction_matrix, products, top_n=3): """Get product recommendations based on collaborative filtering.""" # Get the customer's product vector customer_vector = interaction_matrix.iloc[customer_id-1].values.reshape(1, -1) # Calculate similarity with all customers similarities = cosine_similarity(customer_vector, interaction_matrix.values) similar_customers = np.argsort(similarities[0])[-6:-1] # Top 5 similar customers # Get products owned by similar customers similar_products = interaction_matrix.iloc[similar_customers].sum(axis=0) # Remove products already owned by the customer owned = interaction_matrix.iloc[customer_id-1] == 1 similar_products[owned] = 0 # Get top recommendations recommended = similar_products.sort_values(ascending=False).head(top_n) return recommended.index.tolist() # Get recommendations for a sample customer sample_customer = 42 recommendations = get_product_recommendations(sample_customer, interaction_df, products) owned_products = interaction_df.columns[interaction_df.iloc[sample_customer-1] == 1].tolist() print(f"\nCustomer {sample_customer}:") print(f" Owned Products: {owned_products}") print(f" Recommended Products: {recommendations}") # ---------------------------------------------------------------- # PART C: NEXT-BEST-ACTION PREDICTION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART C: Next-Best-Action Prediction") print("-"*60) # Simulate next-best-action dataset np.random.seed(42) n_actions = 10000 action_data = pd.DataFrame({ 'customer_id': np.random.choice(range(1, n_customers+1), n_actions), 'action_type': np.random.choice(['Deposit', 'Withdrawal', 'Transfer', 'Payment', 'Account Opening', 'Loan Application', 'Investment', 'Insurance Quote'], n_actions), 'amount': np.random.gamma(3, 50, n_actions), 'timestamp': [datetime.now() - timedelta(days=np.random.randint(0, 365)) for _ in range(n_actions)] }) print("Action Data Sample:") print(action_data.head()) # Feature engineering for action prediction customer_actions = action_data.groupby('customer_id').agg({ 'action_type': lambda x: x.value_counts().index[0] if len(x) > 0 else 'None', 'amount': 'mean', 'timestamp': 'count' }).reset_index() customer_actions.columns = ['customer_id', 'most_frequent_action', 'avg_amount', 'action_count'] # Merge with customer data customer_full = customer_data.merge(customer_actions, on='customer_id', how='left') customer_full.fillna({'most_frequent_action': 'Unknown', 'avg_amount': 0, 'action_count': 0}, inplace=True) # Simple heuristic for next-best-action def predict_nba(row): """Simple rule-based next-best-action prediction.""" if row['products_count'] < 3: return 'Increase product adoption' elif row['transaction_count'] < 10: return 'Increase transaction activity' elif row['account_balance'] > 50000: return 'Investment advice' elif row['age'] > 55: return 'Retirement planning' else: return 'General engagement' customer_full['next_best_action'] = customer_full.apply(predict_nba, axis=1) print("\nNext-Best-Action Distribution:") print(customer_full['next_best_action'].value_counts()) # ---------------------------------------------------------------- # PART D: PERSONALISED OFFER SIMULATION # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART D: Personalised Offer Simulation") print("-"*60) # Define offers offers = { 'High Spender': {'offer': 'Premium Credit Card', 'condition': 'avg_transaction > 200'}, 'Saver': {'offer': 'High-Yield Savings', 'condition': 'account_balance > 10000'}, 'Investor': {'offer': 'Investment Advisory', 'condition': 'products_count > 3'}, 'New Customer': {'offer': 'Welcome Bonus', 'condition': 'tenure < 1'}, 'Dormant': {'offer': 'Re-engagement Offer', 'condition': 'transaction_count < 5'} } # Simulate personalised offers def generate_personalised_offer(row): """Generate a personalised offer based on customer profile.""" if row['avg_transaction'] > 200: return 'Premium Credit Card' elif row['account_balance'] > 10000: return 'High-Yield Savings' elif row['products_count'] > 3: return 'Investment Advisory' elif row['tenure'] < 1: return 'Welcome Bonus' elif row['transaction_count'] < 5: return 'Re-engagement Offer' else: return 'Standard Savings Offer' customer_data['personalised_offer'] = customer_data.apply(generate_personalised_offer, axis=1) print("\nPersonalised Offer Distribution:") print(customer_data['personalised_offer'].value_counts()) # Visualise offer distribution by segment offer_by_segment = customer_data.groupby(['segment', 'personalised_offer']).size().unstack(fill_value=0) fig, ax = plt.subplots(figsize=(12, 6)) offer_by_segment.plot(kind='bar', ax=ax, stacked=True) ax.set_xlabel('Segment') ax.set_ylabel('Number of Customers') ax.set_title('Personalised Offers by Segment') ax.legend(loc='best') ax.grid(True, alpha=0.3) plt.tight_layout() plt.savefig('personalised_offers.png', dpi=300, bbox_inches='tight') plt.show() print("Personalised offers visualisation saved as 'personalised_offers.png'") # ---------------------------------------------------------------- # PART E: PERSONALISATION MATURITY ASSESSMENT # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART E: Personalisation Maturity Assessment") print("-"*60) maturity = pd.DataFrame({ 'Dimension': ['Data', 'Segmentation', 'Targeting', 'Recommendation', 'Real-Time', 'Measurement'], 'Current Level (1-6)': [3, 3, 2, 3, 2, 3], 'Target Level (1-6)': [5, 5, 5, 5, 4, 5], 'Gap': [2, 2, 3, 2, 2, 2] }) print("Personalisation Maturity Assessment:") print(maturity.to_string(index=False)) # Visualise fig, ax = plt.subplots(figsize=(10, 6)) x = np.arange(len(maturity)) width = 0.35 ax.bar(x - width/2, maturity['Current Level (1-6)'], width, label='Current', color='blue', alpha=0.7) ax.bar(x + width/2, maturity['Target Level (1-6)'], width, label='Target', color='green', alpha=0.7) ax.set_xlabel('Dimension') ax.set_ylabel('Level (1-6)') ax.set_title('Personalisation Maturity Assessment') ax.set_xticks(x) ax.set_xticklabels(maturity['Dimension']) ax.legend() ax.grid(True, alpha=0.3) plt.tight_layout() plt.savefig('personalisation_maturity.png', dpi=300, bbox_inches='tight') plt.show() print("Personalisation maturity visualisation saved as 'personalisation_maturity.png'") # ---------------------------------------------------------------- # PART F: PERSONALISATION STRATEGY RECOMMENDATIONS # ---------------------------------------------------------------- print("\n" + "-"*60) print("PART F: Personalisation Strategy Recommendations") print("-"*60) strategy = { "1. Data Foundation": { "Actions": [ "Build a Customer Data Platform (CDP).", "Integrate data across all channels.", "Implement real-time data processing.", "Ensure data quality and governance." ], "Priority": "High", "Timeline": "0-6 months" }, "2. Segmentation": { "Actions": [ "Implement dynamic segmentation.", "Use behavioural and predictive segments.", "Segment by customer value and potential.", "Create micro-segments for targeting." ], "Priority": "High", "Timeline": "0-6 months" }, "3. Recommendation Systems": { "Actions": [ "Build AI-powered recommendation engine.", "Implement hybrid recommendation systems.", "Personalise product recommendations.", "Add next-best-action capabilities." ], "Priority": "High", "Timeline": "6-12 months" }, "4. Real-Time Personalisation": { "Actions": [ "Implement real-time event processing.", "Personalise website and app experiences.", "Use context-aware personalisation.", "Implement dynamic content delivery." ], "Priority": "Medium", "Timeline": "12-18 months" }, "5. Measurement": { "Actions": [ "Define personalisation KPIs.", "Implement A/B testing.", "Track business impact (ROI).", "Continuously optimise." ], "Priority": "High", "Timeline": "Ongoing" } } for item, details in strategy.items(): print(f"\n{item}:") for action in details['Actions']: print(f" • {action}") print(f" Priority: {details['Priority']}") print(f" Timeline: {details['Timeline']}") # ---------------------------------------------------------------- # PART G: SUMMARY AND RECOMMENDATIONS # ---------------------------------------------------------------- print("\n" + "="*70) print("PART G: Summary and Recommendations") print("="*70) print(""" Personalisation in Digital Banking – Key Takeaways: 1. Personalisation is a key competitive differentiator in banking. 2. Data sources include demographic, transactional, behavioural, and real-time data. 3. Segmentation enables targeted personalisation. 4. Recommendation systems suggest relevant products and actions. 5. Next-best-action predicts the most relevant offer for each customer. 6. Personalisation maturity ranges from basic to hyper-personalisation. 7. Measurement and optimisation are essential for success. Recommendations: - Build a Customer Data Platform (CDP). - Implement dynamic segmentation and targeting. - Develop AI-powered recommendation systems. - Enable real-time personalisation. - Measure and optimise personalisation impact. - Continuously invest in data and AI capabilities. """) print("="*70) print("END OF LESSON 3 – MODULE 2") print("="*70)
SECTION 7: SUMMARY FOR THE DATA PRACTITIONER
-
Personalisation is a key competitive differentiator in digital banking.
-
Data sources include demographic, transactional, behavioural, and real-time data.
-
Segmentation enables targeted personalisation across customer groups.
-
Recommendation systems suggest relevant products and actions to customers.
-
Next-best-action predicts the most relevant offer for each customer.
-
Personalisation maturity ranges from basic to hyper-personalisation.
-
Measurement and optimisation are essential for success.
SECTION 8: RECOMMENDED NEXT STEPS
-
Build a Customer Data Platform (CDP).
-
Implement dynamic segmentation and targeting.
-
Develop AI-powered recommendation systems.
-
Enable real-time personalisation.
-
Measure and optimise personalisation impact.
-
Prepare for Lesson 4: Omnichannel Banking Integration.
[END OF LESSON 3 – MODULE 2]