Coffee Palm oil Classification

library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.8
✓ tidyr   1.2.0     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
pixels <- read_csv("~/Downloads/data.csv")
Rows: 1560922 Columns: 12
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (1): clase
dbl (11): B2, B3, B4, B5, B6, B7, B8, B11, B12, DEM, Slopes

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
##
getSDRange <- function(data, the_class){
  sample <- data |> 
    filter(clase == the_class) |> 
    select(B2, B3, B4, B5, B6, B7, B8, B11, B12)
  print(summary(sample))
  print(sample |> tally())

  sds   = sapply(sample, sd)
  means = sapply(sample, mean)
  stats = bind_rows(means + sds, means, means - sds) |> 
    mutate(id = row_number()) |> 
    pivot_longer(cols = starts_with("B"), 
                 names_to = "band", values_to = "value") |>
    mutate(band = factor(
      band, 
      levels = c("B2","B3","B4","B5","B6","B7","B8","B9","B11","B12"))
    )
  
  return(stats)
}

##
plotClass <- function(the_class){
  bands <- pixels |> 
    filter(clase == the_class) |> 
    select(B2, B3, B4, B5, B6, B7, B8, B11, B12) |> 
    mutate(id = row_number()) |>
    pivot_longer(cols = starts_with("B"), names_to = "band", values_to = "value") |>
    mutate(clase = the_class, 
           band = factor(
             band, 
             levels = c("B2","B3","B4","B5","B6","B7","B8","B9","B11","B12")
            )
    )
  
  return(bands)
}
palma <- plotClass("palma")
cafe1 <- plotClass("cafe_expuesto")
cafe2 <- plotClass("cafe_semisombra")
cafe3 <- plotClass("cafe_sombra")
ggplot(data = palma, aes(x=band, y= value, fill=clase)) + geom_boxplot()

ggplot(data = cafe1, aes(x=band, y= value, fill=clase)) + geom_boxplot()

ggplot(data = cafe2, aes(x=band, y= value, fill=clase)) + geom_boxplot()

ggplot(data = cafe3, aes(x=band, y= value, fill=clase)) + geom_boxplot()

##
cafe <- cafe1 |> bind_rows(cafe2) |> bind_rows(cafe3)
ggplot(data = cafe, aes(x=band, y= value, fill=clase)) + geom_boxplot()

##
runGgplot <- function(data, the_class){
  range = getSDRange(pixels, the_class)
  g = ggplot(data = data, aes(x=band, y= value, group=id)) + 
    geom_line(size=0.2, alpha=0.01) +
    stat_summary(aes(y = value, group = 1), 
                 fun = mean, colour = "blue", geom = "line", group = 1) +
    geom_line(data = range |> filter(id == 1), 
              aes(x = band, y = value), colour= "red", linetype = "dashed") +
    geom_line(data = range |> filter(id == 3), 
              aes(x = band, y = value), colour= "red", linetype = "dashed") +
    theme_bw() 

  return(g)
}

plot(runGgplot(palma, "palma"))
       B2              B3              B4              B5       
 Min.   : 15.0   Min.   : 42.0   Min.   : 24.0   Min.   :  0.0  
 1st Qu.: 49.0   1st Qu.:102.0   1st Qu.: 61.0   1st Qu.:179.0  
 Median : 73.0   Median :133.0   Median : 95.0   Median :235.0  
 Mean   : 76.4   Mean   :152.2   Mean   :108.8   Mean   :269.3  
 3rd Qu.: 95.0   3rd Qu.:195.0   3rd Qu.:130.0   3rd Qu.:344.0  
 Max.   :439.0   Max.   :649.0   Max.   :950.0   Max.   :913.0  
       B6               B7             B8            B11        
 Min.   :   0.0   Min.   :-100   Min.   : 276   Min.   :-100.0  
 1st Qu.: 585.0   1st Qu.: 743   1st Qu.: 764   1st Qu.: 415.0  
 Median : 671.0   Median : 865   Median : 896   Median : 518.0  
 Mean   : 841.4   Mean   :1076   Mean   :1110   Mean   : 613.2  
 3rd Qu.:1194.0   3rd Qu.:1533   3rd Qu.:1577   3rd Qu.: 805.0  
 Max.   :1770.0   Max.   :2342   Max.   :2443   Max.   :1755.0  
      B12        
 Min.   :-100.0  
 1st Qu.: 183.0  
 Median : 268.0  
 Mean   : 291.9  
 3rd Qu.: 359.0  
 Max.   :1217.0  
# A tibble: 1 × 1
      n
  <int>
1 22205

plot(runGgplot(cafe1, "cafe_expuesto"))
       B2                B3               B4               B5        
 Min.   :   0.00   Min.   :   9.0   Min.   :-100.0   Min.   :-100.0  
 1st Qu.:  45.00   1st Qu.:  95.0   1st Qu.:  59.0   1st Qu.: 190.0  
 Median :  62.00   Median : 126.0   Median :  89.0   Median : 245.0  
 Mean   :  73.54   Mean   : 151.6   Mean   : 109.7   Mean   : 290.1  
 3rd Qu.:  88.00   3rd Qu.: 185.0   3rd Qu.: 136.0   3rd Qu.: 357.0  
 Max.   :1561.00   Max.   :1701.0   Max.   :1558.0   Max.   :2291.0  
       B6               B7             B8            B11        
 Min.   :-100.0   Min.   :-100   Min.   : 178   Min.   :-100.0  
 1st Qu.: 548.0   1st Qu.: 675   1st Qu.: 703   1st Qu.: 432.0  
 Median : 692.0   Median : 852   Median : 898   Median : 530.0  
 Mean   : 847.5   Mean   :1038   Mean   :1095   Mean   : 631.2  
 3rd Qu.:1063.0   3rd Qu.:1287   3rd Qu.:1347   3rd Qu.: 791.0  
 Max.   :4059.0   Max.   :4696   Max.   :6332   Max.   :3330.0  
      B12        
 Min.   :-100.0  
 1st Qu.: 203.0  
 Median : 271.0  
 Mean   : 317.6  
 3rd Qu.: 401.0  
 Max.   :2305.0  
# A tibble: 1 × 1
      n
  <int>
1 19417

plot(runGgplot(cafe2, "cafe_semisombra"))
       B2                B3               B4                B5        
 Min.   :   0.00   Min.   :   0.0   Min.   :-100.00   Min.   :   0.0  
 1st Qu.:  37.00   1st Qu.:  87.0   1st Qu.:  52.00   1st Qu.: 179.0  
 Median :  52.00   Median : 115.0   Median :  73.00   Median : 227.0  
 Mean   :  60.44   Mean   : 136.7   Mean   :  89.05   Mean   : 267.7  
 3rd Qu.:  73.75   3rd Qu.: 164.0   3rd Qu.: 108.00   3rd Qu.: 323.0  
 Max.   :1650.00   Max.   :1650.0   Max.   :1341.00   Max.   :1897.0  
       B6               B7             B8            B11        
 Min.   :   0.0   Min.   :-100   Min.   : 106   Min.   :-100.0  
 1st Qu.: 564.0   1st Qu.: 701   1st Qu.: 732   1st Qu.: 419.0  
 Median : 696.0   Median : 867   Median : 924   Median : 501.5  
 Mean   : 848.4   Mean   :1055   Mean   :1117   Mean   : 601.4  
 3rd Qu.:1058.0   3rd Qu.:1322   3rd Qu.:1380   3rd Qu.: 753.0  
 Max.   :4986.0   Max.   :5679   Max.   :5748   Max.   :3400.0  
      B12        
 Min.   :-100.0  
 1st Qu.: 190.0  
 Median : 241.0  
 Mean   : 283.7  
 3rd Qu.: 352.0  
 Max.   :1692.0  
# A tibble: 1 × 1
      n
  <int>
1 20690

plot(runGgplot(cafe3, "cafe_sombra"))
       B2               B3              B4               B5        
 Min.   :  0.00   Min.   :  2.0   Min.   :  1.00   Min.   :  33.0  
 1st Qu.: 37.00   1st Qu.: 87.0   1st Qu.: 50.00   1st Qu.: 177.0  
 Median : 51.00   Median :119.0   Median : 71.00   Median : 236.0  
 Mean   : 58.63   Mean   :139.7   Mean   : 83.18   Mean   : 275.6  
 3rd Qu.: 72.00   3rd Qu.:177.0   3rd Qu.:103.00   3rd Qu.: 351.0  
 Max.   :545.00   Max.   :842.0   Max.   :686.00   Max.   :1463.0  
       B6               B7             B8            B11        
 Min.   : 178.0   Min.   : 245   Min.   : 184   Min.   : 164.0  
 1st Qu.: 594.0   1st Qu.: 752   1st Qu.: 788   1st Qu.: 419.0  
 Median : 813.0   Median :1029   Median :1085   Median : 538.0  
 Mean   : 961.2   Mean   :1221   Mean   :1284   Mean   : 647.4  
 3rd Qu.:1264.0   3rd Qu.:1607   3rd Qu.:1669   3rd Qu.: 853.0  
 Max.   :4181.0   Max.   :4942   Max.   :6742   Max.   :3013.0  
      B12        
 Min.   :  63.0  
 1st Qu.: 186.0  
 Median : 250.0  
 Mean   : 289.6  
 3rd Qu.: 371.0  
 Max.   :1521.0  
# A tibble: 1 × 1
      n
  <int>
1 21879

ggplot(data = cafe, aes(x=band, y= value, group = id)) + 
  stat_summary(data = palma, aes(y = value, group = 1), 
               fun = mean, colour = "orange", geom = "line", group = 1) +
  stat_summary(data = cafe1, aes(y = value, group = 1), 
               fun = mean, colour = "green", geom = "line", group = 1) +
  stat_summary(data = cafe2, aes(y = value, group = 1), 
               fun = mean, colour = "blue", geom = "line", group = 1) +
  stat_summary(data = cafe3, aes(y = value, group = 1), 
               fun = mean, colour = "red", geom = "line", group = 1) +
  theme_bw()

vegetacion <- plotClass("vegetacion")
agua <- plotClass("agua")
ciudad <- plotClass("ciudad")

ggplot(data = cafe, aes(x=band, y= value, group = id)) + 
  stat_summary(data = cafe1, aes(y = value, group = 1), 
               fun = mean, colour = "green", geom = "line", group = 1) +
  stat_summary(data = cafe2, aes(y = value, group = 1), 
               fun = mean, colour = "blue", geom = "line", group = 1) +
  stat_summary(data = cafe3, aes(y = value, group = 1), 
               fun = mean, colour = "red", geom = "line", group = 1) +
  stat_summary(data = vegetacion, aes(y = value, group = 1), 
               fun = mean, colour = "darkgreen", geom = "line", group = 1) +
  stat_summary(data = ciudad, aes(y = value, group = 1), 
               fun = mean, colour = "darkgray", geom = "line", group = 1) +
  stat_summary(data = agua, aes(y = value, group = 1), 
               fun = mean, colour = "darkblue", geom = "line", group = 1) +
  theme_bw()

ggplot(data = palma, aes(x=band, y= value, group = id)) + 
  stat_summary(data = palma, aes(y = value, group = 1), 
               fun = mean, colour = "orange", geom = "line", group = 1) +
  stat_summary(data = vegetacion, aes(y = value, group = 1), 
               fun = mean, colour = "darkgreen", geom = "line", group = 1) +
  stat_summary(data = ciudad, aes(y = value, group = 1), 
               fun = mean, colour = "darkgray", geom = "line", group = 1) +
  stat_summary(data = agua, aes(y = value, group = 1), 
               fun = mean, colour = "darkblue", geom = "line", group = 1) +
  theme_bw()