Praktikum 03 - Tugas Satria June Adwendi
Tugas untuk Praktikum 03 ini adalah :
• Tugas Praktikum 3.a
Praktikkan penggunaan inner_join(), left_join(), right_join(), full_join(), semi_join(), anti_join() untuk menggabungkan 2 buat table dari database chinook.db atau Northwind_large.sqlite
• Tugas Praktikum 3.b:
Buat satu Peta dari daerah Anda masing-masing (Kecamatan, Kabupaten), Anda bebas menggunakan data apapun.
• Tugas dikerjakan dengan rmarkdown dan dipublish di rpubs masing-masing, yang dikumpulkan di newlms berupa file html, jangan lupa, sertakan url rpubs di file html yang dikumpulkan di newlms.
Database Queries with R
Database Queries Beberapa package yang digunakan untuk bekerja dengan database menggunakan R software adalah:
DBI berfungsi memisahkan konektivitas ke DBMS menjadi “front-end” dan “back-end”. Aplikasi hanya menggunakan API front-end yang terbuka. Fasilitas back-end yang berkomunikasi dengan DBMS tertentu (SQLite, MySQL, PostgreSQL, MonetDB, dll.) disediakan oleh driver (package lain) yang dipanggil secara otomatis.
dplyr dan dbplyr memiliki SQL back-end yang digeneralisasi untuk bisa bekerja dengan database.
odbc menyediakan antarmuka yang sesuai dengan DBI untuk driver Open Database Connectivity (ODBC). Hal ini memungkinkan koneksi yang efisien dan mudah diatur ke database apa pun dengan driver ODBC yang tersedia, termasuk SQL Server, Oracle, MySQL, PostgreSQL, SQLite, dan lainnya.
Connection to Database
Melakukan koneksi terhadap database pada R software adalah dengan menggunakan syntax berikut:
install.packages(c("RSQLite", "DBI"), dependencies = TRUE)Memanggil package yang akan digunakan:
library(tidyverse)## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(RSQLite)## Warning: package 'RSQLite' was built under R version 4.0.4
library(DBI)## Warning: package 'DBI' was built under R version 4.0.4
Database yang akan digunakan pada praktikum ini adalah database Northwind_large.sqlite
#Koneksi ke database yang akan digunakan
NWl <- DBI::dbConnect(RSQLite::SQLite(), "C:/sqlite/db/Northwind_large.sqlite")
class(NWl)## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
Syntax di atas tidak membaca data ke dalam R seperti halnya fungsi read_csv() melainkan berupa instruksi kepada R untuk mengkoneksikan database SQLite yang terdapat pada file Northwind
Selanjutnya, fungsi dbListTables dapat digunakan untuk melihat tables yang terdapat di dalam database. Berikut daftar tabel yang ada di dalam database chinook:
RSQLite::dbListTables(NWl)## [1] "Category" "Customer" "CustomerCustomerDemo"
## [4] "CustomerDemographic" "Employee" "EmployeeTerritory"
## [7] "Order" "OrderDetail" "Product"
## [10] "ProductDetails_V" "Region" "Shipper"
## [13] "Supplier" "Territory"
Combining Multiple Tables
#Mengakses tabel pada database
(NSupplier <- dplyr::tbl(NWl,"Supplier"))## # Source: table<Supplier> [?? x 12]
## # Database: sqlite 3.34.1 [C:\sqlite\db\Northwind_large.sqlite]
## Id CompanyName ContactName ContactTitle Address City Region PostalCode
## <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 Exotic Liq~ Charlotte ~ Purchasing ~ 49 Gil~ Lond~ Briti~ EC1 4SD
## 2 2 New Orlean~ Shelley Bu~ Order Admin~ P.O. B~ New ~ North~ 70117
## 3 3 Grandma Ke~ Regina Mur~ Sales Repre~ 707 Ox~ Ann ~ North~ 48104
## 4 4 Tokyo Trad~ Yoshi Naga~ Marketing M~ 9-8 Se~ Tokyo Easte~ 100
## 5 5 Cooperativ~ Antonio de~ Export Admi~ Calle ~ Ovie~ South~ 33007
## 6 6 Mayumi's Mayumi Ohno Marketing R~ 92 Set~ Osaka Easte~ 545
## 7 7 Pavlova, L~ Ian Devling Marketing M~ 74 Ros~ Melb~ Victo~ 3058
## 8 8 Specialty ~ Peter Wils~ Sales Repre~ 29 Kin~ Manc~ Briti~ M14 GSD
## 9 9 PB Knäckeb~ Lars Peter~ Sales Agent Kaload~ Göte~ North~ S-345 67
## 10 10 Refrescos ~ Carlos Diaz Marketing M~ Av. da~ Sao ~ South~ 5442
## # ... with more rows, and 4 more variables: Country <chr>, Phone <chr>,
## # Fax <chr>, HomePage <chr>
#Mengakses tabel pada database
(NEmployee <- dplyr::tbl(NWl,"Employee"))## # Source: table<Employee> [?? x 18]
## # Database: sqlite 3.34.1 [C:\sqlite\db\Northwind_large.sqlite]
## Id LastName FirstName Title TitleOfCourtesy BirthDate HireDate Address
## <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 Davolio Nancy Sale~ Ms. 1980-12-~ 2024-05~ 507 - ~
## 2 2 Fuller Andrew Vice~ Dr. 1984-02-~ 2024-08~ 908 W.~
## 3 3 Leverli~ Janet Sale~ Ms. 1995-08-~ 2024-04~ 722 Mo~
## 4 4 Peacock Margaret Sale~ Mrs. 1969-09-~ 2025-05~ 4110 O~
## 5 5 Buchanan Steven Sale~ Mr. 1987-03-~ 2025-10~ 14 Gar~
## 6 6 Suyama Michael Sale~ Mr. 1995-07-~ 2025-10~ Covent~
## 7 7 King Robert Sale~ Mr. 1992-05-~ 2026-01~ Edgeha~
## 8 8 Callahan Laura Insi~ Ms. 1990-01-~ 2026-03~ 4726 -~
## 9 9 Dodswor~ Anne Sale~ Ms. 1998-01-~ 2026-11~ 7 Houn~
## # ... with 10 more variables: City <chr>, Region <chr>, PostalCode <chr>,
## # Country <chr>, HomePhone <chr>, Extension <chr>, Photo <blob>, Notes <chr>,
## # ReportsTo <int>, PhotoPath <chr>
Tabel yang akan digunakan adalah tabel Supplier dan Employee. Pada tabel Supplier hanya akan digunakan variabel CompanyName, dan City. Sementara, pada tabel Employee hanya akan digunakan variabel LastName Title dan City.
#Tabel Supplier yang akan digunakan
(NS2 <- tibble (data.frame (NSupplier %>% select(CompanyName, City))))## # A tibble: 29 x 2
## CompanyName City
## <chr> <chr>
## 1 Exotic Liquids London
## 2 New Orleans Cajun Delights New Orleans
## 3 Grandma Kelly's Homestead Ann Arbor
## 4 Tokyo Traders Tokyo
## 5 Cooperativa de Quesos 'Las Cabras' Oviedo
## 6 Mayumi's Osaka
## 7 Pavlova, Ltd. Melbourne
## 8 Specialty Biscuits, Ltd. Manchester
## 9 PB Knäckebröd AB Göteborg
## 10 Refrescos Americanas LTDA Sao Paulo
## # ... with 19 more rows
#Tabel Employe yang akan digunakan
(NE3 <- tibble (data.frame(NEmployee %>% select(LastName, Title, City))))## # A tibble: 9 x 3
## LastName Title City
## <chr> <chr> <chr>
## 1 Davolio Sales Representative Seattle
## 2 Fuller Vice President, Sales Tacoma
## 3 Leverling Sales Representative Kirkland
## 4 Peacock Sales Representative Redmond
## 5 Buchanan Sales Manager London
## 6 Suyama Sales Representative London
## 7 King Sales Representative London
## 8 Callahan Inside Sales Coordinator Seattle
## 9 Dodsworth Sales Representative London
Penggunaan inner_join()
Fungsi inner_join() akan menghasilkan semua baris pada tabel x yang memiliki kesamaan nilai dengan tabel y, dan semua kolom dari x dan y.
inner_join(NS2, NE3, by="City")## # A tibble: 4 x 4
## CompanyName City LastName Title
## <chr> <chr> <chr> <chr>
## 1 Exotic Liquids London Buchanan Sales Manager
## 2 Exotic Liquids London Suyama Sales Representative
## 3 Exotic Liquids London King Sales Representative
## 4 Exotic Liquids London Dodsworth Sales Representative
Penggunaan left_join()
Fungsi left_join() akan menghasilkan semua baris pada tabel x, dan semua kolom pada x dan y, dimana untuk baris pada tabel x yang tidak memiliki kesamaan dengan tabel y akan diisi dengan nilai NA pada kolom yang baru.
left_join(NS2, NE3, by="City")## # A tibble: 32 x 4
## CompanyName City LastName Title
## <chr> <chr> <chr> <chr>
## 1 Exotic Liquids London Buchanan Sales Manager
## 2 Exotic Liquids London Suyama Sales Representative
## 3 Exotic Liquids London King Sales Representative
## 4 Exotic Liquids London Dodsworth Sales Representative
## 5 New Orleans Cajun Delights New Orleans <NA> <NA>
## 6 Grandma Kelly's Homestead Ann Arbor <NA> <NA>
## 7 Tokyo Traders Tokyo <NA> <NA>
## 8 Cooperativa de Quesos 'Las Cabras' Oviedo <NA> <NA>
## 9 Mayumi's Osaka <NA> <NA>
## 10 Pavlova, Ltd. Melbourne <NA> <NA>
## # ... with 22 more rows
Penggunaan right_join()
Fungsi right_join() akan menghasilkan semua baris pada tabel y, dan semua kolom pada tabel x dan y, dimana untuk baris pada tabel y yang tidak memiliki kesamaan dengan tabel x akan diisi dengan nilai NA pada kolom yang baru.
right_join(NS2, NE3, by="City")## # A tibble: 9 x 4
## CompanyName City LastName Title
## <chr> <chr> <chr> <chr>
## 1 Exotic Liquids London Buchanan Sales Manager
## 2 Exotic Liquids London Suyama Sales Representative
## 3 Exotic Liquids London King Sales Representative
## 4 Exotic Liquids London Dodsworth Sales Representative
## 5 <NA> Seattle Davolio Sales Representative
## 6 <NA> Tacoma Fuller Vice President, Sales
## 7 <NA> Kirkland Leverling Sales Representative
## 8 <NA> Redmond Peacock Sales Representative
## 9 <NA> Seattle Callahan Inside Sales Coordinator
Penggunaan full_join()
Fungsi full_join() akan menghasilkan semua baris dan kolom dari tabel x dan y. Jika ada nilai yang tidak sama antara tabel x dan y, maka akan bernilai NA.
full_join(NS2, NE3, by="City")## # A tibble: 37 x 4
## CompanyName City LastName Title
## <chr> <chr> <chr> <chr>
## 1 Exotic Liquids London Buchanan Sales Manager
## 2 Exotic Liquids London Suyama Sales Representative
## 3 Exotic Liquids London King Sales Representative
## 4 Exotic Liquids London Dodsworth Sales Representative
## 5 New Orleans Cajun Delights New Orleans <NA> <NA>
## 6 Grandma Kelly's Homestead Ann Arbor <NA> <NA>
## 7 Tokyo Traders Tokyo <NA> <NA>
## 8 Cooperativa de Quesos 'Las Cabras' Oviedo <NA> <NA>
## 9 Mayumi's Osaka <NA> <NA>
## 10 Pavlova, Ltd. Melbourne <NA> <NA>
## # ... with 27 more rows
Penggunaan semi_join()
Fungsi semi_join() akan menghasilkan semua baris pada tabel x yang memiliki kesamaan nilai dengan tabel y, dan semua kolom dari tabel x. Mirip dengan inner_join(), hanya saja pada inner_join() mengembalikan semua kolom dari tabel x dan y.
semi_join(NS2, NE3, by="City")## # A tibble: 1 x 2
## CompanyName City
## <chr> <chr>
## 1 Exotic Liquids London
Penggunaan anti_join()
Fungsi anti_join() akan menghasilkan semua baris dari tabel x yang TIDAK memiliki kesamaan dengan tabel y, dan semua kolom yang berasal dari tabel x.
anti_join(NS2, NE3, by="City")## # A tibble: 28 x 2
## CompanyName City
## <chr> <chr>
## 1 New Orleans Cajun Delights New Orleans
## 2 Grandma Kelly's Homestead Ann Arbor
## 3 Tokyo Traders Tokyo
## 4 Cooperativa de Quesos 'Las Cabras' Oviedo
## 5 Mayumi's Osaka
## 6 Pavlova, Ltd. Melbourne
## 7 Specialty Biscuits, Ltd. Manchester
## 8 PB Knäckebröd AB Göteborg
## 9 Refrescos Americanas LTDA Sao Paulo
## 10 Heli Süßwaren GmbH & Co. KG Berlin
## # ... with 18 more rows
Spatial Data
Instal Package
install.packages("rgdal")
install.packages("gdtools")
install.packages("kableExtra")
install.packages("sf")
install.packages("tigris")Library yang digunakan:
library(rgdal)## Warning: package 'rgdal' was built under R version 4.0.4
## Loading required package: sp
## rgdal: version: 1.5-23, (SVN revision 1121)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.2.1, released 2020/12/29
## Path to GDAL shared files: C:/Users/ADWENDI/OneDrive/Documents/R/win-library/4.0/rgdal/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 7.2.1, January 1st, 2021, [PJ_VERSION: 721]
## Path to PROJ shared files: C:/Users/ADWENDI/OneDrive/Documents/R/win-library/4.0/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.4-5
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
## Overwritten PROJ_LIB was C:/Users/ADWENDI/OneDrive/Documents/R/win-library/4.0/rgdal/proj
library(sf)## Warning: package 'sf' was built under R version 4.0.4
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(ggplot2)
library(tigris)## Warning: package 'tigris' was built under R version 4.0.4
## To enable
## caching of data, set `options(tigris_use_cache = TRUE)` in your R script or .Rprofile.
library(dplyr)
library(tidyverse)Memasukan Data SHP
adm3 <- "D:/S2 Bismillah/02_SEMESTER 1/_STA581 SAINS DATA/PRAKTIKUM/idn_adm_bps_20200401_shp/idn_admbnda_adm3_bps_20200401.shp"
adm3 <- st_read(adm3)## Reading layer `idn_admbnda_adm3_bps_20200401' from data source `D:\S2 Bismillah\02_SEMESTER 1\_STA581 SAINS DATA\PRAKTIKUM\idn_adm_bps_20200401_shp\idn_admbnda_adm3_bps_20200401.shp' using driver `ESRI Shapefile'
## Simple feature collection with 7069 features and 16 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 95.01079 ymin: -11.00762 xmax: 141.0194 ymax: 6.07693
## geographic CRS: WGS 84
glimpse(adm3) # unutuk tahu seperti apa file SHP tersebut di R## Rows: 7,069
## Columns: 17
## $ Shape_Leng <dbl> 0.2798656, 0.7514001, 0.6900061, 0.6483629, 0.2437073, 1...
## $ Shape_Area <dbl> 0.003107633, 0.016925540, 0.024636382, 0.010761277, 0.00...
## $ ADM3_EN <chr> "2 X 11 Enam Lingkung", "2 X 11 Kayu Tanam", "Abab", "Ab...
## $ ADM3_PCODE <chr> "ID1306050", "ID1306052", "ID1612030", "ID5107050", "ID7...
## $ ADM3_REF <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
## $ ADM3ALT1EN <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
## $ ADM3ALT2EN <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
## $ ADM2_EN <chr> "Padang Pariaman", "Padang Pariaman", "Penukal Abab Lema...
## $ ADM2_PCODE <chr> "ID1306", "ID1306", "ID1612", "ID5107", "ID7471", "ID943...
## $ ADM1_EN <chr> "Sumatera Barat", "Sumatera Barat", "Sumatera Selatan", ...
## $ ADM1_PCODE <chr> "ID13", "ID13", "ID16", "ID51", "ID74", "ID94", "ID94", ...
## $ ADM0_EN <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Ind...
## $ ADM0_PCODE <chr> "ID", "ID", "ID", "ID", "ID", "ID", "ID", "ID", "ID", "I...
## $ date <date> 2019-12-20, 2019-12-20, 2019-12-20, 2019-12-20, 2019-12...
## $ validOn <date> 2020-04-01, 2020-04-01, 2020-04-01, 2020-04-01, 2020-04...
## $ validTo <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((100.2811 -0..., MULTIPOLYGO...
Memasukan Data File CSV
Data yang digunakan adalah jumlah penduduk Kota Manado berdasarkan Kecamatan
# Input Data
#tabel manado
pendudukmanado <- read.csv("D:/S2 Bismillah/02_SEMESTER 1/_STA581 SAINS DATA/PRAKTIKUM/pendudukmanado.csv", header=TRUE, sep=",")
pendudukmanado## kecamatan kodekecamatan penduduk
## 1 Bunaken ID7171053 21740
## 2 Bunaken Kepulauan ID7171054 6167
## 3 Malalayang ID7171010 57319
## 4 Mapanget ID7171040 53716
## 5 Paal Dua ID7171032 42488
## 6 Sario ID7171020 24456
## 7 Singkil ID7171051 48248
## 8 Tikala ID7171031 29693
## 9 Tuminting ID7171052 51539
## 10 Wanea ID7171021 56509
## 11 Wenang ID7171030 36031
#tabel sulawesi utara
pendudukmanadoindo <- read.csv("D:/S2 Bismillah/02_SEMESTER 1/_STA581 SAINS DATA/PRAKTIKUM/pendudukmanadoindonesia.csv", header=TRUE, sep=",")Merge Data
Merge Data dilakukan dengan membandingkan primary key antara Spatial Data (Admin3 hasil import file SHP) dan Data Frame (penduduk hasil Import File CSV).
# Merge Data
mergependuduk <- geo_join(spatial_data=adm3, data_frame=pendudukmanado, by_sp="ADM3_PCODE",
by_df="kodekecamatan", how = "inner")
mergependuduk## Simple feature collection with 11 features and 18 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 124.6813 ymin: 1.429394 xmax: 124.9336 ymax: 1.649242
## geographic CRS: WGS 84
## First 10 features:
## Shape_Leng Shape_Area ADM3_EN ADM3_PCODE ADM3_REF ADM3ALT1EN
## 1 0.31622460 0.0025846925 Bunaken ID7171053 <NA> <NA>
## 2 0.37983155 0.0015202973 Bunaken Kepulauan ID7171054 <NA> <NA>
## 3 0.21428259 0.0013495132 Malalayang ID7171010 <NA> <NA>
## 4 0.35565022 0.0043182665 Mapanget ID7171040 <NA> <NA>
## 5 0.19362944 0.0009143825 Paal Dua ID7171032 <NA> <NA>
## 6 0.08430001 0.0001592974 Sario ID7171020 <NA> <NA>
## 7 0.10301963 0.0003878210 Singkil ID7171051 <NA> <NA>
## 8 0.14986550 0.0004954714 Tikala ID7171031 <NA> <NA>
## 9 0.11751331 0.0003841142 Tuminting ID7171052 <NA> <NA>
## 10 0.15553400 0.0006956120 Wanea ID7171021 <NA> <NA>
## ADM3ALT2EN ADM2_EN ADM2_PCODE ADM1_EN ADM1_PCODE ADM0_EN
## 1 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 2 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 3 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 4 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 5 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 6 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 7 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 8 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 9 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## 10 <NA> Kota Manado ID7171 Sulawesi Utara ID71 Indonesia
## ADM0_PCODE date validOn validTo kecamatan penduduk
## 1 ID 2019-12-20 2020-04-01 <NA> Bunaken 21740
## 2 ID 2019-12-20 2020-04-01 <NA> Bunaken Kepulauan 6167
## 3 ID 2019-12-20 2020-04-01 <NA> Malalayang 57319
## 4 ID 2019-12-20 2020-04-01 <NA> Mapanget 53716
## 5 ID 2019-12-20 2020-04-01 <NA> Paal Dua 42488
## 6 ID 2019-12-20 2020-04-01 <NA> Sario 24456
## 7 ID 2019-12-20 2020-04-01 <NA> Singkil 48248
## 8 ID 2019-12-20 2020-04-01 <NA> Tikala 29693
## 9 ID 2019-12-20 2020-04-01 <NA> Tuminting 51539
## 10 ID 2019-12-20 2020-04-01 <NA> Wanea 56509
## geometry
## 1 MULTIPOLYGON (((124.8207 1....
## 2 MULTIPOLYGON (((124.7442 1....
## 3 MULTIPOLYGON (((124.8263 1....
## 4 MULTIPOLYGON (((124.9067 1....
## 5 MULTIPOLYGON (((124.8786 1....
## 6 MULTIPOLYGON (((124.838 1.4...
## 7 MULTIPOLYGON (((124.8673 1....
## 8 MULTIPOLYGON (((124.8515 1....
## 9 MULTIPOLYGON (((124.8466 1....
## 10 MULTIPOLYGON (((124.8489 1....
mergependuduk2 <- geo_join(spatial_data=adm3, data_frame=pendudukmanadoindo, by_sp="ADM3_PCODE",
by_df="kodekecamatan", how = "inner")Atur Warna
mycol <- c("#ffcccc", "#ff6666", "#ff4d4d", "#e60000")Menampilkan Peta
#Peta manado by kecataman dan jumlah penduduk manado
petapenduduk<-ggplot()+
geom_sf(data=mergependuduk, aes(fill=penduduk))+
scale_fill_gradientn(colours=mycol)+theme(axis.text = element_text(size = 5))+
labs(title="Jumlah Penduduk Kota Manado Berdasarkan Kecamatan Tahun 2020")
petapenduduk#peta provinsi sulawesi Utara by kecamatan dan jumlah penduduk manado
petapenduduk2<-ggplot()+
geom_sf(data=mergependuduk2, aes(fill=penduduk))+
scale_fill_gradientn(colours=mycol)+theme(axis.text = element_text(size = 5))+
labs(title="Jumlah Penduduk Kota Manado Berdasarkan Kecamatan Tahun 2020")
petapenduduk2Demikian, Terima Kasih
Satria June Adwendi, IPB University, sjadwendi@apps.ipb.ac.id↩︎