Pandas agrupación de datos (cut / qcut)
La agrupación de datos (también llamada agrupamiento en contenedores) es el proceso de discretizar variables continuas, comúnmente utilizado en preprocesamiento de datos, ingeniería de características y análisis de datos.
cut: agrupación de igual ancho
cutDivide los datos en intervalos de igual ancho.
Ejemplo
import pandas as pd
import numpy as np
# Crear datos de edad
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Datos originales:")
print(ages.tolist())
print()
# Agrupación de igual ancho (5 intervalos)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Niños", "Jóvenes", "Mediana edad", "Mayores", "Ancianos"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Resultado de la agrupación de igual ancho:")
print(age_bins)
print()
# Incluye el límite derecho
age_bins2 = pd.cut(ages, bins=4)
print("Agrupación automática de igual ancho:")
print(age_bins2)
import numpy as np
# Crear datos de edad
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Datos originales:")
print(ages.tolist())
print()
# Agrupación de igual ancho (5 intervalos)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Niños", "Jóvenes", "Mediana edad", "Mayores", "Ancianos"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Resultado de la agrupación de igual ancho:")
print(age_bins)
print()
# Incluye el límite derecho
age_bins2 = pd.cut(ages, bins=4)
print("Agrupación automática de igual ancho:")
print(age_bins2)
Devolver categorías y límites
Ejemplo
import pandas as pd
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Devolver el índice de los intervalos
result = pd.cut(ages, bins=4, labels=False)
print("Índice de intervalos:")
print(result)
print()
# Devolver los límites de los intervalos
result = pd.cut(ages, bins=4, retbins=True)
print("Límites de intervalos:")
print(result[1])
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Devolver el índice de los intervalos
result = pd.cut(ages, bins=4, labels=False)
print("Índice de intervalos:")
print(result)
print()
# Devolver los límites de los intervalos
result = pd.cut(ages, bins=4, retbins=True)
print("Límites de intervalos:")
print(result[1])
qcut: agrupación de igual frecuencia
qcutDivide los datos en intervalos que contienen aproximadamente la misma cantidad de puntos de datos.
Ejemplo
import pandas as pd
import numpy as np
# Datos con distribución desigual
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Datos originales:")
print(data.tolist())
print()
# Agrupación de igual ancho (puede causar distribución desigual)
cut_result = pd.cut(data, q=4)
print("Agrupación de igual ancho:")
print(cut_result.value_counts())
print()
# Agrupación de igual frecuencia (cada intervalo tiene aproximadamente la misma cantidad de puntos de datos)
qcut_result = pd.qcut(data, q=4)
print("Agrupación de igual frecuencia:")
print(qcut_result.value_counts())
import numpy as np
# Datos con distribución desigual
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Datos originales:")
print(data.tolist())
print()
# Agrupación de igual ancho (puede causar distribución desigual)
cut_result = pd.cut(data, q=4)
print("Agrupación de igual ancho:")
print(cut_result.value_counts())
print()
# Agrupación de igual frecuencia (cada intervalo tiene aproximadamente la misma cantidad de puntos de datos)
qcut_result = pd.qcut(data, q=4)
print("Agrupación de igual frecuencia:")
print(qcut_result.value_counts())
Especificar cuantiles
Ejemplo
import pandas as pd
data = pd.Series(range(1, 101))
# Dividir según cuantiles especificados
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("División por cuantiles:")
print(result.value_counts().sort_index())
data = pd.Series(range(1, 101))
# Dividir según cuantiles especificados
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("División por cuantiles:")
print(result.value_counts().sort_index())
Práctica: análisis de datos
Ejemplo
import pandas as pd
import numpy as np
# Simular datos de consumo de clientes
np.random.seed(42)
customers = pd.DataFrame({
"ID de cliente": range(1, 101),
"Monto de consumo": np.random.exponential(500, 100) + 100
})
# Agrupar en diferentes niveles de consumo
customers["Nivel de consumo"] = pd.cut(
customers["Monto de consumo"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Bajo", "Medio", "Alto", "VIP"]
)
# Contar el número de clientes por nivel
print("Distribución de niveles de consumo:")
print(customers["Nivel de consumo"].value_counts())
print()
# Calcular el consumo promedio por nivel
print("Consumo promedio por nivel:")
print(customers.groupby("Nivel de consumo")["Monto de consumo"].mean().round(2))
import numpy as np
# Simular datos de consumo de clientes
np.random.seed(42)
customers = pd.DataFrame({
"ID de cliente": range(1, 101),
"Monto de consumo": np.random.exponential(500, 100) + 100
})
# Agrupar en diferentes niveles de consumo
customers["Nivel de consumo"] = pd.cut(
customers["Monto de consumo"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Bajo", "Medio", "Alto", "VIP"]
)
# Contar el número de clientes por nivel
print("Distribución de niveles de consumo:")
print(customers["Nivel de consumo"].value_counts())
print()
# Calcular el consumo promedio por nivel
print("Consumo promedio por nivel:")
print(customers.groupby("Nivel de consumo")["Monto de consumo"].mean().round(2))