PES Content Error

Introduction

Berikut merupakan contoh penghitungan content error untuk post enumeration survey sensus pertanian 2024. Pada contoh berikut akan dilakukan penghitungan cotent error untuk BLOK 3 PES & ST.

Untuk laporan error dan debugging dapat mengunjungi link berikut. https://youtu.be/kti_zU2KDBI?si=FQ3rF5yipcIg5Bqq.

Data & Function

Functions

Untuk menghitung content error telah disediakan beberapa function baik untuk penyiapan data maupun penghitungan indikator. Function tersebut akan dijelaskan pada penggunaan.

recodeST = function(st){
  st = st %>% 
    mutate(
      device = ifelse(sumber == "PAPI-Desktop", "D", ifelse(sumber == "PAPI-WebEntry", "W", NA))
    )  %>% 
    mutate(
      id_ruta_st = ifelse(sumber == "CAPI", id_ruta, paste0(id, device)),
      
      b2r202 = as.numeric(gsub(".*#(. *)", "\\1", id_art)),
      id_art_st = ifelse(sumber == "CAPI", id_art, as.character(b2r202))
    ) 
  st
}

expandDataset= function(pair,st,pes,group, varnames = "var", dropna = T,num_to_bin = 0,numeric = FALSE, matching_only = F){
  colnames(st) = c("id_1","id_2","var_st")
  colnames(pes) = c("id_1","id_2","var_pes")
  contentset = pair %>% left_join(st,by= c("id_ruta_st" = "id_1" ,"id_art_st"= "id_2" ))
  contentset = contentset %>% left_join(pes,by= c("id_ruta_pes" = "id_1" ,"id_art_pes"= "id_2" ))
  
  if(matching_only) return ( contentset)
  #Na treatment
  if (dropna ) {
    contentset = contentset  %>% filter(!is.na(var_st)| !is.na(var_pes))
    contentset[is.na(contentset)] = 0
    
  }else{
    contentset[is.na(contentset)] = 0
  }
  
  if(numeric) {return (contentset %>% select_at(c(group,"var_st","var_pes")))}
  
  #convert numeric to binary
  if(num_to_bin != 0 ){
    
    contentset = contentset %>% mutate(growth = 100*(var_pes-var_st)/var_st,
                                       growth = if_else(is.na(growth),0,growth),
                                       code = "1#1",
                                       code = ifelse(var_st>var_pes  & growth< -num_to_bin,"1#0",code),
                                       code = ifelse(var_st<var_pes & growth > num_to_bin,"0#1",code),
                                       code = ifelse(growth <0 & growth > -num_to_bin,"0#0",code)
    )%>% select(-var_st,-var_pes,-growth) 
    
    contentset = contentset  %>% separate_wider_delim(code,"#",names = c("var_st","var_pes")) 
  } 
  
  ctb = contentset %>% group_by_at(c(group,"var_st","var_pes")) %>% summarise(cnt = n()) %>% ungroup()
  rlevel = unique(c(ctb$var_st,ctb$var_pes))
  grid = expand.grid(unique(ctb$kdprov),rlevel,rlevel)
  colnames(grid) = colnames(ctb)[-NCOL(ctb)]
  mytab  = merge(grid,ctb,all.x = TRUE) 
  colnames(mytab) = c(group,paste0(varnames,"_st"),paste0(varnames,"_pes"),"cnt")
  mytab
}


find_mode <- function(x) {
  x = as.numeric(x)
  u <- sort(unique(x))
  tab <- tabulate(match(x, u))
  u[tab == max(tab)][1]
}




computeContent = function(dataset,freq,cencus_var,pes_var, group = "None" ){
  
  dataset = dataset %>% rename("Freq" = freq)
  if(group == "None"){
    dataset$group = "Nasional"
    group = "group"
  }
  #Produce Cross Tab
  ctab = dataset %>% group_by_at(c(group,cencus_var,pes_var)) %>% summarise_at("Freq",sum,na.rm=TRUE) %>% ungroup()  %>% spread(key = pes_var,value = Freq)
  ctab$total = rowSums(ctab[,-c(1,2)])
  idx = colnames(ctab)[-c(1:2)]
  
  coltot = ctab %>% group_by_at(c(group)) %>% summarise_at(idx,sum,na.rm=T)
  ctab = bind_rows(ctab, coltot) %>% arrange_at(c(group,cencus_var)) %>% mutate_at(cencus_var ,as.character)
  ctab[is.na(ctab)] = "total"
  
  #Prepare variables
  vrt = dataset %>% group_by_at(c(group,cencus_var)) %>% summarise_at("Freq",sum,na.rm=TRUE) %>% ungroup() %>% rename(vrt = Freq)
  hrz = dataset %>% group_by_at(c(group,pes_var)) %>% summarise_at("Freq",sum,na.rm=TRUE)  %>% ungroup()%>% .$Freq
  dig = dataset %>% filter(eval(parse(text = paste0(cencus_var,"==",pes_var)))) %>%group_by_at(c(group,pes_var)) %>% summarise_at("Freq",sum,na.rm=TRUE) %>%  ungroup()%>% .$Freq
  
  #produce basic indicators
  dataset = vrt %>%  mutate(vrt = as.numeric(vrt),hrz =as.numeric(hrz),dig = as.numeric(dig),vh = vrt*hrz  ) %>%
    group_by_at(group) %>% mutate(n = sum(vrt)) %>% ungroup()
  dataset = dataset %>% mutate(hrz =hrz ) %>% group_by_at(group) %>% mutate(n = sum(vrt)) %>% ungroup()
  dataset = dataset %>% mutate(NDR = ((vrt-hrz)/n)*100,
                               IOI = (vrt+hrz-2*dig)/((1/n)*(vrt*(n-hrz)+hrz*(n-vrt)))*100
  )
  
  #produce aggregate indicators
  datasetAgg = dataset %>% group_by_at(c(group,"n")) %>% summarise(across(vrt:vh,sum))
  datasetAgg = datasetAgg %>% mutate(AggIOI = (n-dig)/(n-(1/n)*vh),
                                     GDR = (n-dig)/(n-(1/n)*dig),
                                     ROA = dig/n
  )
  return(list(ctab = ctab,basic = dataset, agg =datasetAgg))
}

computeContentReg = function(dataset,cencus_var,pes_var, group = "None" ){
  
  
  if(group == "None"){
    dataset$group = "Nasional"
    group = "group"
  }
  
  res = dataset %>%  group_by_at(group) %>% summarise(Jumlah_observasi = n(),
                                                      Mean_ST =  mean(var_st,na.rm = T) ,
                                                      Mean_PES = mean(var_pes,na.rm = T) ,
                                                      MSE = mse(var_st,var_pes),
                                                      RMSE = rmse(var_st,var_pes),
                                                      R2 = R2_Score(var_st,var_pes),
                                                      MAE = mae(var_st,var_pes),
                                                      SMAPE = smape(var_st,var_pes)
                                                      )
  res
}

showres = function(df){
  df %>% kbl() %>% kable_classic_2(full_width=F)
}


exportRegression = function(nasional,provinsi, plot_reg ,var,folder=""){
  level = "Nasional"
  level2 = "Provinsi"
  title = paste0("Tabel Hasil Penghitungan Content Error ",var, " -Regresi")
  title1 = paste0("Tabel Hasil Penghitungan Content Error ",var," tingkat ",level)
  sheetname = "Nasional"
  wb=createWorkbook()
  addWorksheet(wb, sheetName = sheetname)
  writeData(wb, sheet = sheetname, x = title1, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname, x = nasional, startRow = 3)
  s2 = createStyle(border = "TopBottomLeftRight")
  s1 = createStyle( textDecoration = c("BOLD"))
  addStyle(wb, sheet = sheetname, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname, style = s2, rows = 3:(3+NROW(nasional)), cols = 1:NCOL(nasional), gridExpand = TRUE)
  
  title2 = paste0("Tabel Hasil Penghitungan Content Error ",var," tingkat ",level2)
  sheetname2 = "Provinsi"
  addWorksheet(wb, sheetName = sheetname2)
  writeData(wb, sheet = sheetname2, x = title2, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname2, x = provinsi, startRow = 3)
  addStyle(wb, sheet = sheetname2, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname2, style = s2, rows = 3:(3+NROW(provinsi)), cols = 1:NCOL(provinsi), gridExpand = TRUE)
  
  
  sheetname3 = "Plot"
  title3 = paste0("Diagram Pencar ",var)
  addWorksheet(wb, sheetName = sheetname3)
  writeData(wb, sheet = sheetname3, x = title3, startRow = 1, startCol = 1)
  addStyle(wb, sheet = sheetname3, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  print(plot_reg +xlab(paste(word(var,1),"pada","ST")) +ylab(paste(word(var,1),"pada","PES"))) 
  insertPlot(wb, sheet = sheetname3, fileType = "png", units = "in",startRow = 3 ,startCol = 2)
  
  saveWorkbook(wb, paste0(folder,Sys.Date()," ",title,".xlsx"))
  print("Cie ngesavenya berhasil !")
}

exportCategoric = function(nasional, provinsi,var,folder=""){
  level = "Nasional"
  level2 = "Provinsi"
  title = paste0("Tabel Hasil Penghitungan Content Error ",var," -Kategorik")
  title1 = paste0("Tabel Tabulasi ",var," tingkat ",level)
  
  sheetname = "Nasional Tabulasi"
  wb=createWorkbook()
  addWorksheet(wb, sheetName = sheetname)
  writeData(wb, sheet = sheetname, x = title1, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname, x = nasional$ctab, startRow = 3)
  s2 = createStyle(border = "TopBottomLeftRight")
  s1 = createStyle( textDecoration = c("BOLD"))
  addStyle(wb, sheet = sheetname, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname, style = s2, rows = 3:(3+NROW(nasional$ctab)), cols = 1:NCOL(nasional$ctab), gridExpand = TRUE)
  
  
  sheetname2 = "Nasional Kelas"
  title2 = paste0("Tabel Indikator NDR dan IOI untuk ",var," tingkat ",level)
  addWorksheet(wb, sheetName = sheetname2)
  writeData(wb, sheet = sheetname2, x = title2, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname2, x = nasional$basic, startRow = 3)
  addStyle(wb, sheet = sheetname2, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname2, style = s2, rows = 3:(3+NROW(nasional$basic)), cols = 1:NCOL(nasional$basic), gridExpand = TRUE)
  
  sheetname3 = "Nasional Agregat"
  title3 = paste0("Tabel Indikator Agregat IOI,GDR, dan ROA untuk ",var," tingkat ",level)
  addWorksheet(wb, sheetName = sheetname3)
  writeData(wb, sheet = sheetname3, x = title3, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname3, x = nasional$agg, startRow = 3)
  addStyle(wb, sheet = sheetname3, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname3, style = s2, rows = 3:(3+NROW(nasional$agg)), cols = 1:NCOL(nasional$agg), gridExpand = TRUE)
  
  level = level2
  sheetname = "Provinsi Tabulasi"
  title1 = paste0("Tabel Tabulasi ",var," tingkat ",level)
  addWorksheet(wb, sheetName = sheetname)
  writeData(wb, sheet = sheetname, x = title1, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname, x = provinsi$ctab, startRow = 3)
  addStyle(wb, sheet = sheetname, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname, style = s2, rows = 3:(3+NROW(provinsi$ctab)), cols = 1:NCOL(provinsi$ctab), gridExpand = TRUE)
  
  sheetname2 = "Provinsi Kelas"
  title2 = paste0("Tabel Indikator NDR dan IOI untuk ",var," tingkat ",level)
  addWorksheet(wb, sheetName = sheetname2)
  writeData(wb, sheet = sheetname2, x = title2, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname2, x = provinsi$basic, startRow = 3)
  addStyle(wb, sheet = sheetname2, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname2, style = s2, rows = 3:(3+NROW(provinsi$basic)), cols = 1:NCOL(provinsi$basic), gridExpand = TRUE)
  
  sheetname3 = "Provinsi Agregat"
  title3 = paste0("Tabel Indikator Agregat IOI,GDR, dan ROA untuk ",var," tingkat ",level)
  addWorksheet(wb, sheetName = sheetname3)
  writeData(wb, sheet = sheetname3, x = title3, startRow = 1, startCol = 1)
  writeData(wb, sheet = sheetname3, x = provinsi$agg, startRow = 3)
  addStyle(wb, sheet = sheetname3, style = s1, rows = 1, cols = 1, gridExpand = TRUE)
  addStyle(wb, sheet = sheetname3, style = s2, rows = 3:(3+NROW(provinsi$agg)), cols = 1:NCOL(provinsi$agg), gridExpand = TRUE)
  
  saveWorkbook(wb, paste0(folder,Sys.Date()," ",title,".xlsx"))
  print("Cie ngesavenya berhasil !")
}

Dataset Requirement

library("rio")
library("dplyr")
library("tidyr")
library("Metrics")
library("MLmetrics")
library("kableExtra")
library(ggplot2)
library(openxlsx)
library(stringr)
#Load data pairs dan add kode provinsi
pairs= import("2024-01-15 Data Pairs Perbaikan Data Terbaru.xlsx")
pairs = pairs %>% select(idsubsls,id_ruta_pes,id_art_pes,id_ruta_st,id_art_st)
pairs$kdprov = substr(pairs$idsubsls,1,2)

pes_btiga = import("Data/SIS/PES/Data3_1_202312121016.xlsx")
#pes_btiga_2 = import("Data/SIS/PES/Data3_202312121016.xlsx")


# Load data ST dan recode ST ID ke ID Pairs
st_btiga  = import("ST 2023-01-14 FINAL/l2_blok3.Rds")
st_btiga  = recodeST(st_btiga )

Terdapat beberapa dataset yang digunakan pada penghitungan content error

  • Pairs : Merupakan data matching ID antara ST dan PES. Data pairs unik untuk setiap UTP dengan id : id_ruta dan id_art dengan jumlah record 190759
  • ST : Data dari ST yang terdiri dari beberapa blok untuk mendapatkan isian (content) dari variabel ST. Untuk blok 3 unik record adalah id_ruta,id_art,dan id_bidang
  • PES : Data dari PES yang terdiri dari beberapa blok untuk mendapatkan isian (content) dari variabel PES. Untuk blok 3 unik record adalah id_ruta,id_art,dan id_bidang

B3R10 : Jumlah Bidang (Numeric)

Contoh penghitungan content error pertama adalah untuk membandingkan jumlah bidangdi ST dan PES untuk masing-masing UTP yang memiliki bidang. Beberapa tahapan umum yang dapat dilakukan adalah

  1. Matching content error bersandar pada data pairs yang unik di tingkat utp. Sehingga data PES dan ST yang berada di tingkat roster tertentu (blok 3 : bidang) harus di manipulasi ke tingkat utp. Untuk jumlah bidang hal tersebut dapat dilakukan dengan melakukan summarise di tingkat art.
st = st_btiga %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  = n())
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  =n())
Hasil rekap data ST
id_ruta_st id_art_st var_st
0000E02C-F2C4-41EC-9E23-02764BD91D77D 1 2
0001B022-4E10-43E6-9E89-1986A21DDF85D 1 1
0001E3A9-02E1-4ED9-9308-E511BE8D7EA8D 1 2
0001E8D4-15A9-481B-AE05-96B61794D63BD 1 1
00020A07-4A1D-44CC-B534-071BB72F870CD 1 1
Hasil rekap data PES.
id_ruta_st id_art_st var_st
0000E02C-F2C4-41EC-9E23-02764BD91D77D 1 2
0001B022-4E10-43E6-9E89-1986A21DDF85D 1 1
0001E3A9-02E1-4ED9-9308-E511BE8D7EA8D 1 2
0001E8D4-15A9-481B-AE05-96B61794D63BD 1 1
00020A07-4A1D-44CC-B534-071BB72F870CD 1 1

Setelah proses berikut kedua data unik di tingkat UTP

  1. Selanjutnya akan dilakukan proses matching antara data pairs,PES, dan ST dengan bantuan funtion expandDataset(). Untuk menggunakan function tersebut data PES dan ST harus hanya memiliki 3 kolom yaitu id_ruta,id_art, dan var seperti yang telah disiapkan pada proses sebelumnya.

Karena jumlah bidang merupakan variabel numerik. Terdapat dua pendekatan untuk melakukan pemeriksaan content error yaitu dengan pendekatan regresi dan pengkategorian numeric.

Pendekatan regresi

pendekatan pertama adalah dengan metric regresi sehingga pada pemanggialan expandDataset() perlu beberapa paramaeter seperti pada kode di bawah. Karena pendekatan yang digunakan adalah metric regresi maka parameter numeric = T harus ditambahkan. Parameter kdprov digunakan untuk kepentiangan tingkat analisis

tabulasi_numeric = expandDataset(pairs,st,pes,"kdprov",numeric = T)

Hasil dari fungsi tersebut adalah tabel yang dapat digunakan untuk penghitungan indikator dengan pendekatan metric regresi. Salah satu tahapan yang penting adalah untuk memeriksa jumlah observasi setelah proses matching. Pada kasus ini, jumlah observasi 182204 lebih kecil dari jumlah pairs, hal ini direnakan tidak semua utp memiliki bidang. Pada proses expandDataset() apabila terdapat isian na di kedua dataset (PES dan ST) baris tersebut akan di drop dari dataset. Terkecuali ditambahkan parameter dropna=F

kdprov var_st var_pes
16 1 1
16 1 2
16 1 1
16 1 0
16 1 0
16 1 0

Untuk mendapatkan hasil penghitungan metric regresi dapat digunakan function computeContentReg().

resnas_310 = computeContentReg(tabulasi_numeric,"var_st","var_pes")
resnas_310  %>% kbl()%>%  kable_classic_2(full_width=F)
group Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
Nasional 182204 1.75416 1.688948 1.164563 1.079149 0.1248034 0.6275493 0.3725876

untuk hasil di tingkat provinsi dapat digunakan kode berikut

resprov_310 = computeContentReg(tabulasi_numeric,"var_st","var_pes",group = "kdprov")
resprov_310  %>%head() %>% kbl()%>%  kable_classic_2(full_width=F)
kdprov Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
11 8810 1.617707 1.512826 0.8397276 0.9163665 0.0758335 0.5225880 0.3576803
12 7628 1.744363 1.603959 1.2633718 1.1239981 0.0369318 0.6862874 0.4588349
13 7067 1.843922 1.770341 1.0434413 1.0214898 -0.0573159 0.6387435 0.3447103
14 4596 1.593342 1.685596 1.1544822 1.0744683 0.2621010 0.5561358 0.2982367
15 6684 1.588420 1.515559 0.8104428 0.9002460 -0.0474957 0.5091263 0.3074614
16 7857 1.697849 1.589538 1.0198549 1.0098787 0.0358863 0.5845743 0.3593228
plot_310 = ggplot(tabulasi_numeric, aes(x=var_st, y= var_pes)) + 
  geom_point(shape=18, color="blue")+
  geom_smooth(method=lm,
             color="darkred", fill="blue") 
plot_310
## `geom_smooth()` using formula = 'y ~ x'

exportRegression(resnas_310,resprov_310,plot_310,var = "B3R10 (Jumlah Bidang)")
## `geom_smooth()` using formula = 'y ~ x'

## [1] "Cie ngesavenya berhasil !"
Pengkategorian numeric
Pendekatan kedua adalah dengan mengubah variabel numeric ke kategori binary. algoritma perubahan tersebut adalah dengan mengubah selsih nilai di PES dan ST dengan ketentuan klasifikasi binary berdasarkan cut-off tertentu. Contoh algoritma pengkategorian ulang untuk variabel bidang dengan menggunakan cut-off 30% adalah sebagai berikut
klas_st klas_pes syarat Final Status
1 1 Selisih nilai variable ST dan PES diantara 0-30 Positive Match
0 0 Selisih nilai variable ST dan PES diantara -30-0 Negative Match
1 0 Selisih nilai variable ST dan PES diantara >30 Positive Unmatch
0 1 Selisih nilai variable ST dan PES diantara <-30 Negative Unmatch

Untuk menghasilkan tabel dengan algoritma tersebut, fungsi expandDataset() dapat digunakan dengan menambahkan argumen num_to_bin = 30. Parameter varnames juga harus ditambahkan untuk menyimpan hasil matching dari pes dan st.

tabulasi_recat = expandDataset(pairs,st,pes,"kdprov",num_to_bin = 30)
tabulasi_recat %>%head() %>% kbl()%>%  kable_classic_2(full_width=F)
kdprov var_st var_pes cnt
11 0 0 117
11 0 1 1381
11 1 0 2044
11 1 1 5268
12 0 0 117
12 0 1 1456

tabel di atas sedikit berbeda dengan hasil expandDataset() untuk numeric, karena variabel dikategorisasi dengan ketentuan yang telah disiapkan

Selanjutnya, dilakukan penghitungan indikator content error dengan pendekaran klasifikasi. hal tersebut dapat dilakukan dengan menggunakan function computeContent(). Paramameter yang perlu dilakukan adalah tabel hasil ekpansi, varibael frekuensi cnt, variabel st var_st, variabel pes var_pes, dan group kdprov untuk analisis di tingkat provinsi.

resnas_310 = computeContent(tabulasi_recat,"cnt","var_st","var_pes")
resprov_310 = computeContent(tabulasi_recat,"cnt","var_st","var_pes",group = "kdprov")
Hasil dari function tersebut adalah 3 list dataset yaitu, hasil tabulasi silang resnas_310$ctab
group var_st 0 1 total
Nasional 0 2964 35545 38509
Nasional 1 43494 100201 143695
Nasional total 46458 135746 182204
Tabel basic indikator content error resnas_310$basic
group var_st vrt hrz dig vh n NDR IOI
Nasional 0 38509 46458 2964 1789051122 182204 -4.362692 120.9859
Nasional 1 143695 135746 100201 19506021470 182204 4.362692 120.9859
Tabel agregat indikator content error resnas_310$agg
group n vrt hrz dig vh AggIOI GDR ROA
Nasional 182204 182204 182204 103165 21295072592 1.209859 0.4337953 0.566206
exportCategoric(resnas_310,resprov_310,var = "B3R10 (Jumlah Bidang)")
## [1] "Cie ngesavenya berhasil !"

B3R323 : Jenis irigasi (Kategoric)

Untuk varibel jenis irigasi dapat dilakuan dengan cara yang sama pada tahap sebelumnya. Untuk melakukan matching jenis irigasi di tingkat utp dengan variabel di tingkat bidang dapat dilakukan dengan menggunakan berbagai pendekatan (misal : modus atau penjumlahan kategori). Untuk kasus ini digunakan kasus kategori. Untuk contoh ini digunakan fungsi find_mode() untuk melihat modus dari data di tingkat UTP

st = st_btiga %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  = find_mode(b3r323))
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  = find_mode(l2_r323))

selanjutnya kita dapat melakukan ekspansi dataset dengan

tabulasi_cat = expandDataset(pairs,st,pes,"kdprov")
tabulasi_cat %>% head() %>% kbl()%>%  kable_classic_2(full_width=F)
kdprov var_st var_pes cnt
11 0 0 NA
11 0 1 12
11 0 2 NA
11 0 3 NA
11 0 4 NA
11 0 5 4

Hasil tabulasi tersebut dapat dilihat jumlah observasi 182204. Jumlah ini lebih sedikit dari pairs dan sama dengan jumlah isian utp yang memiliki bidang. Selanjutnya dapat dihitung indikator content error dengan funtion computeContent()

resnas_323 = computeContent(tabulasi_cat,"cnt","var_st","var_pes")
resprov_323 = computeContent(tabulasi_cat,"cnt","var_st","var_pes",group = "kdprov")
Hasil dari function tersebut adalah 3 list dataset yaitu, hasil tabulasi silang resnas_323$ctab
group var_st 0 1 2 3 4 5 6 total
Nasional 0 0 214 12 21 1 123 2183 2554
Nasional 1 1177 24341 433 195 28 1146 10709 38029
Nasional 2 18 432 59 27 0 42 416 994
Nasional 3 91 453 36 532 3 236 773 2124
Nasional 4 136 95 0 5 3 41 582 862
Nasional 5 129 930 27 180 8 1639 2421 5334
Nasional 6 6291 9005 212 1077 81 2658 112983 132307
Nasional total 7842 35470 779 2037 124 5885 130067 182204
Tabel basic indikator content error resnas_323$basic
group var_st vrt hrz dig vh n NDR IOI
Nasional 0 2554 7842 0 20028468 182204 -2.9022414 102.16041
Nasional 1 38029 35470 24341 1348888630 182204 1.4044697 42.28298
Nasional 2 994 779 59 774326 182204 0.1179996 93.79425
Nasional 3 2124 2037 532 4326588 182204 0.0477487 75.28853
Nasional 4 862 124 3 106888 182204 0.4050405 99.50989
Nasional 5 5334 5885 1639 31390590 182204 -0.3024083 73.02449
Nasional 6 132307 130067 112983 17208774569 182204 1.2293912 49.54931
Tabel agregat indikator content error resnas_323$agg
group n vrt hrz dig vh AggIOI GDR ROA
Nasional 182204 182204 182204 139557 18614290059 0.5328065 0.2340628 0.7659382
exportCategoric(resnas_323,resprov_323,var = "B3R23 (Jenis Irigasi)")
## [1] "Cie ngesavenya berhasil !"

B3R11 : Luas bidang

Untuk variabel luas bidang yang dikuasai digunakan pendekatan numerik

st = st_btiga %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  = sum(as.numeric(b3r311),na.rm = T))
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  =sum(l2_r311,na.rm = T))
tabulasi_numeric = expandDataset(pairs,st,pes,"kdprov",numeric = T)
b3r11a_nas = computeContentReg(tabulasi_numeric,"var_st","var_pes")
b3r11a_prov = computeContentReg(tabulasi_numeric,"var_st","var_pes",group = 'kdprov')

b3r11a_nas %>% head() %>%  showres()
group Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
Nasional 182204 9652.057 10132.91 19559924803 139856.8 0.0077363 5720.426 0.6319613
b3r11a_prov %>% head() %>%  showres()
kdprov Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
11 8810 6665.972 6415.237 83027669 9111.952 0.2601777 3524.836 0.5798981
12 7628 6927.305 6407.144 69552696 8339.826 0.2805060 3787.023 0.6761860
13 7067 7465.366 7323.275 175463616 13246.268 0.1169467 4395.048 0.6669092
14 4596 20809.603 20847.931 462175115 21498.258 0.3602690 9488.688 0.5455275
15 6684 18119.067 18285.889 369406588 19219.953 0.3009228 8801.989 0.5708778
16 7857 16546.644 16467.435 364275459 19086.002 0.4059917 7663.732 0.5144687

Plot untuk memastikan kebenaran indikator

plot_B3R11 = ggplot(tabulasi_numeric, aes(x=var_st, y= var_pes)) + 
  geom_point(shape=18, color="blue")+
  geom_smooth(method=lm,
             color="darkred", fill="blue")

Dari plot di atas dapat dilihat keberadan outlier pada data pes dan st. Karena garis regresi tidak menunjukkan garis y=x maka terdapat penyimpangan linear yang tinggi antara st dan pes untuk variabel luas wilayah.

exportRegression(b3r11a_nas,b3r11a_prov,plot_B3R11,var = "B3R11 (Luas Bidang)")
## `geom_smooth()` using formula = 'y ~ x'

## [1] "Cie ngesavenya berhasil !"

B3R11a : Lahan untuk usaha pertanian

Untuk variabel luas bidang yang dikuasai digunakan pendekatan numerik

st_btiga[,11:20] = st_btiga[,11:20] %>% mutate_if(is.character,as.numeric)
st = st_btiga  %>%  mutate(b3r11a = rowSums(across(b3r312:b3r320),na.rm=T))
st = st %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  =sum( b3r11a,na.rm = T))
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  =sum(l2_r311a,na.rm = T))
tabulasi_numeric = expandDataset(pairs,st,pes,"kdprov",numeric = T)
b3r11a_nas = computeContentReg(tabulasi_numeric,"var_st","var_pes")
b3r11a_prov = computeContentReg(tabulasi_numeric,"var_st","var_pes",group = 'kdprov')

b3r11a_nas %>% head() %>%  showres()
group Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
Nasional 182204 9528.55 9829.343 19552936372 139831.8 0.0071356 5650.302 NaN
b3r11a_prov %>% head() %>%  showres()
kdprov Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
11 8810 6654.628 6029.127 84682902 9202.331 0.2135307 3613.792 0.6085594
12 7628 6906.862 6171.047 69439382 8333.030 0.2378932 3859.316 0.7193532
13 7067 7455.385 7263.366 174699054 13217.377 0.1046528 4386.550 0.6689032
14 4596 20705.323 20738.246 452656686 21275.730 0.3642518 9444.913 NaN
15 6684 18077.214 17966.338 372847605 19309.262 0.2945563 8865.578 NaN
16 7857 16519.720 16046.007 369723048 19228.184 0.3947619 7788.560 0.5402211

Plot untuk memastikan kebenaran indikator

plot_B3R11 = ggplot(tabulasi_numeric, aes(x=var_st, y= var_pes)) + 
  geom_point(shape=18, color="blue")+
  geom_smooth(method=lm,
             color="darkred", fill="blue")
exportRegression(b3r11a_nas,b3r11a_prov,plot_B3R11,var = "B3R11 (Luas Lahan untuk usaha pertanian)")
## `geom_smooth()` using formula = 'y ~ x'

## [1] "Cie ngesavenya berhasil !"

B3R321 : Lahan lainnya

Untuk variabel luas bidang yang dikuasai digunakan pendekatan numerik

st = st_btiga %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  = sum(as.numeric(b3r321),na.rm = T))
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  =sum(l2_r321,na.rm = T))
tabulasi_numeric = expandDataset(pairs,st,pes,"kdprov",numeric = T)
b3r321_nas = computeContentReg(tabulasi_numeric,"var_st","var_pes")
b3r321_prov = computeContentReg(tabulasi_numeric,"var_st","var_pes",group = 'kdprov')

b3r321_nas %>% head() %>%  showres()
group Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
Nasional 182204 123.5625 303.0317 12051258 3471.492 -0.0474559 370.7658 NaN
b3r321_prov %>% head() %>%  showres()
kdprov Jumlah_observasi Mean_ST Mean_PES MSE RMSE R2 MAE SMAPE
11 8810 11.344608 386.11033 8974843 2995.804 -0.0199630 391.89535 NaN
12 7628 20.442842 236.09714 6675742 2583.746 -0.0302639 255.36825 NaN
13 7067 9.981039 59.90845 1778542 1333.620 -0.0533683 69.68516 NaN
14 4596 104.280896 109.68494 7716006 2777.770 -1.0683692 213.93973 NaN
15 6684 41.853381 319.55027 7275561 2697.325 -0.0166267 326.91682 NaN
16 7857 26.924017 408.70052 9648881 3106.265 -0.0280854 427.37508 NaN

Plot untuk memastikan kebenaran indikator

plot_b3r321 = ggplot(tabulasi_numeric, aes(x=var_st, y= var_pes)) + 
  geom_point(shape=18, color="blue")+
  geom_smooth(method=lm,
             color="darkred", fill="blue")
exportRegression(b3r321_nas,b3r321_prov,plot_b3r321,var = "B3R321 (Luas Lahan Lainnya)")
## `geom_smooth()` using formula = 'y ~ x'

## [1] "Cie ngesavenya berhasil !"

B3R8 : Kepemilikan lahan

Pendekatan yang dilakukan adalah pendekatan kategorik. Karena variabel 308 tidak ada di data ST sehingga digunakan b3r10 sebagai procxy

st = st_btiga %>% group_by(id_ruta_st,id_art_st) %>% summarise(var_st  = n()) %>% mutate(var_st = ifelse(var_st >0,1,2))
pes = pes_btiga %>% group_by(id,index1) %>% summarise(var_pes  =n())%>% mutate(var_pes = ifelse(var_pes >0,1,2))

selanjutnya kita dapat melakukan ekspansi dataset dengan kode berikut. fungsi dropna = F ditambahkan karena pada matching beirkut kita ingin melihat tingka konsistensi jawaban orang yang tidak memiliki lahan.

tabulasi_cat = expandDataset(pairs,st,pes,"kdprov",dropna = F)
tabulasi_cat = tabulasi_cat %>% mutate(var_st = ifelse(var_st==0,2,var_st),
                                       var_pes = ifelse(var_pes==0,2,var_pes)
                                       ) 

tabulasi_cat %>% head() %>% kbl()%>%  kable_classic_2(full_width=F)
kdprov var_st var_pes cnt
11 2 2 128
11 2 1 44
11 1 2 591
11 1 1 8175
12 2 2 217
12 2 1 84

Hasil tabulasi tersebut dapat dilihat jumlah observasi 190759. Jumlah tersebut sama dengan jumlah data pairs. Selanjutnya dapat dihitung indikator content error dengan funtion computeContent()

resnas_308 = computeContent(tabulasi_cat,"cnt","var_st","var_pes")
resprov_308 = computeContent(tabulasi_cat,"cnt","var_st","var_pes",group = "kdprov")

resnas_308
## $ctab
## # A tibble: 3 × 5
##   group    var_st    `1`   `2`  total
##   <chr>    <chr>   <int> <int>  <dbl>
## 1 Nasional 1      171809  7841 179650
## 2 Nasional 2        2554  8555  11109
## 3 Nasional total  174363 16396 190759
## 
## $basic
## # A tibble: 2 × 9
##   group    var_st    vrt    hrz    dig          vh      n   NDR   IOI
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>       <dbl>  <dbl> <dbl> <dbl>
## 1 Nasional      1 179650 174363 171809 31324312950 190759  2.77  40.6
## 2 Nasional      2  11109  16396   8555   182143164 190759 -2.77  40.6
## 
## $agg
## # A tibble: 1 × 9
## # Groups:   group [1]
##   group         n    vrt    hrz    dig          vh AggIOI    GDR   ROA
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>       <dbl>  <dbl>  <dbl> <dbl>
## 1 Nasional 190759 190759 190759 180364 31506456114  0.406 0.0545 0.946
exportCategoric(resnas_308,resprov_308, var = "B3r8 (Kepemilikan Lahan)")
## [1] "Cie ngesavenya berhasil !"