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 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 ...
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.
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
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…