Spotreba cukru vo svete

Práca s údajmi, čistenie údajov, tabuľky a grafy

Autor

Ema Šimkovicová

Publikované

22. októbra 2026

1 Popis údajov

1.1 Odkiaľ údaje pochádzajú

Pracujem so súborom sugar_consumption_dataset.csv, ktorý som si stiahla z otvorenej databázy Kaggle. Súbor je vo formáte CSV – položky sú oddelené čiarkou, desatinné čísla používajú desatinnú bodku a v prvom riadku sú názvy premenných.

1.2 Čo údaje ukazujú

Údaje opisujú spotrebu cukru v 12 krajinách sveta (Austrália, Brazília, Čína, Francúzsko, Nemecko, India, Indonézia, Japonsko, Mexiko, Rusko, Južná Afrika a USA) v rokoch 1960 – 2023. Pre každú krajinu a rok obsahujú:

  • spotrebu cukru – ročnú spotrebu na obyvateľa, celkovú spotrebu krajiny a priemerný denný príjem cukru na osobu,
  • zdroje cukru – aký podiel cukru pochádza z cukrovej trstiny, cukrovej repy, kukuričného sirupu s vysokým obsahom fruktózy (HFCS) a z iných zdrojov,
  • zdravotné ukazovatele – výskyt cukrovky (diabetes) a mieru obezity,
  • ekonomické ukazovatele – HDP na obyvateľa, dovoz a vývoz cukru, priemernú maloobchodnú cenu cukru, spotrebu spracovaných potravín, mieru urbanizácie a výnos cukrovej trstiny,
  • opatrenia vlády – či krajina v danom roku mala daň na cukor, dotácie na cukor a vzdelávaciu kampaň o cukre,
  • klimatické podmienky – vyjadrené číslom 1 až 5.

Takéto údaje sa dajú využiť napríklad na otázku, či vyššia spotreba cukru súvisí s vyšším výskytom cukrovky alebo obezity a či opatrenia vlády (napr. daň na cukor) súvisia s nižšou spotrebou.

1.3 O aký typ údajov ide

  • Sekundárne údaje – prebrané z verejne dostupnej databázy Kaggle.
  • Štruktúrované tabuľkové údaje – jeden riadok je jeden záznam (krajina + rok), jeden stĺpec je jedna premenná. Súbor má 10 000 riadkov a 26 stĺpcov.
  • Podľa časovej a priestorovej dimenzie ide o kombináciu prierezových údajov (viac krajín) a časových radov (roky 1960 – 2023), teda o údaje panelového typu. Pre jednu krajinu a jeden rok je však v súbore viac záznamov (v priemere 13), preto nejde o klasický vyvážený panel, ale skôr o združené prierezové údaje (pooled cross-section). Ukážeme si to v časti o čistení údajov.
  • Podľa typu premenných obsahuje súbor:
    • kvantitatívne spojité (pomerové) premenné – napr. spotreba cukru, HDP na obyvateľa, cena, podiely v %,
    • kvantitatívnu diskrétnu premennú – rok,
    • kategoriálne nominálne premenné – krajina, kód krajiny, kontinent, región,
    • ordinálnu premennú – klimatické podmienky (1 – 5),
    • binárne (dummy) premenné 0/1 – daň na cukor, dotácie, vzdelávacia kampaň.
  • Pravdepodobne ide o syntetické (simulované) údaje. Pri čistení a v grafoch sa ukáže, že hodnoty sú takmer rovnomerne rozložené, premenné spolu takmer nesúvisia, počet obyvateľov tej istej krajiny skáče medzi 1 a 300 miliónmi a podiel „iných zdrojov“ cukru je často záporný. Skutočné štatistiky takto nevyzerajú. Výsledky preto beriem ako cvičenie postupov, nie ako skutočné závery o spotrebe cukru.

Prehľad všetkých premenných (jednotky nie sú v súbore uvedené; tam, kde ich bolo možné overiť výpočtom, sú doplnené):

Prehľad premenných v súbore
Premenná Význam Jednotka Typ premennej
Country krajina – kategoriálna nominálna
Year rok rok kvantitatívna diskrétna
Country_Code kód krajiny (ISO) – kategoriálna nominálna
Continent kontinent – kategoriálna nominálna
Region región – kategoriálna nominálna
Population počet obyvateľov osoby kvantitatívna spojitá
GDP_Per_Capita HDP na obyvateľa USD kvantitatívna spojitá
Per_Capita_Sugar_Consumption ročná spotreba cukru na obyvateľa kg / osoba / rok kvantitatívna spojitá
Total_Sugar_Consumption celková spotreba cukru v krajine tony kvantitatívna spojitá
Sugar_From_Sugarcane podiel cukru z cukrovej trstiny % kvantitatívna spojitá
Sugar_From_Beet podiel cukru z cukrovej repy % kvantitatívna spojitá
Sugar_From_HFCS podiel cukru z kukuričného sirupu (HFCS) % kvantitatívna spojitá
Sugar_From_Other podiel cukru z iných zdrojov % kvantitatívna spojitá
Processed_Food_Consumption spotreba spracovaných potravín neuvedená kvantitatívna spojitá
Avg_Daily_Sugar_Intake priemerný denný príjem cukru g / osoba / deň kvantitatívna spojitá
Diabetes_Prevalence výskyt cukrovky v populácii % kvantitatívna spojitá
Obesity_Rate miera obezity % kvantitatívna spojitá
Sugar_Imports dovoz cukru neuvedená (asi tony) kvantitatívna spojitá
Sugar_Exports vývoz cukru neuvedená (asi tony) kvantitatívna spojitá
Avg_Retail_Price_Per_Kg priemerná maloobchodná cena cukru za kg (asi USD) kvantitatívna spojitá
Gov_Tax daň na cukor (1 = áno, 0 = nie) 0/1 binárna (dummy)
Gov_Subsidies dotácie na cukor (1 = áno, 0 = nie) 0/1 binárna (dummy)
Education_Campaign vzdelávacia kampaň (1 = áno, 0 = nie) 0/1 binárna (dummy)
Urbanization_Rate miera urbanizácie % kvantitatívna spojitá
Climate_Conditions klimatické podmienky stupeň 1 – 5 ordinálna
Sugarcane_Production_Yield výnos cukrovej trstiny neuvedená kvantitatívna spojitá

2 Import údajov

Súbor sugar_consumption_dataset.csv mám uložený v rovnakom priečinku ako tento .qmd dokument (OneDrive › Ema – osobné › Pracovná plocha › M3 › dataset_sugar_consumption), preto stačí uviesť len názov súboru. Na rozdiel od cvičenia, kde bol oddeľovač bodkočiarka (read.csv2), tu je oddeľovačom čiarka, preto používam read.csv. Prázdne bunky a text „NA“ sa načítajú ako chýbajúce hodnoty NA.

udaje <- read.csv(
  "sugar_consumption_dataset.csv",
  header = TRUE,             
  sep = ",",                 
  dec = ".",                 
  na.strings = c("", "NA"),  
  stringsAsFactors = FALSE  ) 

dim(udaje)       
[1] 10000    26
colnames(udaje)  
 [1] "Country"                      "Year"                        
 [3] "Country_Code"                 "Continent"                   
 [5] "Region"                       "Population"                  
 [7] "GDP_Per_Capita"               "Per_Capita_Sugar_Consumption"
 [9] "Total_Sugar_Consumption"      "Sugar_From_Sugarcane"        
[11] "Sugar_From_Beet"              "Sugar_From_HFCS"             
[13] "Sugar_From_Other"             "Processed_Food_Consumption"  
[15] "Avg_Daily_Sugar_Intake"       "Diabetes_Prevalence"         
[17] "Obesity_Rate"                 "Sugar_Imports"               
[19] "Sugar_Exports"                "Avg_Retail_Price_Per_Kg"     
[21] "Gov_Tax"                      "Gov_Subsidies"               
[23] "Education_Campaign"           "Urbanization_Rate"           
[25] "Climate_Conditions"           "Sugarcane_Production_Yield"  

Prvých niekoľko riadkov databázy:

head(udaje) %>%
  kable(digits = 2, caption = ) %>%
  styl() %>%
  scroll_box(width = "100%")
Country Year Country_Code Continent Region Population GDP_Per_Capita Per_Capita_Sugar_Consumption Total_Sugar_Consumption Sugar_From_Sugarcane Sugar_From_Beet Sugar_From_HFCS Sugar_From_Other Processed_Food_Consumption Avg_Daily_Sugar_Intake Diabetes_Prevalence Obesity_Rate Sugar_Imports Sugar_Exports Avg_Retail_Price_Per_Kg Gov_Tax Gov_Subsidies Education_Campaign Urbanization_Rate Climate_Conditions Sugarcane_Production_Yield
France 1972 FRA Europe Western Europe 261730647 8692.63 12.83 3357412.9 68.42 38.60 42.97 -49.99 171.97 35.15 11.50 34.09 5401670 2358929 3.86 0 0 0 34.50 3 52.43
Australia 2003 AUS Oceania Australia & New Zealand 173796468 6859.20 21.36 3712750.0 55.43 38.46 16.22 -10.12 229.24 58.53 6.52 16.04 3418790 9694348 3.28 0 0 0 31.78 4 58.38
Germany 1963 DEU Europe Western Europe 123636586 22075.95 32.08 3965950.7 86.47 10.00 51.72 -48.19 203.26 87.89 8.25 14.41 8987281 5451632 1.10 0 0 0 51.55 1 32.18
France 1965 FRA Europe Western Europe 298996150 3728.03 47.65 14246846.5 69.81 34.01 43.57 -47.39 34.18 130.56 11.00 38.50 5179004 8048500 2.76 0 0 0 80.39 2 84.30
Germany 2010 DEU Europe Western Europe 7341531 40420.97 23.21 170428.8 63.77 23.11 53.54 -40.42 78.73 63.61 14.89 36.19 6463439 7062910 4.22 0 0 1 49.70 3 66.11
South Africa 1997 ZAF Africa Sub-Saharan Africa 91997984 45446.26 66.80 6145419.2 53.90 29.02 59.08 -41.99 209.46 183.03 14.89 14.45 2178783 8683158 1.17 0 0 0 77.15 1 98.64

Štruktúra databázy – typ každej premennej:

str(udaje)
'data.frame':   10000 obs. of  26 variables:
 $ Country                     : chr  "France" "Australia" "Germany" "France" ...
 $ Year                        : int  1972 2003 1963 1965 2010 1997 1965 1970 1986 2013 ...
 $ Country_Code                : chr  "FRA" "AUS" "DEU" "FRA" ...
 $ Continent                   : chr  "Europe" "Oceania" "Europe" "Europe" ...
 $ Region                      : chr  "Western Europe" "Australia & New Zealand" "Western Europe" "Western Europe" ...
 $ Population                  : num  2.62e+08 1.74e+08 1.24e+08 2.99e+08 7.34e+06 ...
 $ GDP_Per_Capita              : num  8693 6859 22076 3728 40421 ...
 $ Per_Capita_Sugar_Consumption: num  12.8 21.4 32.1 47.6 23.2 ...
 $ Total_Sugar_Consumption     : num  3357413 3712750 3965951 14246846 170429 ...
 $ Sugar_From_Sugarcane        : num  68.4 55.4 86.5 69.8 63.8 ...
 $ Sugar_From_Beet             : num  38.6 38.5 10 34 23.1 ...
 $ Sugar_From_HFCS             : num  43 16.2 51.7 43.6 53.5 ...
 $ Sugar_From_Other            : num  -50 -10.1 -48.2 -47.4 -40.4 ...
 $ Processed_Food_Consumption  : num  172 229.2 203.3 34.2 78.7 ...
 $ Avg_Daily_Sugar_Intake      : num  35.1 58.5 87.9 130.6 63.6 ...
 $ Diabetes_Prevalence         : num  11.5 6.52 8.25 11 14.89 ...
 $ Obesity_Rate                : num  34.1 16 14.4 38.5 36.2 ...
 $ Sugar_Imports               : num  5401670 3418790 8987281 5179004 6463439 ...
 $ Sugar_Exports               : num  2358929 9694348 5451632 8048500 7062910 ...
 $ Avg_Retail_Price_Per_Kg     : num  3.86 3.28 1.1 2.76 4.22 ...
 $ Gov_Tax                     : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Gov_Subsidies               : int  0 0 0 0 0 0 0 0 1 0 ...
 $ Education_Campaign          : num  0 0 0 0 1 0 0 0 0 1 ...
 $ Urbanization_Rate           : num  34.5 31.8 51.6 80.4 49.7 ...
 $ Climate_Conditions          : int  3 4 1 2 3 1 4 5 5 4 ...
 $ Sugarcane_Production_Yield  : num  52.4 58.4 32.2 84.3 66.1 ...

3 Čistenie údajov

3.1 Úprava názvov premenných

Názvy stĺpcov v pôvodnom súbore síce neobsahujú medzery, ale sú dlhé a mixujú veľké a malé písmená. Pomocou knižnice janitor ich zjednotím na malé písmená s podčiarkovníkom (snake_case) a niektoré dlhé názvy ešte skrátim pomocou rename().

povodne_nazvy <- names(udaje)

udaje <- udaje %>%
  clean_names() %>%                               # malé písmená, bez neprípustných znakov
  rename(
    spotreba_na_obyv   = per_capita_sugar_consumption,
    spotreba_celkova   = total_sugar_consumption,
    denny_prijem       = avg_daily_sugar_intake,
    trstina            = sugar_from_sugarcane,
    repa               = sugar_from_beet,
    hfcs               = sugar_from_hfcs,
    ine_zdroje         = sugar_from_other,
    spracovane_potr    = processed_food_consumption,
    diabetes           = diabetes_prevalence,
    obezita            = obesity_rate,
    cena_kg            = avg_retail_price_per_kg,
    hdp_na_obyv        = gdp_per_capita,
    urbanizacia        = urbanization_rate,
    klima              = climate_conditions,
    vynos_trstiny      = sugarcane_production_yield
  )

data.frame(Povodny_nazov = povodne_nazvy, Novy_nazov = names(udaje)) %>%
  kable(col.names = c("Pôvodný názov", "Nový názov"),
        caption = "Porovnanie pôvodných a upravených názvov premenných") %>%
  styl()
Porovnanie pôvodných a upravených názvov premenných
Pôvodný názov Nový názov
Country country
Year year
Country_Code country_code
Continent continent
Region region
Population population
GDP_Per_Capita hdp_na_obyv
Per_Capita_Sugar_Consumption spotreba_na_obyv
Total_Sugar_Consumption spotreba_celkova
Sugar_From_Sugarcane trstina
Sugar_From_Beet repa
Sugar_From_HFCS hfcs
Sugar_From_Other ine_zdroje
Processed_Food_Consumption spracovane_potr
Avg_Daily_Sugar_Intake denny_prijem
Diabetes_Prevalence diabetes
Obesity_Rate obezita
Sugar_Imports sugar_imports
Sugar_Exports sugar_exports
Avg_Retail_Price_Per_Kg cena_kg
Gov_Tax gov_tax
Gov_Subsidies gov_subsidies
Education_Campaign education_campaign
Urbanization_Rate urbanizacia
Climate_Conditions klima
Sugarcane_Production_Yield vynos_trstiny

3.2 Duplicity a štruktúra záznamov

Najprv overím, či sa v databáze nenachádzajú úplne rovnaké (duplicitné) riadky.

pocet_duplicit <- sum(duplicated(udaje))
pocet_duplicit
[1] 0

Úplne rovnaké riadky v databáze nie sú. Pri panelových údajoch by však mala byť každá dvojica krajina + rok v databáze iba raz. Pozrime sa, koľko záznamov pripadá na jednu krajinu a jeden rok:

zaznamy_kr <- udaje %>%
  count(country, year, name = "pocet_zaznamov")

nrow(zaznamy_kr)   # počet rôznych kombinácií krajina + rok
[1] 768
zaznamy_kr %>%
  summarise(
    min     = min(pocet_zaznamov),
    priemer = mean(pocet_zaznamov),
    median  = median(pocet_zaznamov),
    max     = max(pocet_zaznamov)
  ) %>%
  kable(digits = 1,
        caption = "Počet záznamov na jednu dvojicu krajina + rok") %>%
  styl()
Počet záznamov na jednu dvojicu krajina + rok
min priemer median max
5 13 13 30

Zo 10 000 riadkov je len 768 rôznych kombinácií krajina + rok (12 krajín × 64 rokov = 768). Na jednu krajinu a rok pripadá v priemere 13,0 záznamov a tieto záznamy majú navzájom úplne odlišné hodnoty. Preto nejde o vyvážený panel. Riadky nemažem (nie sú to presné duplicity), ale:

  • pri tabuľkách a testoch beriem každý riadok ako samostatné pozorovanie (združené prierezové údaje),
  • pri grafoch vývoja v čase najprv vypočítam priemer za krajinu a rok.

Počet záznamov podľa krajín:

udaje %>%
  group_by(country, continent) %>%
  summarise(
    pocet = n(),
    od    = min(year),
    do    = max(year),
    .groups = "drop"
  ) %>%
  arrange(desc(pocet)) %>%
  kable(col.names = c("Krajina", "Kontinent", "Počet záznamov", "Od roku", "Do roku"),
        caption = "Počet záznamov podľa krajín") %>%
  styl()
Počet záznamov podľa krajín
Krajina Kontinent Počet záznamov Od roku Do roku
Australia Oceania 917 1960 2023
Indonesia Asia 877 1960 2023
France Europe 861 1960 2023
Japan Asia 846 1960 2023
Germany Europe 832 1960 2023
India Asia 829 1960 2023
Mexico North America 820 1960 2023
Russia Europe 817 1960 2023
South Africa Africa 816 1960 2023
USA North America 800 1960 2023
China Asia 797 1960 2023
Brazil South America 788 1960 2023

3.3 Chýbajúce údaje

Koľko chýbajúcich hodnôt (NA) má každá premenná:

print("počet chýbajúcich údajov za jednotlivé premenné")
[1] "počet chýbajúcich údajov za jednotlivé premenné"
colSums(is.na(udaje))
           country               year       country_code          continent 
                 0                  0                  0                  0 
            region         population        hdp_na_obyv   spotreba_na_obyv 
                 0                  0                  0                  0 
  spotreba_celkova            trstina               repa               hfcs 
                 0                  0                  0                  0 
        ine_zdroje    spracovane_potr       denny_prijem           diabetes 
                 0                  0                  0                  0 
           obezita      sugar_imports      sugar_exports            cena_kg 
                 0                  0                  0                  0 
           gov_tax      gov_subsidies education_campaign        urbanizacia 
               531                  0                520                  0 
             klima      vynos_trstiny 
                 0                  0 

Prehľadnejšie len premenné, ktorým nejaké hodnoty chýbajú:

chybajuce <- data.frame(
  premenna = names(udaje),
  pocet_NA = colSums(is.na(udaje))
) %>%
  filter(pocet_NA > 0) %>%
  mutate(podiel = 100 * pocet_NA / nrow(udaje))

chybajuce %>%
  kable(digits = 2, row.names = FALSE,
        col.names = c("Premenná", "Počet NA", "Podiel NA (%)"),
        caption = "Premenné s chýbajúcimi hodnotami") %>%
  styl()
Premenné s chýbajúcimi hodnotami
Premenná Počet NA Podiel NA (%)
gov_tax 531 5.31
education_campaign 520 5.20

Chýbajú hodnoty iba v dvoch binárnych premenných – daň na cukor (gov_tax) a vzdelávacia kampaň (education_campaign), približne 5 % hodnôt v každej. Štruktúru chýbajúcich údajov ukazuje md.pattern() z knižnice mice (pre prehľadnosť len na premenných, ktoré súvisia s opatreniami vlády; červená = chýbajúca hodnota). Čísla vľavo udávajú, koľko riadkov má daný vzor, čísla dole počet chýbajúcich hodnôt v stĺpci:

# kvôli čitateľnosti grafu premenné dočasne skrátim: dan, kampan, dotacie
md.pattern(udaje %>% select(dotacie = gov_subsidies, kampan = education_campaign, dan = gov_tax),
           rotate.names = TRUE)

     dotacie kampan dan     
8974       1      1   1    0
506        1      1   0    1
495        1      0   1    1
25         1      0   0    2
           0    520 531 1051

Podiel chýbajúcich hodnôt vo všetkých premenných (graf podobný funkcii aggr() z knižnice VIM, nakreslený cez ggplot2):

udaje %>%
  summarise(across(everything(), ~ 100 * mean(is.na(.x)))) %>%
  pivot_longer(everything(), names_to = "premenna", values_to = "podiel_na") %>%
  ggplot(aes(x = podiel_na, y = reorder(premenna, podiel_na),
             fill = podiel_na > 0)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = ifelse(podiel_na > 0, paste0(cislo(podiel_na, 1), " %"), "")),
            hjust = -0.15, size = 3.5) +
  scale_fill_manual(values = c("FALSE" = "navyblue", "TRUE" = "red"), guide = "none") +
  scale_x_continuous(limits = c(0, 7), expand = c(0, 0)) +
  labs(
    title = "Podiel chýbajúcich hodnôt podľa premenných",
    x = "Chýbajúce hodnoty (%)",
    y = NULL
  ) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank(), panel.grid.major.y = element_blank())

Chýbajúcich údajov je málo a nie sú sústredené v rovnakých riadkoch, preto ich nahradím viacnásobnou imputáciou pomocou knižnice mice. Pre binárne premenné používam metódu pmm (predictive mean matching), ktorá dopĺňa len hodnoty, ktoré sa v údajoch naozaj vyskytujú – teda iba 0 alebo 1. Ako pomocné premenné vyberiem len niektoré číselné stĺpce. Odvodené premenné (denný príjem, celková spotreba, podiel „iných zdrojov“) sú presnými prepočtami iných stĺpcov a mice by s nimi skončila chybou system is computationally singular, preto ich do imputácie nezaraďujem.

# do imputácie vstupujú len vybrané číselné premenné
# (textové stĺpce mice nevie použiť, odvodené stĺpce spôsobujú singularitu)
vstup_imputacie <- udaje %>%
  select(gov_tax, education_campaign, gov_subsidies, year,
         spotreba_na_obyv, diabetes, obezita, hdp_na_obyv,
         cena_kg, urbanizacia, spracovane_potr)

imp <- mice(vstup_imputacie, m = 5, maxit = 5, method = "pmm",
            seed = 123, printFlag = FALSE)
udaje_imputovane <- complete(imp, 1)

# pred imputáciou si zapamätám pôvodné podiely
pred_imputaciou <- udaje %>%
  summarise(gov_tax = mean(gov_tax, na.rm = TRUE),
            education_campaign = mean(education_campaign, na.rm = TRUE))

# doplnené stĺpce vrátim do pôvodnej databázy
udaje$gov_tax            <- udaje_imputovane$gov_tax
udaje$education_campaign <- udaje_imputovane$education_campaign
rm(imp, udaje_imputovane, vstup_imputacie)

print("počet chýbajúcich údajov po imputácii")
[1] "počet chýbajúcich údajov po imputácii"
colSums(is.na(udaje))
           country               year       country_code          continent 
                 0                  0                  0                  0 
            region         population        hdp_na_obyv   spotreba_na_obyv 
                 0                  0                  0                  0 
  spotreba_celkova            trstina               repa               hfcs 
                 0                  0                  0                  0 
        ine_zdroje    spracovane_potr       denny_prijem           diabetes 
                 0                  0                  0                  0 
           obezita      sugar_imports      sugar_exports            cena_kg 
                 0                  0                  0                  0 
           gov_tax      gov_subsidies education_campaign        urbanizacia 
                 0                  0                  0                  0 
             klima      vynos_trstiny 
                 0                  0 

Kontrola, či imputácia nezmenila rozdelenie premenných (podiel záznamov s hodnotou 1):

po_imputacii <- udaje %>%
  summarise(gov_tax = mean(gov_tax), education_campaign = mean(education_campaign))

bind_rows(pred_imputaciou, po_imputacii) %>%
  mutate(stav = c("pred imputáciou (bez NA)", "po imputácii")) %>%
  select(stav, everything()) %>%
  kable(digits = 3,
        col.names = c("", "Podiel s daňou na cukor", "Podiel so vzdelávacou kampaňou"),
        caption = "Podiel hodnôt 1 pred a po imputácii") %>%
  styl()
Podiel hodnôt 1 pred a po imputácii
Podiel s daňou na cukor Podiel so vzdelávacou kampaňou
pred imputáciou (bez NA) 0.151 0.407
po imputácii 0.151 0.407

Podiely sa takmer nezmenili, imputácia teda rozdelenie premenných neskreslila.

3.4 Logická kontrola hodnôt

Aj keď údajom nič nechýba, hodnoty môžu byť nezmyselné. Skontrolujem preto, či medzi sebou premenné logicky sedia.

3.4.1 Odvodené premenné

Denný príjem cukru by mal zodpovedať ročnej spotrebe na obyvateľa prepočítanej na gramy za deň (kg × 1000 / 365) a celková spotreba by mala byť spotreba na obyvateľa × počet obyvateľov (prepočítaná na tony).

udaje %>%
  summarise(
    `Denný príjem vs. spotreba × 1000 / 365` =
      max(abs(denny_prijem - spotreba_na_obyv * 1000 / 365)),
    `Celková spotreba vs. spotreba × obyvatelia / 1000` =
      max(abs(spotreba_celkova - spotreba_na_obyv * population / 1000))
  ) %>%
  pivot_longer(everything(), names_to = "Kontrola", values_to = "Najväčší rozdiel") %>%
  kable(digits = 3, caption = "Kontrola odvodených premenných") %>%
  styl()
Kontrola odvodených premenných
Kontrola Najväčší rozdiel
Denný príjem vs. spotreba × 1000 / 365 0.019
Celková spotreba vs. spotreba × obyvatelia / 1000 0.000

Rozdiely sú prakticky nulové, takže odvodené premenné sú vypočítané správne. Zároveň to potvrdzuje jednotky: spotreba na obyvateľa je v kg za rok, denný príjem v gramoch a celková spotreba v tonách.

3.4.2 Podiely zdrojov cukru

Podiely štyroch zdrojov cukru by mali byť medzi 0 a 100 % a spolu dávať 100 %.

udaje %>%
  summarise(
    `Súčet podielov – minimum` = min(trstina + repa + hfcs + ine_zdroje),
    `Súčet podielov – maximum` = max(trstina + repa + hfcs + ine_zdroje),
    `Počet záporných podielov „iné zdroje“` = sum(ine_zdroje < 0),
    `Podiel takých záznamov (%)` = 100 * mean(ine_zdroje < 0)
  ) %>%
  pivot_longer(everything(), names_to = "Ukazovateľ", values_to = "Hodnota") %>%
  kable(digits = 1, caption = "Kontrola podielov zdrojov cukru") %>%
  styl()
Kontrola podielov zdrojov cukru
Ukazovateľ Hodnota
Súčet podielov – minimum 100.0
Súčet podielov – maximum 100.0
Počet záporných podielov „iné zdroje“ 8254.0
Podiel takých záznamov (%) 82.5

Súčet je vždy 100 %, ale v 82,5 % záznamov je podiel „iných zdrojov“ záporný, čo je nemožné. Podiel „iné zdroje“ bol zrejme dopočítaný ako zvyšok do 100 %, pričom podiely trstiny, repy a HFCS spolu presahovali 100 %. Chybu opravím tak, že:

  1. záporný podiel „iných zdrojov“ nahradím nulou,
  2. všetky štyri podiely prepočítam tak, aby spolu dávali 100 %.

Pôvodné stĺpce ponechám a upravené podiely uložím do nových stĺpcov s príponou _upr.

udaje <- udaje %>%
  mutate(
    ine_zdroje_0   = pmax(ine_zdroje, 0),                    # záporné hodnoty -> 0
    sucet          = trstina + repa + hfcs + ine_zdroje_0,
    trstina_upr    = 100 * trstina / sucet,
    repa_upr       = 100 * repa / sucet,
    hfcs_upr       = 100 * hfcs / sucet,
    ine_zdroje_upr = 100 * ine_zdroje_0 / sucet
  ) %>%
  select(-ine_zdroje_0, -sucet)

udaje %>%
  select(trstina_upr, repa_upr, hfcs_upr, ine_zdroje_upr) %>%
  summary()
  trstina_upr       repa_upr         hfcs_upr        ine_zdroje_upr  
 Min.   :34.53   Min.   : 3.404   Min.   : 0.00176   Min.   : 0.000  
 1st Qu.:50.29   1st Qu.:11.557   1st Qu.:13.31441   1st Qu.: 0.000  
 Median :56.00   Median :18.073   Median :24.22396   Median : 0.000  
 Mean   :57.04   Mean   :17.986   Mean   :22.94242   Mean   : 2.033  
 3rd Qu.:63.39   3rd Qu.:23.743   3rd Qu.:32.58729   3rd Qu.: 0.000  
 Max.   :89.41   Max.   :39.542   Max.   :50.71461   Max.   :40.710  

Po úprave sú všetky podiely v rozmedzí 0 – 100 % a ich súčet je 100 %.

3.4.3 Počet obyvateľov

Počet obyvateľov jednej krajiny by sa medzi rokmi mal meniť len mierne.

udaje %>%
  group_by(country) %>%
  summarise(
    min_mil = min(population) / 1e6,
    max_mil = max(population) / 1e6
  ) %>%
  kable(digits = 1,
        col.names = c("Krajina", "Minimum (mil.)", "Maximum (mil.)"),
        caption = "Rozpätie počtu obyvateľov v databáze") %>%
  styl()
Rozpätie počtu obyvateľov v databáze
Krajina Minimum (mil.) Maximum (mil.)
Australia 1.1 300.0
Brazil 1.6 299.4
China 1.0 299.6
France 1.0 299.5
Germany 2.0 300.0
India 1.0 299.7
Indonesia 1.2 299.9
Japan 1.2 299.5
Mexico 1.6 299.7
Russia 2.6 298.0
South Africa 1.2 300.0
USA 1.2 299.6

Počet obyvateľov sa v každej krajine pohybuje náhodne medzi približne 1 a 300 miliónmi (napr. Čína alebo India by mali mať vyše miliardy obyvateľov). Túto premennú nie je možné rozumne opraviť, preto ju ďalej neinterpretujem. Rovnaký problém má aj celková spotreba cukru, ktorá z počtu obyvateľov vychádza. V analýze preto používam ukazovatele na obyvateľa. Toto je zároveň jeden z dôkazov, že údaje sú syntetické.

3.5 Úprava typov premenných a nové premenné

  • Kategoriálne premenné prevediem na faktory, klimatické podmienky na usporiadaný (ordinálny) faktor.
  • Binárne premenné doplním o čitateľné verzie „áno / nie“.
  • Vytvorím premennú desaťročie.
  • Vytvorím premennú kategória denného príjmu podľa odporúčania WHO pre voľné cukry: menej ako 10 % energetického príjmu (asi 50 g denne), ideálne menej ako 5 % (asi 25 g denne). Ide len o orientačné porovnanie, keďže databáza uvádza celkovú spotrebu cukru, nie iba voľné cukry.
udaje <- udaje %>%
  mutate(
    country   = factor(country),
    continent = factor(continent),
    region    = factor(region),
    klima     = factor(klima, levels = 1:5, ordered = TRUE),
    dan       = factor(gov_tax, levels = c(0, 1), labels = c("nie", "áno")),
    dotacie   = factor(gov_subsidies, levels = c(0, 1), labels = c("nie", "áno")),
    kampan    = factor(education_campaign, levels = c(0, 1), labels = c("nie", "áno")),
    desatrocie = paste0(floor(year / 10) * 10, "s"),
    hdp_tis    = hdp_na_obyv / 1000,          # HDP v tisícoch USD (čitateľnejší koeficient v regresii)
    kategoria_who = case_when(
      denny_prijem <= 25 ~ "do 25 g (odporúčanie WHO)",
      denny_prijem <= 50 ~ "25 – 50 g (horná hranica WHO)",
      TRUE               ~ "nad 50 g (nad hranicou WHO)"
    ),
    kategoria_who = factor(kategoria_who,
                           levels = c("do 25 g (odporúčanie WHO)",
                                      "25 – 50 g (horná hranica WHO)",
                                      "nad 50 g (nad hranicou WHO)"))
  )

glimpse(udaje)
Rows: 10,000
Columns: 36
$ country            <fct> France, Australia, Germany, France, Germany, South …
$ year               <int> 1972, 2003, 1963, 1965, 2010, 1997, 1965, 1970, 198…
$ country_code       <chr> "FRA", "AUS", "DEU", "FRA", "DEU", "ZAF", "IND", "M…
$ continent          <fct> Europe, Oceania, Europe, Europe, Europe, Africa, As…
$ region             <fct> Western Europe, Australia & New Zealand, Western Eu…
$ population         <dbl> 261730647, 173796468, 123636586, 298996150, 7341531…
$ hdp_na_obyv        <dbl> 8692.6317, 6859.1960, 22075.9506, 3728.0274, 40420.…
$ spotreba_na_obyv   <dbl> 12.82774, 21.36263, 32.07748, 47.64893, 23.21434, 6…
$ spotreba_celkova   <dbl> 3357412.9, 3712750.0, 3965950.7, 14246846.5, 170428…
$ trstina            <dbl> 68.42296, 55.43256, 86.46612, 69.80671, 63.77228, 5…
$ repa               <dbl> 38.600384, 38.463620, 10.001416, 34.005173, 23.1059…
$ hfcs               <dbl> 42.970760, 16.223681, 51.720631, 43.573774, 53.5435…
$ ine_zdroje         <dbl> -49.994107, -10.119866, -48.188167, -47.385654, -40…
$ spracovane_potr    <dbl> 171.96618, 229.23802, 203.26325, 34.17728, 78.73348…
$ denny_prijem       <dbl> 35.14801, 58.53361, 87.89231, 130.55807, 63.60730, …
$ diabetes           <dbl> 11.495111, 6.517479, 8.252688, 10.997905, 14.893879…
$ obezita            <dbl> 34.094017, 16.040118, 14.405741, 38.499271, 36.1909…
$ sugar_imports      <dbl> 5401669.8, 3418789.6, 8987281.1, 5179004.2, 6463438…
$ sugar_exports      <dbl> 2358929, 9694348, 5451632, 8048500, 7062910, 868315…
$ cena_kg            <dbl> 3.8640198, 3.2821007, 1.0976869, 2.7612974, 4.21943…
$ gov_tax            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, …
$ gov_subsidies      <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, …
$ education_campaign <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, …
$ urbanizacia        <dbl> 34.50340, 31.78307, 51.55134, 80.38628, 49.70115, 7…
$ klima              <ord> 3, 4, 1, 2, 3, 1, 4, 5, 5, 4, 3, 2, 5, 1, 3, 5, 2, …
$ vynos_trstiny      <dbl> 52.43397, 58.38205, 32.18473, 84.29602, 66.11082, 9…
$ trstina_upr        <dbl> 45.61710, 50.33839, 58.34887, 47.36330, 45.41480, 3…
$ repa_upr           <dbl> 25.734600, 34.928866, 6.749133, 23.072241, 16.45465…
$ hfcs_upr           <dbl> 28.648299, 14.732747, 34.901998, 29.564461, 38.1305…
$ ine_zdroje_upr     <dbl> 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0…
$ dan                <fct> nie, nie, nie, nie, nie, nie, nie, nie, nie, nie, n…
$ dotacie            <fct> nie, nie, nie, nie, nie, nie, nie, nie, áno, nie, á…
$ kampan             <fct> nie, nie, nie, nie, áno, nie, nie, nie, nie, áno, n…
$ desatrocie         <chr> "1970s", "2000s", "1960s", "1960s", "2010s", "1990s…
$ hdp_tis            <dbl> 8.6926317, 6.8591960, 22.0759506, 3.7280274, 40.420…
$ kategoria_who      <fct> 25 – 50 g (horná hranica WHO), nad 50 g (nad hranic…

4 Tabuľky – popisná štatistika

4.1 Základné štatistiky hlavných premenných

udaje %>%
  select(spotreba_na_obyv, denny_prijem, diabetes, obezita,
         hdp_na_obyv, cena_kg, urbanizacia, spracovane_potr) %>%
  pivot_longer(everything(), names_to = "premenna", values_to = "hodnota") %>%
  mutate(premenna = factor(premenna, levels = unique(premenna))) %>%
  group_by(premenna) %>%
  summarise(
    n      = n(),
    mean   = mean(hodnota),
    sd     = sd(hodnota),
    min    = min(hodnota),
    q25    = quantile(hodnota, 0.25),
    median = median(hodnota),
    q75    = quantile(hodnota, 0.75),
    max    = max(hodnota)
  ) %>%
  mutate(premenna = recode(premenna,
    spotreba_na_obyv = "Spotreba cukru (kg/osoba/rok)",
    denny_prijem     = "Denný príjem cukru (g/deň)",
    diabetes         = "Výskyt cukrovky (%)",
    obezita          = "Obezita (%)",
    hdp_na_obyv      = "HDP na obyvateľa (USD)",
    cena_kg          = "Cena cukru za kg",
    urbanizacia      = "Urbanizácia (%)",
    spracovane_potr  = "Spracované potraviny"
  )) %>%
  kable(digits = 2,
        col.names = c("Premenná", "n", "Priemer", "Smer. odch.", "Min", "Q25", "Medián", "Q75", "Max"),
        caption = "Základné štatistiky vybraných premenných") %>%
  styl() %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  add_header_above(c(" " = 2, "Polohy a variability" = 2, "Kvantily" = 5))
Základné štatistiky vybraných premenných
Polohy a variability
Kvantily
Premenná n Priemer Smer. odch. Min Q25 Medián Q75 Max
Spotreba cukru (kg/osoba/rok) 10000 37.63 18.73 5.02 21.39 37.88 54.00 69.99
Denný príjem cukru (g/deň) 10000 103.10 51.33 13.75 58.60 103.79 147.97 191.78
Výskyt cukrovky (%) 10000 9.35 3.80 2.14 6.05 9.33 12.66 16.55
Obezita (%) 10000 22.36 10.09 5.00 13.70 22.26 31.01 40.00
HDP na obyvateľa (USD) 10000 25242.49 14193.05 500.42 13219.35 25155.57 37558.13 49997.01
Cena cukru za kg 10000 2.75 1.30 0.50 1.62 2.74 3.87 5.00
Urbanizácia (%) 10000 49.97 23.19 10.02 29.37 50.20 70.07 90.00
Spracované potraviny 10000 155.29 83.68 10.03 81.79 155.91 228.08 299.93

Priemerný obyvateľ v databáze skonzumuje približne 37,6 kg cukru ročne, čo je asi 103 g denne – dvojnásobok hornej hranice odporúčanej WHO. Priemer a medián sú takmer rovnaké a kvartily sú rozložené pravidelne, čo zodpovedá rovnomernému rozdeleniu.

4.2 Spotreba cukru a zdravie podľa krajín

udaje %>%
  group_by(country) %>%
  summarise(
    n            = n(),
    spotreba     = mean(spotreba_na_obyv),
    denny        = mean(denny_prijem),
    diabetes     = mean(diabetes),
    obezita      = mean(obezita),
    hdp          = mean(hdp_na_obyv)
  ) %>%
  arrange(desc(spotreba)) %>%
  kable(digits = 1,
        col.names = c("Krajina", "n", "Spotreba (kg/rok)", "Denný príjem (g)",
                      "Cukrovka (%)", "Obezita (%)", "HDP na obyv. (USD)"),
        caption = "Priemerné hodnoty podľa krajín (zoradené podľa spotreby)") %>%
  styl() %>%
  column_spec(1, bold = TRUE)
Priemerné hodnoty podľa krajín (zoradené podľa spotreby)
Krajina n Spotreba (kg/rok) Denný príjem (g) Cukrovka (%) Obezita (%) HDP na obyv. (USD)
Japan 846 39.1 107.1 9.7 22.4 25242.9
Germany 832 38.4 105.2 9.4 21.9 26338.9
India 829 38.2 104.8 9.3 22.3 24755.3
Indonesia 877 38.1 104.4 9.4 22.4 24323.4
South Africa 816 37.7 103.2 9.3 22.1 25558.2
Australia 917 37.5 102.8 9.3 22.2 25710.9
Mexico 820 37.5 102.7 9.2 22.9 25830.2
Russia 817 37.4 102.4 9.4 22.0 25516.1
France 861 37.1 101.8 9.3 23.2 24568.2
Brazil 788 36.9 101.1 9.5 22.4 24354.9
USA 800 36.8 100.7 9.3 22.4 25106.7
China 797 36.7 100.4 9.1 22.0 25610.6

Rozdiely medzi krajinami sú veľmi malé – všetky krajiny majú priemernú spotrebu okolo 37 – 39 kg na osobu a rok. V skutočnosti sa spotreba cukru medzi krajinami výrazne líši (napr. v USA je oveľa vyššia ako v Indii), čo je ďalší znak simulovaných údajov.

4.3 Vývoj podľa desaťročí

udaje %>%
  group_by(desatrocie) %>%
  summarise(
    n         = n(),
    spotreba  = mean(spotreba_na_obyv),
    diabetes  = mean(diabetes),
    obezita   = mean(obezita),
    hfcs      = mean(hfcs_upr),
    dan       = 100 * mean(gov_tax)
  ) %>%
  kable(digits = 1,
        col.names = c("Desaťročie", "n", "Spotreba (kg/rok)", "Cukrovka (%)",
                      "Obezita (%)", "Podiel HFCS (%)", "Záznamy s daňou (%)"),
        caption = "Priemerné hodnoty podľa desaťročí") %>%
  styl()
Priemerné hodnoty podľa desaťročí
Desaťročie n Spotreba (kg/rok) Cukrovka (%) Obezita (%) Podiel HFCS (%) Záznamy s daňou (%)
1960s 1575 37.0 9.5 22.5 23.1 15.4
1970s 1556 37.4 9.2 22.6 23.2 14.6
1980s 1611 37.7 9.4 22.3 22.6 15.8
1990s 1549 37.4 9.4 22.4 22.8 16.3
2000s 1547 37.6 9.4 22.0 23.0 15.1
2010s 1563 38.7 9.3 22.3 22.7 14.5
2020s 599 37.5 9.3 22.4 23.7 13.0

4.4 Kategórie denného príjmu podľa WHO

udaje %>%
  group_by(kategoria_who) %>%
  summarise(
    pocet    = n(),
    podiel   = 100 * n() / nrow(udaje),
    diabetes = mean(diabetes),
    obezita  = mean(obezita)
  ) %>%
  kable(digits = 1,
        col.names = c("Denný príjem cukru", "Počet", "Podiel (%)",
                      "Priem. výskyt cukrovky (%)", "Priem. obezita (%)"),
        caption = "Záznamy podľa kategórie denného príjmu cukru") %>%
  styl()
Záznamy podľa kategórie denného príjmu cukru
Denný príjem cukru Počet Podiel (%) Priem. výskyt cukrovky (%) Priem. obezita (%)
do 25 g (odporúčanie WHO) 647 6.5 8.7 22.6
25 – 50 g (horná hranica WHO) 1399 14.0 8.8 22.2
nad 50 g (nad hranicou WHO) 7954 79.5 9.5 22.4

So zvyšujúcim sa denným príjmom cukru mierne rastie priemerný výskyt cukrovky, obezita sa však medzi skupinami takmer nemení.

4.5 Spotreba cukru podľa opatrení vlády

Podobne ako v cvičení (group_by(MaAuto)) zoskupím záznamy podľa toho, či mala krajina v danom roku daň na cukor, resp. vzdelávaciu kampaň.

bind_rows(
  udaje %>% group_by(hodnota = dan)    %>% summarise(n = n(), spotreba = mean(spotreba_na_obyv), diabetes = mean(diabetes)) %>% mutate(opatrenie = "Daň na cukor"),
  udaje %>% group_by(hodnota = kampan) %>% summarise(n = n(), spotreba = mean(spotreba_na_obyv), diabetes = mean(diabetes)) %>% mutate(opatrenie = "Vzdelávacia kampaň"),
  udaje %>% group_by(hodnota = dotacie)%>% summarise(n = n(), spotreba = mean(spotreba_na_obyv), diabetes = mean(diabetes)) %>% mutate(opatrenie = "Dotácie na cukor")
) %>%
  select(opatrenie, hodnota, n, spotreba, diabetes) %>%
  kable(digits = 2,
        col.names = c("Opatrenie", "Zavedené?", "Počet", "Spotreba (kg/rok)", "Cukrovka (%)"),
        caption = "Priemerná spotreba cukru a výskyt cukrovky podľa opatrení vlády") %>%
  styl() %>%
  collapse_rows(columns = 1, valign = "middle")
Priemerná spotreba cukru a výskyt cukrovky podľa opatrení vlády
Opatrenie Zavedené? Počet Spotreba (kg/rok) Cukrovka (%)
Daň na cukor nie 8486 37.58 9.35
áno 1514 37.86 9.34
Vzdelávacia kampaň nie 5931 37.54 9.35
áno 4069 37.75 9.36
Dotácie na cukor nie 7025 37.45 9.34
áno 2975 38.04 9.37

5 Grafy

Grafy kreslím knižnicou ggplot2.

5.1 Rozdelenie spotreby cukru – histogram

ggplot(udaje, aes(x = spotreba_na_obyv)) +
  geom_histogram(binwidth = 2.5, boundary = 5, fill = farba, color = "white") +
  labs(
    title = "Rozdelenie ročnej spotreby cukru na obyvateľa",
    x = "Spotreba cukru (kg na osobu za rok)",
    y = "Počet záznamov"
  ) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

Histogram je takmer „plochý“ – spotreba je rovnomerne rozdelená medzi 5 a 70 kg. Skutočné ekonomické údaje majú zvyčajne rozdelenie s vrcholom a dlhším chvostom, takže aj tento graf naznačuje, že údaje boli vygenerované náhodne.

5.2 Spotreba cukru podľa kontinentov – boxplot

ggplot(udaje, aes(x = continent, y = spotreba_na_obyv)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(
    title = "Spotreba cukru na obyvateľa podľa kontinentov",
    x = "Kontinent",
    y = "Spotreba cukru (kg na osobu za rok)"
  ) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

Boxploty všetkých kontinentov sú takmer rovnaké – medián okolo 38 kg a rovnaké rozpätie.

5.3 Vývoj spotreby cukru v čase podľa krajín

Pre každú krajinu a rok najprv vypočítam priemer (keďže na jednu krajinu a rok pripadá viac záznamov).

udaje_kr <- udaje %>%
  group_by(country, year) %>%
  summarise(spotreba = mean(spotreba_na_obyv),
            diabetes = mean(diabetes),
            .groups = "drop")

ggplot(udaje_kr, aes(x = year, y = spotreba)) +
  geom_line(color = farba, linewidth = 0.6) +
  geom_smooth(method = "loess", se = FALSE, color = "grey30", linewidth = 0.6) +
  facet_wrap(~ country, ncol = 4) +
  labs(
    title = "Priemerná spotreba cukru na obyvateľa v rokoch 1960 – 2023",
    subtitle = "Modrá: ročný priemer záznamov, sivá: vyhladený trend (loess)",
    x = "Rok",
    y = "Spotreba (kg na osobu za rok)"
  ) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

Ročné priemery kolíšu náhodne okolo 37 kg a vyhladený trend je takmer vodorovný – v údajoch nie je žiadny výrazný dlhodobý trend.

5.4 Súvis spotreby cukru a cukrovky – bodový graf

ggplot(udaje, aes(x = spotreba_na_obyv, y = diabetes)) +
  geom_point(alpha = 0.15, size = 1, color = farba) +
  geom_smooth(method = "lm", color = "grey20", linewidth = 0.8) +
  labs(
    title = "Spotreba cukru a výskyt cukrovky",
    subtitle = "Každý bod je jeden záznam, čiara je lineárna regresná priamka",
    x = "Spotreba cukru (kg na osobu za rok)",
    y = "Výskyt cukrovky (%)"
  ) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

Regresná priamka mierne stúpa – vyššia spotreba cukru súvisí s mierne vyšším výskytom cukrovky. Body sú však rozptýlené po celej ploche, takže súvis je slabý (korelačný koeficient 0,12).

5.5 Štruktúra zdrojov cukru podľa krajín

Používam upravené podiely (po oprave záporných hodnôt).

zdroje <- udaje %>%
  group_by(country) %>%
  summarise(
    `Cukrová trstina` = mean(trstina_upr),
    `Cukrová repa`    = mean(repa_upr),
    `HFCS`            = mean(hfcs_upr),
    `Iné zdroje`      = mean(ine_zdroje_upr)
  ) %>%
  pivot_longer(-country, names_to = "zdroj", values_to = "podiel") %>%
  mutate(zdroj = factor(zdroj, levels = c("Cukrová trstina", "Cukrová repa", "HFCS", "Iné zdroje")))

ggplot(zdroje, aes(x = podiel, y = fct_rev(country), fill = zdroj)) +
  geom_col(width = 0.7, color = "white", linewidth = 0.3,
           position = position_stack(reverse = TRUE)) +   # poradie v stĺpci = poradie v legende
  scale_fill_manual(values = c("#2a78d6", "#eb6834", "#1baf7a", "#eda100")) +
  scale_x_continuous(labels = function(x) paste0(x, " %"),
                     expand = expansion(mult = c(0, 0.03))) +
  labs(
    title = "Priemerná štruktúra zdrojov cukru podľa krajín",
    x = "Podiel na spotrebe cukru",
    y = NULL,
    fill = "Zdroj"
  ) +
  theme_minimal() +
  theme(legend.position = "top", panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Vo všetkých krajinách tvorí najväčšiu časť cukor z cukrovej trstiny, nasleduje HFCS a cukrová repa. V skutočnosti by Európa (Francúzsko, Nemecko, Rusko) mala vyrábať cukor najmä z cukrovej repy a USA by mali mať výrazne vyšší podiel HFCS – štruktúra je však vo všetkých krajinách takmer rovnaká.