5.4: Obtención de un Resumen General de una Variable
- Page ID
- 151567
\( \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}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Hasta este punto del capítulo he explicado varias estadísticas de resumen diferentes que se utilizan comúnmente a la hora de analizar datos, junto con funciones específicas que puedes usar en R para calcular cada una. Sin embargo, es un poco molesto tener que calcular por separado medias, medianas, desviaciones estándar, sesgos etc. ¿No sería bueno que R tuviera algunas funciones útiles que hicieran todos estos tediosos cálculos a la vez? Algo como summary ()
o describe ()
, ¿quizás? Por qué sí, sí lo haría. Tanto es así que ambas funciones existen. La función summary ()
está en el paquete base
, por lo que viene con cada instalación de R. La función describe ()
es parte del paquete psych
, que cargamos anteriormente en el capítulo.
“Resumiendo” una variable
La función summary ()
es algo fácil de usar, pero algo complicado de entender en su totalidad, ya que es una función genérica (ver Sección 4.11. La idea básica detrás de la función summary ()
es que imprime alguna información útil sobre cualquier objeto (es decir, variable, en lo que a nosotros respecta) que especifique como argumento objeto
. Como consecuencia, el comportamiento de la función summary ()
difiere bastante dramáticamente dependiendo de la clase del objeto que le des. Empecemos dándole un objeto numérico:
summary( object = afl.margins )
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 12.75 30.50 35.30 50.50 116.00
Para las variables numéricas, obtenemos un montón de estadísticas descriptivas útiles. Nos da los valores mínimo y máximo (es decir, el rango), el primer y tercer cuartiles (percentiles 25 y 75; es decir, el IQR), la media y la mediana. Es decir, nos da una colección bastante buena de estadísticas descriptivas relacionadas con la tendencia central y la difusión de los datos.
Bien, ¿y si le damos de comer un vector lógico en su lugar? Digamos que quiero saber algo sobre cuántos “reventones” hubo en la temporada 2010 de la AFL. Operacionalizo el concepto de reventón (ver Capítulo 2) como un juego en el que el margen ganador supera los 50 puntos. Vamos a crear una variable lógica reventones
en la que el i-ésimo elemento es VERDADERO
si ese juego fue un reventón según mi definición,
blowouts <- afl.margins > 50
blowouts
## [1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [12] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE
## [34] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [45] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
## [56] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
## [67] TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [78] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [89] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE
## [111] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
## [122] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
## [133] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
## [144] TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
## [155] TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
## [166] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Entonces así es como se ve la variable reventones
. Ahora vamos a pedirle a R un resumen ()
summary( object = blowouts )
## Mode FALSE TRUE
## logical 132 44
En este contexto, la función summary ()
nos da un recuento del número de valores VERDADEROS
, el número de valores FALSE
y el número de valores faltantes (es decir, los NA
s). Comportamiento bastante razonable.
A continuación, intentemos darle un factor. Si recuerdas, he definido el vector afl.finalistas
como factor, así que usemos eso:
summary( object = afl.finalists )
## Adelaide Brisbane Carlton Collingwood
## 26 25 26 28
## Essendon Fitzroy Fremantle Geelong
## 32 0 6 39
## Hawthorn Melbourne North Melbourne Port Adelaide
## 27 28 28 17
## Richmond St Kilda Sydney West Coast
## 6 24 26 38
## Western Bulldogs
## 24
Para los factores, obtenemos una tabla de frecuencias, tal como la obtuvimos cuando usamos la función table ()
. Curiosamente, sin embargo, si convertimos esto en un vector de caracteres usando la función.character ()
(ver Sección 7.10, no obtenemos los mismos resultados:
f2 <- as.character( afl.finalists )
summary( object = f2 )
## Length Class Mode
## 400 character character
Esta es una de esas situaciones a las que me refería en la Sección 4.7, en la que es útil declarar su variable de escala nominal como un factor en lugar de un vector de caracteres. Debido a que he definido afl.finalistas
como un factor, R sabe que debería tratarlo como una variable de escala nominal, y así te da un resumen mucho más detallado (y útil) de lo que tendría si lo hubiera dejado como un vector de caracteres.
“Resumir” un marco de datos
Bien ¿qué pasa con los marcos de datos? Cuando pasa un marco de datos a la función summary ()
, produce un resumen ligeramente condensado de cada variable dentro del marco de datos. Para darte una idea de cómo esto puede ser útil, probemos esto para un nuevo conjunto de datos, uno que nunca antes habías visto. Los datos se almacenan en el archivo ClinicalTrial.rdata
, y los usaremos mucho en el Capítulo 14 (puede encontrar una descripción completa de los datos al inicio de ese capítulo). Vamos a cargarlo, y a ver qué tenemos:
load( "./data/clinicaltrial.Rdata" )
who(TRUE)
## -- Name -- -- Class -- -- Size --
## clin.trial data.frame 18 x 3
## $drug factor 18
## $therapy factor 18
## $mood.gain numeric 18
Hay un solo marco de datos llamado clin.trial
que contiene tres variables, fármaco
, terapia
y estado de ánimo
. Presumiblemente entonces, estos datos provienen de un ensayo clínico de algún tipo, en el que a las personas se les administraron diferentes medicamentos; y los investigadores miraron para ver qué le hacían los medicamentos a su estado de ánimo. Veamos si la función summary ()
arroja un poco más de luz sobre esta situación:
summary( clin.trial )
## drug therapy mood.gain
## placebo :6 no.therapy:9 Min. :0.1000
## anxifree:6 CBT :9 1st Qu.:0.4250
## joyzepam:6 Median :0.8500
## Mean :0.8833
## 3rd Qu.:1.3000
## Max. :1.8000
Evidentemente había tres fármacos: un placebo, algo llamado “ansioso” y algo llamado “joyzepam”; y había 6 personas a las que se les administraba cada medicamento. Hubo 9 personas atendidas con terapia cognitivo-conductual (TCC) y 9 personas que no recibieron tratamiento psicológico. Y podemos ver al mirar el resumen de la variable de mood.gain
que la mayoría de la gente sí mostró una ganancia de estado de ánimo (media =.88), aunque sin saber cuál es la escala aquí es difícil decir mucho más que eso. Aún así, eso no está tan mal. En general, siento que aprendí algo de eso.
“Describir” un marco de datos
La función describe ()
(en el paquete psych
) es un poco diferente, y en realidad solo pretende ser útil cuando tus datos son escala de intervalo o ratio. A diferencia de la función summary ()
, calcula las mismas estadísticas descriptivas para cualquier tipo de variable que le des. Por defecto, estos son:
var
. Esto es solo un índice: 1 para la primera variable, 2 para la segunda variable, y así sucesivamente.n
. Este es el tamaño de la muestra: más precisamente, es el número de valores que no faltan.media
. Esta es la media muestral (Sección 5.1.1).sd
. Esta es la desviación estándar (corregida por sesgo) (Sección 5.2.5).mediana
. La mediana (Sección 5.1.3).recortado
. Esto se recorta media. Por defecto es la media recortada del 10% (Sección 5.1.6).loco
. La mediana de la desviación absoluta (Sección 5.2.6).min
. El valor mínimo.máx
. El valor máximo.gama
. El rango abarcado por los datos (Sección 5.2.1).sesgo
. La asimetría (Sección 5.3).curtosis
. La curtosis (Sección 5.3).se
. El error estándar de la media (Capítulo 10).
Observe que estas estadísticas descriptivas generalmente solo tienen sentido para datos que son escala de intervalo o proporción (generalmente codificados como vectores numéricos). Para las variables nominales u ordinales (generalmente codificadas como factores), la mayoría de estas estadísticas descriptivas no son tan útiles. Lo que hace la función describe ()
es convertir factores y variables lógicas en vectores numéricos para hacer los cálculos. Estas variables están marcadas con *
y la mayoría de las veces, la estadística descriptiva de esas variables no tendrá mucho sentido. Si intenta alimentarlo con un marco de datos que incluye un vector de caracteres como variable, se produce un error.
Con esas advertencias en mente, usemos la función describe ()
para echar un vistazo al marco de datos clin.trial
. Esto es lo que obtenemos:
describe( x = clin.trial )
## vars n mean sd median trimmed mad min max range skew
## drug* 1 18 2.00 0.84 2.00 2.00 1.48 1.0 3.0 2.0 0.00
## therapy* 2 18 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00
## mood.gain 3 18 0.88 0.53 0.85 0.88 0.67 0.1 1.8 1.7 0.13
## kurtosis se
## drug* -1.66 0.20
## therapy* -2.11 0.12
## mood.gain -1.44 0.13
Como puede ver, la salida de las variables con asteriscos no tiene sentido, y debe ignorarse. Sin embargo, para la variable mood.gain
, hay mucha información útil.