Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.7 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 | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cramers_v_py_datascience | cramers_v | function | py | datascience | 1.0.0 | pure | def cramers_v(a: list, b: list) -> float | Cramer's V del grupo eda: asociacion simetrica entre dos columnas categoricas pareadas (0=independientes, 1=asociacion perfecta), con correccion de sesgo Bergsma-Wicher. Descarta pares con None y devuelve 0.0 si hay <2 categorias o <2 pares. Funcion pura, sin pandas. |
|
false | from datascience import cramers_v a = ["red", "green", "blue", "red", "green", "blue"] b = ["hot", "cool", "cool", "hot", "cool", "cool"] # derivada de a cramers_v(a, b) # -> ~1.0 (asociacion perfecta) | true |
|
python/functions/datascience/cramers_v_test.py | python/functions/datascience/cramers_v.py |
|
float en [0, 1]. 0.0 = variables independientes, 1.0 = asociacion perfecta. Devuelve 0.0 cuando hay menos de 2 pares validos o menos de 2 categorias distintas en alguna de las dos variables. Nunca devuelve None ni lanza excepcion. |
Ejemplo
from datascience import cramers_v
# Dos categoricas asociadas: b se deriva de a con un mapeo fijo.
a = ["red", "green", "blue", "red", "green", "blue", "red", "green", "blue"]
mapping = {"red": "hot", "green": "cool", "blue": "cool"}
b = [mapping[x] for x in a]
cramers_v(a, b)
# -> ~1.0 (saber el color predice perfectamente la temperatura)
# Dos categoricas independientes (aleatorias) -> V cercana a 0.
import random
rng = random.Random(42)
cats = ["a", "b", "c", "d"]
x = [rng.choice(cats) for _ in range(2000)]
y = [rng.choice(cats) for _ in range(2000)]
cramers_v(x, y)
# -> < 0.5 (no hay asociacion)
Cuando usarla
Cuando perfiles o exploras un dataset y necesites medir la asociacion entre
dos columnas categoricas (no numericas): construir un heatmap de correlacion
categorica, detectar columnas redundantes/derivadas una de otra, o decidir que
features categoricas aportan informacion antes de modelar. Es el equivalente
categorico de un coeficiente de correlacion: simetrica (cramers_v(a, b) == cramers_v(b, a)) y normalizada a [0, 1].
Notas
Funcion pura, sin I/O, sin pandas y sin mutar los inputs. Construye la tabla de
contingencia con collections.Counter sobre los pares (a_i, b_i) y calcula
chi-cuadrado a mano (sum((obs-exp)^2/exp)), por lo que solo depende de la
stdlib.
Aplica la correccion de sesgo de Bergsma-Wicher, que reduce el inflado de V
en tablas pequenas: phi2corr = max(0, phi2 - (r-1)(k-1)/(n-1)), con r/k
filas/columnas corregidas y n el numero de pares validos. El resultado se
clampa a [0, 1] por seguridad numerica.
Casos borde resueltos sin excepcion: listas vacias, un solo par, columna con una
sola categoria, o None en cualquiera de los dos lados (el par se descarta) ->
todos devuelven 0.0 o una V bien definida sobre los pares que queden.