2. Dades categòriques
Dades categòriques i no categòriques¶
En esta pràctica convertirem dades categòriques i no categòriques.
Utilitzarem el automobile dataset.
Comencem important el DataSet i posant nom a les columnes.
import pandas as pd
url = "data/imports-85.csv"
col_names=['symboling','normalized-losses','fuel-type','aspiration','num-of-doors','body-style','drive-wheels','engine-location','wheel-base',
'length','width','height','curb-weight','engine-type','num-of-cylinders','engine-size',
'fuel-system','bore','stroke','compression-ratio','horsepower','peak-rpm','city-mpg','highway-mpg','price']
df_car = pd.read_csv(url,sep=',',names = col_names ,na_values="?", header=None)
df_car.head()
| symboling | normalized-losses | fuel-type | aspiration | num-of-doors | body-style | drive-wheels | engine-location | wheel-base | length | width | height | curb-weight | engine-type | num-of-cylinders | engine-size | fuel-system | bore | stroke | compression-ratio | horsepower | peak-rpm | city-mpg | highway-mpg | price | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3 | NaN | gas | std | two | convertible | rwd | front | 88.6 | 168.8 | 64.1 | 48.8 | 2548 | dohc | four | 130 | mpfi | 3.47 | 2.68 | 9.0 | 111.0 | 5000.0 | 21 | 27 | 13495.0 |
| 1 | 3 | NaN | gas | std | two | convertible | rwd | front | 88.6 | 168.8 | 64.1 | 48.8 | 2548 | dohc | four | 130 | mpfi | 3.47 | 2.68 | 9.0 | 111.0 | 5000.0 | 21 | 27 | 16500.0 |
| 2 | 1 | NaN | gas | std | two | hatchback | rwd | front | 94.5 | 171.2 | 65.5 | 52.4 | 2823 | ohcv | six | 152 | mpfi | 2.68 | 3.47 | 9.0 | 154.0 | 5000.0 | 19 | 26 | 16500.0 |
| 3 | 2 | 164.0 | gas | std | four | sedan | fwd | front | 99.8 | 176.6 | 66.2 | 54.3 | 2337 | ohc | four | 109 | mpfi | 3.19 | 3.40 | 10.0 | 102.0 | 5500.0 | 24 | 30 | 13950.0 |
| 4 | 2 | 164.0 | gas | std | four | sedan | 4wd | front | 99.4 | 176.6 | 66.4 | 54.3 | 2824 | ohc | five | 136 | mpfi | 3.19 | 3.40 | 8.0 | 115.0 | 5500.0 | 18 | 22 | 17450.0 |
No totes les columnes ens interessen, per tant anem a quedar-nos solament amb les que si que ens interessen.
df_car = df_car[[ 'aspiration', 'num-of-doors', 'drive-wheels', 'num-of-cylinders']].copy()
df_car.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 205 entries, 0 to 204 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 aspiration 205 non-null object 1 num-of-doors 203 non-null object 2 drive-wheels 205 non-null object 3 num-of-cylinders 205 non-null object dtypes: object(4) memory usage: 6.5+ KB
Característiques ordinals¶
Anem a centrar-nos en el número de portes.
Per començar mirarem quants valors diferents tenim.
df_car['num-of-doors'].value_counts()
num-of-doors four 114 two 89 Name: count, dtype: int64
Com podem observar, tenim 114 files amb el valor four i 89 amb el valor two.
Hem de transformar els valors two al valor numèric 2 i el four al valor numèric 4. Per fer-ho, podem utilitzar la funció replace. Esta funció rep com a argument un diccionari per a fer el mapejat.
door_mapper = {"two": 2,
"four": 4}
df_car['doors'] = df_car["num-of-doors"].replace(door_mapper)
df_car.head()
| aspiration | num-of-doors | drive-wheels | num-of-cylinders | doors | |
|---|---|---|---|---|---|
| 0 | std | two | rwd | four | 2.0 |
| 1 | std | two | rwd | four | 2.0 |
| 2 | std | two | rwd | six | 2.0 |
| 3 | std | four | fwd | four | 4.0 |
| 4 | std | four | 4wd | five | 4.0 |
Pregunta 1¶
Fes el mateix procés de conversió amb el número de cilindres.
Codificant dades categòriques no ordinals¶
Per codificar dades no ordinals, és a dir, que no seguixen un ordre o prioritat, utilitzarem el mètode get_dummies() de pandas.
Les dues característiques que ens queden són no ordinals:
- aspiration: std, turbo (injecció estàndar o turbo)
- drive-wheels: 4wd, fwd, rwd (tracció a les 4 rodes, les frontals o les de darrere)
Es podria pensar que podem seguir una estratègia d'assignar a cada valor un valor numèric, per exemple, 4wd=1, fwd=2, rwd=3. Però al fer-ho d'aquesta forma, estem establint un ordre o prioritat, cosa que pot influir en el resultat dels algorismes d'IA.
L'estratègia correcta seria convertir a valñor binari cada valor original. És el que s'anomena one-hot encoding (en machine learning) o dummying (en estadística). Aquesta forma de procedir ens permetrà expresar la informació en forma numèrica sense implicar un ordre.
Pandas proporciona el mètode get_dummies per a fer aquesta codificació.
Pregunta 2¶
Utilitza el mètode get_dummies per a codificar les dades drive-wheels.
Pregunta 3¶
Observa com ha quedat el dataframe una vegada codificats els valors de drive-wheels. Hauràs pogut observar que ha creat tres columnes noves.
Anem a aplicar la mateixa idea a la columna aspiration. Esta vegada sols hi ha dos valors diferents, calen dues columnes o podem crear una sola característica nova amb valor True o Fals que indique si és turbo o no? Seria suficient simplement amb una columna. Utilitzareu el mateix mètode però ammb el paràmetre drop_first=True per a no crear una característica de la injecció estàndar.
Pregunta 4¶
Torna a carregar el dataset i observa si hi ha més característiques que necessiten una transformació abans de passar-les a un model de ML.
Pregunta 5¶
Modifica el dataset per a que sols queden dades numèriques. Guarda'l en un arxiu imports-85-numeric.csv.