Visualisasi Data Hasil Scrapping Jora

G1501231057-MONICA RAHMA FAUZIAH

1 Pendahuluan

Jora adalah mesin pencari pekerjaan global yang tersedia di beberapa negara. Ini menawarkan daftar lengkap peluang pekerjaan dari berbagai sumber, memungkinkan pencari kerja menemukan posting pekerjaan terbaru di satu tempat. Jora mengumpulkan daftar pekerjaan dari berbagai situs web, menyediakan platform terpadu untuk pencari kerja.

Pada project kali ini dilakukan scraping pada website https://jora.com/. Jora adalah platform yang menyediakan informasi tentang lowongan kerja, perusahaan, dan kesempatan karier lainnya. Project ini bertujuan untuk mengumpulkan data dari Jora menggunakan teknik web scraping, yang nantinya akan digunakan untuk analisis dan visualisasi data terkait informasi lowongan kerja dan perusahaan yang tersedia. Proyek ini akan menggunakan teknik web scraping untuk mengumpulkan beberapa informasi yang relevan dari website Jora. Setelah data berhasil dikumpulkan, langkah selanjutnya adalah melakukan analisis data dan membuat visualisasi yang informatif, seperti grafik untuk menggambarkan tren lowongan kerja berdasarkan sektor industri, tingkat pendidikan yang dibutuhkan, atau lokasi pekerjaan yang paling banyak dicari. Visualisasi ini akan membantu dalam memahami dinamika pasar kerja dan memberikan wawasan berharga bagi para pencari kerja dan perusahaan.

Dalam proyek ini, kami melakukan scraping data dari daftar lowongan pekerjaan di Jora Indonesia dengan rincian sebagai berikut:

  • Job Position: Judul atau nama pekerjaan yang diiklankan.
  • Company Name: Nama perusahaan atau pemberi kerja yang menawarkan pekerjaan.
  • Location: Lokasi di mana pekerjaan tersebut berbasis.
  • Job Description: Deskripsi singkat tentang pekerjaan, termasuk tanggung jawab dan persyaratannya.
  • Posting Date: Tanggal ketika lowongan pekerjaan tersebut diposting.

Scraping dilakukan dengan software R menggunakan packages tidyverse sebagai cleaning tools pada data yang telah diambil. Data yang telah discraping dari website akan disimpan dalam MongoDB Atlas dan dijadwalkan setiap hari di jam 01.00 akan diambil secara acak lima data lowongan pekerjaan. Scraping terjadwal dilakukan dengan membuat workflow di Github Action.

2. MongoDB Atlas

library(ggplot2)
library(tidyverse)
library(scales)
library(RColorBrewer)
dataku<-read.csv("D:/datamonic.csv")
glimpse(dataku)
## Rows: 75
## Columns: 6
## $ X_id         <chr> "66584b33d870160ac4006701", "66584b33d870160ac4006702", "…
## $ time_scraped <chr> "2024-05-30T09:47:28.267Z", "2024-05-30T09:47:28.267Z", "…
## $ posisi       <chr> "Administrative Assistants (Administration & Marketing Su…
## $ perusahaan   <chr> "Reine des Mers Training Center", "Pt Manasya Anugerah Se…
## $ lokasi       <chr> "Brontokusuman, Yogyakarta", "Sudimara, Banten", "Jawa", …
## $ deskripsi    <chr> "Minimum 1 year experience in administrative field Good w…

3 Visualisasi Data

3.1 Menghapus Data Duplikat

Sebelum melakukan visualisasi dilihat bahwa terdapat data duplikat dari hasil scrapping sehingga perlu dilakukan penghapusan data duplikat.

# Count the number of entries before removing duplicates
initial_count <- nrow(dataku)

# Remove duplicate entries based on the 'posisi' column
data_clean <- dataku %>% distinct(posisi, .keep_all = TRUE)

# Count the number of entries after removing duplicates
clean_count <- nrow(data_clean)
# Create a data frame for visualization
count_data <- data.frame(
  Condition = c("Before Cleaning", "After Cleaning"),
  Count = c(initial_count, clean_count)
)

3.2 Visualisasi Jumlah Pekerjaan Berdasarkan Lokasi

library(dplyr)
library(ggplot2)
library(forcats)

# Anggap data_clean adalah dataframe yang sudah ada
# Menggabungkan "Jakarta" dan "Jakarta Selatan" ke dalam satu kategori
data_clean <- data_clean %>%
  mutate(lokasi = case_when(
    grepl("Jakarta", lokasi, ignore.case = TRUE) ~ "Jakarta",
    TRUE ~ lokasi
  ))

# Menghitung jumlah pekerjaan per lokasi
top_locations <- data_clean %>%
  group_by(lokasi) %>%
  summarise(jumlah = n()) %>%
  arrange(desc(jumlah)) %>%
  mutate(lokasi = as.character(lokasi))

# Mendapatkan 5 lokasi teratas
top_5_locations <- top_locations %>%
  slice(1:5)

# Mengelompokkan lokasi selain 5 teratas ke dalam kategori "Lainnya"
data_clean <- data_clean %>%
  mutate(lokasi = ifelse(lokasi %in% top_5_locations$lokasi, lokasi, "Lainnya"))

# Membuat plot
ggplot(data_clean, aes(x = fct_infreq(lokasi))) +
  geom_bar(aes(fill = lokasi), color = "black", show.legend = FALSE) +
  labs(title = "Jumlah Pekerjaan Berdasarkan Lokasi",
       x = "Lokasi",
       y = "Jumlah Pekerjaan",
       caption = "Sumber: Hasil Web Scraping") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
    axis.title = element_text(size = 12, face = "bold"),
    plot.caption = element_text(hjust = 0)
  ) +
  geom_text(stat='count', aes(label=..count..), vjust=-0.5)

3.3 Visualisasi Jumlah Pekerjaan Berdasarkan Perusahaan

library(dplyr)
library(ggplot2)
library(forcats)

# Anggap data_clean adalah dataframe yang sudah ada
# Menghitung jumlah pekerjaan per perusahaan
top_companies <- data_clean %>%
  group_by(perusahaan) %>%
  summarise(jumlah = n()) %>%
  arrange(desc(jumlah)) %>%
  mutate(perusahaan = as.character(perusahaan))

# Mendapatkan 5 perusahaan teratas
top_5 <- top_companies %>%
  slice(1:5)

# Mengelompokkan perusahaan selain 5 teratas ke dalam kategori "Lainnya"
data_clean <- data_clean %>%
  mutate(perusahaan = ifelse(perusahaan %in% top_5$perusahaan, perusahaan, "Lainnya"))

# Membuat plot
ggplot(data_clean, aes(x = fct_infreq(perusahaan))) +
  geom_bar(aes(fill = perusahaan), color = "black", show.legend = FALSE) +
  labs(title = "Jumlah Pekerjaan Berdasarkan Perusahaan",
       x = "Perusahaan",
       y = "Jumlah Pekerjaan",
       caption = "Sumber: Hasil Web Scraping") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
    axis.title = element_text(size = 12, face = "bold"),
    plot.caption = element_text(hjust = 0)
  ) +
  geom_text(stat='count', aes(label=..count..), vjust=-0.5)

3.4 Visualisasi Jumlah Pekerjaan Berdasarkan Posisi

# Muat pustaka yang diperlukan
library(ggplot2)
library(dplyr)

# Ubah kolom "perusahaan" menjadi faktor untuk memudahkan plotting
dataku$perusahaan <- as.factor(dataku$perusahaan)

# Frekuensi Posisi Pekerjaan Berdasarkan Perusahaan
posisi_perusahaan_freq <- dataku %>%
  group_by(perusahaan, posisi) %>%
  summarise(count = n()) %>%
  arrange(desc(count))
## `summarise()` has grouped output by 'perusahaan'. You can override using the
## `.groups` argument.
# Ambil 10 perusahaan teratas berdasarkan jumlah posisi
top_10_perusahaan <- posisi_perusahaan_freq %>%
  group_by(perusahaan) %>%
  summarise(total_count = sum(count)) %>%
  arrange(desc(total_count)) %>%
  slice(1:10)

# Filter data untuk 10 perusahaan teratas
filtered_data <- posisi_perusahaan_freq %>%
  filter(perusahaan %in% top_10_perusahaan$perusahaan)

# Plot diagram batang untuk posisi pekerjaan berdasarkan 10 perusahaan teratas
ggplot(filtered_data, aes(x = reorder(perusahaan, -count), y = count, fill = posisi)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  theme_minimal() +
  labs(title = "Frekuensi Posisi Pekerjaan Berdasarkan 10 Perusahaan Teratas", x = "Perusahaan", y = "Jumlah", fill = "Posisi") +
  theme(legend.position = "bottom")

3.5 visualisasi posisi pekerjaan berdasarkan perusahaan dan lokasi

# Muat pustaka yang diperlukan
library(ggplot2)
library(dplyr)

# Ubah kolom "perusahaan" dan "lokasi" menjadi faktor untuk memudahkan plotting
dataku$perusahaan <- as.factor(dataku$perusahaan)
dataku$lokasi <- as.factor(dataku$lokasi)

# Frekuensi Posisi Pekerjaan Berdasarkan Perusahaan dan Lokasi
posisi_perusahaan_lokasi_freq <- dataku %>%
  group_by(perusahaan, lokasi) %>%
  summarise(count = n()) %>%
  arrange(desc(count))
## `summarise()` has grouped output by 'perusahaan'. You can override using the
## `.groups` argument.
# Ambil 10 perusahaan teratas berdasarkan jumlah posisi
top_10_perusahaan <- posisi_perusahaan_lokasi_freq %>%
  group_by(perusahaan) %>%
  summarise(total_count = sum(count)) %>%
  arrange(desc(total_count)) %>%
  slice(1:10)

# Filter data untuk 10 perusahaan teratas
filtered_data <- posisi_perusahaan_lokasi_freq %>%
  filter(perusahaan %in% top_10_perusahaan$perusahaan)

# Plot diagram batang untuk posisi pekerjaan berdasarkan perusahaan dan lokasi
ggplot(filtered_data, aes(x = reorder(perusahaan, -count), y = count, fill = lokasi)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  theme_minimal() +
  labs(title = "Frekuensi Posisi Pekerjaan Berdasarkan Perusahaan dan Lokasi (10 Perusahaan Teratas)", 
       x = "Perusahaan", y = "Jumlah", fill = "Lokasi") +
  theme(legend.position = "bottom")

3.6 word cloud untuk posisi jabatan

# Load necessary libraries
library(ggplot2)
library(dplyr)
library(wordcloud)
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
# Read the data
data<-read.csv("D:/datamonic.csv")

# Prepare data for word cloud of job positions
positions <- tolower(data$posisi)
positions_corpus <- Corpus(VectorSource(positions))
positions_corpus <- tm_map(positions_corpus, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(positions_corpus, content_transformer(tolower)):
## transformation drops documents
positions_corpus <- tm_map(positions_corpus, removePunctuation)
## Warning in tm_map.SimpleCorpus(positions_corpus, removePunctuation):
## transformation drops documents
positions_corpus <- tm_map(positions_corpus, removeNumbers)
## Warning in tm_map.SimpleCorpus(positions_corpus, removeNumbers): transformation
## drops documents
positions_corpus <- tm_map(positions_corpus, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(positions_corpus, removeWords,
## stopwords("english")): transformation drops documents
positions_corpus <- tm_map(positions_corpus, stripWhitespace)
## Warning in tm_map.SimpleCorpus(positions_corpus, stripWhitespace):
## transformation drops documents
positions_dtm <- TermDocumentMatrix(positions_corpus)
positions_matrix <- as.matrix(positions_dtm)
positions_freq <- sort(rowSums(positions_matrix), decreasing = TRUE)

# Plot the word cloud for job positions
wordcloud(names(positions_freq), positions_freq, scale = c(4, 0.5), max.words = 200, colors = brewer.pal(8, "Dark2"))