14  Sumarização de Dados

Status 🟨🟨🟨

14.1 Funções Básicas

Nesta seção são detalhadas algumas das funções mais básicas para sumarização de dados.

14.1.1 Soma

A função sum retorna a soma dos elementos informados como argumentos.

sum(1:10)
[1] 55
sum(NA)
[1] NA
sum(NA, na.rm = T)
[1] 0

14.1.2 Média

mean(1:20)
[1] 10.5
mean(c(NA, 1, 2, 3))
[1] NA
mean(NA, na.rm = T)
[1] NaN

14.1.3 Mediana

median(1:11)
[1] 6
median(c(NA, 1, 2, 3))
[1] NA
median(NA, na.rm = T)
[1] NA

14.1.4 Máximo e mínimo

max(99:15)
[1] 99
min(15:99)
[1] 15

Estas funções também oferecem o argumento na.rm. Veja que vetores vazios recebem retornos Inf e -Inf.

max(c(NA, NA), na.rm = T)
Warning in max(c(NA, NA), na.rm = T): nenhum argumento não faltante para max;
retornando -Inf
[1] -Inf
min(c(NA, NA), na.rm = T)
Warning in min(c(NA, NA), na.rm = T): nenhum argumento não faltante para min;
retornando Inf
[1] Inf

14.2 Agregação

Uma tarefa muito rotineira em análise de dados é a sumarização de valores por grupos de interesse.

Vejamos um exemplo na base Estatísticas de Aprovações - Por Porte de Empresa (BNDES). Uma informação de interesse, por exemplo, pode ser o valor total de Aprovações por ano para cada porte das empresas. Como a base de dados originalmente traz os valores abertos para cada mês, será necessária operação de agregação.

df_aprovacoes_porte <-
  readRDS(
    './data/aprovacoes_por_porte_de_empresa.RDS')

df_aprovacoes_porte |> head()
   ANO MES    MICRO PEQUENA    MEDIA   GRANDE
1 1995   1 128.4699       0 10.18922 380.2330
2 1995   2 106.3283       0 16.21161 495.5282
3 1995   3 234.5488       0 13.69085 715.9591
4 1995   4 125.2196       0 16.44511 403.9919
5 1995   5 209.4168       0 20.88794 477.2529
6 1995   6 122.5179       0 23.86818 473.2194

Podemos então fazer a agregação usando a variável ANO como variável chave na função aggregate. Esta função exige (dentre outros argumentos opcionais) um objeto sobre os quais a função informada será aplicada, uma lista de elementos para definir o agrupamento e a função a ser aplicada. No exemplo, usaremos a função sum, que retorna a soma dos valores.

somatorio <-
  aggregate(subset(df_aprovacoes_porte, select = c(-ANO, -MES)),
            by = list(df_aprovacoes_porte$ANO),
            sum)

head(somatorio)
  Group.1    MICRO    PEQUENA     MEDIA   GRANDE
1    1995 1711.645   0.000000  216.8279  7048.91
2    1996 1431.916   0.000000  271.6768 11362.08
3    1997 2179.985   1.053206  137.0893 16672.74
4    1998 1375.066  34.909957 1454.6207 20161.79
5    1999 1394.739 426.779631 1083.7491 16634.18
6    2000 2366.893 864.823930 1534.4957 22858.39

Veja que a função subset foi usada pois as somas de ANO e MES não são de interesse aqui. Sem removê-las a função aggregate faria a soma de seus valores.

A mesma operação pode ser feita usando o pipe:

df_aprovacoes_porte |>
  subset(select = c(-ANO, -MES)) |> 
  aggregate(by = list(df_aprovacoes_porte$ANO),
            sum) |> 
  head()
  Group.1    MICRO    PEQUENA     MEDIA   GRANDE
1    1995 1711.645   0.000000  216.8279  7048.91
2    1996 1431.916   0.000000  271.6768 11362.08
3    1997 2179.985   1.053206  137.0893 16672.74
4    1998 1375.066  34.909957 1454.6207 20161.79
5    1999 1394.739 426.779631 1083.7491 16634.18
6    2000 2366.893 864.823930 1534.4957 22858.39

Uma forma equivalente e ainda mais sucinta é possível com a utilização do . (indicando todas as variáveis) e do ~ (indicando que as variáveis “dependem” ou são “explicadas” pela variável ANO). Como aqui a variável ANO será indicada como “explicativa” das demais ela não deve ser descartada no comando subset, como feito no exemplo anterior.

df_aprovacoes_porte |>
  subset(select = -MES) |> 
  aggregate(by = . ~ ANO, sum) |> 
  head()
   ANO    MICRO    PEQUENA     MEDIA   GRANDE
1 1995 1711.645   0.000000  216.8279  7048.91
2 1996 1431.916   0.000000  271.6768 11362.08
3 1997 2179.985   1.053206  137.0893 16672.74
4 1998 1375.066  34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39

14.3 Valores Faltantes - NA

A função aggregate possui como padrão o argumento na.action = na.omit, assim os valores NA são omitidos. Caso seja necessáiro considerar os valores faltantes deve ser informada uma função “alternativa”, que trata estes registros. No exemplo abaixo foi informado NULL, ou seja, “nenhuma” função a ser aplicada sobre os valores faltantes. Assim eles serão considerados no cálculo.

df_aprovacoes_porte_na <- df_aprovacoes_porte

df_aprovacoes_porte_na[1,]$MICRO <- NA

head(df_aprovacoes_porte_na)
   ANO MES    MICRO PEQUENA    MEDIA   GRANDE
1 1995   1       NA       0 10.18922 380.2330
2 1995   2 106.3283       0 16.21161 495.5282
3 1995   3 234.5488       0 13.69085 715.9591
4 1995   4 125.2196       0 16.44511 403.9919
5 1995   5 209.4168       0 20.88794 477.2529
6 1995   6 122.5179       0 23.86818 473.2194
df_aprovacoes_porte_na |>
  subset(select = -MES) |>
  aggregate(by = . ~ ANO, sum, 
            na.action = NULL) |>
  head()
   ANO    MICRO    PEQUENA     MEDIA   GRANDE
1 1995       NA   0.000000  216.8279  7048.91
2 1996 1431.916   0.000000  271.6768 11362.08
3 1997 2179.985   1.053206  137.0893 16672.74
4 1998 1375.066  34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39

Veja que agora a soma para o ano de 1995 para o porte MICRO é NA.

Caso seja inserido na.rm = T como argumento da função sum, os valores faltantes são desconsiderados novamente, mesmo na.action sendo nulo.

df_aprovacoes_porte_na |>
  subset(select = -MES) |>
  aggregate(by = . ~ ANO, sum, na.rm = T,
            na.action = NULL) |>
  head()
   ANO    MICRO    PEQUENA     MEDIA   GRANDE
1 1995 1583.175   0.000000  216.8279  7048.91
2 1996 1431.916   0.000000  271.6768 11362.08
3 1997 2179.985   1.053206  137.0893 16672.74
4 1998 1375.066  34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39

Última atualização: 11/10/2024 - 21:53:42