Rmd source

Wprowadzenie

Dokument w zamierzeniach ma spełniać dwa cele: analizuje spożycia mięsa na głowę na świecie ORAZ w trakcie tej analizy pokazuje jak wykorzystać do tego system/język R ze szczególnym uwzględnieniem pakietów ggplot2/dpyr/tidyr, które zaraz zostaną załadowane:

library(ggplot2)
library(dplyr)
library(tidyr)
options(dplyr.print_max = 1e9)
## różne globalne opcje i parametry
minpop <- 5000
cons.min <- 40.0

Dane

Dane pochodzą z bazy FAO, która jest cośkolwiek obszerna. Punktem startu jest http://www.fao.org/faostat/en/#data (Data/DOMAINS); w dziale Food Balance jest pozycja New Food Balances oraz Food Balances (old methodology and population) Dział New Food Balances (http://www.fao.org/faostat/en/#data/FBS/metadata) obejmuje lata 2018–2014; dział Food Balances (http://www.fao.org/faostat/en/#data/FBSH/metadata) zaś 2013–1961. Jak widać zmieniła się metoda ale trudno, na to nie poradzimy :-).

W oknie wyboru danych w panelu Countries/Regions wybieramy wszystkie kraje; w panelu Elements wybieramy Food supply quantity kg/capita/yr; w panelu Item/Item aggregated przełączamy się na zakładkę Item aggregated, w której wybieramy Meat Total oraz Meat List; W ostatniej zakładce wybieramy wszystkie dostępne lata (Select All). Pobieram dane (Download Data)

Powyższe wykonujemy dla New Food Balances oraz Food Balances (old methodology and population). Każdy plik ma 14 pól: Domain Code, Domain, Area Code, Area, Element Code, Element, Item Code, Item, Year Code, Year, Unit, Value, Flag, Flag Description. Większość z tego jest zbędna; istotne są pola 4,8,9 oraz 12. W systemie linux można to osiągnąć np za pomocą AWK:

awk -F ',' '{print $4 ";" $8 ";" $9 ";" $12}' Plik_O.csv Plik_N.csv > FAOStat_MeatCons.csv
wc -l FAOStat_MeatCons.csv
56668

W rezultacie plik FAOStat_MeatCons.csv ma 56668 wierszy (pobrany 2020-12-29 dla jasności), każdy wiersz 4 pola: kraj, zmienna rok oraz wartość (używamy angielskich nazw bo to mądrzej wygląda: country, item, year oraz value.)

fbs <- read.csv("FAOStat_MeatCons.csv", sep = ';',  header=T, na.string="NA");
str(fbs)
## 'data.frame':    56667 obs. of  4 variables:
##  $ country: Factor w/ 184 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ item   : Factor w/ 6 levels "Bovine Meat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year   : int  1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 ...
##  $ value  : num  14.4 14.5 14.9 15.1 15.4 ...
fbsx <- fbs %>% spread(item, value, drop=T)
str(fbsx)
## 'data.frame':    9492 obs. of  8 variables:
##  $ country           : Factor w/ 184 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ year              : int  1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 ...
##  $ Bovine Meat       : num  4.8 5.01 5.06 5.03 4.99 6.81 6.36 6.78 6.99 5.63 ...
##  $ Meat              : num  14.4 14.5 14.9 15.1 15.4 ...
##  $ Meat Other        : num  0.85 0.88 1.07 1.01 1.06 1.03 1.11 1.08 1.06 1.03 ...
##  $ Mutton & Goat Meat: num  8.18 7.92 8.09 8.35 8.64 ...
##  $ Pigmeat           : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Poultry Meat      : num  0.63 0.66 0.66 0.67 0.7 0.72 0.74 0.76 0.89 0.87 ...

Spożycie w ostatnim raportowanym roku

Rozpocznijmy analizę od zestawienia krajów ze względu na spożycie mięsa ogółem dla ostatniego raportowanego w FAO roku. Ponieważ plik CSV jest typu long do ramki fbs.lst wybieramy wiersze zawierające Meat jako wartość kolumny item oraz wartość 2016 i więcej w kolumnie year (pomijamy raportujących ostatni raz w 2015 i wcześniej). Wiersze są grupowane ze względu na country, usuwane są wartości brakujące, porządkowane są grupy względem roku. Kolejne polecenie filter wypisuje ostatni wiersz w każdej grupie:

fbs.last <- fbs %>% filter (year > 2015 & item == 'Meat' ) %>%
        group_by(country) %>%  drop_na(value) %>% arrange(year) %>%
        filter(row_number()==n()) %>%  as.data.frame
str(fbs.last)
## 'data.frame':    173 obs. of  4 variables:
##  $ country: Factor w/ 184 levels "Afghanistan",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ item   : Factor w/ 6 levels "Bovine Meat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year   : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
##  $ value  : num  9.7 39.1 19.8 23.7 73.8 ...
print(fbs.last)
##                                                  country item year  value
## 1                                            Afghanistan Meat 2018   9.70
## 2                                                Albania Meat 2018  39.12
## 3                                                Algeria Meat 2018  19.83
## 4                                                 Angola Meat 2018  23.69
## 5                                    Antigua and Barbuda Meat 2018  73.78
## 6                                              Argentina Meat 2018 116.52
## 7                                                Armenia Meat 2018  42.69
## 8                                              Australia Meat 2018 113.03
## 9                                                Austria Meat 2018  86.59
## 10                                            Azerbaijan Meat 2018  34.78
## 11                                               Bahamas Meat 2018  86.59
## 12                                            Bangladesh Meat 2018   4.29
## 13                                              Barbados Meat 2018  73.32
## 14                                               Belarus Meat 2018  84.00
## 15                                               Belgium Meat 2018  54.71
## 16                                                Belize Meat 2018  49.23
## 17                                                 Benin Meat 2018  15.67
## 18                      Bolivia (Plurinational State of) Meat 2018  80.24
## 19                                Bosnia and Herzegovina Meat 2018  42.87
## 20                                              Botswana Meat 2018  25.07
## 21                                                Brazil Meat 2018  99.31
## 22                                              Bulgaria Meat 2018  60.19
## 23                                          Burkina Faso Meat 2018  13.22
## 24                                            Cabo Verde Meat 2018  32.13
## 25                                              Cambodia Meat 2018  12.15
## 26                                              Cameroon Meat 2018  12.10
## 27                                                Canada Meat 2018  91.78
## 28                              Central African Republic Meat 2018  35.18
## 29                                                  Chad Meat 2018  11.33
## 30                                                 Chile Meat 2018  91.51
## 31                                                 China Meat 2018  62.43
## 32                                   China Hong Kong SAR Meat 2018 124.46
## 33                                       China Macao SAR Meat 2018 104.01
## 34                                        China mainland Meat 2018  61.78
## 35                              China Taiwan Province of Meat 2018  81.13
## 36                                              Colombia Meat 2018  61.39
## 37                                                 Congo Meat 2018  38.47
## 38                                            Costa Rica Meat 2018  52.17
## 39                                         Côte d'Ivoire Meat 2018  10.30
## 40                                               Croatia Meat 2018  79.80
## 41                                                  Cuba Meat 2018  60.64
## 42                                                Cyprus Meat 2018  76.75
## 43                                               Czechia Meat 2018  83.70
## 44                 Democratic People's Republic of Korea Meat 2018  13.42
## 45                                               Denmark Meat 2018  79.32
## 46                                              Djibouti Meat 2018  15.89
## 47                                              Dominica Meat 2018  61.64
## 48                                    Dominican Republic Meat 2018  55.46
## 49                                               Ecuador Meat 2018  48.02
## 50                                                 Egypt Meat 2018  30.75
## 51                                           El Salvador Meat 2018  35.05
## 52                                               Estonia Meat 2018  69.17
## 53                                              Eswatini Meat 2018  26.62
## 54                                              Ethiopia Meat 2018   7.06
## 55                                                  Fiji Meat 2018  39.43
## 56                                               Finland Meat 2018  78.12
## 57                                                France Meat 2018  79.00
## 58                                      French Polynesia Meat 2018  91.44
## 59                                                 Gabon Meat 2018  57.05
## 60                                                Gambia Meat 2018   8.48
## 61                                               Georgia Meat 2018  34.00
## 62                                               Germany Meat 2018  78.75
## 63                                                 Ghana Meat 2018  15.27
## 64                                                Greece Meat 2018  73.22
## 65                                               Grenada Meat 2018  56.43
## 66                                             Guatemala Meat 2018  34.88
## 67                                                Guinea Meat 2018  12.59
## 68                                         Guinea-Bissau Meat 2018  16.04
## 69                                                Guyana Meat 2018  45.58
## 70                                                 Haiti Meat 2018  17.74
## 71                                              Honduras Meat 2018  34.77
## 72                                               Hungary Meat 2018  83.93
## 73                                               Iceland Meat 2018  91.40
## 74                                                 India Meat 2018   4.11
## 75                                             Indonesia Meat 2018  12.43
## 76                            Iran (Islamic Republic of) Meat 2018  37.15
## 77                                                  Iraq Meat 2018  14.17
## 78                                               Ireland Meat 2018  77.96
## 79                                                Israel Meat 2018  98.09
## 80                                                 Italy Meat 2018  81.69
## 81                                               Jamaica Meat 2018  60.02
## 82                                                 Japan Meat 2018  50.07
## 83                                                Jordan Meat 2018  34.32
## 84                                            Kazakhstan Meat 2018  65.21
## 85                                                 Kenya Meat 2018  15.56
## 86                                              Kiribati Meat 2018  29.46
## 87                                                Kuwait Meat 2018  70.07
## 88                                            Kyrgyzstan Meat 2018  30.32
## 89                      Lao People's Democratic Republic Meat 2018  24.11
## 90                                                Latvia Meat 2018  71.25
## 91                                               Lebanon Meat 2018  30.01
## 92                                               Lesotho Meat 2018  28.61
## 93                                               Liberia Meat 2018  22.04
## 94                                             Lithuania Meat 2018  83.71
## 95                                            Luxembourg Meat 2018  81.67
## 96                                            Madagascar Meat 2018  13.30
## 97                                                Malawi Meat 2018  12.69
## 98                                              Malaysia Meat 2018  53.79
## 99                                              Maldives Meat 2018  21.57
## 100                                                 Mali Meat 2018  20.81
## 101                                                Malta Meat 2018  77.88
## 102                                           Mauritania Meat 2018  31.07
## 103                                            Mauritius Meat 2018  52.77
## 104                                               Mexico Meat 2018  69.25
## 105                                             Mongolia Meat 2018  84.99
## 106                                           Montenegro Meat 2018  78.08
## 107                                              Morocco Meat 2018  34.19
## 108                                           Mozambique Meat 2018   9.64
## 109                                              Myanmar Meat 2018  47.98
## 110                                              Namibia Meat 2018  31.11
## 111                                                Nepal Meat 2018  13.98
## 112                                          Netherlands Meat 2018  69.18
## 113                                        New Caledonia Meat 2018  71.37
## 114                                          New Zealand Meat 2018  89.78
## 115                                            Nicaragua Meat 2018  27.71
## 116                                                Niger Meat 2018   8.66
## 117                                              Nigeria Meat 2018   7.52
## 118                                      North Macedonia Meat 2018  38.62
## 119                                               Norway Meat 2018  67.67
## 120                                                 Oman Meat 2018  42.17
## 121                                             Pakistan Meat 2018  16.20
## 122                                               Panama Meat 2018  65.11
## 123                                             Paraguay Meat 2018  40.88
## 124                                                 Peru Meat 2018  24.59
## 125                                          Philippines Meat 2018  37.04
## 126                                               Poland Meat 2018  88.48
## 127                                             Portugal Meat 2018  94.68
## 128                                    Republic of Korea Meat 2018  71.08
## 129                                  Republic of Moldova Meat 2018  39.39
## 130                                              Romania Meat 2018  64.83
## 131                                   Russian Federation Meat 2018  75.68
## 132                                               Rwanda Meat 2018   7.75
## 133                                Saint Kitts and Nevis Meat 2018  76.21
## 134                                          Saint Lucia Meat 2018  92.81
## 135                     Saint Vincent and the Grenadines Meat 2018  95.85
## 136                                                Samoa Meat 2018  94.95
## 137                                Sao Tome and Principe Meat 2018  15.33
## 138                                         Saudi Arabia Meat 2018  45.45
## 139                                              Senegal Meat 2018  15.00
## 140                                               Serbia Meat 2018  56.18
## 141                                         Sierra Leone Meat 2018   8.73
## 142                                             Slovakia Meat 2018  57.36
## 143                                             Slovenia Meat 2018  69.57
## 144                                      Solomon Islands Meat 2018  11.79
## 145                                         South Africa Meat 2018  64.09
## 146                                                Spain Meat 2018  98.79
## 147                                            Sri Lanka Meat 2018   6.60
## 148                                                Sudan Meat 2018  21.15
## 149                                             Suriname Meat 2018  44.17
## 150                                               Sweden Meat 2018  73.16
## 151                                          Switzerland Meat 2018  65.04
## 152                                           Tajikistan Meat 2018  13.84
## 153                                             Thailand Meat 2018  28.88
## 154                                          Timor-Leste Meat 2018  32.74
## 155                                                 Togo Meat 2018  12.12
## 156                                  Trinidad and Tobago Meat 2018  77.10
## 157                                              Tunisia Meat 2018  28.39
## 158                                               Turkey Meat 2018  39.47
## 159                                         Turkmenistan Meat 2018  54.17
## 160                                               Uganda Meat 2018  11.92
## 161                                              Ukraine Meat 2018  49.32
## 162                                 United Arab Emirates Meat 2018  68.15
## 163 United Kingdom of Great Britain and Northern Ireland Meat 2018  77.25
## 164                          United Republic of Tanzania Meat 2018  10.72
## 165                             United States of America Meat 2018 123.15
## 166                                              Uruguay Meat 2018  53.31
## 167                                           Uzbekistan Meat 2018  36.16
## 168                                              Vanuatu Meat 2018  39.32
## 169                   Venezuela (Bolivarian Republic of) Meat 2018  36.22
## 170                                             Viet Nam Meat 2018  65.16
## 171                                                Yemen Meat 2018  15.09
## 172                                               Zambia Meat 2018  18.84
## 173                                             Zimbabwe Meat 2018  18.42

się okazuje, że w bazie jest 173 krajów; wszystkie zresztą raportowały w roku 2018. Policzmy miary

meat.mean <- mean(fbs.last$value)
meat.median <- median(fbs.last$value)
meat.sum <- summary(fbs.last$value)
str(meat.sum)
##  'summaryDefault' Named num [1:6] 4.11 21.57 45.45 48.95 73.32 ...
##  - attr(*, "names")= chr [1:6] "Min." "1st Qu." "Median" "Mean" ...
##
meat.sum["Median"]
## Median 
##  45.45
meat.q1 <- meat.sum["1st Qu."]
meat.q3 <- meat.sum["3rd Qu."]
meat.max <- meat.sum["Max."]
meat.min <- meat.sum["Min."]

Średnia wielkość wskaźnika wyniosła 48.9460116 a mediana 45.45. Pierwszy/trzeci kwartyl to odpowiednio: 21.57 oraz 73.32. Co by oznaczało, między innymi, że mamy do czynienia ze skośnością prawostronną. Rozkład można przedstawić na histogramie:

bwd <- 10
p1 <- fbs.last %>%
  ggplot(aes(x =  value)) +
  geom_histogram(binwidth = bwd, color = "white", fill = "#9FE367") +
  scale_y_continuous(name = "Frequency") +
  scale_x_continuous(breaks=seq(0,max(meat.max, na.rm=T), by=bwd))
p1

Się okazuje, że rozkład wskaźnika jest bardziej dwumodalny niż prawostronny. Jest grupa krajów ze spożyciem 10–30–40 kg/pc oraz druga ze spożyciem 70–80 kg/pc.

Porównanie spożycia z 2018 ze spożyciem w roku 2000

A jak kształtowało się spożycie mięsa w 2000 roku (czyli około 20 lat temu):

fbs.prev <- fbs %>% filter (year == 2000 & item == 'Meat' ) %>%
  group_by(country) %>%  drop_na(value) %>% arrange(year) %>%
  filter(row_number()==n()) %>%  as.data.frame
str(fbs.prev)
## 'data.frame':    175 obs. of  4 variables:
##  $ country: Factor w/ 184 levels "Afghanistan",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ item   : Factor w/ 6 levels "Bovine Meat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year   : int  2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
##  $ value  : num  15.5 26.9 18.4 16.8 69 ...
print(fbs.prev)
##                                                  country item year  value
## 1                                            Afghanistan Meat 2000  15.51
## 2                                                Albania Meat 2000  26.91
## 3                                                Algeria Meat 2000  18.37
## 4                                                 Angola Meat 2000  16.82
## 5                                    Antigua and Barbuda Meat 2000  68.97
## 6                                              Argentina Meat 2000  98.75
## 7                                                Armenia Meat 2000  21.20
## 8                                              Australia Meat 2000 111.07
## 9                                                Austria Meat 2000  99.23
## 10                                            Azerbaijan Meat 2000  16.36
## 11                                               Bahamas Meat 2000 107.18
## 12                                            Bangladesh Meat 2000   3.40
## 13                                              Barbados Meat 2000  69.65
## 14                                               Belarus Meat 2000  59.35
## 15                                               Belgium Meat 2000  81.41
## 16                                                Belize Meat 2000  42.90
## 17                                                 Benin Meat 2000  15.10
## 18                                               Bermuda Meat 2000  99.85
## 19                      Bolivia (Plurinational State of) Meat 2000  47.53
## 20                                Bosnia and Herzegovina Meat 2000  17.17
## 21                                              Botswana Meat 2000  23.21
## 22                                                Brazil Meat 2000  78.98
## 23                                     Brunei Darussalam Meat 2000  59.62
## 24                                              Bulgaria Meat 2000  57.09
## 25                                          Burkina Faso Meat 2000  14.10
## 26                                            Cabo Verde Meat 2000  25.17
## 27                                              Cambodia Meat 2000  16.37
## 28                                              Cameroon Meat 2000  14.48
## 29                                                Canada Meat 2000 101.27
## 30                              Central African Republic Meat 2000  32.02
## 31                                                  Chad Meat 2000  13.76
## 32                                                 Chile Meat 2000  64.98
## 33                                                 China Meat 2000  45.06
## 34                                   China Hong Kong SAR Meat 2000 121.96
## 35                                       China Macao SAR Meat 2000  78.03
## 36                                        China mainland Meat 2000  44.00
## 37                              China Taiwan Province of Meat 2000  82.59
## 38                                              Colombia Meat 2000  35.11
## 39                                                 Congo Meat 2000  14.60
## 40                                            Costa Rica Meat 2000  42.39
## 41                                         Côte d'Ivoire Meat 2000  13.14
## 42                                               Croatia Meat 2000  35.66
## 43                                                  Cuba Meat 2000  29.50
## 44                                                Cyprus Meat 2000  87.94
## 45                                               Czechia Meat 2000  77.33
## 46                 Democratic People's Republic of Korea Meat 2000  11.27
## 47                                               Denmark Meat 2000  69.83
## 48                                              Djibouti Meat 2000  16.58
## 49                                              Dominica Meat 2000  67.56
## 50                                    Dominican Republic Meat 2000  40.00
## 51                                               Ecuador Meat 2000  39.42
## 52                                                 Egypt Meat 2000  22.88
## 53                                           El Salvador Meat 2000  21.04
## 54                                               Estonia Meat 2000  59.31
## 55                                              Eswatini Meat 2000  24.81
## 56                                              Ethiopia Meat 2000   6.97
## 57                                                  Fiji Meat 2000  44.86
## 58                                               Finland Meat 2000  65.49
## 59                                                France Meat 2000 100.10
## 60                                      French Polynesia Meat 2000  97.07
## 61                                                 Gabon Meat 2000  50.59
## 62                                                Gambia Meat 2000   8.74
## 63                                               Georgia Meat 2000  26.81
## 64                                               Germany Meat 2000  82.74
## 65                                                 Ghana Meat 2000  10.58
## 66                                                Greece Meat 2000  97.59
## 67                                               Grenada Meat 2000  51.30
## 68                                             Guatemala Meat 2000  22.45
## 69                                                Guinea Meat 2000   6.06
## 70                                         Guinea-Bissau Meat 2000  14.93
## 71                                                Guyana Meat 2000  37.13
## 72                                                 Haiti Meat 2000  13.01
## 73                                              Honduras Meat 2000  25.18
## 74                                               Hungary Meat 2000  94.30
## 75                                               Iceland Meat 2000  81.66
## 76                                                 India Meat 2000   3.97
## 77                                             Indonesia Meat 2000   8.36
## 78                            Iran (Islamic Republic of) Meat 2000  23.88
## 79                                                  Iraq Meat 2000   6.44
## 80                                               Ireland Meat 2000  95.12
## 81                                                Israel Meat 2000  85.31
## 82                                                 Italy Meat 2000  88.66
## 83                                               Jamaica Meat 2000  54.31
## 84                                                 Japan Meat 2000  45.27
## 85                                                Jordan Meat 2000  36.51
## 86                                            Kazakhstan Meat 2000  40.95
## 87                                                 Kenya Meat 2000  12.22
## 88                                              Kiribati Meat 2000  28.59
## 89                                                Kuwait Meat 2000  78.93
## 90                                            Kyrgyzstan Meat 2000  38.64
## 91                      Lao People's Democratic Republic Meat 2000  13.74
## 92                                                Latvia Meat 2000  37.00
## 93                                               Lebanon Meat 2000  51.73
## 94                                               Lesotho Meat 2000  17.15
## 95                                               Liberia Meat 2000   9.71
## 96                                             Lithuania Meat 2000  49.13
## 97                                            Luxembourg Meat 2000  98.16
## 98                                            Madagascar Meat 2000  15.60
## 99                                                Malawi Meat 2000   5.55
## 100                                             Malaysia Meat 2000  44.73
## 101                                             Maldives Meat 2000  14.08
## 102                                                 Mali Meat 2000  18.25
## 103                                                Malta Meat 2000  74.92
## 104                                           Mauritania Meat 2000  30.82
## 105                                            Mauritius Meat 2000  34.99
## 106                                               Mexico Meat 2000  53.05
## 107                                             Mongolia Meat 2000 100.68
## 108                                              Morocco Meat 2000  20.95
## 109                                           Mozambique Meat 2000  10.93
## 110                                              Myanmar Meat 2000   9.60
## 111                                              Namibia Meat 2000  42.79
## 112                                                Nepal Meat 2000  10.24
## 113                                          Netherlands Meat 2000  90.10
## 114                        Netherlands Antilles (former) Meat 2000  94.89
## 115                                        New Caledonia Meat 2000  61.36
## 116                                          New Zealand Meat 2000  92.48
## 117                                            Nicaragua Meat 2000  16.10
## 118                                                Niger Meat 2000  20.52
## 119                                              Nigeria Meat 2000   8.57
## 120                                      North Macedonia Meat 2000  30.93
## 121                                               Norway Meat 2000  60.82
## 122                                                 Oman Meat 2000  34.07
## 123                                             Pakistan Meat 2000  11.80
## 124                                               Panama Meat 2000  58.60
## 125                                             Paraguay Meat 2000  70.39
## 126                                                 Peru Meat 2000  16.47
## 127                                          Philippines Meat 2000  28.77
## 128                                               Poland Meat 2000  70.71
## 129                                             Portugal Meat 2000  87.37
## 130                                    Republic of Korea Meat 2000  47.58
## 131                                  Republic of Moldova Meat 2000  19.52
## 132                                              Romania Meat 2000  47.42
## 133                                   Russian Federation Meat 2000  39.86
## 134                                               Rwanda Meat 2000   4.43
## 135                                Saint Kitts and Nevis Meat 2000  76.91
## 136                                          Saint Lucia Meat 2000  99.06
## 137                     Saint Vincent and the Grenadines Meat 2000  66.05
## 138                                                Samoa Meat 2000  73.91
## 139                                Sao Tome and Principe Meat 2000   8.00
## 140                                         Saudi Arabia Meat 2000  53.11
## 141                                              Senegal Meat 2000  11.99
## 142                                Serbia and Montenegro Meat 2000  87.86
## 143                                         Sierra Leone Meat 2000   4.88
## 144                                             Slovakia Meat 2000  57.89
## 145                                             Slovenia Meat 2000  92.60
## 146                                      Solomon Islands Meat 2000   7.57
## 147                                         South Africa Meat 2000  41.60
## 148                                                Spain Meat 2000 113.25
## 149                                            Sri Lanka Meat 2000   5.38
## 150                                       Sudan (former) Meat 2000  24.19
## 151                                             Suriname Meat 2000  40.12
## 152                                               Sweden Meat 2000  69.04
## 153                                          Switzerland Meat 2000  71.55
## 154                                           Tajikistan Meat 2000   8.93
## 155                                             Thailand Meat 2000  26.65
## 156                                          Timor-Leste Meat 2000  37.41
## 157                                                 Togo Meat 2000   9.29
## 158                                  Trinidad and Tobago Meat 2000  39.69
## 159                                              Tunisia Meat 2000  26.69
## 160                                               Turkey Meat 2000  22.05
## 161                                         Turkmenistan Meat 2000  33.87
## 162                                               Uganda Meat 2000  10.97
## 163                                              Ukraine Meat 2000  31.18
## 164                                 United Arab Emirates Meat 2000  72.98
## 165 United Kingdom of Great Britain and Northern Ireland Meat 2000  77.06
## 166                          United Republic of Tanzania Meat 2000   9.97
## 167                             United States of America Meat 2000 121.68
## 168                                              Uruguay Meat 2000  78.76
## 169                                           Uzbekistan Meat 2000  21.01
## 170                                              Vanuatu Meat 2000  36.11
## 171                   Venezuela (Bolivarian Republic of) Meat 2000  50.85
## 172                                             Viet Nam Meat 2000  23.60
## 173                                                Yemen Meat 2000  13.29
## 174                                               Zambia Meat 2000  13.58
## 175                                             Zimbabwe Meat 2000  13.36
meat.prev.mean <- mean(fbs.prev$value)
meat.prev.median <- median(fbs.prev$value)
meat.prev.sum <- summary(fbs.prev$value)
str(meat.prev.sum)
##  'summaryDefault' Named num [1:6] 3.4 16.4 37.1 44.4 69.7 ...
##  - attr(*, "names")= chr [1:6] "Min." "1st Qu." "Median" "Mean" ...
meat.prev.q1 <- meat.prev.sum["1st Qu."]
meat.prev.q3 <- meat.prev.sum["3rd Qu."]
meat.prev.max <- meat.sum["Max."]
meat.prev.min <- meat.prev.sum["Min."]

Średnia wielkość wskaźnika wyniosła 44.3600571 a mediana 37.13. Pierwszy/trzeci kwartyl to odpowiednio: 16.365 oraz 69.74. Wartości wszystkich miar wzrosły zatem. Przykładowo średnia wzrosła o 4.5859544 kilograma/pc. Oznacza to wzrost o 10.3% w porównaniu do roku 2000.

Rozkład wskaźnika spożycia mięsa w roku 2000 można przedstawić na histogramie:

p2 <- fbs.prev %>%
  ggplot(aes(x =  value)) +
  geom_histogram(binwidth = bwd, color = "white", fill = "#9FE367") +
  scale_y_continuous(name = "Frequency") +
  scale_x_continuous(breaks=seq(0,max(meat.max, na.rm=T), by=bwd))
p2

Teraz gdybyśmy chcieli porównać dynamikę spożycia dla poszczególnych krajów to jest pewien problem, mianowicie ramka fbs.last miała 173 wierszy podczas gdy ramka fbs.prev miała 175 wierszy. Ramki różnią się wielkością.

## należy użyć factor nie levels
## bo levels poda także nieużywane wartości czynnika
countries.last <- factor(fbs.last$country)
countries.prev <- factor(fbs.prev$country)

bad.countries <- setdiff(countries.last, countries.prev)
bad.countries
## [1] "Montenegro" "Serbia"     "Sudan"

Śmiało możemy pominąć Montenegro, Serbia, Sudan (Sudańczycy i Serbowie by się nie zgodzili) Jednym ze sposobów połączenia jest wykorzystanie left_join z pakietu dpyr. Ramki zostaną połączone, że tak powiem w poziomie w oparciu o wspólną wartość kolumny country (w obu ramkach jest ta kolumna a wartości w niej są identyfikatorami wierszy). Jak coś nie ma do pary to zostanie pominięte (Sorry Serbio…)

Następnie liczymy różnice pomiędzy wartościami z lat 2018 oraz 2000. Uwaga: value.x to nazwa kolumny value z pierwszej łączonej ramki (czyli z roku 2018; value.y to oczywiście value z drugiej ramki). Dplyr musiał dopisać x/y, bo kolumny value też mają identyczne nazwy w obu ramkach.

fbs.2018 <- fbs.last ## kopia na później
fbs.last <- left_join(fbs.last, fbs.prev, by='country')

fbs.last$diff <- fbs.last$value.x - fbs.last$value.y
#fbs.last 
meat.lower <- nrow(fbs.last %>% filter(diff <0))
meat.hgh <- nrow(fbs.last %>% filter(diff >= 0))

W 48 krajach spożycie spadło a w 122 krajach wzrosło. Można to bardziej precyzyjnie określić, przykładowow w ilu i jakich krajach spadło o więcej niz 25% a w ilu wzrosło o 25%:

fbs.good.countries <- fbs.last %>% filter(  diff / value.y * 100 < -25)

fbs.last$diffp <- fbs.last$diff / fbs.last$value.y *100
fbs.bad.countries <- fbs.last %>% filter(  diffp > 25)

#fbs.bad.countries
#fbs.good.countries

Dokładnie w 9 spadło o więcej niż 25%, zaś wzrosło o więcej niż 25% w dużo większej liczbie krajów bo w 71. W jakich można wypisać usuwając znak # sprzed nazw ramek i rekompilując ten dokument–jak ktoś jest ciekaw to niestety musi się zdobyć na ten wysiłek.

Dla tych co są ciekawi, ale im się nie chce rekompilować wydrukujemy pięć krajów z największym spadkiem spożycia oraz 15 z największym wzrostem (bo tych jest stosowanie więcej):

fbs.good.countries <- fbs.last %>% filter( diffp < -25)

head(fbs.good.countries[order(fbs.good.countries$diffp),c(1,4,7,8,9)], n=5)
##       country value.x value.y   diff     diffp
## 6       Niger    8.66   20.52 -11.86 -57.79727
## 4     Lebanon   30.01   51.73 -21.72 -41.98724
## 7    Paraguay   40.88   70.39 -29.51 -41.92357
## 1 Afghanistan    9.70   15.51  -5.81 -37.45970
## 2     Belgium   54.71   81.41 -26.70 -32.79695
head(fbs.bad.countries[order(fbs.bad.countries$diffp, decreasing = T),c(1,4,7,8,9)], n=15)
##                   country value.x value.y  diff     diffp
## 43                Myanmar   47.98    9.60 38.38 399.79167
## 69               Viet Nam   65.16   23.60 41.56 176.10169
## 16                  Congo   38.47   14.60 23.87 163.49315
## 8  Bosnia and Herzegovina   42.87   17.17 25.70 149.67967
## 38                 Malawi   12.69    5.55  7.14 128.64865
## 36                Liberia   22.04    9.71 12.33 126.98249
## 17                Croatia   79.80   35.66 44.14 123.78015
## 30                   Iraq   14.17    6.44  7.73 120.03106
## 4              Azerbaijan   34.78   16.36 18.42 112.59169
## 25                 Guinea   12.59    6.06  6.53 107.75578
## 18                   Cuba   60.64   29.50 31.14 105.55932
## 51    Republic of Moldova   39.39   19.52 19.87 101.79303
## 3                 Armenia   42.69   21.20 21.49 101.36792
## 64    Trinidad and Tobago   77.10   39.69 37.41  94.25548
## 34                 Latvia   71.25   37.00 34.25  92.56757
## albo (ale to nie do końca to samo):
tail(fbs.bad.countries[order(fbs.bad.countries$diffp, decreasing = F),c(1,4,7,8,9)], n=15)
##                   country value.x value.y  diff     diffp
## 34                 Latvia   71.25   37.00 34.25  92.56757
## 64    Trinidad and Tobago   77.10   39.69 37.41  94.25548
## 3                 Armenia   42.69   21.20 21.49 101.36792
## 51    Republic of Moldova   39.39   19.52 19.87 101.79303
## 18                   Cuba   60.64   29.50 31.14 105.55932
## 25                 Guinea   12.59    6.06  6.53 107.75578
## 4              Azerbaijan   34.78   16.36 18.42 112.59169
## 30                   Iraq   14.17    6.44  7.73 120.03106
## 17                Croatia   79.80   35.66 44.14 123.78015
## 36                Liberia   22.04    9.71 12.33 126.98249
## 38                 Malawi   12.69    5.55  7.14 128.64865
## 8  Bosnia and Herzegovina   42.87   17.17 25.70 149.67967
## 16                  Congo   38.47   14.60 23.87 163.49315
## 69               Viet Nam   65.16   23.60 41.56 176.10169
## 43                Myanmar   47.98    9.60 38.38 399.79167

Zapis c(1,4,7,8,9) określa które kolumny ramki mają być wybrane. Niekoniecznie przy tym chodzi o wydruk, równie dobrze może chodzić o przypisanie do innej ramki (na przykład):

top5 <- head(fbs.good.countries[order(fbs.good.countries$diffp),c(1,4,7,8,9)], n=5)
str(top5)
## 'data.frame':    5 obs. of  5 variables:
##  $ country: Factor w/ 184 levels "Afghanistan",..: 122 96 130 1 15
##  $ value.x: num  8.66 30.01 40.88 9.7 54.71
##  $ value.y: num  20.5 51.7 70.4 15.5 81.4
##  $ diff   : num  -11.86 -21.72 -29.51 -5.81 -26.7
##  $ diffp  : num  -57.8 -42 -41.9 -37.5 -32.8

Na koniec pokażmy spożycie w latach 2000 oraz 2018 jednocześnie. Można to zrobić na wykresie słupkowym, tyle że słupków by musiało być po dwa na kategorię (czyli na kraj). Coś takiego określa się jako skumulowany wykres słupkowy jak słupek jest jeden podzielony na podsłupki nazwijmy to, albo grupowany jak dla każdej kategorii jest kilka słupków (tutaj byłby dwa)

Osobiście nie znoszę skumulowanego (zresztą on tutaj nie za bardzo się nadaje); nie lubię i polecam także grupowanego, zwłaszcza jak kategorii jest więcej niż kilkanaście (a grup więcej niż dwie). Zwykły wykres punktowy moim zdaniem jest najlepszy. Jest tylko jeden problem z punktu widzenia że tak powiem technicznego: szeroki format danych jest mniej wygodny (value.x/value.y) lepszy byłby format długi. Żeby to osiągnąć można użyć dplyr::bind_rows:

fbs.all <- bind_rows(fbs.2018, fbs.prev)

Teraz każdy kraj to dwa wiersze a krajów jest 170. Żeby wykres był czytelny ograniczę go do 80 krajów o największym spożyciu. W tym celu najpierw wyciągam wiersze z roku 2018 (filter), potem je sortuję według wartości (arrange); wreszcie slice odcina 80 pierwszych wierszy:

fbs.top.80 <- fbs.all %>% filter(year=='2018') %>% arrange(value) %>% 
  slice_head(n=80)

Teraz wektor top.names.80 zawiera nazwy krajów z tej czołowej 80-tki:

top.names.80 <- as.vector(fbs.top.80$country)

Kolejny filtr korzysta z operatora %in%, wartością wyrażenia kolumna %in% wektor jest prawda jeżeli wartość kolumny jest równa jednemu z elementów wektora:

fbs.all <- fbs.all %>% filter (country %in% top.names.80 ) %>% as.data.frame()

Teraz ramka zawiera tylko wartości dla 80 krajów o największym spożyciu (dla dwóch lat). Można przedstawić ją na wykresie:

## tylko 80 pierwszych
p3 <- fbs.all %>%
  ggplot(aes(x = country )) +
  geom_point(aes(y = value, colour = as.factor(year) ), size=1) +
  xlab(label="cc") + ylab(label="n ") + 
  ggtitle("Spożycie mięsa na głowę w kg 2000/20018", 
            subtitle="80 krajów o największym spożyciu w roku 2018") +
  theme(axis.text = element_text(size = 6)) +
  ##coord_cartesian(ylim = c(0, 8)) +
  coord_flip()
p3

Wykres pudełkowy

p4 <- ggplot(fbs.all, aes(x=as.factor(year), y=value, fill=as.factor(year))) +
 geom_boxplot() +
 ylab("spożycie/pc") +
 xlab("rok") +
 ggtitle("Spożycie mięsa na głowę w kg 2000/2018",
         subtitle="80 krajów o największym spożyciu w roku 2018"
          ) +
 theme(legend.position="none")
p4

Analiza dynamiki

Ponieważ krajów jest aż tak dużo to warto się zastanowić czy wszystkie są różnie interesujące. Można dajmy na to pominąć kraje małe, na przykład takie których liczba ludności jest mniejsza niż powiedzmy 5000 (tysięcy). Tak się dobrze składa że FAO liczy także liczbę ludności na świecie, a stosowna baza jest w dziale Population.

Jak się ściągnie tą bazę to na przykład można odsiać wszystkie lilipucie kraje.

No więc po ściągnięciu bazy usunąłem z niej wszystkie zbędne i redundatne pola zostawiając: country, pop, year, value (gdzie pop to zmienna określająca zmienną: ogółem, kobiety, mężczyźni, wieś i miasto):

pop <- read.csv("FAOPop.csv", sep = ';',  header=T, na.string="NA");
str(pop)
## 'data.frame':    70585 obs. of  4 variables:
##  $ country: Factor w/ 245 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ pop    : Factor w/ 5 levels "females","males",..: 4 2 1 3 5 4 2 1 3 5 ...
##  $ year   : int  1950 1950 1950 1950 1950 1951 1951 1951 1951 1951 ...
##  $ value  : num  7752 4099 3653 7287 465 ...
levels(pop$pop)
## [1] "females" "males"   "rural"   "total"   "urban"

Interesuje nas tylko najbardziej aktualna informacja o liczbie ludności zatem:

pop <- pop %>% filter (year > 2015 & pop == 'total' ) %>%
  group_by(country) %>%  drop_na(value) %>% arrange(year) %>%
  filter(row_number()==n()) %>%  as.data.frame
str(pop)
## 'data.frame':    237 obs. of  4 variables:
##  $ country: Factor w/ 245 levels "Afghanistan",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ pop    : Factor w/ 5 levels "females","males",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ year   : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
##  $ value  : num  37171.9 2882.7 42228.4 55.5 77 ...
total.countries <- nrow(pop)
##print(pop)

BWT łączna liczba ludzi na świecie wg FAO to 9.0907461^{6} (za 2018). Jakby więcej niż możnaby oczekiwać wartoby spojrzeć czy w danych nie ma błędu (np. oprócz krajów jakieś agregaty typu stowarzyszenia krajów…)

Teraz można połączyć dane o spożyciu i liczbie ludności (wspólna kolumna country)

## Tylko mięso ogółem
fbs <- fbs %>% filter (item=='Meat') %>% as.data.frame()

fbs <- left_join (fbs, pop, by='country')
str(fbs)
## 'data.frame':    9487 obs. of  7 variables:
##  $ country: Factor w/ 245 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ item   : Factor w/ 6 levels "Bovine Meat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year.x : int  1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 ...
##  $ value.x: num  14.4 14.5 14.9 15.1 15.4 ...
##  $ pop    : Factor w/ 5 levels "females","males",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ year.y : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
##  $ value.y: num  37172 37172 37172 37172 37172 ...

Ile jest krajów o liczbie ludności większej od 5 mln?

fbs500 <- fbs %>% filter (value.y > 5000 ) %>% as.data.frame()
## ile krajów zostało?
length(unique(fbs500$country))
## [1] 112

Ponieważ fbs500$country nie jest ramką nie używamy nrow ale length (to taka uwaga na boku.) Anyway 112 to trochę za dużo, dlatego dodajemy drugi warunek: spożycie nie mniejsze niż 40 kg/pc:

fbs500 <- fbs %>% filter (value.y > 5000 & value.x > cons.min ) %>% as.data.frame()

str(fbs500)
## 'data.frame':    2111 obs. of  7 variables:
##  $ country: Factor w/ 245 levels "Afghanistan",..: 6 6 6 6 6 6 6 6 6 6 ...
##  $ item   : Factor w/ 6 levels "Bovine Meat",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year.x : int  1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 ...
##  $ value.x: num  102 103 102.8 83.1 89.7 ...
##  $ pop    : Factor w/ 5 levels "females","males",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ year.y : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
##  $ value.y: num  44361 44361 44361 44361 44361 ...
cc500 <- length(unique(fbs500$country))

Wynikowa ramka ma 57 krajów. Dużo ale mniej niż było (a było 237.)

Wykreślmy spożycie mięsa ogółem dla wybranych krajów: Poland, Germany, Denmark, United States of America, Australia, New Zealand oraz Japan.

countries <- c("Poland", "Germany", "Denmark", "United States of America",
               "Australia", "New Zealand", "Japan", "India", "China Hong Kong SAR")
fbsy <- fbsx %>% filter(country %in% countries) %>% as.data.frame()

ggplot(fbsy, aes(x=as.Date(as.factor(year), format="%Y"), color=country, y = Meat),  ) +
    ggtitle("Spożycie mięsa (per capita/rok)") +
    ##
    geom_point(alpha=.3, size=1.2) +
    geom_line(size=.4) 

inne zestawienie:

countries <- c("Argentina", "Italy", "China",
               "Switzerland", "Netherlands", "Viet Nam", "Czechia", "Brazil")
fbsy <- fbsx %>% filter(country %in% countries) %>% as.data.frame()

ggplot(fbsy, aes(x=as.Date(as.factor(year), format="%Y"), color=country, y = Meat),  ) +
    ggtitle("Spożycie mięsa (per capita/rok)") +
    ##
    geom_point(alpha=.3, size=1.2) +
    geom_line(size=.4) 

Ładne wykresy, ale zostało 41 krajów do zwizualizowania. W tym stylu dużo roboty. Można użyć czegoś co się nazywa facets, a implementuje się bajecznie prosto za pomocą ggplot.

spanV <- 0.5
loessColor <- "steelblue"
mainColor <- "deeppink"

p6 <- ggplot(fbs500, aes(x=as.Date(as.factor(year.x), format="%Y"), y=value.x)) + 
 geom_smooth(method="loess", se=F, span=spanV, colour = loessColor) +
 geom_point(size=.4, color=mainColor, alpha=.5) +
 facet_wrap( ~ country, scales = "fixed") +
 xlab(label="") +
 #scale_x_date( labels = date_format("%m/%d"), breaks = mainBreaks) +
 ggtitle("Spożycie mięsa", subtitle = sprintf("Źródło: %s",  "FAO"))
p6

Ciut nieczytelne. Można podzielić panel wykresów na kawałki wykorzystując bibliotekę ggforce::facet_wrap_paginate. Tutaj dzielimy na 5 kawałki po 12 wykresów (bo wiemy że krajów jest 58) ułożonych w prostokąt 3x4 (każdy):

library("ggforce")

for(i in 1:5){
 p0 <- ggplot(fbs500, aes(x=as.Date(as.factor(year.x), format="%Y"), y=value.x)) + 
   geom_smooth(method="loess", se=F, span=spanV, colour = loessColor) +
   geom_point(size=.4, color=mainColor, alpha=.5) +
   facet_wrap_paginate( ~ country, ncol=4, nrow=3, page=i, scales = "fixed") +
   xlab(label="") +
   #scale_x_date( labels = date_format("%m/%d"), breaks = mainBreaks) +
   ggtitle("Spożycie mięsa", subtitle = sprintf("Źródło: %s",  "FAO"))
 print(p0)
}

Zwróćmy uwagę, że każdy wykres ma identyczną skalę co oczywiście ułatwia porównania. Nie zawsze to się da zrobić ale w tym przypadku się dało.

Koniec, wreszcie…