Agrupación de chi-cuadrado (chi-cuadrado)

Las estadísticas y los modelos de control de riesgos a menudo se topan con el algoritmo de agrupación de chi-cuadrado ChiMerge. La agrupación de chi-cuadrado es el núcleo del cuadro de mando de regresión logística en el campo del control del riesgo de crédito financiero , lo que hace que la agrupación sea estadísticamente significativa (monótona). La combinación de chi-cuadrado se puede utilizar para comparar si existen diferencias significativas entre dos fármacos o dos grupos de pacientes en el campo de la biomedicina. Pero muchos modeladores no comprenden el principio de agrupación de chi-cuadrado. Primero, permítanme presentarles lo que a menudo se mencionan la distribución de chi-cuadrado y la prueba de chi-cuadrado. Invitamos a todos los estudiantes a aprender más sobre el modelo de cuadro de mando de control de riesgos financieros de Python y el análisis de datos : https://edu.csdn.net/combo/detail/1927

1. Distribución chi-cuadrado

La distribución chi-cuadrado (distribución chi-cuadrado, distribución χ2) es una distribución de probabilidad comúnmente utilizada en estadísticas de probabilidad, y también es una de las distribuciones de probabilidad más utilizadas en inferencia estadística. Se ve a menudo en el cálculo de pruebas de hipótesis. e intervalos de confianza Figura de distribución Chi-cuadrado.

La distribución chi-cuadrado se define de la siguiente manera:

Si k variables aleatorias independientes Z1, Z2,..., Zk satisfacen la distribución normal estándar N(0,1), entonces la suma de cuadrados de estas k variables aleatorias:

Para obedecer a la distribución chi-cuadrado con k grados de libertad, se escribe como:

o denotado como

2. Prueba de chi-cuadrado

La prueba de χ2 es un método de prueba de hipótesis basado en la distribución de χ2, que se utiliza principalmente para la prueba de independencia entre variables categóricas.

La idea básica es inferir si existe una diferencia significativa entre la distribución general y la distribución esperada con base en los datos de la muestra, o inferir si dos variables categóricas están correlacionadas o son independientes.

Generalmente, la hipótesis nula se puede establecer como: no hay diferencia entre la frecuencia observada y la frecuencia esperada, o las dos variables son independientes y no están correlacionadas.

En aplicaciones prácticas, primero asumimos que la hipótesis nula es verdadera y calculamos el valor de chi-cuadrado, que representa el grado de desviación entre el valor observado y el valor teórico.

La fórmula para calcular el valor de chi-cuadrado es:

Donde A es la frecuencia real y E es la frecuencia esperada. El valor de chi-cuadrado se utiliza para medir el grado de diferencia entre el valor real y el valor teórico, que también es la idea central de la prueba de chi-cuadrado.

El valor de chi-cuadrado contiene los dos datos siguientes:

1. El tamaño absoluto de la desviación entre el valor real y el valor teórico. 2. El tamaño relativo del grado de diferencia y el valor teórico.

El valor de chi-cuadrado calculado anteriormente obedece a la distribución de chi-cuadrado. De acuerdo con la distribución chi-cuadrado, el estadístico chi-cuadrado y los grados de libertad, se puede determinar la probabilidad p de obtener el estadístico actual y casos más extremos bajo la condición de que se establezca la hipótesis nula. Si p es pequeño, significa que el valor observado se desvía mucho del valor teórico y la hipótesis nula debe rechazarse. De lo contrario no se puede rechazar la hipótesis nula.

3. Ejemplo de prueba de chi-cuadrado

Un hospital utilizó dos tratamientos diferentes A y B para pacientes con una determinada enfermedad. Los resultados se muestran en la Tabla 1. ¿Hay alguna diferencia entre los dos tratamientos?

Tabla 1 Comparación de los efectos curativos de dos terapias para el cáncer de ovario

Se puede calcular la frecuencia esperada dentro de cada celda.

Fila 1 y columna 1: 43×53/87=26,2

Fila 1 y columna 2: 43×34/87=16,8

Fila 2 y columna 1: 44×53/87=26,8

Fila 2 y columna 2: 4×34/87=17,2

Primero establezca la hipótesis nula: no hay diferencia entre los dos tratamientos A y B. Según la fórmula de cálculo del valor de chi-cuadrado, calcule:

Valor de chi-cuadrado calculado = 10,01.

Después de obtener el valor de chi-cuadrado, debe consultar la tabla de distribución de chi-cuadrado para determinar el valor p, a fin de tomar la decisión de aceptar o rechazar la hipótesis nula.

En primer lugar, aclaramos el concepto de grado de libertad: grado de libertad k=(número de filas-1)*(número de columnas-1). Aquí k = 1. Luego mire la tabla de probabilidad crítica de la distribución chi-cuadrado, podemos usar el siguiente código para generar:

 
 
  1. #python金融风控评分卡模型和数据分析:https://edu.csdn.net/combo/detail/1927

  2. #讲师csdn学院教学主页:https://edu.csdn.net/lecturer/5602

  3. from scipy.stats import chi2

  4. # chi square distribution

  5. percents = [ 0.95, 0.90, 0.5,0.1, 0.05, 0.025, 0.01, 0.005]

  6. df =pd.DataFrame(np.array([chi2.isf(percents, df=i) for i in range(1, 30)]))

  7. pd.set_option('precision', 3)

El grado de libertad en la búsqueda de la tabla es 1 y el valor de chi-cuadrado de p = 0,05 es 3,841. En este caso, el valor de chi-cuadrado es 10,01>3,841, por lo que p <0,05, lo que indica que la hipótesis nula puede ser rechazado al nivel de significancia de 0,05. Es decir, la hipótesis nula no se cumple.

4. Algoritmo de agrupación ChiMerge

El algoritmo de agrupación chi-cuadrado ChiMerge fue propuesto por Kerber en 1992.

Incluye principalmente dos fases: fase de inicialización y fase de fusión ascendente.

1. Fase de inicialización:

Primero ordene de acuerdo con el tamaño del valor del atributo (para características no continuas, primero debe realizar una conversión numérica, como convertir a la tasa de tipos malos, y luego ordenar), y luego cada valor de atributo es un grupo separado.

2. Fase de fusión:

(1) Para cada par de grupos adyacentes, calcule el valor de chi-cuadrado.

(2) De acuerdo con el valor de chi-cuadrado calculado, combine el par más pequeño de grupos adyacentes en un grupo.

(3) Repita (1) y (2) hasta que el valor de chi-cuadrado calculado no sea inferior al umbral preestablecido, o el número de grupos alcance una determinada condición (por ejemplo, el número mínimo de grupos es 5, el número máximo de grupos es 8).

Vale la pena señalar que el editor encontró que algunos métodos de implementación no calcularon el valor de chi-cuadrado del grupo adyacente en la etapa de fusión (solo considere las muestras en estos dos grupos y calcule la frecuencia esperada), porque usan la muestra general. Calcula la frecuencia esperada para estos dos grupos adyacentes.

La siguiente figura muestra la agrupación de los valores del atributo de longitud del sépalo del famoso conjunto de datos del iris y el valor de chi-cuadrado de los grupos adyacentes. La columna de la izquierda es el valor del atributo, las 3 columnas del medio son la frecuencia de la clase y la columna de la derecha es el valor de chi-cuadrado. Esta agrupación es el resultado de un umbral de chi-cuadrado de 1,4. Se puede ver que el grupo más pequeño es [6,7, 7,0) y su valor de chi-cuadrado es 1,5.

Si el umbral se aumenta aún más, como establecerlo en 4.6, la agrupación anterior continuará fusionándose y la agrupación final será la siguiente:

Además de utilizar umbrales como restricciones para la agrupación de chi-cuadrado, puede agregar restricciones en la cantidad de ubicaciones que se van a agrupar, así como restricciones en la proporción mínima de ubicaciones y la tasa de malos.

Implementación del código Python de agrupación de chi-cuadrado

En el último artículo, se introdujeron la idea básica y el método de agrupación de chi-cuadrado, todos los cuales eran conceptuales y no se proporcionó ninguna implementación de código específica. Este artículo presentará la implementación del algoritmo ChiMerge escrito por Xiaobian.

Cálculo de chi-cuadrado

La función para calcular el valor de chi-cuadrado necesita ingresar una tabla de frecuencia en formato numérico. Para el conjunto de datos de pandas, solo necesita usar pd.crosstab para calcular, por ejemplo, la tabla de frecuencia de la variable "número total de cuentas" y la variable objetivo "mal cliente o no", como se muestra en la siguiente figura:

Cada línea representa la frecuencia de un intervalo (grupo), por ejemplo, la primera línea en la figura anterior indica que el número total de cuentas en el grupo [2,3) corresponde a 3 buenos clientes y 1 mal cliente.

Convierta la tabla de frecuencia en una matriz numpy y luego llame a la función para calcular el valor de chi-cuadrado. La lógica de cálculo es la siguiente:

1) Calcule el total de la fila i.

2) Calcule el total de la columna j.

3) Calcular la frecuencia total N.

4) Calcule la frecuencia esperada de las celdas i y j.

5) Encuentra el chi-cuadrado en cada cuadrícula:

6) Dado que la frecuencia esperada Ei,j puede ser 0, el resultado calculado en el paso anterior no tiene sentido y debe borrarse y no incluirse en el resultado final.

7) Suma los chi-cuadrado de los posesivos para obtener el valor de chi-cuadrado.

El código se muestra a continuación.

'autor:xiaodongxu y monica'

Algoritmo de agrupación ChiMerge

La función de agrupación de chi-cuadrado puede controlar el número final de agrupaciones de acuerdo con el número máximo de grupos y el umbral de chi-cuadrado.

Si no se especifica el número máximo de grupos ni el umbral al llamar, la función utilizará automáticamente un nivel de confianza del 95% para establecer el umbral.

La lógica de agrupación es:

1) Inicialmente, todos los valores de las variables forman un grupo propio y se cuenta la frecuencia.

2) Luego escanee en orden de acuerdo con el valor inicial de cada grupo, de pequeño a grande, y saque dos grupos para formar un valor de chi-cuadrado.

Si el valor de chi-cuadrado calculado actual es menor que el valor de chi-cuadrado mínimo observado, marque la coordenada actual y actualice el valor de chi-cuadrado mínimo observado al valor actual.

3) Después de escanear una vez, si el número actual de grupos es mayor que el número máximo de grupos, o el valor mínimo de chi-cuadrado es menor que el umbral, los dos grupos de frecuencias correspondientes al valor mínimo de chi-cuadrado se fusionan. y los intervalos también se fusionan. Y regrese al paso 2 para ejecutar. De lo contrario, deje de fusionarse. Genere los puntos de segmentación de intervalo de los grupos actuales.

El código se muestra a continuación.

'autor:xiaodongxu y monica'

Valor variable en grupo

Una vez completada la agrupación de chi-cuadrado, se obtiene el valor inicial del intervalo de cada grupo. Para cualquier valor de variable x dado, los valores de agrupación se pueden obtener utilizando la siguiente función.

El código se muestra a continuación.

'autor:xiaodongxu y monica'

Cabe señalar que si el valor x que se va a convertir no está dentro del intervalo de agrupación, es probable que sea un valor atípico y no se debe esperar que la función anterior maneje esta situación, pero se debe usar un controlador de valores atípicos especial.

Casos de uso en el modelado de cuadros de mando

A continuación se presenta el uso de la agrupación de chi-cuadrado en el modelado de cuadros de mando. Veamos primero el conjunto de datos.

Además de la variable y, hay 3 variables: monto del préstamo (loan_amnt, numérico), número total de cuenta (total_acc, numérico) y estado de la dirección (addr_state, categoría).

Binando el número total de cuentas total_acc:

Transforme según los resultados de la agrupación para derivar nuevas variables de agrupación:

Ahora que total_acc se ha derivado a una nueva variable categórica total_acc_chi2_group, puede continuar procesando con el código WOE e ingresar el modelo.

Guión de combate real de boxeo chi-cuadrado de Python

 Agrupación supervisada de una variable en un marco de datos

#python金融风控评分卡模型和数据分析:https://edu.csdn.net/combo/detail/1927

#讲师csdn学院教学主页:https://edu.csdn.net/lecturer/5602


data = pd.read_csv('sample_data.csv', sep="\t", na_values=['', '?'])



# 定义一个卡方分箱(可设置参数置信度水平与箱的个数)停止条件为大于置信水平且小于bin的数目

def ChiMerge(df, variable, flag, confidenceVal=3.841, bin=10, sample = None):

运行前需要 import pandas as pd 和 import numpy as np

df:传入一个数据框仅包含一个需要卡方分箱的变量与正负样本标识(正样本为1,负样本为0)

variable:需要卡方分箱的变量名称(字符串)

confidenceVal:置信度水平(默认是不进行抽样95%)

sample: 为抽样的数目(默认是不进行抽样),因为如果观测值过多运行会较慢



df = df.sample(n=sample)




total_num = df.groupby([variable])[flag].count() # 统计需分箱变量每个值数目

total_num = pd.DataFrame({'total_num': total_num}) # 创建一个数据框保存之前的结果

positive_class = df.groupby([variable])[flag].sum() # 统计需分箱变量每个值正样本数

positive_class = pd.DataFrame({'positive_class': positive_class}) # 创建一个数据框保存之前的结果

regroup = pd.merge(total_num, positive_class, left_index=True, right_index=True,

how='inner') # 组合total_num与positive_class

regroup.reset_index(inplace=True)

regroup['negative_class'] = regroup['total_num'] - regroup['positive_class'] # 统计需分箱变量每个值负样本数

regroup = regroup.drop('total_num', axis=1)

np_regroup = np.array(regroup) # 把数据框转化为numpy(提高运行效率)

print('已完成数据读入,正在计算数据初处理')

#处理连续没有正样本或负样本的区间,并进行区间的合并(以免卡方值计算报错)

while (i <= np_regroup.shape[0] - 2):

if ((np_regroup[i, 1] == 0 and np_regroup[i + 1, 1] == 0) or ( np_regroup[i, 2] == 0 and np_regroup[i + 1, 2] == 0)):

np_regroup[i, 1] = np_regroup[i, 1] + np_regroup[i + 1, 1] # 正样本

np_regroup[i, 2] = np_regroup[i, 2] + np_regroup[i + 1, 2] # 负样本

np_regroup[i, 0] = np_regroup[i + 1, 0]

np_regroup = np.delete(np_regroup, i + 1, 0)




chi_table = np.array([]) # 创建一个数组保存相邻两个区间的卡方值

for i in np.arange(np_regroup.shape[0] - 1):

chi = (np_regroup[i, 1] * np_regroup[i + 1, 2] - np_regroup[i, 2] * np_regroup[i + 1, 1]) ** 2 \

* (np_regroup[i, 1] + np_regroup[i, 2] + np_regroup[i + 1, 1] + np_regroup[i + 1, 2]) / \

((np_regroup[i, 1] + np_regroup[i, 2]) * (np_regroup[i + 1, 1] + np_regroup[i + 1, 2]) * (

np_regroup[i, 1] + np_regroup[i + 1, 1]) * (np_regroup[i, 2] + np_regroup[i + 1, 2]))

chi_table = np.append(chi_table, chi)

print('已完成数据初处理,正在进行卡方分箱核心操作')



if (len(chi_table) <= (bin - 1) and min(chi_table) >= confidenceVal):

chi_min_index = np.argwhere(chi_table == min(chi_table))[0] # 找出卡方值最小的位置索引

np_regroup[chi_min_index, 1] = np_regroup[chi_min_index, 1] + np_regroup[chi_min_index + 1, 1]

np_regroup[chi_min_index, 2] = np_regroup[chi_min_index, 2] + np_regroup[chi_min_index + 1, 2]

np_regroup[chi_min_index, 0] = np_regroup[chi_min_index + 1, 0]

np_regroup = np.delete(np_regroup, chi_min_index + 1, 0)

if (chi_min_index == np_regroup.shape[0] - 1): # 最小值试最后两个区间的时候

# 计算合并后当前区间与前一个区间的卡方值并替换

chi_table[chi_min_index - 1] = (np_regroup[chi_min_index - 1, 1] * np_regroup[chi_min_index, 2] - np_regroup[chi_min_index - 1, 2] * np_regroup[chi_min_index, 1]) ** 2 \

* (np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index - 1, 2] + np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2]) / \

((np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index - 1, 2]) * (np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2]) * (np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index, 1]) * (np_regroup[chi_min_index - 1, 2] + np_regroup[chi_min_index, 2]))

chi_table = np.delete(chi_table, chi_min_index, axis=0)


# 计算合并后当前区间与前一个区间的卡方值并替换

chi_table[chi_min_index - 1] = (np_regroup[chi_min_index - 1, 1] * np_regroup[chi_min_index, 2] - np_regroup[chi_min_index - 1, 2] * np_regroup[chi_min_index, 1]) ** 2 \

* (np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index - 1, 2] + np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2]) / \

((np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index - 1, 2]) * (np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2]) * (np_regroup[chi_min_index - 1, 1] + np_regroup[chi_min_index, 1]) * (np_regroup[chi_min_index - 1, 2] + np_regroup[chi_min_index, 2]))

# 计算合并后当前区间与后一个区间的卡方值并替换

chi_table[chi_min_index] = (np_regroup[chi_min_index, 1] * np_regroup[chi_min_index + 1, 2] - np_regroup[chi_min_index, 2] * np_regroup[chi_min_index + 1, 1]) ** 2 \

* (np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2] + np_regroup[chi_min_index + 1, 1] + np_regroup[chi_min_index + 1, 2]) / \

((np_regroup[chi_min_index, 1] + np_regroup[chi_min_index, 2]) * (np_regroup[chi_min_index + 1, 1] + np_regroup[chi_min_index + 1, 2]) * (np_regroup[chi_min_index, 1] + np_regroup[chi_min_index + 1, 1]) * (np_regroup[chi_min_index, 2] + np_regroup[chi_min_index + 1, 2]))

chi_table = np.delete(chi_table, chi_min_index + 1, axis=0)

print('已完成卡方分箱核心操作,正在保存结果')


result_data = pd.DataFrame() # 创建一个保存结果的数据框

result_data['variable'] = [variable] * np_regroup.shape[0] # 结果表第一列:变量名

for i in np.arange(np_regroup.shape[0]):

x = '0' + ',' + str(np_regroup[i, 0])

elif i == np_regroup.shape[0] - 1:

x = str(np_regroup[i - 1, 0]) + '+'

x = str(np_regroup[i - 1, 0]) + ',' + str(np_regroup[i, 0])

list_temp.append(x)

result_data['interval'] = list_temp # 结果表第二列:区间

result_data['flag_0'] = np_regroup[:, 2] # 结果表第三列:负样本数目

result_data['flag_1'] = np_regroup[:, 1] # 结果表第四列:正样本数目




bins = ChiMerge(temp, 'x','y', confidenceVal=3.841, bin=10,sample=None)

Bienvenido a visitar la página de inicio de enseñanza universitaria de csdn del profesor : https://edu.csdn.net/lecturer/5602 para obtener más información sobre el combate real de los modelos financieros de Python.

Declaración de derechos de autor: el artículo proviene de la cuenta oficial (modelo de control de riesgos de Python), sin permiso, sin plagio. Siguiendo el acuerdo de derechos de autor CC 4.0 BY-SA, adjunte el enlace de la fuente original y esta declaración para su reimpresión.

Supongo que te gusta

Origin blog.csdn.net/toby001111/article/details/132395225
Recomendado
Clasificación