Hola:
Escribí un artículo en algún momento, espero que esto sea útil.
Introducción a la regresión logística
Visión general-
La regresión logística se usa generalmente donde la variable dependiente es binaria o dicotómica. Eso significa que la variable dependiente puede tomar solo dos valores posibles, como “Sí o No”, “Predeterminado o No predeterminado”, “Vivo o muerto”, “Respondedor o No respondedor”, “Sí o No”, etc. Factores o variables independientes Pueden ser variables categóricas o numéricas.
Tenga en cuenta que aunque la regresión logística (logit) se usa con frecuencia para variables binarias (2 clases), se puede usar para variables dependientes categóricas con más de 2 clases. En este caso se llama Regresión logística multinomial.
Aquí nos centraremos en la regresión logística con variables dependientes binarias, ya que se utiliza con mayor frecuencia.
Aplicaciones de la regresión logística
La regresión logística se utiliza para predecir la salida que es binaria, como se indicó anteriormente. Por ejemplo, si una compañía de tarjetas de crédito va a construir un modelo para decidir si emitirá una tarjeta de crédito a un cliente o no, modelará si el cliente va a “Predeterminado” o “No predeterminado” en esta tarjeta de crédito . Esto se llama “Modelado de propensión predeterminado” en la jerga bancaria.
Del mismo modo, una empresa de comercio electrónico que envía costosos correos publicitarios / ofertas promocionales a los clientes, deseará saber si es probable que un cliente en particular responda a la oferta o no. En otras palabras, si un cliente será “Respondedor” o “No respondedor”. Esto se llama “modelado de propensión a responder”
Utilizando información generada a partir del resultado de la regresión logística, las compañías pueden optimizar sus estrategias comerciales para lograr sus objetivos comerciales, como minimizar los gastos o pérdidas, maximizar el retorno de la inversión (ROI) en campañas de marketing, etc.
Algoritmo subyacente y suposiciones
El algoritmo subyacente de Estimación de máxima verosimilitud (MLE) determina el coeficiente de regresión para el modelo que predice con precisión la probabilidad de la variable dependiente binaria. El algoritmo se detiene cuando se cumple el criterio de convergencia o se alcanza el número máximo de iteraciones. Dado que la probabilidad de cualquier evento se encuentra entre 0 y 1 (o 0% a 100%), cuando graficamos la probabilidad de la variable dependiente por factores independientes, demostrará una curva de forma ‘S’.
Tomemos un ejemplo: aquí estamos prediciendo la probabilidad de que un candidato determinado sea admitido en una escuela de su elección por el puntaje que los candidatos reciben en la prueba de admisión. Dado que la variable dependiente es binaria / dicotómica: “Admisión” o “No Admisión”, podemos usar un modelo de regresión logística para predecir la probabilidad de obtener la “Admisión”. Primero grafiquemos los datos y analicemos la forma para confirmar que esto está siguiendo una forma de ‘S’.
Dado que la relación entre el puntaje y la probabilidad de selección no es lineal, sino que muestra una forma de ‘S’, no podemos usar un modelo lineal para predecir la probabilidad de selección mediante un puntaje. Necesitamos hacer la transformación Logit de la variable dependiente para hacer que la correlación entre el predictor y la variable dependiente sea lineal.
Logit Transformation se define de la siguiente manera:
Logit = Log (p / 1-p) = log (probabilidad de que ocurra un evento / probabilidad de que no ocurra) = log (Probabilidades)
Ahora podemos modelar usando la regresión para predecir la probabilidad de un cierto resultado de la variable dependiente. La ecuación de regresión que el modelo intentará sacar es:
Log (p / 1-p) = b0 + b1 * x1 + b2 * x2 + e
Donde b0 es la intersección Y, e es el error en el modelo, b1 es el coeficiente (pendiente) para el factor independiente x1, y b2 es el coeficiente (pendiente) para el factor independiente x2 y así sucesivamente …
En el ejemplo anterior, la ecuación de regresión se verá así:
Log (p / 1-p) = b0 + b1 * Puntuación + e
El modelo generará los coeficientes b0 y b1 que nos dan el mejor modelo en términos de métricas clave que discutiremos más adelante.
Herramientas para construir regresión logística
R- La función glm () con la familia = “Logit” se usa con frecuencia
SAS-PROC Logistic es un procedimiento dedicado para ejecutar regresión logística con varias diferencias
Métrica clave e interpretación
Métricas clave que permiten la comparación entre diferentes modelos y proporcionan indicadores del rendimiento del modelo.
Curva de Lorenz e índice de Gini: captura el poder discriminatorio del modelo al separar la selección “buena” de la “mala” versus la selección aleatoria. El índice de Gini es la proporción de áreas marcadas debajo de [A / (A + B)]. Esto mide cuánto mejor se desempeña el modelo en comparación con la selección aleatoria. El Gini puede variar entre 0% y 100%. A mayor índice de Gini, mejor modelo (mayor separación entre lo bueno y lo malo). El valor de Gini del 0% indicaría un modelo que no es mejor que el azar o, en otras palabras, no tiene poder de predicción. Por otro lado, un valor de Gini del 100% indicará un modelo perfecto: predecirá con precisión el 100% bueno y malo.
Estadísticas de Kolmogorov-Smirnov (KS): al igual que Gini, KS también captura el poder discriminatorio del modelo al separar “Bueno” de “Malo”. Es la separación más alta entre la tasa acumulativa buena y la tasa acumulativa mala. A mayor KS, mejor es el modelo (mayor separación entre lo bueno y lo malo). Los valores de KS pueden variar entre 0 y 100%, los valores de KS superiores al 20% se consideran aceptables para un modelo.
Curva característica de funcionamiento del receptor (ROC) / Área bajo curva (AUC): mide el rendimiento del modelo para identificar “verdadero positivo” en lugar de “falso positivo”. Traza TPR vs FPR. El área bajo la tabla ROC es una indicación de esta métrica. El AUC puede variar del 50% al 100%. Cuanto mayor sea el valor de AUC, mejor es el poder de predicción del modelo.
Otras métricas
Levantamiento, matriz de confusión (real frente a predicción), índice de estabilidad característica,% de concordancia, etc.
Aquí está el código completo y la salida de un modelo de regresión logística basado en los famosos datos de la tarjeta de crédito alemana. Riesgo de crédito alemán | Kaggle
## Paso 1 – setwd
setwd (“C: / Users / rpandey / Desktop / Classes”)
## Paso 2 – Cargar datos
logdata <- read.csv ("Default_On_Payment.csv")
## Paso 3 – Explorar datos: ¿dónde están los valores faltantes? ¿Por qué algunos son NA y otros no tienen valores?
dim (logdata)
## [1] 40121 22
nombres (logdata)
## [1] “Customer_ID” “Status_Checking_Acc”
## [3] “Duration_in_Months” “Credit_History”
## [5] “Fin_Credit_Taken” “Credit_Amount”
## [7] “Savings_Acc” “Years_At_Present_Employment”
## [9] “Inst_Rt_Income” “Marital_Status_Gender”
## [11] “Otros_Deudadores_Guarantes” “Dirección_Actual”
## [13] “Propiedad” “Edad”
## [15] “Otros_Inst_Planes” “Vivienda”
## [17] “Num_CC” “Trabajo”
## [19] “Dependientes” “Teléfono”
## [21] “Foreign_Worker” “Default_On_Payment”
cabeza (logdata)
## Customer_ID Status_Checking_Acc Duration_in_Months Credit_History
## 1 100015 A14 27 A32
## 2 100031 A11 12 A34
## 3 100046 A12 13 A34
## 4 100103 A14 24 A32
## 5 100104 A11 24 A32
## 6 100128 A11 10 A32
## Purposre_Credit_Taken Credit_Amount Savings_Acc
## 1 A40 2570 A61
## 2 A43 385 A61
## 3 A43 882 A61
## 4 A40 1393 A61
## 5 A40 3123 A61
## 6 A43 2315 A61
## Years_At_Present_Employment Inst_Rt_Income Marital_Status_Gender
## 1 A73 3 A92
## 2 A74 4 A92
## 3 A72 4 A93
## 4 A73 2 A93
## 5 A72 4 A92
## 6 A75 3 A93
## Other_Debtors_Guarantors Current_Address_Yrs Antigüedad de la propiedad
## 1 A101 3 A121 21
## 2 A101 3 A121 58
## 3 A103 4 A121 23
## 4 A103 2 A121 31
## 5 A101 1 A122 27
## 6 A101 4 A121 52
## Other_Inst_Plans Housing Num_CC Job Dependientes Teléfono Foreign_Worker
## 1 A143 A151 1 A173 1 A191 A201
## 2 A143 A152 4 A172 1 A192 A201
## 3 A143 A152 2 A173 1 A191 A201
## 4 A143 A152 1 A173 1 A192 A201
## 5 A143 A152 1 A173 1 A191 A201
## 6 A143 A152 1 A172 1 A191 A201
## Default_On_Payment
## 1 1
## 2 0
## 3 0
## 4 0
## 5 1
## 6 0
cola (logdata)
## Customer_ID Status_Checking_Acc Duration_in_Months Credit_History
## 40116 986907 A11 24 A32
## 40117 986936 A12 24 A34
## 40118 986939 A12 60 A32
## 40119 986944 A12 36 A30
## 40120 986974 A11 20 A34
## 40121 987000 A14 36 A34
## Purposre_Credit_Taken Credit_Amount Savings_Acc
## 40116 A40 1285 A65
## 40117 A49 1935 A61
## 40118 A40 14027 A61
## 40119 A43 3804 A61
## 40120 A40 2235 A61
## 40121
## Years_At_Present_Employment Inst_Rt_Income Marital_Status_Gender
## 40116 A74 4 A92
## 40117 A75 4 A91
## 40118 A74 4 A93
## 40119 A73 4 A92
## 40120 A73 4 A94
## 40121 NA
## Other_Debtors_Guarantors Current_Address_Yrs Antigüedad de la propiedad
## 40116 A101 4 A124 32
## 40117 A101 4 A121 31
## 40118 A101 2 A124 27
## 40119 A101 1 A123 42
## 40120 A103 2 A122 33
## 40121 NA NA
## Other_Inst_Plans Housing Num_CC Job Dependientes Teléfono
## 40116 A143 A151 1 A173 1 A191
## 40117 A143 A152 2 A173 1 A192
## 40118 A143 A152 1 A174 1 A192
## 40119 A143 A152 1 A173 1 A192
## 40120 A141 A151 2 A173 1 A191
## 40121 NA NA
## Foreign_Worker Default_On_Payment
## 40116 A201 1
## 40117 A201 1
## 40118 A201 1
## 40119 A201 1
## 40120 A202 1
## 40121 NA
str (logdata)
## ‘data.frame’: 40121 obs. de 22 variables:
## $ Customer_ID: int 100015 100031 100046 100103 100104 100128 100148 100164 100182 100230…
## $ Status_Checking_Acc: Factor con 5 niveles “2”, “A11”, “A12”, ..: 5 2 3 5 2 2 2 5 3 5…
## $ Duration_in_Months: Factor con 34 niveles “10”, “11”, “12”, ..: 14 3 4 12 12 1 2 12 8 3 …
## $ Credit_History: Factor con 6 niveles “46”, “A30”, “A31”, ..: 4 6 6 4 4 4 6 6 4 4…
## $ Purposre_Credit_Taken: Factor con 12 niveles “”, “A143”, “A40”, ..: 3 7 7 3 3 7 3 7 7 3…
## $ Credit_Amount: Factor con 923 niveles “”, “1007”, “10127”, ..: 419 602 877 153 511 373 615 353 875 150 …
## $ Savings_Acc: Factor con 7 niveles “”, “2”, “A61”, “A62”, ..: 3 3 3 3 3 3 3 4 3 5…
## $ Years_At_Present_Employment: Factor con 7 niveles “”, “A172”, “A71”, ..: 5 6 4 5 4 7 5 7 5 5…
## $ Inst_Rt_Income: int 3 4 4 2 4 3 1 4 4 2…
## $ Marital_Status_Gender: Factor con 6 niveles “”, “A192”, “A91”, ..: 4 4 5 5 4 5 5 5 6 4…
## $ Other_Debtors_Guarantors: Factor con 5 niveles “”, “A101”, “A102”, ..: 2 2 4 4 2 2 2 2 4 2…
## $ Current_Address_Yrs: int 3 3 4 2 1 4 2 4 2 2…
## $ Propiedad: Factor con 5 niveles “”, “A121”, “A122”, ..: 2 2 2 2 3 2 2 3 2 3…
## $ Edad: int 21 58 23 31 27 52 40 52 25 26…
## $ Other_Inst_Plans: Factor con 4 niveles “”, “A141”, “A142”, ..: 4 4 4 4 4 4 4 2 4 4…
## $ Carcasa: Factor con 4 niveles “”, “A151”, “A152”, ..: 2 3 3 3 3 3 3 3 3 3…
## $ Num_CC: int 1 4 2 1 1 1 2 2 1 1…
## $ Job: Factor con 5 niveles “”, “A171”, “A172”, ..: 4 3 4 4 4 3 3 4 3 4…
## $ Dependientes: int 1 1 1 1 1 1 2 1 1 1…
## $ Teléfono: Factor con 3 niveles “”, “A191”, “A192”: 2 3 2 3 2 2 2 2 2 2…
## $ Foreign_Worker: Factor con 3 niveles “”, “A201”, “A202”: 2 2 2 2 2 2 2 2 2 2…
## $ Default_On_Payment: int 1 0 0 0 1 0 0 0 0 1…
resumen (como.factor (logdata $ Default_On_Payment))
## 0 1 NA’s
## 28118 12001 2
summary_logdata = resumen (logdata)
write.csv (summary_logdata, “summary_logdata.csv”, row.names = F)
## Paso 4: elimine las filas con valores faltantes y el customer_id eliminado
logdata <- logdata [complete.cases (logdata),]
logdata <- logdata [, c (-1)]
# Paso 5- Análisis bivariado
biblioteca (gmodels)
CrossTable (logdata $ Status_Checking_Acc, logdata $ Default_On_Payment)
##
##
## Contenido de la celda
## | ————————- |
## | N |
## | Contribución de Chi-cuadrado |
## | N / fila total |
## | N / Col Total |
## | N / Tabla total |
## | ————————- |
##
##
## Total de observaciones en la tabla: 40119
##
##
## | logdata $ Default_On_Payment
## logdata $ Status_Checking_Acc | 0 | 1 | Fila total |
## —————————- | ———– | ———– | ———– |
## A11 | 5573 | 5417 | 10990 |
## | 588,743 | 1379,407 | El |
## | 0,507 | 0,493 | 0,274 |
## | 0,198 | 0,451 | El |
## | 0,139 | 0,135 | El |
## —————————- | ———– | ———– | ———– |
## A12 | 6624 | 4175 | 10799 |
## | 117,900 | 276,237 | El |
## | 0,613 | 0,387 | 0,269 |
## | 0,236 | 0,348 | El |
## | 0,165 | 0,104 | El |
## —————————- | ———– | ———– | ———– |
## A13 | 1967 | 564 2531 |
## | 21,023 | 49,255 | El |
## | 0,777 | 0,223 | 0,063 |
## | 0,070 | 0,047 | El |
## | 0,049 | 0,014 | El |
## —————————- | ———– | ———– | ———– |
## A14 | 13954 | 1845 15799 |
## | 749,606 | 1756.306 | El |
## | 0,883 | 0,117 | 0,394 |
## | 0,496 | 0,154 | El |
## | 0,348 | 0,046 | El |
## —————————- | ———– | ———– | ———– |
## Columna Total | 28118 | 12001 | 40119 |
## | 0,701 | 0,299 | El |
## —————————- | ———– | ———– | ———– |
##
##
Tabla cruzada (logdata $ Status_Checking_Acc, logdata $ Default_On_Payment, esperado = FALSE, prop.r = FALSE, prop.c = FALSE, prop.t = FALSE, prop.chisq = FALSE, chisq = FALSE)
##
##
## Contenido de la celda
## | ————————- |
## | N |
## | ————————- |
##
##
## Total de observaciones en la tabla: 40119
##
##
## | logdata $ Default_On_Payment
## logdata $ Status_Checking_Acc | 0 | 1 | Fila total |
## —————————- | ———– | ———– | ———– |
## A11 | 5573 | 5417 | 10990 |
## —————————- | ———– | ———– | ———– |
## A12 | 6624 | 4175 | 10799 |
## —————————- | ———– | ———– | ———– |
## A13 | 1967 | 564 2531 |
## —————————- | ———– | ———– | ———– |
## A14 | 13954 | 1845 15799 |
## —————————- | ———– | ———– | ———– |
## Columna Total | 28118 | 12001 | 40119 |
## —————————- | ———– | ———– | ———– |
##
##
Tabla cruzada (logdata $ Status_Checking_Acc, logdata $ Default_On_Payment, esperado = FALSE, prop.c = FALSE, prop.t = FALSE, prop.chisq = FALSE, chisq = FALSE)
##
##
## Contenido de la celda
## | ————————- |
## | N |
## | N / fila total |
## | ————————- |
##
##
## Total de observaciones en la tabla: 40119
##
##
## | logdata $ Default_On_Payment
## logdata $ Status_Checking_Acc | 0 | 1 | Fila total |
## —————————- | ———– | ———– | ———– |
## A11 | 5573 | 5417 | 10990 |
## | 0,507 | 0,493 | 0,274 |
## —————————- | ———– | ———– | ———– |
## A12 | 6624 | 4175 | 10799 |
## | 0,613 | 0,387 | 0,269 |
## —————————- | ———– | ———– | ———– |
## A13 | 1967 | 564 2531 |
## | 0,777 | 0,223 | 0,063 |
## —————————- | ———– | ———– | ———– |
## A14 | 13954 | 1845 15799 |
## | 0,883 | 0,111 | 0,394 |
## —————————- | ———– | ———– | ———– |
## Columna Total | 28118 | 12001 | 40119 |
## —————————- | ———– | ———– | ———– |
##
##
# Paso 6- WOE y IV
biblioteca (información)
biblioteca (riv)
## Carga del paquete requerido: MASA
## Cargando el paquete requerido: rrcov
## Carga del paquete requerido: robusta base
## Estimadores robustos escalables con alto punto de ruptura (versión 1.4-3)
## Cargando el paquete requerido: quantreg
## Cargando el paquete requerido: SparseM
##
## Adjuntando paquete: ‘SparseM’
## El siguiente objeto está enmascarado de ‘paquete: base’:
##
## backsolve
biblioteca (devtools)
biblioteca (ay)
biblioteca (gridExtra)
# Paso 6a Genere IV de cada factor independiente: ¿qué variables queremos seleccionar para el modelo de construcción?
stat <- create_infotables (data = logdata, y = "Default_On_Payment")
grid.table (stat $ Resumen, filas = NULL)
write.csv (stat $ Resumen, “IV_summary.csv”, row.names = F)
# Paso 6b: subconjunte los datos para seleccionar solo variables significativas
newdata <- subset (logdata, select = c (Status_Checking_Acc, Duration_in_Months, Credit_History, Savings_Acc, Purposre_Credit_Taken, Age, Property, Years_At_Present_Employment, Housing, Other_Inst_Plans, Default_On_Payment))
# 6c Generar tabla WOE para cada factor independiente
# stat <- create_infotables (data = newdata, y = "Default_On_Payment")
# #
# grid.table (nuevo $ Tables $ Status_Checking_Acc, rows = NULL)
# #
# grid.table (stat $ Tablas $ Duration_in_Months, rows = NULL)
# Paso 7 – Construir el modelo Linear Reg
biblioteca (coche)
linreg = lm (Default_On_Payment ~., data = newdata)
resumen (linreg)
##
## Llamada:
## lm (fórmula = Default_On_Payment ~., data = newdata)
##
## Residuos:
## Mín. 1Q Mediana 3Q Máx.
## -0.86382 -0.28676 -0.09219 0.32246 1.00918
##
## Coeficientes:
## Estd Estd. Error t valor Pr (> | t |)
## (Intercepción) 0.7697585 0.0218420 35.242 <2e-16 ***
## Status_Checking_AccA12 -0.1002857 0.0056839 -17.644 <2e-16 ***
## Status_Checking_AccA13 -0.1982932 0.0089160 -22.240 <2e-16 ***
## Status_Checking_AccA14 -0.2719186 0.0053806 -50.537 <2e-16 ***
## Duration_in_Months11 -0.0883551 0.0241493 -3.659 0.000254 ***
## Duration_in_Months12 0.1316079 0.0127738 10.303 <2e-16 ***
## Duration_in_Months13 -0.1679345 0.0336398 -4.992 6.00e-07 ***
## Duration_in_Months14 -0.0310201 0.0334909 -0.926 0.354335
## Duration_in_Months15 0.0651237 0.0142697 4.564 5.04e-06 ***
## Duration_in_Months16 0.1752283 0.0463289 3.782 0.000156 ***
## Duration_in_Months18 0.2004975 0.0134166 14.944 <2e-16 ***
## Duration_in_Months20 -0.0221322 0.0254798 -0.869 0.385061
## Duration_in_Months21 0.1846304 0.0165940 11.126 <2e-16 ***
## Duration_in_Months22 0.0164428 0.0457009 0.360 0.719005
## Duration_in_Months24 0.1777103 0.0128954 13.781 <2e-16 ***
## Duration_in_Months26 -0.1471282 0.0637199 -2.309 0.020950 *
## Duration_in_Months27 0.2374538 0.0215329 11.028 <2e-16 ***
## Duration_in_Months28 0.1920215 0.0379099 5.065 4.10e-07 ***
## Duration_in_Months30 0.2005126 0.0157673 12.717 <2e-16 ***
## Duration_in_Months33 0.3675467 0.0381566 9.633 <2e-16 ***
## Duration_in_Months36 0.2938116 0.0139703 21.031 <2e-16 ***
## Duration_in_Months39 0.1831788 0.0306500 5.976 2.30e-09 ***
## Duration_in_Months4 0.0600658 0.0282814 2.124 0.033688 *
## Duration_in_Months40 0.4745183 0.0640407 7.410 1.29e-13 ***
## Duration_in_Months42 0.1325365 0.0226113 5.862 4.62e-09 ***
## Duration_in_Months45 0.5373842 0.0307741 17.462 <2e-16 ***
## Duration_in_Months47 -0.4267245 0.0633595 -6.735 1.66e-11 ***
## Duration_in_Months48 0.3796413 0.0154894 24.510 <2e-16 ***
## Duration_in_Months5 0.1641571 0.0641030 2.561 0.010446 *
## Duration_in_Months54 0.2297115 0.0470660 4.881 1.06e-06 ***
## Duration_in_Months6 -0.0284747 0.0138936 -2.049 0.040421 *
## Duration_in_Months60 0.2800291 0.0212741 13.163 <2e-16 ***
## Duration_in_Months7 -0.0453094 0.0304958 -1.486 0.137351
## Duration_in_Months72 0.8438571 0.0636178 13.264 <2e-16 ***
## Duration_in_Months8 -0.0262472 0.0267354 -0.982 0.326235
## Duration_in_Months9 0.1470090 0.0149335 9.844 <2e-16 ***
## Credit_HistoryA31 -0.0168741 0.0139103 -1.213 0.225113
## Credit_HistoryA32 -0.1712827 0.0109288 -15.673 <2e-16 ***
## Credit_HistoryA33 -0.1722833 0.0123986 -13.895 <2e-16 ***
## Credit_HistoryA34 -0.2559607 0.0113152 -22.621 <2e-16 ***
## Savings_AccA62 -0.0331820 0.0069638 -4.765 1.90e-06 ***
## Savings_AccA63 -0.0727308 0.0085281 -8.528 <2e-16 ***
## Savings_AccA64 -0.1124998 0.0096075 -11.710 <2e-16 ***
## Savings_AccA65 -0.1105122 0.0055340 -19.970 <2e-16 ***
## Purposre_Credit_TakenA41 -0.2385023 0.0078033 -30.564 <2e-16 ***
## Purposre_Credit_TakenA410 -0.1952226 0.0191432 -10.198 <2e-16 ***
## Purposre_Credit_TakenA42 -0.1275840 0.0063874 -19.974 <2e-16 ***
## Purposre_Credit_TakenA43 -0.1372409 0.0057771 -23.756 <2e-16 ***
## Purposre_Credit_TakenA44 -0.0593060 0.0185287 -3.201 0.001372 **
## Purposre_Credit_TakenA45 -0.0251342 0.0140787 -1.785 0.074226.
## Purposre_Credit_TakenA46 0.0183318 0.0100066 1.832 0.066963.
## Purposre_Credit_TakenA48 -0.2157282 0.0213985 -10.081 <2e-16 ***
## Purposre_Credit_TakenA49 -0.1231291 0.0080966 -15.208 <2e-16 ***
## Edad -0.0012711 0.0002051 -6.198 5.76e-10 ***
## PropiedadA122 0.0611509 0.0058654 10.426 <2e-16 ***
## PropiedadA123 0.0528360 0.0054169 9.754 <2e-16 ***
## PropiedadA124 0.1489449 0.0097867 15.219 <2e-16 ***
## Years_At_Present_EmploymentA72 0.0252472 0.0097476 2.590 0.009599 **
## Years_At_Present_EmploymentA73 -0.0414445 0.0090543 -4.577 4.72e-06 ***
## Years_At_Present_EmploymentA74 -0.1210120 0.0096866 -12.493 <2e-16 ***
## Years_At_Present_EmploymentA75 -0.0506770 0.0091716 -5.525 3.31e-08 ***
## Vivienda A152 -0.0798273 0.0055000 -14.514 <2e-16 ***
## Vivienda A153 -0.1272980 0.0112635 -11.302 <2e-16 ***
## Other_Inst_PlansA142 0.0045000 0.0107968 0.417 0.676837
## Other_Inst_PlansA143 -0.0726811 0.0061262 -11.864 <2e-16 ***
## –
## Signif. códigos: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ” 1
##
## Error estándar residual: 0.3908 en 40054 grados de libertad
## R-cuadrado múltiple: 0.2726, R-cuadrado ajustado: 0.2715
## Estadística F: 234.6 en 64 y 40054 DF, valor p: <2.2e-16
plot (predic (linreg)) # los valores predichos se encuentran fuera del rango 0 a 1, por lo tanto, el ajuste incorrecto del modelo
trama (linreg)
# Paso 8- Transformación / Codificación ficticia de variables para obtener el mejor modelo
write.csv (stat $ Tablas $ Duration_in_Months, “Duration_summary.csv”, row.names = F)
newdata $ Duration_Category <- ifelse (newdata $ Duration_in_Months% en% c ("4", "5", "6", "7", "8", "9", "10", "11", "12" , "13", "14", "15", "16", "17", "18"), "lessthan20", ifelse (newdata $ Duration_in_Months% en% c ("20", "21", "22 "," 24 "," 26 "," 27 "," 28 "," 30 "," 33 "," 36 "," 39 ")," 20to40 "," más de 40 "))
tabla (newdata $ Duration_in_Months, newdata $ Duration_Category)
##
## 20to40 menos20 más40
## 10 0 1123 0
## 11 0 361 0
## 12 0 7179 0
## 13 0 161 0
## 14 0 161 0
## 15 0 2567 0
## 16 0 80 0
## 18 0 4536 0
## 20322 0 0
## 21 1205 0 0
## 22 80 0 0
## 24 7386 0 0
## 26 40 0 0
## 27 521 0 0
## 28120 0 0
## 30 1604 0 0
## 33121 0 0
## 36 3326 0 0
## 39200 0 0
## 4 0 240 0
## 40 0 0 41
## 42 0 0 440
## 45 0 0 200
## 47 0 0 40
## 48 0 0 1924
## 5 0 40 0
## 54 0 0 80
## 6 0 3009 0
## 60 0 0 524
## 7 0 200 0
## 72 0 0 40
## 8 0 280 0
## 9 0 1968 0
## A122 0 0 0
stat <- create_infotables (data = newdata, y = "Default_On_Payment")
newdata $ Duration_Dummy_20 <- ifelse (newdata $ Duration_Category == "lessthan20", 1,0)
newdata $ Duration_Dummy_40 <- ifelse (newdata $ Duration_Category == "20to40", 1,0)
newdata $ Status_Checking_Acc_A11 <- ifelse (newdata $ Status_Checking_Acc == "A11", 1,0)
newdata $ Status_Checking_Acc_A12 <- ifelse (newdata $ Status_Checking_Acc == "A12", 1,0)
newdata $ Status_Checking_Acc_A13 <- ifelse (newdata $ Status_Checking_Acc == "A13", 1,0)
newdata $ Default_On_Payment1 <- as.factor (ifelse (newdata $ Default_On_Payment == 1, "1", "0"))
# Paso 9 – Construir regresión logística
biblioteca (ROCR)
## Cargando el paquete requerido: gplots
##
## Adjuntando paquete: ‘gplots’
## El siguiente objeto está enmascarado de ‘paquete: estadísticas’:
##
## lowess
logreg <- glm (Default_On_Payment ~ Duration_Dummy_20 + Duration_Dummy_40 + Status_Checking_Acc_A11 + Status_Checking_Acc_A12 + Status_Checking_Acc_A13 + Age, family = binomial ("logit"), data = newdata)
resumen (logreg)
##
## Llamada:
## glm (formula = Default_On_Payment ~ Duration_Dummy_20 + Duration_Dummy_40 +
## Status_Checking_Acc_A11 + Status_Checking_Acc_A12 + Status_Checking_Acc_A13 +
## Edad, familia = binomio (“logit”), datos = nuevos datos)
##
## Residuos de desviación:
## Mín. 1Q Mediana 3Q Máx.
## -1.6125 -0.8832 -0.4819 1.0449 2.3970
##
## Coeficientes:
## Estd Estd. Error z valor Pr (> | z |)
## (Intercepción) -0.595650 0.059126 -10.07 <2e-16 ***
## Duration_Dummy_20 -1.154614 0.041206 -28.02 <2e-16 ***
## Duration_Dummy_40 -0.677572 0.042070 -16.11 <2e-16 ***
## Status_Checking_Acc_A11 1.984595 0.031684 62.64 <2e-16 ***
## Status_Checking_Acc_A12 1.495144 0.032235 46.38 <2e-16 ***
## Status_Checking_Acc_A13 0.865074 0.054460 15.88 <2e-16 ***
## Edad -0.015651 0.001076 -14.55 <2e-16 ***
## –
## Signif. códigos: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ” 1
##
## (Parámetro de dispersión para la familia binomial tomada como 1)
##
## Desviación nula: 48956 en 40118 grados de libertad
## Desviación residual: 42581 en 40112 grados de libertad
## AIC: 42595
##
## Número de iteraciones de Fisher Scoring: 4
plot (predic (logreg, type = “response”)) #note la opción plot tiene type para obtener el inverso de log_odds
newdata $ predicted = predict (logreg, type = “response”)
write.csv (nuevos datos, “output_logreg.csv”, row.names = F)
capture.output (summary (logreg), file = “summary_logreg.csv”)
summary_residuals_model.csv <-residuals (logreg, type = "deviance")
write.csv (summary_residuals_model.csv, “summary_residuals_model.csv”)
# Paso 10 – Diagnóstico del modelo
# ROCR
newdata $ predicted = predict (logreg, type = “response”)
pred <-prediction (newdata $ predicho, newdata $ Default_On_Payment)
perf <- rendimiento (pred, "tpr", "fpr")
trama (perf)
abline (a = 0, b = 1, col = “Rojo”)
# AUC
auc.perf = rendimiento (pred, measure = “auc”)
[correo electrónico protegido]
## [[1]]
## [1] 0.7429535
# Crear decil por bandas de puntuación
biblioteca (dplyr)
##
## Adjuntando paquete: ‘dplyr’
## El siguiente objeto está enmascarado de ‘package: car’:
##
## recodificar
## El siguiente objeto está enmascarado de ‘package: gridExtra’:
##
## combinar
## El siguiente objeto está enmascarado de ‘paquete: MASA’:
##
## seleccionar
## Los siguientes objetos están enmascarados de ‘paquete: estadísticas’:
##
## filtro, retraso
## Los siguientes objetos están enmascarados de ‘paquete: base’:
##
## intersect, setdiff, setequal, union
newdata $ decile <- ntile (-newdata $ predicho, 10)
write.csv (newdata, “newdata.csv”)
# KS
max (attr (perf, ‘valores y’) [[1]] – attr (perf, ‘valores x’) [[1]])
## [1] 0.3810604
# Ascensor
lift.obj <- rendimiento (pred, "lift", x.measure = "rpp")
parcela (lift.obj,
main = “Venta cruzada – Gráfico de elevación”,
xlab = “% Poblaciones”,
ylab = “Ascensor”,
col = “azul”)
abline (1,0, col = “gris”)
# Lorenz y Gini
biblioteca (ineq)
# Índice de Gini
ineq (newdata $ predicho, type = “Gini”)
## [1] 0.3388472
## Curva de Lorenz
plot (Lc (newdata $ predicho), col = “darkred”, lwd = 2)
## Obtener estadísticas de concordancia / pares
# Relación alta-baja de mala tasa por decil en Excel.
# Intervalo de confianza para ROC, KS, Gini
# mydata [which (mydata $ gender == ‘F’ & mydata $ age> 65),]
Concordancia = función (y, yhat)
{
result_and_fitted_col <-data.frame (y, yhat)
colnames (result_and_fitted_col) <- c ("Contestador", "valores ajustados")
# obtener un subconjunto de resultados donde realmente ocurrió el evento
unos = result_and_fitted_col [result_and_fitted_col [, 1] == 1,]
# obtener un subconjunto de resultados donde el evento en realidad no sucedió
ceros = result_and_fitted_col [result_and_fitted_col [, 1] == 0,]
# Igualar la duración de las tablas de eventos y no eventos
if (longitud (unos [, 1])> longitud (ceros [, 1])) {unos = unos [1: longitud (ceros [, 1]),]}
else {ceros = ceros [1: longitud (unos [, 1]),]}
# Lo siguiente será c (ones_outcome, ones_fitted, zeros_outcome, zeros_fitted)
ones_and_zeros = data.frame (unos, ceros)
# iniciar columnas para almacenar evaluaciones concordantes, discordantes y de pares
conc = rep (NA, longitud (ones_and_zeros [, 1]))
disco = rep (NA, longitud (ones_and_zeros [, 1]))
lazos = rep (NA, longitud (ones_and_zeros [, 1]))
for (i in 1: length (ones_and_zeros [, 1])) {
# Esto prueba la concordancia
if (ones_and_zeros [i, 2]> ones_and_zeros [i, 4])
{conc [i] = 1
disco [i] = 0
lazos [i] = 0
}
# Esto prueba para un empate
si no (ones_and_zeros [i, 2] == ones_and_zeros [i, 4])
{
conc [i] = 0
disco [i] = 0
lazos [i] = 1
}
# Esto debería atrapar pares discordantes.
sino if (ones_and_zeros [i, 2] {
conc [i] = 0
disco [i] = 1
lazos [i] = 0
}
}
# Aquí guardamos las diferentes tarifas
conc_rate = mean (conc, na.rm = TRUE)
disc_rate = mean (disc, na.rm = TRUE)
tie_rate = mean (ties, na.rm = TRUE)
return (list (concordancia = conc_rate, num_concordant = sum (conc), discordancia = disc_rate, num_discordant = sum (disco), tie_rate = tie_rate, num_tied = sum (tie)))
}
Prueba_concordancia <-Concordancia (newdata $ Default_On_Payment, newdata $ predicha)
Prueba de concordancia
## $ concordancia
## [1] 0.7421882
##
## $ num_concordant
## [1] 8907
##
## $ discordancia
## [1] 0.2553121
##
## $ num_discordant
## [1] 3064
##
## $ tie_rate
## [1] 0.002499792
##
## $ num_tied
## [1] 30
Espero que esto ayude.
¡Aclamaciones!
Gracias por sus votos a favor de antemano. Me mantienen en marcha! ¡Gracias!
Descargo de responsabilidad: Las opiniones expresadas aquí son únicamente las del escritor en su capacidad privada.