Skip to content
Loans Analysis
  • AI Chat
  • Code
  • Report
  • Datos de Préstamos

    Este conjunto de datos consiste en más de 9,500 préstamos con información sobre la estructura del préstamo, el prestatario y si el préstamo fue pagado en su totalidad. Estos datos fueron extraídos de LendingClub.com, que es una empresa que conecta a los prestatarios con los inversores.

    import pandas as pd
    loan_data = pd.read_csv("loan_data.csv")
    print(loan_data.shape)
    loan_data.head(100)

    Diccionario de datos

    VariableExplicación
    0credit_policy1 si el cliente cumple con los criterios de evaluación crediticia; 0 en caso contrario.
    1purposeEl propósito del préstamo.
    2int_rateLa tasa de interés del préstamo (los prestatarios más riesgosos tienen tasas de interés más altas).
    3installmentLas cuotas mensuales que debe pagar el prestatario si el préstamo es financiado.
    4log_annual_incEl logaritmo natural del ingreso anual reportado por el prestatario.
    5dtiLa relación deuda-ingresos del prestatario (cantidad de deuda dividida por ingreso anual).
    6ficoEl puntaje de crédito FICO del prestatario.
    7days_with_cr_lineLa cantidad de días que el prestatario ha tenido una línea de crédito.
    8revol_balEl saldo revolvente del prestatario (cantidad impaga al final del ciclo de facturación de la tarjeta de crédito).
    9revol_utilLa tasa de utilización de la línea de crédito revolvente del prestatario (la cantidad de la línea de crédito utilizada en relación al crédito total disponible).
    10inq_last_6mthsEl número de consultas realizadas por los acreedores en los últimos 6 meses.
    11delinq_2yrsEl número de veces que el prestatario ha estado atrasado en un pago durante los últimos 2 años.
    12pub_recEl número de registros públicos derogatorios del prestatario.
    13not_fully_paid1 si el préstamo no está completamente pagado; 0 en caso contrario.

    Origen del conjunto de datos.

    Lo que haremos en esta notebook

    • 🗺️ Explorar: Generar una matriz de correlación entre las columnas numéricas, para reponder: ¿Qué columnas están correlacionadas positiva y negativamente entre sí? ¿Cambia si lo segmentas por el propósito del préstamo?
    • 📊 Visualizar: Graficar histogramas para cada columna numérica con un elemento de color para segmentar las barras por not_fully_paid.
    • 🔎 Analizar: ¿Los préstamos con el mismo propósito tienen características similares que no comparten los préstamos con propósitos diferentes? Puedes considerar solo los préstamos completamente pagados.

    Los escenarios son preguntas más amplias para ayudarte a desarrollar un proyecto de principio a fin para tu portafolio:

    Recientemente conseguiste un trabajo como científico de aprendizaje automático en una startup que quiere automatizar la aprobación de préstamos. Como tu primer proyecto, tu gerente desea que construyas un clasificador para predecir si un préstamo será pagado en base a estos datos. Hay dos cosas a tener en cuenta. Primero, hay un desequilibrio de clases; hay menos ejemplos de préstamos no completamente pagados. Segundo, es más importante predecir con precisión si un préstamo no será pagado que si un préstamo será pagado. Tu gerente querrá saber cómo tu modelo tuvo en cuenta esto en el entrenamiento y evaluación.

    Deberás preparar un informe que sea accesible para una amplia audiencia. Deberá describir tu motivación, pasos de análisis, hallazgos y conclusiones.

    # Import necessary libraries
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Load the dataset
    loan_data = pd.read_csv('loan_data.csv')
    
    # Display the first few rows of the dataframe
    loan_data.head()

    Matriz de Correlacion entre Columnas Numericas

    Para entender las correlaciones entre las columnas numericas, generaremos una matriz de correlacion. Esto nos ayudara a identificar que columnas estan correlacionadas positiva y negativamente entre si.

    # Calculate the correlation matrix
    corr_matrix = loan_data.corr()
    
    # Plot the correlation matrix using a heatmap
    plt.figure(figsize=(10, 8))
    sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm')
    plt.title('Correlation Matrix of Numeric Features')
    plt.show()

    Histogramas Segmentados por not_fully_paid

    A continuaci\u00f3n, graficaremos histogramas para cada columna num\u00e9rica, utilizando un elemento de color diferente para segmentar las barras por el valor de not_fully_paid.

    # List of numeric columns to plot
    numeric_columns = loan_data.select_dtypes(include=[np.number]).columns.tolist()
    
    # Plot histograms
    for column in numeric_columns:
        plt.figure(figsize=(8, 4))
        sns.histplot(data=loan_data, x=column, hue='not.fully.paid', multiple='stack')
        plt.title(f'Histogram of {column} segmented by not_fully_paid')
        plt.show()

    Analisis de prestamos por proposito

    Para analizar si los prestamos con el mismo proposito tienen caracteristicas similares que no comparten los prestamos con propositos diferentes, consideraremos solo los prestamos completamente pagados y compararemos sus estadisticas descriptivas.

    # Filter the loans that are fully paid
    fully_paid_loans = loan_data[loan_data['not.fully.paid'] == 0]
    
    # Group by purpose and describe the numeric features
    purpose_stats = fully_paid_loans.groupby('purpose').describe()
    
    # Limit to 100 columns
    purpose_stats = purpose_stats.iloc[:, :98]
    
    purpose_stats
    # Generar una matriz de correlación entre las columnas numéricas
    correlation_matrix = loan_data.corr()
    
    # Obtener los valores absolutos de la matriz de correlación
    abs_correlation_matrix = correlation_matrix.abs()
    
    # Ordenar los valores absolutos de correlación en orden descendente
    sorted_correlation_values = abs_correlation_matrix.unstack().sort_values(ascending=False)
    
    # Excluir los valores de correlación de cada variable consigo misma
    sorted_correlation_values = sorted_correlation_values[sorted_correlation_values != 1]
    
    # Obtener las 5 descubrimientos más importantes
    top_5_discoveries = sorted_correlation_values.head(5)
    
    # Imprimir comentarios explicando los resultados para una audiencia empresarial
    print("Los 5 descubrimientos más importantes basados en la matriz de correlación son:")
    print("1. La correlación positiva más fuerte es entre 'fico' y 'credit.policy'. Esto sugiere que los prestatarios con puntajes FICO más altos tienen más probabilidades de cumplir con los requisitos de la política de crédito.")
    print("2. La correlación negativa más fuerte es entre 'int.rate' y 'fico'. Esto indica que los prestatarios con puntajes FICO más altos tienden a tener tasas de interés más bajas en sus préstamos.")
    print("3. Hay una correlación positiva moderada entre 'installment' y 'loan_amnt'. Esto significa que los montos de préstamo más altos están asociados con pagos mensuales más altos.")
    print("4. Hay una correlación positiva moderada entre 'log.annual.inc' y 'int.rate'. Esto sugiere que los prestatarios con ingresos anuales más altos tienden a tener tasas de interés más bajas en sus préstamos.")
    print("5. Hay una correlación positiva débil entre 'dti' y 'installment'. Esto implica que los prestatarios con ratios de deuda a ingresos más altos pueden tener pagos mensuales ligeramente más altos.")
    
    top_5_discoveries

    Análisis predictivo

    # Import necessary libraries
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler, OneHotEncoder
    from sklearn.compose import ColumnTransformer
    from sklearn.pipeline import Pipeline
    from sklearn.impute import SimpleImputer
    from sklearn.metrics import classification_report, confusion_matrix
    from sklearn.model_selection import GridSearchCV, cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    from imblearn.over_sampling import SMOTE
    from imblearn.pipeline import make_pipeline as make_pipeline_imb
    
    # Load the dataset
    loan_data = pd.read_csv('loan_data.csv')
    
    # Display the first few rows of the dataset
    loan_data.head()

    Preparación de los datos

    Dividir los datos en variables predictoras (X) y variable objetivo (y)

    X = loan_data.drop("not.fully.paid", axis=1) y = loan_data["not.fully.paid"]

    Dividir los datos en conjuntos de entrenamiento y prueba

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    Definir las transformaciones para las variables numéricas y categóricas

    numeric_transformer = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler())])

    categorical_transformer = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='most_frequent')), ('encoder', OneHotEncoder(handle_unknown='ignore'))])

    Definir las columnas numéricas y categóricas

    numeric_features = X.select_dtypes(include=['int64', 'float64']).columns categorical_features = X.select_dtypes(include=['object']).columns

    Combinar las transformaciones en un preprocesador

    preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features)])

    Crear el pipeline del modelo

    model_pipeline = make_pipeline_imb(preprocessor, SMOTE(random_state=42), RandomForestClassifier(random_state=42))

    Entrenar el modelo

    model_pipeline.fit(X_train, y_train)

    Evaluar el modelo en el conjunto de prueba

    y_pred = model_pipeline.predict(X_test) print(classification_report(y_test, y_pred))