Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.6 KiB
id, name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, example, tested, tests, test_file_path, file_path, params, output
| id | name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | example | tested | tests | test_file_path | file_path | params | output | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mutual_info_columns_py_datascience | mutual_info_columns | function | py | datascience | 1.0.0 | pure | def mutual_info_columns(a: list, b: list, a_numeric: bool = False, b_numeric: bool = False, bins: int = 10, normalized: bool = True) -> float | Informacion mutua entre dos columnas pareadas del grupo eda: detector general de dependencia que capta relaciones de cualquier forma (lineal o no, num-num, cat-cat, num-cat). Discretiza numericas por cuantiles, factoriza categoricas, devuelve NMI en [0,1] (normalized) o MI en nats. Funcion pura. |
|
false | from datascience import mutual_info_columns a = [i - 1000 for i in range(2000)] b = [abs(x) for x in a] # V-shape: no lineal, Pearson ~ 0 mutual_info_columns(a, b, a_numeric=True, b_numeric=True) # ~0.69, NMI alto | true |
|
python/functions/datascience/mutual_info_columns_test.py | python/functions/datascience/mutual_info_columns.py |
|
float. NMI en [0, 1] cuando normalized=True; MI en nats (>= 0) cuando normalized=False. Devuelve 0.0 si hay menos de 2 pares validos o si alguna columna discretizada tiene entropia 0 (constante) bajo normalized. Nunca devuelve None ni lanza excepcion. |
Ejemplo
from datascience import mutual_info_columns
import math
# Relacion NO lineal: b = |a| (forma de V). Pearson ~ 0, pero la dependencia es real.
a = [i - 1000 for i in range(2000)] # -1000 .. 999
b = [abs(x) for x in a]
mutual_info_columns(a, b, a_numeric=True, b_numeric=True)
# -> ~0.69 (NMI alto: a determina b por completo dentro de cada cubo)
# Comparalo con la correlacion lineal, que no ve la relacion:
from datascience import pearson
pearson([float(x) for x in a], [float(x) for x in b]) # -> ~0.0
# Tambien capta relaciones oscilantes resueltas por los bins:
ax = [2 * math.pi * i / 2000 for i in range(2000)] # un periodo de seno
bx = [1.0 if math.sin(x) >= 0 else -1.0 for x in ax]
mutual_info_columns(ax, bx, a_numeric=True) # -> ~0.55, Pearson ~ -0.87
# Dos categoricas identicas -> dependencia total.
c = ["red", "green", "blue", "red", "green", "blue"]
mutual_info_columns(c, list(c)) # -> ~1.0
# MI cruda en nats (sin normalizar).
mutual_info_columns(c, list(c), normalized=False) # -> ~log(3) nats
Cuando usarla
Cuando necesites un detector general de dependencia entre dos columnas y no
sepas (o no quieras asumir) la forma de la relacion. Pearson solo ve lineal y
solo num-num; cramers_v solo cat-cat. La informacion mutua funciona para
cualquier par de tipos (num-num, cat-cat, num-cat) y capta relaciones no
lineales (sinusoidales, escalon, agrupamientos) que la correlacion lineal pasa
por alto. Es la celda "comodin" de una matriz de asociacion en un EDA: usala
para descubrir relaciones ocultas antes de modelar, o para rankear que columnas
predicen mejor un objetivo. Activa a_numeric/b_numeric por columna segun su
tipo y deja normalized=True para obtener un score comparable en [0, 1].
Notas
Funcion pura y determinista: misma entrada -> misma salida (sin estado, sin
I/O, sin aleatoriedad; sklearn.metrics.mutual_info_score es determinista).
- Discretizacion: numericas via
np.digitizesobre los bordes de cuantil (np.quantile); categoricas via mapa valor->id en orden de aparicion. La eleccion debinsafecta la estimacion de MI en columnas numericas: pocos bins suavizan, muchos bins capturan mas estructura pero inflan el ruido en muestras pequenas. Una relacion que oscila mas rapido que la resolucion de los bins (p.ej. un seno de muchos periodos sobre el rango dea) da NMI bajo conbinspequeno aunque la dependencia sea real: subebinspara resolverla. - Sesgo de la MI: en muestras pequenas la MI cruda tiende a sobreestimarse (sesgo positivo). La normalizacion NMI lo atenua parcialmente pero no lo elimina; para columnas independientes con muchos bins y pocos datos el valor puede no ser exactamente 0.
- Entropia 0: si una columna discretizada es constante, H = 0 y la NMI se define como 0.0 (no hay informacion compartida medible); la MI cruda tambien es 0 en ese caso.
- NMI = MI / sqrt(H(a) * H(b)), clampada a [0, 1] por seguridad numerica.