dashboard_summary = pd.DataFrame(
[
("Portfolio", "Accounts", len(customer_features), f"{len(customer_features):,}", "Account-level coverage"),
("Portfolio", "Transactions", int(monthly_activity["transaction_count"].sum()), f"{int(monthly_activity['transaction_count'].sum()):,}", "Clean transaction records"),
("Time", "Observed months", len(monthly_activity), f"{len(monthly_activity)}", "Monthly aggregate history"),
("Services", "Retained association rules", len(association_rules_data), f"{len(association_rules_data)}", "Hypotheses, not recommendations"),
("Segmentation", "Segments", len(segment_profiles), f"{len(segment_profiles)}", "Selected K-means solution"),
("Segmentation", "Behavioral outliers", len(selected_outlier_cases), f"{len(selected_outlier_cases)}", "Accounts meeting at least two signals"),
("Loan case study", "Completed loans", len(loan_model_data), f"{len(loan_model_data)}", "Only loans with known final status"),
("Loan case study", "Recorded problem loans", int(y.sum()), f"{int(y.sum())}", "Uncommon target class"),
("Loan case study", "Logistic-regression F1", float(selected_model_metrics["f1"]), f"{selected_model_metrics['f1']:.2f}", "Fixed historical test split"),
("Loan case study", "Logistic-regression PR-AUC", float(selected_model_metrics["pr_auc"]), f"{selected_model_metrics['pr_auc']:.2f}", "Useful with an uncommon target"),
],
columns=["section", "metric", "numeric_value", "display_value", "note"],
)
outlier_counts_by_segment = (
behavioral_outliers.groupby(["segment_id", "segment_name"])
.agg(
behavioral_outlier_count=("is_behavioral_outlier", "sum"),
account_count=("account_id", "size"),
)
.reset_index()
)
outlier_counts_by_segment["behavioral_outlier_rate"] = (
outlier_counts_by_segment["behavioral_outlier_count"]
/ outlier_counts_by_segment["account_count"]
)
dashboard_segments = segment_profiles.merge(
outlier_counts_by_segment[
[
"segment_id",
"behavioral_outlier_count",
"behavioral_outlier_rate",
]
],
on="segment_id",
how="left",
)
dashboard_outliers = selected_outlier_cases.merge(
customer_features[
[
"account_id",
"transactions_per_observed_month",
"average_inflow",
"average_outflow",
"average_balance",
"negative_balance_share",
"transaction_diversity",
"service_diversity",
"has_card",
"has_loan",
"has_standing_order",
]
],
on="account_id",
how="left",
).sort_values(
["outlier_signal_count", "composite_outlier_percentile"],
ascending=False,
).reset_index(drop=True)
dashboard_outliers.insert(
0,
"case_id",
[f"Case {index:02d}" for index in range(1, len(dashboard_outliers) + 1)],
)
dashboard_outliers = dashboard_outliers.drop(columns="account_id")
dashboard_segment_points = (
customer_segments.sort_values("account_id")[
[
"segment_id",
"segment_name",
"pca_component_1",
"pca_component_2",
]
]
.reset_index(drop=True)
)
dashboard_segment_points.insert(
0,
"point_id",
[f"Point {index:04d}" for index in range(1, len(dashboard_segment_points) + 1)],
)
display(dashboard_summary)
display(
dashboard_segments[
[
"segment_name",
"population_size",
"population_share",
"behavioral_outlier_count",
"behavioral_outlier_rate",
]
].round(3)
)
display(dashboard_outliers.head())