SEMANA 11 - Programação Funcional - Pacote dplyr

Gustavo Eduardo Marcatti

Dados

Acesse os dados em:
https://gmarcatti.github.io/dados/talhao_florestal.zip
https://gmarcatti.github.io/dados/classificados_especie.xlsx

Aplicações

1. Gerador de amostras

Gerador de amostras distribuídas de forma sistemática. O procedimento gera amostras a partir de uma feição espacial do tipo polígono, permite considerar restrições no momento de lançamento das amostras, como evitar lançar amostras na borda do polígono. Além disso, o algoritmo conta com um processo repetitivo, implementado utilizando loop while, que garante que a quantidade de parcelas previamente definida seja atendida.

# importar pacotes necessários
#install.packages("sf")
library(sf)
library(ggplot2)
# 1. Importar feição espacial
in_shape <- "C:\\aulas\\dados_prog\\talhao_florestal.shp"
pol <- st_read(in_shape)
pol
plot(pol["talhao"])

# 2. Determinar a quantidade amostras
# intensidade amostral de 1,5
inten <- 1.5
sum(pol$area_ha)
st_area(pol)
# units::set_units(st_area(pol), "ha")
#pol$area_ha <- st_area(pol) / 10000
area_total <- sum(pol$area_ha)
n_parc <- ceiling(area_total / inten)

# 3. Determinar região permitida para amostras
# Evitar lançamento nas bordas
pol_buf <- st_buffer(pol, dist = -20)
plot(pol_buf["talhao"])
g <- ggplot() +
   geom_sf(data = pol) +
   geom_sf(data = pol_buf, fill = "green")
   
g

# 4. Lançar as amostras na área
pts_sist <- st_sample(pol_buf, size = n_parc, type = "regular")
#length(pts_sist)

# 5. Avaliar a quantidade e garantir a quantidade necessária
cont <- 1
while (length(pts_sist) != n_parc) {
   pts_sist <- st_sample(pol_buf, size = n_parc, type = "regular")
   cat(cont, ":", length(pts_sist), "\n")
   cont <- cont + 1
}

length(pts_sist)
g <- ggplot() +
   geom_sf(data = pol) +
   geom_sf(data = pol_buf, fill = "green") +
   geom_sf(data = pts_sist)

g

# 6. Exportar a feição de amostras
id <- paste0("P", 1:length(pts_sist) )#, sep = "")
pts_sist <- st_sf(data.frame(id = id, geom = pts_sist))
out_shape <- "C:\\aulas\\dados_prog\\parc_florestal.shp"
st_write(pts_sist, out_shape)

2. Algoritmo de k-nn

Implementação do algoritmo dos k-vizinhos mais próximos (k-NN, do inglês K-Nearest Neighbors). O k-NN pertence ao grupo de algoritmos de aprendizagem de máquina (machine learning), é muito utilizado para resolver problemas práticos, é eficiente computacionalmente e simples de ser implementado, e o principal: gera bons resultados. O procedimento é implementado para executar uma classificação, mais especificamente, para determinar qual é a espécie de um indivíduo (até então desconhecida) baseado em suas características, como tamanho e cor.

# 1. Importar os dados de referência
library(readxl)
dados <- read_excel("C:\\aulas\\dados_prog\\classificados_especie.xlsx")

# 2. Caracteristicas dos indivíduos indeterminados
# Obs: Poderia ser importado do Excel também
tamanho <- 2.1
cor <- 5

# 3. Estabelecer o número de vizinhos (k) para avaliação
k <- 3

# 4. Computar distância entre o indeterminado e os já identificados
# distância euclidiana: d = raiz( (x2 - x1)² + (y2 - y1)² )
dados$dist <-  sqrt( (dados$tamanho - tamanho)^2 + (dados$cor - cor)^2 )

# 5. Ordenar por distância
# order(dados$dist) # ordenar por distância
dados_ord <- dados[order(dados$dist), ]

# 6. Filtrar apenas os k vizinhos mais próximos
knn <- dados_ord[1:k, "especie"]

# 7. Contabilizar a frequência de espécie dos k vizinhos
knn_freq <- as.data.frame(table(knn))

# 8. Identificar a espécie com maior frequência dos k vizinhos
indx_freq <- which.max(knn_freq$Freq)

# 9. Obter o resultado
classe <- as.character(knn_freq[indx_freq, "knn"])

# 10. Imprimir na tela o resultado
cat("A espécie desconhecida é", classe)