Data Analyst & Web Developer
Hi, I'm Yoga! I turn messy data into clear insights, manage databases, and build fast, well-structured web applications. Curious, resourceful, and always focused on practical solutions.
Data Analytics & Web Engineering
Master's
M.Sc. Degree (BINUS)
Multi-Skill
Web & Data Systems
A look at where I've worked and what I've contributed so far.
Total Duration: 1 yr 8 mos
I build, maintain, and optimize modern web applications, making sure they run smoothly and feel fast for every user.
I clean, analyze, and validate data to power business analytics, product catalog optimization, and reports that help teams make confident decisions.
A few projects I'm proud of, spanning data analytics, dashboards, and web development.
Turning raw data into automated business insights with the help of AI and modern formulas. The dashboard updates dynamically to show Total Revenue YTD, Product Quantities, and Regional Sales Trends.
I turned 13,412 rows of messy transaction data into a dashboard that helps the management team make smarter decisions on stock and promotions. The project answers three business questions: which categories and cities drive the most revenue, when sales peak, and how much of the data is invalid.
Rp 1.56B
Total revenue
12,480
Clean orders
Rp 125K
Average order value
+32%
Q4 vs Q3 growth
1. Raw data
Inspected the CSV in Excel and spotted mixed date formats, prices stored as text, inconsistent city names, duplicate orders, and negative quantities.
2. Cleaning
Built a repeatable pandas pipeline. Missing prices were filled with the median per category, leaving 12,480 clean rows.
3. Analysis
Wrote MySQL queries for monthly revenue, average order value, Q4 vs Q3 growth, and category and city contribution.
4. Dashboard
Built Power BI visuals covering KPIs, monthly trends, and sales mix, so management can read them at a glance.
13,412
Starting rows
-418
Duplicates
-371
Cancelled orders
-143
Invalid qty/price
12,480
Clean rows
import pandas as pd
df = pd.read_csv("penjualan_mentah.csv")
# 1. Drop duplicates by order_id
df = df.drop_duplicates(subset="order_id")
# 2. Standardize date formats
df["tgl_order"] = pd.to_datetime(df["tgl_order"], dayfirst=True, errors="coerce")
# 3. Price: strip "Rp" and dots, convert to a number
df["harga"] = (df["harga"].astype(str)
.str.replace(r"[^0-9]", "", regex=True)
.replace("", None).astype(float))
# 4. Standardize text
df["kota"] = df["kota"].str.strip().str.title().replace({"Jkt": "Jakarta"})
df["kategori"] = df["kategori"].str.strip().str.title()
df["status"] = df["status"].str.strip().str.capitalize()
# 5. Fill missing prices with the median per category
df["harga"] = df["harga"].fillna(df.groupby("kategori")["harga"].transform("median"))
# 6. Drop cancelled orders and invalid quantities
df = df[(df["status"] == "Selesai") & (df["qty"] > 0)]
-- Revenue per month
SELECT DATE_FORMAT(tgl_order, '%Y-%m') AS bulan,
COUNT(*) AS jumlah_order,
SUM(qty * harga) AS pendapatan
FROM penjualan_bersih
GROUP BY bulan
ORDER BY bulan;
-- Contribution by category
SELECT kategori,
SUM(qty * harga) AS pendapatan,
ROUND(100 * SUM(qty * harga) /
(SELECT SUM(qty * harga) FROM penjualan_bersih), 1) AS persen
FROM penjualan_bersih
GROUP BY kategori
ORDER BY pendapatan DESC;
Note: this project uses simulated data for portfolio purposes.
I designed and built a modern web platform for the company, deployed on Cloudflare Pages. It loads fast, works beautifully across devices, and showcases the brand clearly.
My academic foundation in Management Information Systems.
Master's degree, Management Information Systems
Bachelor's degree, Management Information Systems
The tools and technologies I use day to day.
Credentials I've earned along the way.
I'd love to hear about your project! I'm open to collaborations in web development, data analytics, and information systems consulting. Say hello anytime.
Location
Jalan Panji, Gang Intan No. 16, Padangsambian Kaja, Denpasar, Bali, Indonesia
Phone / WhatsApp
+62 817-4151-497