1 Generalidades

Ahora que hemos cubierto muchas de las características de Pandas, vamos a tomarnos un momento para hablar de los tipos de datos y las escalas. Ya sabemos que Pandas soporta un buen número de diferentes tipos de datos, como cadenas, enteros y números de punto flotante. Pero hasta ahora no hemos visto lo que se llama escalas de los datos.

Vamos a trabajar con un dataframe que contiene los grados académicos de un grupo de estudiantes. La diferencia entre un estudiante de grado 1 y otro de grado 2, es la misma que la que hay entre un grado 2 y un grado 3 y la misma que existe entre un grado 8 y un grado 0. Ahora pensemos en los resultados de los calificaciones finales que esos alumnos puedan tener. ¿La diferencia entre un grado A y un A- es la misma que la diferencia entre A- y un B+?

import pandas as pd
df = pd.DataFrame(
    ['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D'],
    index=[
        'excellent', 'excellent', 'excellent',
        'good', 'good', 'good', 'ok', 'ok', 'ok',
        'poor', 'poor'])
df.rename(columns={0: 'Grades'}, inplace=True)
df
          Grades
excellent     A+
excellent      A
excellent     A-
good          B+
good           B
good          B-
ok            C+
ok             C
ok            C-
poor          D+
poor           D

2 Escalas

De manera intuitiva podemos ver diferentes escalas, y conforme hagamos limpieza de los datos, análisis estadísticos y machine learning, es importante aclarar nuestros conocimientos y terminología. Como un data scientist hay cuatro escalas que debemos conocer.

2.1 Escalas de razón

La primera es la llamada escala de razón. En la escala de razón, las unidades de medida están igualmente espaciadas y las operaciones matemáticas como una resta, división y multiplicación son todas válidas. Dos buenos ejemplos de escalas de razón son el peso y la altura.

2.2 Escalas de intervalos

El siguiente tipo de escala que debemos de conocer es llamada escalas de intervalos. En este tipo de escalas las unidades de medida están espaciada equitativamente como en las escalas de razón. Pero no está clara la ausencia de valores. Esto quiere decir que no hay un valor cero real, y por lo tanto las operaciones como la multiplicación no son válidas.

Un ejemplo de escalas de intervalos puede ser la medición de temperatura medidas en grados Celsius o Fahrenheit. Ya que realmente nunca hay una ausencia de temperatura y los 0 grados son solo un valor al que le damos cierto significado.

La dirección de una brújula puede ser otro buen ejemplo, porque 0 grados en la brújla no indica una falta de dirección.

Para la mayoría de los trabajos de minería de datos, las diferencias entre las escalas de razón y las de intervalo tal vez no estén muy claras o no parezcan importantes para el algoritmo que estamos aplicando. Pero es importante tener en mente cuando se aplican pruebas estadísticas avanzadas.

2.3 Escalas de ordinales

La siguiente es la escala ordinal. Aquí el orden de los valores es importante, pero las diferencias entre los valores no son espaciadas equitativamente. Por ejemplo, los grados en muchas universidades de Estados Unidos, donde asignan letras con signos más o menos, pero cuando se compara esto con el porcentaje de valores se puede ver que una letra por si misma cubre el 4% de las calificaciones disponibles, mientas que una letra con signo representa solo el 4% para las calificaciones disponibles. Es decir, un relajo.

Los datos ordinales son muy comunes en el machine learning y generalmente es un reto trabajar con estos.

2.4 Escala nominal

Los valores nominales son muy comunes y con frecuencia se refieren como categorías.

La última escala es la escala nominal que es simplemente datos categorizados. Por ejemplo, los nombres de los equipos de futbol en una liga, hay un número limitado de equipos, pero su clasificación cambia de acuerdo a una fórmula matemática que no se relaciona con sus nombres.

3 Estratos

La estratificación es una característica muy utilizada en la estadística, y con Pandas, crear estratos es realmente muy fácil (cuando le entiendes al asunto).

En el curso que estoy tomando, usamos los datos del censo de EEUU para ejemplificar la estratificación. El planteamiento es el siguiente:

Se busca clasificar a los estados de acuerdo a la población promedio de sus condados en 10 estratos.

El procedimiento es el siguiente:

  1. Se filtran los condados, identificados en la columna SUMLEV con el \(50\).
  2. A continuación, se estable la columna STNAME que corresponde al nombre del estado como índice del Data Frame.
  3. Luego se agrupan por estado y se obtiene el promedio de población por condado usando el método .agg1.
  4. Se crean los estratos, usando la función pd.cut() que toma dos argumentos, el primero es la columna que se usa para agregar, en este caso el promedio o avg y el segundo el número de estratos que deben crearse.

En el curso se usa una versión anterior de Pandas, pero yo tengo instalada la versión actual que es la \(1.0.5\). El caso es que el código propuesto por el curso llama a la columna usada para agregar como un slice del Data Frame y en la nueva versión se usa como una propiedad.

En el curso con una versión anterior, el código es

df = pd.read_csv('./data/census.csv')
df = df[df['SUMLEV']==50]
df = df.set_index('STNAME').groupby(level=0)['CENSUS2010POP'].agg({'avg': np.average})
pd.cut(df['avg'],10)

Pero esto me da el error SpecificationError: nested renamer is not supported porque la columna avg, en la nueva versión ya no se crea de esa manera.

En cambio, en la nueva versión, la columna CENSUS2010POP se usa como propiedad y el código funciona como se espera.

En el resultado, los estratos se indican como intervalos cerrados, indicando en cada uno el inicio con ( inclusive y el final con ] exclusivo.

import pandas as pd
import numpy as np
df = pd.read_csv('../data/census.csv')
df = df[df['SUMLEV']==50]\
    .set_index('STNAME')\
    .groupby('STNAME')\
    .CENSUS2010POP.agg(avg=np.average)
pd.cut(df['avg'], 10)
STNAME
Alabama                   (11706.087, 75333.413]
Alaska                    (11706.087, 75333.413]
Arizona                 (390320.176, 453317.529]
Arkansas                  (11706.087, 75333.413]
California              (579312.234, 642309.586]
Colorado                 (75333.413, 138330.766]
Connecticut             (390320.176, 453317.529]
Delaware                (264325.471, 327322.823]
District of Columbia    (579312.234, 642309.586]
Florida                 (264325.471, 327322.823]
Georgia                   (11706.087, 75333.413]
Hawaii                  (264325.471, 327322.823]
Idaho                     (11706.087, 75333.413]
Illinois                 (75333.413, 138330.766]
Indiana                   (11706.087, 75333.413]
Iowa                      (11706.087, 75333.413]
Kansas                    (11706.087, 75333.413]
Kentucky                  (11706.087, 75333.413]
Louisiana                 (11706.087, 75333.413]
Maine                    (75333.413, 138330.766]
Maryland                (201328.118, 264325.471]
Massachusetts           (453317.529, 516314.881]
Michigan                 (75333.413, 138330.766]
Minnesota                 (11706.087, 75333.413]
Mississippi               (11706.087, 75333.413]
Missouri                  (11706.087, 75333.413]
Montana                   (11706.087, 75333.413]
Nebraska                  (11706.087, 75333.413]
Nevada                  (138330.766, 201328.118]
New Hampshire            (75333.413, 138330.766]
New Jersey              (390320.176, 453317.529]
New Mexico                (11706.087, 75333.413]
New York                (264325.471, 327322.823]
North Carolina           (75333.413, 138330.766]
North Dakota              (11706.087, 75333.413]
Ohio                     (75333.413, 138330.766]
Oklahoma                  (11706.087, 75333.413]
Oregon                   (75333.413, 138330.766]
Pennsylvania            (138330.766, 201328.118]
Rhode Island            (201328.118, 264325.471]
South Carolina           (75333.413, 138330.766]
South Dakota              (11706.087, 75333.413]
Tennessee                 (11706.087, 75333.413]
Texas                    (75333.413, 138330.766]
Utah                     (75333.413, 138330.766]
Vermont                   (11706.087, 75333.413]
Virginia                  (11706.087, 75333.413]
Washington              (138330.766, 201328.118]
West Virginia             (11706.087, 75333.413]
Wisconsin                (75333.413, 138330.766]
Wyoming                   (11706.087, 75333.413]
Name: avg, dtype: category
Categories (10, interval[float64]): [(11706.087, 75333.413] < (75333.413, 138330.766] <
                                     (138330.766, 201328.118] < (201328.118, 264325.471] < ... <
                                     (390320.176, 453317.529] < (453317.529, 516314.881] <
                                     (516314.881, 579312.234] < (579312.234, 642309.586]]

Nota al pie de página:

1

En el contexto del tema, agregación es recolectar todos los valores de CENSUS2010POP y aplicarles la función promedio o np.avg, es decir, se suman las poblaciones y se divide el total entre el número de condados de cada estado.