Second Task

Praticum Week 4

library(htmltools)

# 1. Definisi Style (CSS Modern & Aesthetic)
style <- "
  @import url('[https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;800&display=swap](https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;800&display=swap)');

  .canvas {
    display: flex;
    justify-content: center;
    padding: 40px;
    background: #0f172a; /* Dark background */
  }

  .profile-card {
    display: flex;
    align-items: center;
    gap: 30px;
    padding: 40px;
    border-radius: 30px;
    background: rgba(255, 255, 255, 0.05); /* Glass effect */
    backdrop-filter: blur(15px);
    border: 1px solid rgba(255, 255, 255, 0.1);
    box-shadow: 0 25px 50px rgba(0, 0, 0, 0.3);
    max-width: 700px;
    font-family: 'Poppins', sans-serif;
    position: relative;
    overflow: hidden;
  }

  /* Variasi hiasan cahaya di belakang */
  .profile-card::before {
    content: '';
    position: absolute;
    top: -50%;
    left: -50%;
    width: 200%;
    height: 200%;
    background: radial-gradient(circle, rgba(233,30,99,0.1) 0%, transparent 70%);
    z-index: -1;
  }

  .profile-card img {
    width: 160px;
    height: 160px;
    object-fit: cover;
    border-radius: 25px; /* Boxy-round modern */
    transform: rotate(-3deg);
    transition: 0.4s ease;
    border: 2px solid rgba(255, 255, 255, 0.5);
  }

  .profile-card:hover img {
    transform: rotate(0deg) scale(1.05);
  }

  .profile-text {
    flex: 1;
  }

  .profile-text h3 {
    font-size: 28px;
    font-weight: 800;
    margin: 0;
    background: linear-gradient(to right, #ff80b5, #f472b6);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
  }

  .profile-description {
    font-size: 14px;
    font-weight: 300;
    color: #cbd5e1;
    margin-top: 5px;
    margin-bottom: 20px;
    letter-spacing: 1px;
  }

  .mentor-label {
    font-size: 11px;
    text-transform: uppercase;
    color: #94a3b8;
    letter-spacing: 2px;
    margin-bottom: 5px;
    display: block;
  }

  .mentor-box {
    background: rgba(244, 114, 182, 0.1);
    padding: 12px 20px;
    border-radius: 15px;
    display: flex;
    align-items: center;
    gap: 10px;
    border: 1px solid rgba(244, 114, 182, 0.2);
  }

  .mentor-name {
    font-size: 15px;
    font-weight: 600;
    color: #fbcfe8;
  }

  .badge {
    width: 8px;
    height: 8px;
    background: #f472b6;
    border-radius: 50%;
    box-shadow: 0 0 10px #f472b6;
  }
"

# 2. Struktur Tampilan (HTML)
browsable(
  tagList(
    tags$style(style),
    HTML('
      <div class="canvas">
        <div class="profile-card">
          <img src="PSD (chricyesia)/WhatsApp Image 2026-03-13 at 23.43.40.jpeg">
          
          <div class="profile-text">
            <h3>Chricyesia Winnerlady Frexisovara Uvas</h3>
            <div class="profile-description">
              Data Science Student @ ITSB
            </div>
            
            <span class="mentor-label">Mentored By</span>
            <div class="mentor-box">
              <div class="badge"></div>
              <span class="mentor-name">Mr. Bakti Siregar M.Sc., CDS</span>
            </div>
          </div>
        </div>
      </div>
    ')
  )
)

Chricyesia Winnerlady Frexisovara Uvas

Data Science Student @ ITSB
Mentored By
Mr. Bakti Siregar M.Sc., CDS

1 . Praticum

Independent Practice:Conditional Statements and Loops in Python & R

1.1 Objective

  1. Understand and implement Conditional Statements (if,if-else,if-elif-else).
  2. Apply loops (for loop,while loop,break,continue) to analyze a dataset.

Use the following dummy dataset:

library(knitr)

# 1. Membuat dataset dummy (Sesuai Tabel 2.5.1)
employee_data <- data.frame(
  ID = c(1, 2, 3, 4, 5),
  Name = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Age = c(25, 30, 27, 35, 40),
  Salary = c(5000, 7000, 6500, 10000, 12000),
  Position = c("Staff", "Supervisor", "Staff", "Manager", "Director"),
  Performance = c("Good", "Very Good", "Average", "Good", "Very Good"),
  stringsAsFactors = FALSE
)

# Menampilkan tabel utama dengan format yang bersih
kable(employee_data, 
      format = "simple", 
      caption = "Tabel 2.5.1 Dummy Dataset",
      align = "cllllc")
Table 1.1: Tabel 2.5.1 Dummy Dataset
ID Name Age Salary Position Performance
1 Bagas 25 5000 Staff Good
2 Joan 30 7000 Supervisor Very Good
3 Alya 27 6500 Staff Average
4 Dwi 35 10000 Manager Good
5 Nabil 40 12000 Director Very Good
# Membuat dataframe sesuai dengan tabel pada gambar
df_karyawan <- data.frame(
  ID = c(1, 2, 3, 4, 5),
  Name = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Age = c(25, 30, 27, 35, 40),
  Salary = c(5000, 7000, 6500, 10000, 12000),
  Position = c("Staff", "Supervisor", "Staff", "Manager", "Director"),
  Performance = c("Good", "Very Good", "Average", "Good", "Very Good"),
  stringsAsFactors = FALSE
)

# Menampilkan isi dataframe untuk memastikan data sudah benar
print(df_karyawan)
  ID  Name Age Salary   Position Performance
1  1 Bagas  25   5000      Staff        Good
2  2  Joan  30   7000 Supervisor   Very Good
3  3  Alya  27   6500      Staff     Average
4  4   Dwi  35  10000    Manager        Good
5  5 Nabil  40  12000   Director   Very Good

1.2 Conditional Statements

# Kita punya df_karyawan sebagai sumber data utama di sini. Di dalamnya sudah ada variabel nama, jabatan, dan gaji masing-masing orang, jadi kita tinggal mengolah  untuk melihat gambaran besar tim kita.

# 1. Definisikan persentase bonus dalam named vector (seperti kamus/dictionary)
persen_bonus <- c("Very Good" = 0.20, "Good" = 0.10, "Average" = 0.05)

# 2. Iterasi dengan cara yang lebih 'clean'
for (i in 1:nrow(df_karyawan)) {
  
  # Ambil data performa dan gaji
  perf  <- df_karyawan$Performance[i]
  gaji  <- df_karyawan$Salary[i]
  nama  <- df_karyawan$Name[i]
  
  # Ambil nilai bonus berdasarkan key (performa), default ke 0 jika tidak ditemukan
  bonus <- gaji * (persen_bonus[perf] %||% 0)
  
  # Gunakan sprintf untuk format teks yang lebih rapi (mirip bahasa C atau Python)
  cat(sprintf("\"Name: %s, Bonus: %g\"\n", nama, bonus))
}
"Name: Bagas, Bonus: 500"
"Name: Joan, Bonus: 1400"
"Name: Alya, Bonus: 325"
"Name: Dwi, Bonus: 1000"
"Name: Nabil, Bonus: 2400"

1.3 Loops (For & While)

# Kita buat fungsi helper untuk mencetak garis pemisah agar output lebih rapi
print_header <- function(title) {
  cat(sprintf("\n%s\n%s\n", paste(rep("=", 30), collapse = ""), title))
}

# --- No 1: Filter dengan For Loop (Standard) ---
print_header("EMPLOYEES WITH SALARY > 6000")

==============================
EMPLOYEES WITH SALARY > 6000
for (i in 1:nrow(df_karyawan)) {
  with(df_karyawan[i, ], {
    if (Salary > 6000) cat(sprintf("Name: %s, Salary: %g\n", Name, Salary))
  })
}
Name: Joan, Salary: 7000
Name: Alya, Salary: 6500
Name: Dwi, Salary: 10000
Name: Nabil, Salary: 12000
# --- No 2: Dynamic Stop dengan While Loop ---
print_header("SEARCHING FOR MANAGER...")

==============================
SEARCHING FOR MANAGER...
i <- 1
found_manager <- FALSE
while (i <= nrow(df_karyawan) && !found_manager) {
  curr <- df_karyawan[i, ]
  is_manager <- curr$Position == "Manager"
  
  msg <- sprintf("Name: %s, Position: %s%s", 
                 curr$Name, curr$Position, 
                 if(is_manager) " (Stop here)" else "")
  cat(msg, "\n")
  
  if (is_manager) break
  i <- i + 1
}
Name: Bagas, Position: Staff 
Name: Joan, Position: Supervisor 
Name: Alya, Position: Staff 
Name: Dwi, Position: Manager (Stop here) 
# --- No 3: Threshold Break ---
print_header("SALARY CAP ANALYSIS (MAX 10,000)")

==============================
SALARY CAP ANALYSIS (MAX 10,000)
for (i in 1:nrow(df_karyawan)) {
  if (df_karyawan$Salary[i] > 10000) {
    cat(sprintf("!!! (Stopped because %s has a salary above 10,000)\n", df_karyawan$Name[i]))
    break
  }
  cat(sprintf("Name: %s, Salary: %g\n", df_karyawan$Name[i], df_karyawan$Salary[i]))
}
Name: Bagas, Salary: 5000
Name: Joan, Salary: 7000
Name: Alya, Salary: 6500
Name: Dwi, Salary: 10000
!!! (Stopped because Nabil has a salary above 10,000)
# --- No 4: Performance Skip (The 'Next' Logic) ---
print_header("HIGH/GOOD PERFORMANCE ONLY")

==============================
HIGH/GOOD PERFORMANCE ONLY
for (i in 1:nrow(df_karyawan)) {
  if (df_karyawan$Performance[i] == "Average") next 
  
  cat(sprintf("Name: %-6s | Performance: %s\n", 
              df_karyawan$Name[i], df_karyawan$Performance[i]))
}
Name: Bagas  | Performance: Good
Name: Joan   | Performance: Very Good
Name: Dwi    | Performance: Good
Name: Nabil  | Performance: Very Good