InsuranceBot / kb /methodology /knowledge-graph.md
rohitsar567's picture
data+scoring: verbatim-source all policy_facts, recalibrate scorecard, fix recommendation
7081aaa
|
Raw
History Blame Contribute Delete
8.37 kB
# Scorecard Knowledge Graph
How the scorecard responds to (a) the policy's own attributes and (b) the buyer's profile inputs. Every entry is sourced from the rules baked into `backend/scorecard.py` β€” this doc is the human-readable spec, not free-form opinion.
---
## Part A β€” Policy attribute β†’ sub-score delta
Each row: "if the policy has this value, the listed sub-score moves by this delta." Sub-scores are 0–100. The overall A–F grade is the weighted average (see Part B for weight tuning).
### Coverage Breadth (base 60, weight 22%)
| Attribute | Value condition | Sub-score delta | Source rule |
|---|---|---|---|
| `ayush_coverage` | true | +8 | "AYUSH covered" |
| `ayush_coverage` | false | βˆ’5 | "no AYUSH" |
| `day_care_treatments_count` | β‰₯400 | +10 | "{N} day-care procedures" |
| `day_care_treatments_count` | 200–399 | +6 | |
| `day_care_treatments_count` | <100 | βˆ’5 | "only {N} day-care procedures" |
| `maternity_coverage` | true | +6 | "maternity covered" |
| `newborn_coverage` | true | +4 | "newborn covered" |
| `organ_donor_expenses` | true | +4 | |
| `ambulance_cover` | true | +3 | |
| `domiciliary_treatment` | true | +4 | |
| `preventive_health_checkup` | true | +3 | "free health checkups" |
| `pre_hospitalization_days` | β‰₯60 | +4 | |
| `post_hospitalization_days` | β‰₯90 | +4 | |
### Cost Predictability (base 75, weight 20%)
| Attribute | Value condition | Sub-score delta |
|---|---|---|
| `copayment_pct` | 0 | +0 (baseline) |
| `copayment_pct` | 10 | βˆ’5 |
| `copayment_pct` | β‰₯20 | βˆ’12 |
| `room_rent_capping` | "No limit" / "Single Private A/C Room" | +6 |
| `room_rent_capping` | capped (any % or amount) | βˆ’5 to βˆ’10 |
| `deductible_amount` | 0 | +0 |
| `deductible_amount` | β‰₯100000 | βˆ’8 |
| `sub_limits` | absent | +5 |
| `icu_charges_capping` | none | +3 |
### Waiting-Period Friction (base 70, weight 18%)
| Attribute | Value condition | Sub-score delta |
|---|---|---|
| `initial_waiting_period_days` | ≀30 | +0 (industry standard) |
| `initial_waiting_period_days` | >30 | βˆ’3 |
| `pre_existing_disease_waiting_months` | ≀24 | +10 |
| `pre_existing_disease_waiting_months` | 36 | +0 (industry standard, IRDAI cap) |
| `pre_existing_disease_waiting_months` | β‰₯48 | βˆ’15 (non-conformant) |
| `maternity_waiting_months` | ≀24 | +5 |
| `maternity_waiting_months` | β‰₯36 | βˆ’5 |
| `specific_disease_waiting_months` | ≀24 | +3 |
### Claim Experience (base 65, weight 20%) β€” uses insurer-level data
| Attribute | Value condition | Sub-score delta |
|---|---|---|
| `cashless_treatment_supported` | true | +5 |
| `network_hospital_count` | β‰₯10,000 | +10 |
| `network_hospital_count` | 5,000–9,999 | +5 |
| `network_hospital_count` | <2,000 | βˆ’5 |
| `claim_settlement_ratio` (IRDAI) | β‰₯95% | +12 |
| `claim_settlement_ratio` | 90–95% | +6 |
| `claim_settlement_ratio` | <85% | βˆ’10 |
| `complaints_per_10k_policies` | <5 | +4 |
| `complaints_per_10k_policies` | >20 | βˆ’8 |
| `tat_cashless_authorization_hours` | ≀2 | +4 |
| `tat_cashless_authorization_hours` | β‰₯24 | βˆ’4 |
### Renewal Protection (base 50, weight 12%)
> Renewal Protection now = `max_entry_age` only. Lifelong renewability is the IRDAI universal norm for every health-indemnity product (mandated since 2020), so it is constant across the market and is **not scored** β€” `max_renewal_age` was removed entirely as a scored field.
| Attribute | Value condition | Sub-score delta |
|---|---|---|
| `max_entry_age` | β‰₯65 | +25 |
| `max_entry_age` | β‰₯55 | +12 |
| `max_entry_age` | β‰₯50 | +0 |
| `max_entry_age` | <50 | βˆ’20 |
| (lifelong renewability) | IRDAI-universal | not scored β€” shown for transparency only |
### Bonus & Loyalty (base 60, weight 8%)
| Attribute | Value condition | Sub-score delta |
|---|---|---|
| `no_claim_bonus_pct` | β‰₯50 | +8 |
| `no_claim_bonus_pct` | 25–49 | +4 |
| `restoration_benefit` | present | +6 |
| `preventive_health_checkup` | free annually | +3 |
| `wellness_program_present` | true | +2 |
---
## Part B β€” User input β†’ weight redistribution
Same 6 sub-scores, but the WEIGHTS shift based on what we know about the buyer. Every collected signal moves at least one weight β€” if a field doesn't appear here, we wasted attention collecting it.
Each delta is applied to the base weights then **renormalised to sum 1.0** with a 5% per-criterion floor.
### Age
| Age band | Weight deltas |
|---|---|
| <30 | Waiting-Period Friction +0.04, Claim Experience +0.02, Renewal Protection βˆ’0.04, Bonus & Loyalty βˆ’0.02 |
| 30–49 | (no shift) |
| β‰₯50 | Renewal Protection +0.06, Claim Experience +0.02, Bonus & Loyalty βˆ’0.04, Waiting-Period Friction βˆ’0.04 |
### Dependents
| Dependent | Weight deltas |
|---|---|
| kids / children | Coverage Breadth +0.03, Bonus & Loyalty +0.01, Cost Predictability βˆ’0.02, Renewal Protection βˆ’0.02 |
| spouse | Coverage Breadth +0.02, Waiting-Period Friction +0.02, Bonus & Loyalty βˆ’0.02, Renewal Protection βˆ’0.02 |
| parents | Coverage Breadth +0.04, Claim Experience +0.04, Bonus & Loyalty βˆ’0.04, Cost Predictability βˆ’0.04 |
| parents with PED or age β‰₯65 | + extra: Renewal Protection +0.04, Waiting-Period Friction +0.02, Bonus & Loyalty βˆ’0.04, Cost Predictability βˆ’0.02 |
### Existing cover
| Condition | Weight deltas |
|---|---|
| Has existing cover >0 (super-top-up buyer) | Cost Predictability βˆ’0.03, Claim Experience +0.03 |
| No existing cover (first-time buyer) | Cost Predictability +0.03, Coverage Breadth +0.02, Bonus & Loyalty βˆ’0.03, Waiting-Period Friction βˆ’0.02 |
### Primary goal
| Goal | Weight deltas |
|---|---|
| Tax planning | Cost Predictability +0.02, Bonus & Loyalty βˆ’0.02 |
| Upgrade existing cover | Coverage Breadth +0.03, Renewal Protection +0.02, Bonus & Loyalty βˆ’0.05 |
| Compare specific policies | Flatten weights (5% pull to uniform β€” user already knows what matters) |
### Health conditions
| Condition | Weight deltas |
|---|---|
| Diabetes / BP / hyper / thyroid / heart / cancer / asthma | Waiting-Period Friction +0.06, Claim Experience +0.03, Bonus & Loyalty βˆ’0.04, Cost Predictability βˆ’0.03, Renewal Protection βˆ’0.02 |
### Budget band
| Band | Weight deltas |
|---|---|
| under_15k or 15k_30k | Cost Predictability +0.04, Bonus & Loyalty βˆ’0.02, Waiting-Period Friction βˆ’0.02 |
| 60k+ | Coverage Breadth +0.02, Claim Experience +0.02, Cost Predictability βˆ’0.04 |
### Income band
| Band | Weight deltas |
|---|---|
| under_5L | Cost Predictability +0.03, Bonus & Loyalty βˆ’0.03 |
| 10L–25L / 25L+ | Coverage Breadth +0.02, Claim Experience +0.02, Cost Predictability βˆ’0.04 |
### Location tier
| Tier | Weight deltas |
|---|---|
| tier2 / tier3 | Claim Experience +0.04, Coverage Breadth βˆ’0.02, Bonus & Loyalty βˆ’0.02 |
| metro | Coverage Breadth +0.02, Claim Experience βˆ’0.02 |
---
## Worked example
A 55-year-old with diabetic parents in tier-2 city, β‚Ή30k budget, β‚Ή5L existing cover, primary goal "upgrade":
- Age 55 β†’ +0.06 Renewal, +0.02 Claim, βˆ’0.04 Bonus, βˆ’0.04 Waiting
- Dependents include parents (PED, age 70) β†’ +0.04 Coverage, +0.04 Claim, βˆ’0.04 Bonus, βˆ’0.04 Cost; +0.04 Renewal, +0.02 Waiting, βˆ’0.04 Bonus, βˆ’0.02 Cost
- Existing cover >0 β†’ βˆ’0.03 Cost, +0.03 Claim
- Goal "upgrade" β†’ +0.03 Coverage, +0.02 Renewal, βˆ’0.05 Bonus
- Conditions diabetes (via parents) β†’ +0.06 Waiting, +0.03 Claim, βˆ’0.04 Bonus, βˆ’0.03 Cost, βˆ’0.02 Renewal
- Tier-2 β†’ +0.04 Claim, βˆ’0.02 Coverage, βˆ’0.02 Bonus
Result (post-renormalise + floor):
- Claim Experience: 20% β†’ 31% (the dominant criterion β€” getting paid matters most)
- Coverage Breadth: 22% β†’ 25%
- Waiting-Period Friction: 18% β†’ 20%
- Renewal Protection: 12% β†’ 16%
- Bonus & Loyalty: 8% β†’ 5% (floor)
- Cost Predictability: 20% β†’ 5% (floor)
The buyer's profile is correctly read as: "I'm older, my parents are sick, I'm in a smaller city, I already have basic cover. What I actually need is INSURER QUALITY (will they pay?) and RENEWAL CONTINUITY (can I keep this when I'm 70?)."
---
## Maintenance contract
Whenever a rule in `backend/scorecard.py` changes (new condition, different threshold, different delta), the matching row in this document must be updated in the same commit. Drift between code and this doc breaks the transparency promise the scorecard makes to the buyer.