Prezentacje zaliczeniowe

2023-01-25

Melnyk Artem

Opis wybranych danych

Emisje według krajów, 2002-2022

Kwantyfikacja źródeł i poziomów emisji

Źródło danych

Ten zestaw danych zapewnia dogłębne spojrzenie na globalne emisje CO2 na poziomie kraju w latach 2002-2022, umożliwiając lepsze zrozumienie, w jakim stopniu każdy kraj przyczynia się do globalnego skumulowanego wpływu człowieka na klimat.

Zawiera informacje o emisjach całkowitych, a także z produkcji węgla, ropy naftowej, gazu, cementu i spalania w pochodniach oraz innych źródeł. Dane zawierają również zestawienie emisji CO2 na mieszkańca w podziale na kraje - pokazując, które kraje przodują pod względem poziomu zanieczyszczenia i identyfikując potencjalne obszary, na których należy skoncentrować działania redukujące.

Nazwa kolumny Opis
Country Nazwa kraju. (String)
ISO 3166-1 alpha-3 Trzyliterowy kod kraju. (String)
Year Rok danych. (Integer)
Total Suma emisji CO2 dla kraju w danym roku. (Float)
Coal Ilość emisji CO2 z węgla dla kraju w danym roku. (Float)
Oil Wielkość emisji CO2 z ropy dla kraju w danym roku. (Float)
Gas Wielkość emisji CO2 z gazu dla kraju w danym roku. (Float)
Cement Wielkość emisji CO2 z produkcji cementu dla kraju w danym roku. (Float)
Flaring Wielkość emisji CO2 z operacji spalania na pochodniach dla kraju w danym roku. (Float)
Other Wielkość emisji CO2 z innych źródeł dla kraju w danym roku. (Float)
Per Capita Wielkość emisji CO2 na mieszkańca dla kraju w danym roku. (Float)
# Hostowałem dane na Github Gist
DATA_LINK = "https://gist.githubusercontent.com/MellKam/36d27fc96249949e38749f47faf276c2/raw/5d9957fd67b6fd731726aa9dbf055d1cff8d4d2b/emissions_by_country.csv" # nolint

source_data <- read.csv(DATA_LINK, sep = ",", dec = ".", head = TRUE)
head(source_data)
##       Country ISO.3166.1.alpha.3 Year Total Coal Oil Gas Cement Flaring Other
## 1 Afghanistan                AFG 1750     0   NA  NA  NA     NA      NA    NA
## 2 Afghanistan                AFG 1751     0   NA  NA  NA     NA      NA    NA
## 3 Afghanistan                AFG 1752     0   NA  NA  NA     NA      NA    NA
## 4 Afghanistan                AFG 1753     0   NA  NA  NA     NA      NA    NA
## 5 Afghanistan                AFG 1754     0   NA  NA  NA     NA      NA    NA
## 6 Afghanistan                AFG 1755     0   NA  NA  NA     NA      NA    NA
##   Per.Capita
## 1         NA
## 2         NA
## 3         NA
## 4         NA
## 5         NA
## 6         NA

Statystyki opisowe z wnioskami

Całkowita liczba krajów

total_countries <- length(unique(source_data$Country))

sprintf("Total countries: %d", total_countries)
## [1] "Total countries: 232"

Okres czasu

min_year <- min(source_data$Year)
max_year <- max(source_data$Year)

sprintf(
  "Dane są opisane w okresie od %d do %d roku",
  min_year,
  max_year
)
## [1] "Dane są opisane w okresie od 1750 do 2021 roku"

Kwantyl emisji na człowieka dla 2021 r.

data_2021 <- source_data[
  source_data$Year == "2021"
  & source_data$Country != "Global"
  & source_data$Country != "International Transport",
]

quantile(data_2021$Per.Capita, na.rm = TRUE)
##         0%        25%        50%        75%       100% 
##  0.0000000  0.7070697  2.7121380  5.6580427 35.5873570

Mediana emisji na człowieka dla 2021 r.

median(data_2021$Per.Capita, na.rm = TRUE)
## [1] 2.712138

Średnia wartość emisji na człowieka dla 2021 r.

mean(data_2021$Per.Capita, na.rm = TRUE)
## [1] 4.395642

Odchylenie standardowe emisji na człowieka dla 2021 r.

sd(data_2021$Per.Capita, na.rm = TRUE)
## [1] 5.357284

Ilustrację danych na wykresach

Emisja w Polsce

# Select data for country Poland
pol_data <- source_data[
  source_data$Country == "Poland",
]

lo <- smooth.spline(pol_data$Year, pol_data$Total, spar = 0.4)

plot(pol_data$Year, pol_data$Total,
  type = "l",
  col = "darkblue",
  xlab = "Year",
  ylab = "Total emission",
  # log = "y" # toggle to make logarithmic
)

lines(predict(lo), col = "red", lwd = 2, )

grid(nx = NULL, ny = NULL,
    lty = 1, col = "gray", lwd = 1)

Widzimy, że od 2000 roku kwestia ta ustabilizowała się i nie ma tendencji wzrostowej.

Porównanie całkowitej emisji w krajach europejskich

compare_lines <- function(country_names, df_column) {
  data_frame <- data.frame(
    matrix(ncol = length(unique(source_data$Year)), nrow = 0)
  )

  for (country_name in country_names) {
    country_data <- source_data[
      source_data$Country == country_name,
    ]

    data_frame[nrow(data_frame) + 1, ] <- t(country_data[df_column])
  }

  col_set <- rainbow(nrow(data_frame))

  matplot(
    unique(source_data$Year),
    t(data_frame),
    xlab = "Year",
    ylab = sprintf("Emissions from %s", df_column),
    type = "l",
    lty = "solid",
    col = col_set,
    lwd = 2
  )

  legend(
    "left",
    legend = country_names,
    lty = c(1, 1),
    lwd = c(2.5, 2.5),
    col = col_set
  )
}


compare_lines(
  c(
    "Poland",
    "Ukraine",
    "Germany",
    "Italy",
    "Portugal"
  ),
  "Total"
)

Wykres kołowy dla całkowitego udziału emisji w 2021 r.

ordered_data_2021 <- data_2021[
  order(data_2021$Total, decreasing = TRUE),
]

pie(ordered_data_2021$Total, ordered_data_2021$Country)

Top 10 krajów o największej emisji w 2021 roku

data_2021 <- source_data[
  source_data$Year == 2021
  & source_data$Country != "Global"
  & source_data$Country != "International Transport",
]

largest_data_2021 <- ordered_data_2021[1:10, ]

barplot(
  largest_data_2021$Total,
  names.arg = largest_data_2021$Country,
  col = "darkred",
  ylab = "Total emission",
  xlab = "Country name",
  font.lab = 2,
  panel.first = {
    axis(
      2,
      tck = 1,
      col.ticks = "light gray",
      lwd.ticks = "1",
      at = seq(0, 1, by = 0.06),
      labels = FALSE
    )
    box()
  }
)

Porównanie emisji w czasie w tych krajach (Total)

compare_lines(unique(largest_data_2021$Country), "Total")

Porównanie emisji w czasie w tych krajach (Gas)

compare_lines(unique(largest_data_2021$Country), "Gas")

Porównanie emisji w czasie w tych krajach (Oil)

compare_lines(unique(largest_data_2021$Country), "Oil")

Porównanie emisji w czasie w tych krajach (Coal)

compare_lines(unique(largest_data_2021$Country), "Coal")

Porównanie emisji w czasie w tych krajach (Cement)

compare_lines(unique(largest_data_2021$Country), "Cement")

Widzimy, że w ostatnim czasie emisje w Chinach znacznie wzrosły, zwłaszcza z produkcji węgla i cementu. Emisja CO2 szybko rośnie również w Indiach.

Przedział ufności dla średniej

get_confidence_interval <- function(vector) {
  n <- length(vector)
  m <- mean(vector)
  s <- sd(vector)

  alfa <- 1 - 0.98
  e <- qt(1 - alfa / 2, n - 1)
  E <- e * s / sqrt(n)

  return(m + c(-E, +E))
}

get_confidence_interval(data_2021$Total)
## [1]  24.85679 289.07452
get_confidence_interval(data_2021$Per.Capita)
## [1] 3.568072 5.223213

Minimalną liczebność próby dla średniej

n <- length(data_2021$Per.Capita)
sigma <- sd(data_2021$Per.Capita, na.rm = TRUE)

# Wartość przyjętego błędu :
d <- 1.2
# Kwantyl rozkładu Normalego :
alfa <- 0.05

e <- qnorm(1 - alfa)
# Wyznaczona liczebność :
print(licz <- e^2 * sigma^2 / d^2)
## [1] 53.92391
print(n)
## [1] 230

Testowanie hipotezy o wartości średniej

# Definiujemy hipotezę zerową i alternatywną
H0 <- "Średnia populacji jest większa niż 4.5"
H1 <- "Średnia populacji jest mniejsza niż 4.5"

# Przeprowadzamy jednorodny test t
result <- t.test(
  data_2021$Per.Capita,
  mu = 4.5,
  alternative = "less",
  var.equal = TRUE
)

print(result)
## 
##  One Sample t-test
## 
## data:  data_2021$Per.Capita
## t = -0.29542, df = 229, p-value = 0.384
## alternative hypothesis: true mean is less than 4.5
## 95 percent confidence interval:
##      -Inf 4.979045
## sample estimates:
## mean of x 
##  4.395642
# Pobieramy wartość p
p_value <- result$p.value

# Sprawdzamy czy wartość p jest mniejsza od poziomu istotności
if (p_value < 0.05) {
  print(
    paste(
      "Odrzucamy hipotezę zerową",
      H0,
      "ponieważ wartość p jest",
      p_value
    )
  )
}else{
  print(
    paste(
      "Nie jesteśmy w stanie odrzucić hipotezy zerowej",
      H0,
      "ponieważ wartość p jest",
      p_value
    )
  )
}
## [1] "Nie jesteśmy w stanie odrzucić hipotezy zerowej Średnia populacji jest większa niż 4.5 ponieważ wartość p jest 0.38396952108341"

Testowanie hipotezy o normalności rozkładu

# H0: dane mają rozkład normalny
# H1: dane nie mają rozkłady normalnego

result <- shapiro.test(data_2021$Total)

print(result)
## 
##  Shapiro-Wilk normality test
## 
## data:  data_2021$Total
## W = 0.15625, p-value < 2.2e-16
# W tym przypadku, ponieważ wartość p jest mniejsza niż 0.05,
# można odrzucić hipotezę zerową, że dane mają rozkład normalny
# i stwierdzić, że dane nie mają rozkładu normalnego.

Analiza wariancji

plot.design(as.factor(Total) ~ Per.Capita, data = data_2021, col = "blue")

# H0: średnie wartości dla badanych grup są równe
# H1: średnie wartości dla badanych grup są różne

# Przeprowadzenie ANOVA
result <- aov(data_2021$Total ~ data_2021$Per.Capita)
summary(result)
##                       Df    Sum Sq Mean Sq F value Pr(>F)  
## data_2021$Per.Capita   1   3476963 3476963   4.834 0.0289 *
## Residuals            228 164009008  719338                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

P-value 4.834 oznacza, że nie ma wystarczającego dowodu na istnienie różnicy między średnimi wartościami dla badanych grup. Nie ma podstaw do odrzucenia hipotezy zerowej, czyli braku różnicy między grupami.