File size: 1,965 Bytes
d790594
 
 
1e07e50
d790594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1494eb8
d790594
 
 
 
 
 
 
1494eb8
d790594
 
 
 
 
1e07e50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np

def probability_to_score_v3(prob, base_score=300, max_score=850, threshold=0.326,
                                expansion_factor_low=3, expansion_factor_high=0.7):
    """
    Convierte probabilidades en puntajes de cr茅dito con expansi贸n no lineal
    para distribuir mejor en los extremos.

    Args:
        prob (float): Probabilidad de default.
        base_score (int): Puntaje base.
        max_score (int): Puntaje m谩ximo.
        threshold (float): Valor de corte 贸ptimo.
        expansion_factor_low (float): Factor para expandir la parte baja del rango.
        expansion_factor_high (float): Factor para expandir la parte alta del rango.

    Returns:
        score (float): Puntaje de cr茅dito ajustado.
    """
    # Invertir la probabilidad para que mayor valor sea mejor score
    inverted_prob = 1 - prob

    # Punto de corte invertido
    inverted_threshold = 1 - threshold

    # Determinar si es un score alto o bajo
    if inverted_prob >= inverted_threshold:  # Buenos clientes
        # Normalizar la probabilidad en el rango de buenos
        normalized = (inverted_prob - inverted_threshold) / (1 - inverted_threshold)
        # Aplicar expansi贸n no lineal
        transformed = normalized ** expansion_factor_high
        # Mapear al rango superior
        mid_score = 600  # Punto medio del rango
        score = mid_score + (max_score - mid_score) * transformed
    else:  # Malos clientes
        # Normalizar la probabilidad en el rango de malos
        normalized = inverted_prob / inverted_threshold
        # Aplicar expansi贸n no lineal para los scores bajos
        transformed = normalized ** expansion_factor_low
        # Mapear al rango inferior
        mid_score = 500  # Punto medio del rango
        score = base_score + (mid_score - base_score) * transformed

    # Asegurar que el score est茅 dentro del rango permitido
    score = np.clip(score, base_score, max_score)

    return float(score)