preloader

Variables categóricas

Índice de contenido

Una variable categórica solo puede tener un número limitado, y generalmente fijo, de valores posibles (categorías). Algunos ejemplos de variables de este tipo pueden ser el género y el tipo de sangre. Pueden tener un orden (por ejemplo, ‘muy de acuerdo’ podría ir primero y ‘muy en desacuerdo’ podría ir en último lugar), pero las operaciones numéricas (sumas, restas, divisiones, …) no son posibles.

python
import pandas as pd

Convertir una columna en variable categórica

Convertir variable discreta

python
df = pd.read_csv("C:/Users/user/Desktop/adult-stretch.data", header=None, names = ["Color", "Size", "Other_column", "Age", "Target"])
df

ColorSizeOther_columnAgeTarget
0YELLOWSMALLSTRETCHADULTT
1YELLOWSMALLSTRETCHCHILDT
2YELLOWSMALLDIPADULTT
3YELLOWSMALLDIPCHILDF
4YELLOWSMALLDIPCHILDF
5YELLOWLARGESTRETCHADULTT
6YELLOWLARGESTRETCHCHILDT
7YELLOWLARGEDIPADULTT
8YELLOWLARGEDIPCHILDF
9YELLOWLARGEDIPCHILDF
10PURPLESMALLSTRETCHADULTT
11PURPLESMALLSTRETCHCHILDT
12PURPLESMALLDIPADULTT
13PURPLESMALLDIPCHILDF
14PURPLESMALLDIPCHILDF
15PURPLELARGESTRETCHADULTT
16PURPLELARGESTRETCHCHILDT
17PURPLELARGEDIPADULTT
18PURPLELARGEDIPCHILDF
19PURPLELARGEDIPCHILDF
python
df.columns
Index(['Color', 'Size', 'Other_column', 'Age', 'Target'], dtype='object')
python
df.dtypes
Color           object
Size            object
Other_column    object
Age             object
Target          object
dtype: object
python
df["Color"] = df["Color"].astype("category")
df.dtypes
Color           category
Size              object
Other_column      object
Age               object
Target            object
dtype: object

Convertir variable continua

python
df2 = pd.DataFrame({"Edad": np.random.randint(0, 100, 20)})
df2

Edad
094
140
253
334
462
538
661
790
835
975
1064
1178
1243
1373
1487
1560
1654
1724
1826
1968
python
labels = ["{0} - {1}".format(i, i+9) for i in range(0,100,10)]
labels
['0 - 9',
 '10 - 19',
 '20 - 29',
 '30 - 39',
 '40 - 49',
 '50 - 59',
 '60 - 69',
 '70 - 79',
 '80 - 89',
 '90 - 99']
python
df2["Grupo_edad"] = pd.cut(df2.Edad, range(0,105,10), right = False, labels = labels)
df2

EdadGrupo_edad
09490 - 99
14040 - 49
25350 - 59
33430 - 39
46260 - 69
53830 - 39
66160 - 69
79090 - 99
83530 - 39
97570 - 79
106460 - 69
117870 - 79
124340 - 49
137370 - 79
148780 - 89
156060 - 69
165450 - 59
172420 - 29
182620 - 29
196860 - 69

Renombrar categorías

python
df.Color.unique()
['YELLOW', 'PURPLE']
Categories (2, object): ['YELLOW', 'PURPLE']
python
df.Color.cat.rename_categories({"YELLOW": "AMARILLO", "PURPLE": "MORADO"}, inplace=True)
python
df

ColorSizeOther_columnAgeTarget
0AMARILLOSMALLSTRETCHADULTT
1AMARILLOSMALLSTRETCHCHILDT
2AMARILLOSMALLDIPADULTT
3AMARILLOSMALLDIPCHILDF
4AMARILLOSMALLDIPCHILDF
5AMARILLOLARGESTRETCHADULTT
6AMARILLOLARGESTRETCHCHILDT
7AMARILLOLARGEDIPADULTT
8AMARILLOLARGEDIPCHILDF
9AMARILLOLARGEDIPCHILDF
10MORADOSMALLSTRETCHADULTT
11MORADOSMALLSTRETCHCHILDT
12MORADOSMALLDIPADULTT
13MORADOSMALLDIPCHILDF
14MORADOSMALLDIPCHILDF
15MORADOLARGESTRETCHADULTT
16MORADOLARGESTRETCHCHILDT
17MORADOLARGEDIPADULTT
18MORADOLARGEDIPCHILDF
19MORADOLARGEDIPCHILDF

Añadir categorías

python
df.Color.cat.add_categories("AZUL")
0     AMARILLO
1     AMARILLO
2     AMARILLO
3     AMARILLO
4     AMARILLO
5     AMARILLO
6     AMARILLO
7     AMARILLO
8     AMARILLO
9     AMARILLO
10      MORADO
11      MORADO
12      MORADO
13      MORADO
14      MORADO
15      MORADO
16      MORADO
17      MORADO
18      MORADO
19      MORADO
Name: Color, dtype: category
Categories (3, object): ['MORADO', 'AMARILLO', 'AZUL']

Eliminar categorías

python
df.Color.cat.remove_unused_categories()
0     AMARILLO
1     AMARILLO
2     AMARILLO
3     AMARILLO
4     AMARILLO
5     AMARILLO
6     AMARILLO
7     AMARILLO
8     AMARILLO
9     AMARILLO
10      MORADO
11      MORADO
12      MORADO
13      MORADO
14      MORADO
15      MORADO
16      MORADO
17      MORADO
18      MORADO
19      MORADO
Name: Color, dtype: category
Categories (2, object): ['MORADO', 'AMARILLO']

Ordenar por categoría

python
df.sort_values(by="Color", ascending=True)

ColorSizeOther_columnAgeTarget
19MORADOLARGEDIPCHILDF
17MORADOLARGEDIPADULTT
16MORADOLARGESTRETCHCHILDT
15MORADOLARGESTRETCHADULTT
14MORADOSMALLDIPCHILDF
13MORADOSMALLDIPCHILDF
12MORADOSMALLDIPADULTT
11MORADOSMALLSTRETCHCHILDT
10MORADOSMALLSTRETCHADULTT
18MORADOLARGEDIPCHILDF
0AMARILLOSMALLSTRETCHADULTT
7AMARILLOLARGEDIPADULTT
6AMARILLOLARGESTRETCHCHILDT
5AMARILLOLARGESTRETCHADULTT
4AMARILLOSMALLDIPCHILDF
3AMARILLOSMALLDIPCHILDF
2AMARILLOSMALLDIPADULTT
1AMARILLOSMALLSTRETCHCHILDT
8AMARILLOLARGEDIPCHILDF
9AMARILLOLARGEDIPCHILDF
python
df2.dtypes
Edad             int64
Grupo_edad    category
dtype: object
python
df2.sort_values(by="Grupo_edad", ascending=True)

EdadGrupo_edad
172420 - 29
182620 - 29
33430 - 39
53830 - 39
83530 - 39
14040 - 49
124340 - 49
25350 - 59
165450 - 59
196860 - 69
46260 - 69
66160 - 69
106460 - 69
156060 - 69
97570 - 79
137370 - 79
117870 - 79
148780 - 89
79090 - 99
09490 - 99

Agrupar por categoría

python
df2.groupby("Grupo_edad").size()
Grupo_edad
0 - 9      0
10 - 19    0
20 - 29    2
30 - 39    3
40 - 49    2
50 - 59    2
60 - 69    5
70 - 79    3
80 - 89    1
90 - 99    2
dtype: int64

Tratamiento de variables categóricas

Eliminar variables categóricas

La manera más simple de atajar el problema de las variables categóricas consiste en eliminarlas del conjunto de datos. Sin embargo, este enfoque puede provocar una pérdida de información potencialmente valiosa para el modelo de Machine Learning.

Método de label encoding

El método de label encoding (o codificación de etiqueta) consiste en asignar un número entero a cada valor diferente de una variable. El problema de este enfoque es que implica asumir un orden en las categorías, y las variables categóricas no siempre llevan implícito un orden claro. Por tanto, esta técnica es apropiada cuando se están tratando variables ordinales.

python
df

ColorSizeOther_columnAgeTarget
0YELLOWSMALLSTRETCHADULTT
1YELLOWSMALLSTRETCHCHILDT
2YELLOWSMALLDIPADULTT
3YELLOWSMALLDIPCHILDF
4YELLOWSMALLDIPCHILDF
5YELLOWLARGESTRETCHADULTT
6YELLOWLARGESTRETCHCHILDT
7YELLOWLARGEDIPADULTT
8YELLOWLARGEDIPCHILDF
9YELLOWLARGEDIPCHILDF
10PURPLESMALLSTRETCHADULTT
11PURPLESMALLSTRETCHCHILDT
12PURPLESMALLDIPADULTT
13PURPLESMALLDIPCHILDF
14PURPLESMALLDIPCHILDF
15PURPLELARGESTRETCHADULTT
16PURPLELARGESTRETCHCHILDT
17PURPLELARGEDIPADULTT
18PURPLELARGEDIPCHILDF
19PURPLELARGEDIPCHILDF
python
color_map = {"YELLOW": 1, "PURPLE": 2}
df["Color_numeric"] = df.Color.map(color_map)
df

ColorSizeOther_columnAgeTargetColor_numeric
0YELLOWSMALLSTRETCHADULTT1
1YELLOWSMALLSTRETCHCHILDT1
2YELLOWSMALLDIPADULTT1
3YELLOWSMALLDIPCHILDF1
4YELLOWSMALLDIPCHILDF1
5YELLOWLARGESTRETCHADULTT1
6YELLOWLARGESTRETCHCHILDT1
7YELLOWLARGEDIPADULTT1
8YELLOWLARGEDIPCHILDF1
9YELLOWLARGEDIPCHILDF1
10PURPLESMALLSTRETCHADULTT2
11PURPLESMALLSTRETCHCHILDT2
12PURPLESMALLDIPADULTT2
13PURPLESMALLDIPCHILDF2
14PURPLESMALLDIPCHILDF2
15PURPLELARGESTRETCHADULTT2
16PURPLELARGESTRETCHCHILDT2
17PURPLELARGEDIPADULTT2
18PURPLELARGEDIPCHILDF2
19PURPLELARGEDIPCHILDF2
python
df.dtypes
Color            category
Size               object
Other_column       object
Age                object
Target             object
Color_numeric    category
dtype: object
python
df.Color.cat.codes
0     1
1     1
2     1
3     1
4     1
5     1
6     1
7     1
8     1
9     1
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
dtype: int8
python
df["Color_codes"] = df.Color.cat.codes
df

ColorSizeOther_columnAgeTargetColor_numericColor_codes
0YELLOWSMALLSTRETCHADULTT11
1YELLOWSMALLSTRETCHCHILDT11
2YELLOWSMALLDIPADULTT11
3YELLOWSMALLDIPCHILDF11
4YELLOWSMALLDIPCHILDF11
5YELLOWLARGESTRETCHADULTT11
6YELLOWLARGESTRETCHCHILDT11
7YELLOWLARGEDIPADULTT11
8YELLOWLARGEDIPCHILDF11
9YELLOWLARGEDIPCHILDF11
10PURPLESMALLSTRETCHADULTT20
11PURPLESMALLSTRETCHCHILDT20
12PURPLESMALLDIPADULTT20
13PURPLESMALLDIPCHILDF20
14PURPLESMALLDIPCHILDF20
15PURPLELARGESTRETCHADULTT20
16PURPLELARGESTRETCHCHILDT20
17PURPLELARGEDIPADULTT20
18PURPLELARGEDIPCHILDF20
19PURPLELARGEDIPCHILDF20
python
df.Color.cat.ordered
False

Método de one-hot encoding

El método de one-hot encoding (o codificación one-hot) consiste en crear nuevas columnas indicando la presencia o ausencia de cada posible valor de una variable categórica.

One-hot encoding, al contrario que el método de label encoding, no implica asumir un orden en las categorías. Por tanto, esta técnica es apropiada para tratar variables nominales. Sin embargo, es importante tener en cuenta que el método de one-hot encoding no suele dar buenos resultados si hay muchos valores diferentes para la variable categórica que se está procesando (generalmente, más de 15).

python
pd.get_dummies(data=df, columns=["Color"], drop_first=True)

SizeOther_columnAgeTargetColor_numericColor_codesColor_YELLOW
0SMALLSTRETCHADULTT111
1SMALLSTRETCHCHILDT111
2SMALLDIPADULTT111
3SMALLDIPCHILDF111
4SMALLDIPCHILDF111
5LARGESTRETCHADULTT111
6LARGESTRETCHCHILDT111
7LARGEDIPADULTT111
8LARGEDIPCHILDF111
9LARGEDIPCHILDF111
10SMALLSTRETCHADULTT200
11SMALLSTRETCHCHILDT200
12SMALLDIPADULTT200
13SMALLDIPCHILDF200
14SMALLDIPCHILDF200
15LARGESTRETCHADULTT200
16LARGESTRETCHCHILDT200
17LARGEDIPADULTT200
18LARGEDIPCHILDF200
19LARGEDIPCHILDF200
python
df.dtypes
Color            category
Size               object
Other_column       object
Age                object
Target             object
Color_numeric    category
Color_codes          int8
dtype: object
python
pd.get_dummies(data=df)

Color_codesColor_PURPLEColor_YELLOWSize_LARGESize_SMALLOther_column_DIPOther_column_STRETCHAge_ADULTAge_CHILDTarget_FTarget_TColor_numeric_2Color_numeric_1
01010101100101
11010101010101
21010110100101
31010110011001
41010110011001
51011001100101
61011001010101
71011010100101
81011010011001
91011010011001
100100101100110
110100101010110
120100110100110
130100110011010
140100110011010
150101001100110
160101001010110
170101010100110
180101010011010
190101010011010
python
# USO DE SKLEARN
comments powered by Disqus