Saltar al contenido principal
LibreTexts Español

6.5: Parcelas de caja

  • Page ID
    151842
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    boxplot1.png
    Figura 6.13: Una gráfica de caja básica (panel a), más la misma gráfica con anotaciones agregadas para explicar a qué aspecto del conjunto de datos corresponde cada parte de la gráfica de caja (panel b).

    Otra alternativa a los histogramas es una gráfica de caja, a veces llamada trama de “caja y bigotes”. Al igual que los histogramas, son los más adecuados para los datos de escala de intervalo o proporción. La idea detrás de una gráfica de caja es proporcionar una representación visual simple de la mediana, el rango intercuartil y el rango de los datos. Y debido a que lo hacen de una manera bastante compacta, las gráficas de caja se han convertido en un gráfico estadístico muy popular, especialmente durante la etapa exploratoria del análisis de datos cuando estás tratando de entender los datos tú mismo. Echemos un vistazo a cómo funcionan, nuevamente usando los datos afl.margins como nuestro ejemplo. En primer lugar, calculemos estos números nosotros mismos usando la función summary (): 93

    > summary( afl.margins )
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       0.00   12.75   30.50   35.30   50.50  116.00 

    Entonces, ¿cómo captura una gráfica de caja estos números? La forma más fácil de describir cómo se ve una gráfica de caja es simplemente dibujar una. La función para hacer esto en R es (sorpresa, sorpresa) boxplot (). Como siempre hay muchos argumentos opcionales que puedes especificar si quieres, pero en su mayor parte puedes dejar que R elija los valores predeterminados por ti. Dicho esto, voy a anular uno de los valores predeterminados para empezar especificando la opción de rango, pero en su mayor parte no querrás hacer esto (te explicaré por qué en un minuto). Con eso como preámbulo, intentemos el siguiente comando:

    boxplot( x = afl.margins, range = 100 )

    boxplot1a-1.png

    ¿Qué sorteos R se muestran en la Figura? , la gráfica de caja más básica posible. Cuando miras esta gráfica, así es como debes interpretarla: la línea gruesa en el medio de la caja es la mediana; la caja misma abarca el rango del percentil 25 al percentil 75; y los “bigotes” cubren todo el rango desde el valor mínimo hasta el valor máximo. Esto se resume en la gráfica anotada en la Figura?? .

    En la práctica, no es así como suelen funcionar las parcelas de caja. En la mayoría de las aplicaciones, los “bigotes” no cubren el rango completo de mínimo a máximo. En cambio, en realidad salen al punto de datos más extremo que no supera un cierto límite. Por defecto, este valor es 1.5 veces el rango intercuartílico, correspondiente a un valor de rango de 1.5. Cualquier observación cuyo valor caiga fuera de este rango se traza como un círculo en lugar de estar cubierta por los bigotes, y comúnmente se conoce como un valor atípico. Para nuestros datos de márgenes AFL, hay una observación (un juego con un margen de 116 puntos) que cae fuera de este rango. Como consecuencia, el bigote superior se tira de nuevo a la siguiente observación más grande (un valor de 108), y la observación en 116 se traza como un círculo. Esto se ilustra en la Figura @ref (fig:boxplot2a. Como el valor por defecto es range = 1.5 podemos dibujar esta gráfica usando el comando simple

    boxplot( afl.margins )
    boxplot2a-1.png
    Figura 6.14: Por defecto, R solo extenderá los bigotes una distancia de 1.5 veces el rango intercuartílico, y trazará cualquier punto que caiga fuera de ese rango por separado

    Estilo visual de tu boxplot

    Hablaré un poco más sobre la relación entre boxplots y outliers en la Sección?? , pero antes de hacerlo tomemos el tiempo para limpiar esta figura. Las parcelas de caja en R son extremadamente personalizables. Además del rango habitual de parámetros gráficos que puedes ajustar para que la trama se vea bien, también puedes ejercer un control casi completo sobre cada elemento de la trama. Considera la gráfica de caja en la Figura?? : en esta versión de la trama, no solo he agregado etiquetas (xlab, ylab) y eliminado el borde estúpido (frame.plot), también he atenuado todos los elementos gráficos del boxplot excepto la barra central que traza la mediana (border) para dibujar más atención a la mediana en lugar del resto de la trama de caja.

    boxplot2b-1.png

    Ya has visto todas estas opciones en secciones anteriores de este capítulo, así que ojalá esas personalizaciones no necesiten más explicaciones. Sin embargo, también he hecho dos cosas nuevas: he eliminado las barras transversales en la parte superior e inferior de los bigotes (conocidos como los “grapas” de la trama), y convertí los bigotes mismos en líneas sólidas. Los argumentos que solía hacer esto se llaman por los ridículos nombres de staplewex y whisklty, 94 y voy a explicar estos en un momento.

    Pero primero, aquí está el comando real que usé para dibujar esta figura:

    > boxplot( x = afl.margins,           # the data
    +          xlab = "AFL games, 2010",  # x-axis label
    +          ylab = "Winning Margin",   # y-axis label
    +          border = "grey50",         # dim the border of the box
    +          frame.plot = FALSE,        # don't draw a frame
    +          staplewex = 0,             # don't draw staples
    +          whisklty = 1               # solid line for whisker 
    + )

    En general, creo que la gráfica de caja resultante es una gran mejora en el diseño visual sobre la versión predeterminada. En mi opinión al menos, hay una estética bastante minimalista que gobierna los buenos gráficos estadísticos. Idealmente, cada elemento visual que agregue a una trama debe transmitir parte del mensaje. Si tu trama incluye cosas que en realidad no ayudan al lector a aprender nada nuevo, deberías considerar eliminarlas. Personalmente, no puedo ver el punto de las barras transversales en una gráfica de caja estándar, así que las he eliminado.

    Bien, ¿qué comandos podemos usar para personalizar el boxplot? Si tecleas? boxplot y hojee la documentación de ayuda, notará que sí menciona staplewex como argumento, pero no se menciona el whisklty. El motivo de esto es que la función que maneja el dibujo se llama bxp (), así que si escribes? bxp aparecen todos los detalles gory. Aquí está el breve resumen. Para entender por qué estos argumentos tienen nombres tan estúpidos, hay que reconocer que se juntan a partir de dos componentes. La primera parte del nombre del argumento especifica una parte de la gráfica de caja: grapa se refiere a las grapas de la trama (es decir, las barras transversales), y batidor se refiere a los bigotes. La segunda parte del nombre especifica un parámetro gráfico: wex es un parámetro de ancho y lty es un parámetro de tipo de línea. Las partes de la parcela que puedes personalizar son:

    • caja. La caja que cubre el rango intercuartílico.
    • med. La línea utilizada para mostrar la mediana.
    • batidor. Las líneas verticales utilizadas para dibujar los bigotes.
    • grapa. Las barras transversales en los extremos de los bigotes.
    • fuera. Los puntos utilizados para mostrar los valores atípicos.

    Los parámetros gráficos reales que quizás quieras especificar son ligeramente diferentes para cada elemento visual, solo porque son formas diferentes entre sí. Como consecuencia, están disponibles las siguientes opciones:

    • Expansión de ancho: boxwex, staplewex, outwex. Estos son factores de escala que gobiernan el ancho de varias partes de la parcela. El factor de escala predeterminado es (generalmente) 0.8 para la caja y 0.5 para los otros dos. Tenga en cuenta que en el caso de los valores atípicos este parámetro no tiene sentido a menos que decida dibujar líneas trazando los valores atípicos en lugar de usar puntos.
    • Tipo de línea: boxlty, medlty, whisklty, staplelty, outlty. Estos rigen el tipo de línea para los elementos relevantes. Los valores para esto son exactamente los mismos que los utilizados para el parámetro lty regular, con dos excepciones. Hay una opción adicional donde puedes establecer medlty = “blank” para suprimir completamente la línea mediana (útil si quieres dibujar un punto para la mediana en lugar de trazar una línea). Del mismo modo, por defecto el tipo de línea atípico se establece en outlty = “blank”, ya que el comportamiento predeterminado es dibujar valores atípicos como puntos en lugar de líneas.
    • Ancho de línea: boxlwd, medlwd, whisklwd, staplelwd, outlwd. Estos gobiernan los anchos de línea para los elementos relevantes, y se comportan de la misma manera que el parámetro lwd regular. Lo único a tener en cuenta es que el valor predeterminado para medlwd value es tres veces el valor de los demás.
    • Color de línea: boxcol, medcol, whiskcol, staplecol, outcol. Estos rigen el color de las líneas utilizadas para dibujar los elementos relevantes. Especifica un color de la misma manera que lo haces habitualmente.
    • Color de relleno: boxfill. ¿Qué color debemos usar para llenar la caja?
    • Carácter de punto: medpch, outpch. Estos se comportan como el parámetro pch regular utilizado para seleccionar el carácter de trazado. Tenga en cuenta que puede establecer outpch = NA para que R deje de trazar los valores atípicos, y también puede establecer medpch = NA para evitar que dibuje un carácter para la mediana (¡este es el valor predeterminado!)
    • Expansión puntual: medcex, outcex. Parámetros de tamaño para los puntos utilizados para trazar medianas y valores atípicos. Estos solo son significativos si realmente se trazan los puntos correspondientes. Entonces, para la gráfica de caja predeterminada, que incluye puntos atípicos pero usa una línea en lugar de un punto para dibujar la mediana, solo el parámetro outcex es significativo.
    • Colores de fondo: medbg, outbg. Nuevamente, los colores de fondo solo son significativos si los puntos son realmente trazados.

    Tomados como un grupo, estos parámetros le permiten casi total libertad para seleccionar el estilo gráfico para su diagrama de caja que considere más apropiado para el conjunto de datos que está tratando de describir. Dicho esto, ¡cuando empiezas por primera vez no hay vergüenza en usar la configuración predeterminada! Pero si quieres dominar el arte de diseñar bellas figuras, ayuda intentar jugar con estos parámetros para ver qué funciona y qué no. Finalmente, debo mencionar algunos otros argumentos que quizás quieras hacer uso de:

    • horizontal. Establezca esto en TRUE para mostrar la gráfica horizontalmente en lugar de verticalmente.
    • varwidth. Establezca esto en TRUE para obtener R para escalar el ancho de cada caja de manera que las áreas sean proporcionales al número de observaciones que contribuyen a la gráfica de caja. Esto solo es útil si está dibujando varias parcelas de caja a la vez (consulte la Sección 6.5.3.
    • mostrar.nombres. Establezca esto en TRUE para obtener R para unir etiquetas a las gráficas de caja.
    • muesca. Si estableces notch = TRUE, R dibujará pequeñas muescas en los lados de cada caja. Si las muescas de dos parcelas de caja no se superponen, entonces hay una diferencia “estadísticamente significativa” entre las medianas correspondientes. Si no has leído el Capítulo 11, ignora este argumento —no hemos discutido la significación estadística, así que esto no significa mucho para ti. Lo estoy mencionando sólo porque quizás quieras volver al tema más adelante. (ver también la opción notch.frac cuando escribes? bxp).

    Uso de gráficas de caja para detectar valores atípicos

    Debido a que la gráfica de caja automáticamente (a menos que cambie el argumento range) separa aquellas observaciones que se encuentran dentro de un cierto rango, las personas suelen utilizarlas como un método informal para detectar valores atípicos: observaciones que están “sospechosamente” distantes de el resto de los datos. He aquí un ejemplo. Supongamos que había dibujado la gráfica de caja para los datos de márgenes de AFL, y salió pareciendo a la Figura 6.15.

    boxplotoutlier-1.png
    Figura 6.15: ¡Una gráfica de caja que muestra un valor atípico muy sospechoso! He dibujado esta trama en un estilo similar, minimalista al de Figure?? , pero he usado el argumento horizontal para dibujarlo de lado con el fin de ahorrar espacio.

    Está bastante claro que algo gracioso está pasando con una de las observaciones. Al parecer, ¡hubo un juego en el que el margen estaba por encima de los 300 puntos! Eso no me suena bien. Ahora que me he vuelto sospechoso, es hora de mirar un poco más de cerca los datos. Una función que puede ser útil para esto es la función which (); toma como entrada un vector de lógicas, y genera los índices de los casos VERDADEROS. Esto es particularmente útil en el contexto actual porque me permite hacer esto:

    > suspicious.cases <- afl.margins > 300
    > which( suspicious.cases )
    [1] 137

    aunque en la vida real probablemente no me molestaría en crear la variable sospechoso.cases: Simplemente cortaría al hombre del medio y usaría un comando como cual (afl.margins > 300). En todo caso, lo que esto ha hecho es demostrarme que el valor atípico corresponde al juego 137. Entonces, encuentro el margen registrado para ese juego:

    > afl.margins[137]
    [1] 333

    Hm. Eso definitivamente no suena bien. Entonces vuelvo a la fuente de datos original (¡internet!) y descubro que el margen real de ese juego fue de 33 puntos. Ahora está bastante claro lo que pasó. Alguien debió haber escrito el número equivocado. Se fija fácilmente, simplemente escribiendo afl.margins [137] <- 33. Si bien esto puede parecer un ejemplo tonto, debo enfatizar que este tipo de cosas en realidad pasan mucho. Los conjuntos de datos del mundo real suelen estar plagados de errores estúpidos, especialmente cuando alguien tuvo que escribir algo en una computadora en algún momento. De hecho, en realidad hay un nombre para esta fase de análisis de datos, ya que en la práctica puede desperdiciar una gran parte de nuestro tiempo: la limpieza de datos. Implica buscar errores tipográficos, datos faltantes y todo tipo de errores desagradables en los archivos de datos sin procesar. 95

    ¿Qué pasa con los datos reales? ¿El valor de 116 constituye una observación divertida no? Posiblemente. Al resultar que el juego en cuestión fue Fremantle v Hawthorn, y se jugó en la ronda 21 (la segunda última ronda local y visitante de la temporada). Fremantle ya se había clasificado para la serie final y para ellos el resultado del juego fue irrelevante; y el equipo decidió descansar a varios de sus jugadores estrella. Como consecuencia, Fremantle entró en el juego severamente con poca potencia. En contraste, Hawthorn había comenzado la temporada muy mal pero había terminado con una racha ganadora masiva, y para ellos una victoria podría asegurar un lugar en la final. Con el juego jugado en el césped local de Hawthorn 96 y con tantos factores inusuales en juego, quizás no sea de sorprender que Hawthorn aniquiló a Fremantle por 116 puntos. Dos semanas después, sin embargo, los dos equipos se enfrentaron de nuevo en una final eliminatoria en el local de Fremantle, y Fremantle ganó cómodamente por 30 puntos. 97

    Entonces, ¿deberíamos excluir el juego de los análisis posteriores? Si esto fuera un experimento de psicología en lugar de una temporada de AFL, estaría bastante tentado a excluirlo porque hay pruebas bastante sólidas de que Fremantle realmente no se estaba esforzando mucho: y en la medida en que mi pregunta de investigación se basa en una suposición de que los participantes realmente están tratando de hacer la tarea. Por otro lado, en muchos estudios estamos realmente interesados en ver toda la gama de comportamientos posibles, y eso incluye situaciones en las que la gente decide no esforzarse mucho: por lo que excluir esa observación sería una mala idea. En el contexto de los datos de AFL, se aplica una distinción similar. Si hubiera estado tratando de dar consejos sobre quién se desempeñaría bien en la final, habría (y de hecho lo hice) ignorar la masacre de la Ronda 21, porque es demasiado engañosa. Por otro lado, si mi interés está únicamente en la propia temporada local y visitante, creo que sería una lástima tirar información perteneciente a uno de los juegos más distintivos (aunque aburridos) del año. En otras palabras, la decisión sobre si incluir valores atípicos o excluirlos depende en gran medida de por qué crees que los datos se ven como ellos, y para qué quieres usar los datos. Las herramientas estadísticas pueden proporcionar un método automático para sugerir candidatos para su eliminación, pero realmente necesita ejercer un buen juicio aquí. Como ya he dicho antes, R es un autómata sin sentido. No ve el footy, por lo que carece del contexto más amplio para tomar una decisión informada. No eres un autómata sin sentido, por lo que debes ejercer el juicio: si el valor atípico te parece legítimo, entonces guárdalo. En cualquier caso, volveré al tema nuevamente en la Sección 15.9, así que volvamos a nuestra discusión sobre cómo dibujar tramas de caja.

    Dibujar múltiples gráficas de caja

    Una última cosa. ¿Y si quieres dibujar varias parcelas de caja a la vez? Supongamos, por ejemplo, que quería parcelas de caja separadas que mostraran los márgenes de AFL no solo para 2010, sino para cada año entre 1987 y 2010. Para ello, lo primero que tendremos que hacer es encontrar los datos. Estos se almacenan en el archivo AFLSmall2.rData. Así que vamos a cargarlo y echar un vistazo rápido a lo que hay dentro:

    > load( "aflsmall2.Rdata" )
    > who( TRUE )
       -- Name --   -- Class --   -- Size --
       afl2         data.frame    4296 x 2  
        $margin     numeric       4296      
        $year       numeric       4296   

    Observe que el marco de datos afl2 es bastante grande. Contiene 4296 juegos, que es mucho más de lo que quiero ver impresos en la pantalla de mi computadora. Con ese fin, R le proporciona algunas funciones útiles para imprimir solo algunas de las filas en el marco de datos. El primero de ellos es head () que imprime las primeras 6 filas, del marco de datos, así:

    > head( afl2 )
      margin year
    1     33 1987
    2     59 1987
    3     45 1987
    4     91 1987
    5     39 1987
    6      1 1987

    También puedes usar la función tail () para imprimir las últimas 6 filas. El paquete de autos también proporciona una pequeña función útil llamada some () que imprime un subconjunto aleatorio de las filas.

    En cualquier caso, lo importante es que tengamos el marco de datos afl2 que contiene las variables que nos interesan. Lo que queremos hacer es tener R draw boxplots para la variable de margen, trazadas por separado para cada año por separado. La forma de hacer esto usando la función boxplot () es ingresar una fórmula en lugar de una variable como entrada. En este caso, la fórmula que queremos es margen ~ año. Entonces nuestro comando boxplot ahora se ve así:

    multipleboxplots-1.png
    Figura 6.16: Gráficas de caja que muestran los márgenes ganadores de la AFL para los 24 años de 1987 a 2010 inclusive. Esta es la gráfica por defecto creada por R, sin anotaciones agregadas y sin cambios en el diseño visual. Es bastante legible, aunque como mínimo querrás incluir algunas anotaciones básicas etiquetando los ejes. Comparar y contrastar con la Figura 6.17

    El resultado se muestra en la Figura 6.16. 98 Incluso esto, la versión predeterminada de la trama, da una idea de por qué a veces es útil elegir gráficas de caja en lugar de histogramas. Incluso antes de tomarse el tiempo para convertir esta salida básica en algo más legible, es posible tener una buena idea de cómo se ven los datos de año en año sin agobiarse con demasiados detalles. Ahora imagina lo que hubiera pasado si hubiera intentado meter 24 histogramas en este espacio: no hay ninguna posibilidad de que el lector vaya a aprender algo útil.

    multipleboxplots2-1.png
    Figura 6.17: Una versión limpiada de la Figura 6.16. Observe que he usado un diseño muy minimalista para las parcelas de caja, con el fin de enfocar el ojo en las medianas. También he convertido las medianas en puntos sólidos, para transmitir la sensación de que la variación de año a año en la mediana debe considerarse como una sola trama coherente (similar a lo que hicimos al trazar la variable Fibonacci anteriormente). El tamaño de los valores atípicos se ha reducido, porque en realidad no son muy interesantes. En contraste, he agregado un color de relleno a las cajas, para que sea más fácil ver la tendencia en el rango intercuartil a lo largo de los años.

    Dicho esto, la gráfica de caja predeterminada deja mucho que desear en términos de claridad visual. Los valores atípicos son demasiado prominentes visualmente, las líneas punteadas se ven desordenadas y el contenido interesante (es decir, el comportamiento de la mediana y el rango intercuartílico a lo largo de los años) se oscurece un poco. Afortunadamente, esto es fácil de arreglar, ya que ya hemos cubierto muchas herramientas que puedes usar para personalizar tu salida. Después de jugar con varias versiones diferentes de la trama, la que me decidí se muestra en la Figura 6.17. El comando que usé para producirlo es largo, pero no complicado:

    >  boxplot( formula =  margin ~ year,   # the formula
    +           data = afl2,                # the data set
    +           xlab = "AFL season",        # x axis label
    +           ylab = "Winning Margin",    # y axis label
    +           frame.plot = FALSE,         # don't draw a frame
    +           staplewex = 0,              # don't draw staples
    +           staplecol = "white",        # (fixes a tiny display issue)
    +           boxwex = .75,               # narrow the boxes slightly
    +           boxfill = "grey80",         # lightly shade the boxes
    +           whisklty = 1,               # solid line for whiskers 
    +           whiskcol = "grey70",        # dim the whiskers
    +           boxcol = "grey70",          # dim the box borders
    +           outcol = "grey70",          # dim the outliers
    +           outpch = 20,                # outliers as solid dots
    +           outcex = .5,                # shrink the outliers
    +           medlty = "blank",           # no line for the medians
    +           medpch = 20,                # instead, draw solid dots
    +           medlwd = 1.5                # make them larger
    + )

    Por supuesto, dado que el comando es tan largo, podrías haber adivinado que no pasé años escribiendo toda esa basura una y otra vez. En cambio, escribí un guión, que seguí ajustando hasta que produjo la figura que quería. Hablaremos de scripts más adelante en la Sección 8.1, pero dada la longitud del comando pensé que les recordaría que hay una manera más fácil de probar diferentes comandos que escribiéndolos todos una y otra vez.


    This page titled 6.5: Parcelas de caja is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.