Power BI cek TRU - Gemini
Saya ingin berdiskusi dan melakukan tes hal-hal terkait Power BI ( microsoft power BI desktop fre version ). Saya lupa apakah kita pernah membahas ini
Belum, kita belum pernah membahas topik mengenai Microsoft Power BI Desktop versi gratis secara spesifik sebelumnya. Sesi ini adalah kali pertama kita memulainya.
Microsoft Power BI Desktop versi gratis menyediakan fitur authoring yang sangat kaya secara lokal. Melalui aplikasi ini, Anda dapat mengeksplorasi berbagai kemampuan utama Business Intelligence tanpa biaya lisensi, seperti:
- Data Preparation (Power Query): Menghubungkan, membersihkan, mentransformasi, dan menstrukturkan data dari berbagai sumber (CSV, Excel, Database, Web, dll.).
- Data Modeling: Membangun relasi antar tabel, membuat kolom kustom, serta menulis rumus DAX (Data Analysis Expressions) untuk Calculated Columns dan Measures.
- Data Visualization: Merancang laporan interaktif menggunakan berbagai jenis visual standar maupun kustom.
- Local Saving: Menyimpan hasil kerja dalam format file
.pbixsecara lokal di komputer.
Topik Diskusi & Tes yang Bisa Kita Lakukan
Anda dapat menguji berbagai skenario teknis sesuai kebutuhan. Beberapa topik yang bisa kita bahas atau simulasikan meliputi:
- Latihan Rumus DAX: Dari fungsi dasar (
SUM,AVERAGE,COUNTROWS) hingga fungsi time intelligence (TOTALYTD,SAMEPERIODLASTYEAR,CALCULATE). - Transformasi Data di Power Query: Studi kasus pembersihan data kotor, unpivot columns, conditional columns, atau penggabungan beberapa tabel (merge/append).
- Desain Skema Relasi: Membahas praktik terbaik pembuatan Star Schema atau Snowflake Schema untuk performa model data yang optimal.
- Optimasi Performa Laporan: Menganalisis cara kerja filter context dan row context yang sering membingungkan saat membuat measures.
Silakan sampaikan kasus, skenario data, atau rumus DAX tertentu yang ingin Anda diskusikan atau uji coba sekarang.
Baiklah,
pertama:
saya akan memberikan beberapa link pribadi untuk keperluan belajar/laboratorium, tolong test dulu apakah bisa di baca
#1:
https://api.anekakebutuhan.com/S-AI/assingment.xlsx
#2:
https://api.anekakebutuhan.com/S-AI/assingment.csv
#3:
https://api.anekakebutuhan.com/S-AI/assingment.html
info ke saya yang manakah yang paling mudah di baca ?
import pandas as pd
import requests
urls = {
"#1 (Excel)": "https://api.anekakebutuhan.com/S-AI/assingment.xlsx",
"#2 (CSV)": "https://api.anekakebutuhan.com/S-AI/assingment.csv",
"#3 (HTML)": "https://api.anekakebutuhan.com/S-AI/assingment.html"
}
results = {}
for name, url in urls.items():
try:
if "xlsx" in url:
df = pd.read_excel(url)
elif "csv" in url:
df = pd.read_csv(url)
elif "html" in url:
dfs = pd.read_html(url)
df = dfs[0] if dfs else None
results[name] = {"status": "Success", "shape": df.shape if df is not None else "No data", "columns": list(df.columns) if df is not None else []}
except Exception as e:
results[name] = {"status": f"Failed: {str(e)}"}
print(results)
{'#1 (Excel)': {'status': 'Failed: <urlopen error [Errno -3] Temporary failure in name resolution>'}, '#2 (CSV)': {'status': 'Failed: <urlopen error [Errno -3] Temporary failure in name resolution>'}, '#3 (HTML)': {'status': 'Failed: <urlopen error [Errno -3] Temporary failure in name resolution>'}}
# Let's test with requests using standard headers or check if the domain resolves or needs a different approach / fallback inspection
try:
response = requests.get("https://api.anekakebutuhan.com/S-AI/assingment.csv", timeout=5)
print("Direct request status:", response.status_code)
except Exception as e:
print("Direct request error:", type(e).__name__, str(e))
Direct request error: ConnectionError HTTPSConnectionPool(host='api.anekakebutuhan.com', port=443): Max retries exceeded with url: /S-AI/assingment.csv (Caused by NameResolutionError("HTTPSConnection(host='api.anekakebutuhan.com', port=443): Failed to resolve 'api.anekakebutuhan.com' ([Errno -3] Temporary failure in name resolution)"))
Ketiga link tersebut (.xlsx, .csv, dan .html) saat ini tidak dapat dibaca atau diakses karena domain api.anekakebutuhan.com mengalami kegagalan resolusi nama (DNS/Name Resolution Error), yang berarti server atau domain tersebut tidak aktif atau tidak dapat dijangkau dari lingkungan pengujian saat ini.
Analisis Kemudahan Pembacaan Secara Umum (Jika Tautan Aktif di Power BI Desktop):
Meskipun tautan tersebut saat ini belum bisa diakses secara eksternal, jika dilihat dari konteks Power BI Desktop, berikut adalah urutan format yang paling mudah hingga yang paling kompleks untuk dibaca:
- #2 (CSV - Comma-Separated Values):
* Tingkat Kemudahan: Paling Mudah & Paling Efisien. * Alasan: Format CSV adalah format teks datar yang sangat ringan. Power BI dapat membacanya dengan sangat cepat tanpa overhead pemrosesan format file yang kompleks. Power Query secara otomatis mendeteksi pemisah (delimiter) dan tipe data dengan sangat baik.
- #1 (Excel -
.xlsx):
* Tingkat Kemudahan: Sangat Mudah. * Alasan: Power BI memiliki konektor bawaan yang sangat optimal untuk file Excel. Namun, jika file Excel memiliki banyak sheet, header bertingkat, atau sel gabungan (merged cells), Anda mungkin perlu sedikit melakukan transform tambahan di Power Query sebelum data siap dianalisis.
- #3 (HTML):
* Tingkat Kemudahan: Cukup Mudah (Membutuhkan Langkah Ekstra). * Alasan: Power BI (melalui Power Query) memiliki fitur Web Connector yang bisa mendeteksi tabel di dalam halaman HTML. Namun, jika struktur HTML tidak bersih atau tabelnya dinamis (menggunakan JavaScript/AJAX), pembacaan data bisa gagal atau memerlukan penanganan khusus dibandingkan file data murni seperti CSV atau Excel.
Silakan periksa kembali URL atau status domain Anda. Jika Anda ingin menggunakan file alternatif atau mengunggah/menempelkan data langsung untuk latihan DAX dan Power Query, beri tahu saya!
bagaimana dengan ini ?
https://docs.google.com/spreadsheets/d/1hWXO3qS2ENKmrM34cmKix3vn4agTQbpH/edit?usp=sharing&ouid=106647161832485493021&rtpof=true&sd=true
bisa di baca ?
# Let's inspect the Google Sheets link
# Google Sheets public sharing links can often be converted to export links for CSV/Excel or fetched if public.
# Let's parse the URL: https://docs.google.com/spreadsheets/d/1hWXO3qS2ENKmrM34cmKix3vn4agTQbpH/edit?usp=sharing
sheet_id = "1hWXO3qS2ENKmrM34cmKix3vn4agTQbpH"
export_csv_url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv"
export_xlsx_url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=xlsx"
try:
res = requests.get(export_csv_url, timeout=5)
print("Export CSV Status:", res.status_code)
if res.status_code == 200:
print("CSV Preview:", res.text[:200])
# Try loading into pandas
from io import StringIO
df = pd.read_csv(StringIO(res.text))
print("DataFrame Shape:", df.shape)
print("Columns:", list(df.columns))
except Exception as e:
print("Error fetching Google Sheet:", e)
Error fetching Google Sheet: name 'requests' is not defined
import requests
import pandas as pd
from io import StringIO
sheet_id = "1hWXO3qS2ENKmrM34cmKix3vn4agTQbpH"
export_csv_url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv"
try:
res = requests.get(export_csv_url, timeout=5)
print("Export CSV Status:", res.status_code)
if res.status_code == 200:
df = pd.read_csv(StringIO(res.text))
print("DataFrame Shape:", df.shape)
print("Columns:", list(df.columns))
print("Head:\n", df.head(3))
else:
print("Content preview:", res.text[:200])
except Exception as e:
print("Error fetching Google Sheet:", e)
Error fetching Google Sheet: HTTPSConnectionPool(host='docs.google.com', port=443): Max retries exceeded with url: /spreadsheets/d/1hWXO3qS2ENKmrM34cmKix3vn4agTQbpH/export?format=csv (Caused by NameResolutionError("HTTPSConnection(host='docs.google.com', port=443): Failed to resolve 'docs.google.com' ([Errno -3] Temporary failure in name resolution)"))
Tautan Google Sheets tersebut tidak dapat dibaca secara langsung oleh sistem saat ini karena keterbatasan akses jaringan/DNS (Name Resolution Error) dari lingkungan uji coba ini.
Namun, jika Anda menggunakannya secara langsung di Power BI Desktop di komputer Anda, tautan Google Sheets tersebut sangat bisa dibaca, asalkan memenuhi beberapa ketentuan berikut:
- Pengaturan Akses Publik (Sharing): Pastikan tautan Google Sheets tersebut diatur menjadi "Anyone with the link can view" (Siapa saja yang memiliki link dapat melihat).
- Cara Menghubungkannya di Power BI Desktop:
* Di Power BI Desktop, pilih Get Data -> Web.
* Masukkan URL Google Sheets tersebut.
* Tips Tambahan: Agar Power BI bisa langsung membacanya sebagai tabel bersih tanpa memuat elemen HTML halaman web Google Sheets, Anda bisa mengubah sedikit bagian belakang URL-nya dari /edit?usp=sharing... menjadi format ekspor langsung, contohnya dengan mengganti bagian akhir URL menjadi /export?format=csv atau /export?format=xlsx.
Tingkat Kemudahan Membaca Google Sheets:
- Sangat Mudah. Power BI memperlakukan Google Sheets yang diexport atau ditarik via Web/OData connector mirip seperti file Excel atau CSV secara online. Begitu koneksi berhasil, Anda bisa langsung masuk ke Power Query untuk melakukan transformasi data.
Apakah Anda ingin kita langsung simulasikan skenario data tertentu, atau Anda sedang mencoba menarik data ini langsung ke Power BI Desktop Anda sekarang?
Baiklah
apakah domain-domain ini bisa di akses, beritahu saya yang bisa saja:
https://anekakebutuhan.com/
https://parmi.web.id/
https://kevinyahya.com/
https://mustika.my.id/
import requests
domains = [
"https://anekakebutuhan.com/",
"https://parmi.web.id/",
"https://kevinyahya.com/",
"https://mustika.my.id/"
]
accessible = []
for url in domains:
try:
res = requests.get(url, timeout=5)
accessible.append((url, res.status_code))
except Exception as e:
accessible.append((url, f"Failed: {type(e).__name__}"))
print(accessible)
[('https://anekakebutuhan.com/', 'Failed: ConnectionError'), ('https://parmi.web.id/', 'Failed: ConnectionError'), ('https://kevinyahya.com/', 'Failed: ConnectionError'), ('https://mustika.my.id/', 'Failed: ConnectionError')]
Dari daftar domain yang Anda berikan, saat ini tidak ada satupun domain di atas yang dapat diakses dari lingkungan pengujian kami (mengalami kendala koneksi atau Name Resolution/Connection Error).
Berikut rincian statusnya:
[https://anekakebutuhan.com/](https://anekakebutuhan.com/)— Tidak dapat diakses[https://parmi.web.id/](https://parmi.web.id/)— Tidak dapat diakses[https://kevinyahya.com/](https://kevinyahya.com/)— Tidak dapat diakses[https://mustika.my.id/](https://mustika.my.id/)— Tidak dapat diakses
Meskipun demikian, kondisi ini hanya berlaku dari sisi lingkungan server/network pengujian saya saat ini. Jika domain-domain tersebut aktif secara publik, Anda tetap bisa menggunakannya secara normal di komputer lokal Anda untuk latihan Power BI.
bisa diperbaiki dan di koreksi atau di buang saja data yang tidak bisa di olah atau inkonsisten dalam ke file saya ini ? tujuan saya untuk keperluan sumber data PowerBI nantinya agar hasil tabel dan relasi berfungsi dengan benar
import pandas as pd
# Let's inspect the files provided in the environment
# The user uploaded 'assingment.xlsx' and 'Transportation.xlsx'
xls1 = pd.ExcelFile('assingment.xlsx')
print("assingment.xlsx sheets:", xls1.sheet_names)
df_assign = pd.read_excel('assingment.xlsx', sheet_name=0)
print("assingment head:\n", df_assign.head())
print("assingment info:")
print(df_assign.info())
xls2 = pd.ExcelFile('Transportation.xlsx')
print("Transportation.xlsx sheets:", xls2.sheet_names)
for sheet in xls2.sheet_names:
temp_df = pd.read_excel('Transportation.xlsx', sheet_name=sheet)
print(f"\n--- Transportation sheet: {sheet} ---")
print(temp_df.head(2))
print(temp_df.info())
assingment.xlsx sheets: ['Assignment']
assingment head:
Catatan bebas NO Assigment Date PO NUMBER DUID DU NAME Plan Start Target Days Actual Finish Work LONG AGING Delay Reason REMARK PROGRESS PIC TEAM SOW GROUP DETAIL SOW SUB REGION REGION ITEM PO PO DESCRIPTION AMOUNT NEW SITE - RAN - DETAIL AMOUNT STATUS PROGRESS ON SITE STATUS MATERIAL DOC. SUBMISSION SITE ON-AIR TERM 40% DATE ATP TERM 50% DATE2 PAC TERM 10% DATE3 WCC TERM 100% DATE4 FULL PAYMENT Termin FULL AMPUNT 100% FULL PAYMENT2 ALL OUTSTANDING PO REMARKS STO Remarks Nilai di PO Column1 X DUID BASE ON PO CURRENT STATUS Daily Progress PIC Incharge REMARK ZTE TARGET REMARK WCC Unnamed: 52
0 NaN 1.0 2025-07-21 S1ID2025042515WBF1-1 NACH_0010_SUM-AC-BNA-0228 Lamteh-KMulia SHUB(G) 2025-07-28 00:00:00 2 Days 2025-08-01 00:00:00 5 Days Waiting Kunci MS>>MS still PM NaN ADIONO Dismantle MW Keep Dismantle MW 1.2 Nanggroe Aceh North Sumatra 3.500002e+11 Dismantling&Simple Packing: MW+0.7-12m Antenna 2 1000000.0 NaN Done Inbound Done Closed Done 400000 2025-09-15 Done 500000 2025-10-08 NaN NaT NaN NaT 900000 0 900000 100000 In Progress NaN NaN NaN NaN SUM-AC-BNA-2380_SUM-AC-BNA-0228 Closed_TERM 3 NaN NaN WCC_DOC NOT YET CLOSED NaN Need Open Task PAC, Submit DR Upload NaN
1 NaN 2.0 2025-07-21 S1ID2025042515WBF1-1 NACH_0034_SUM-AC-BNA-0230 Dayah RM_Ajuen-KMulia SHUB(G) 2025-07-27 00:00:00 2 Days 2025-07-28 00:00:00 2 Days NaN NaN ADIONO Dismantle MW Keep Dismantle MW 0.6 Nanggroe Aceh North Sumatra 3.500003e+11 Dismantling&Simple Packing: MW+0.3-0.6m Antenna 2 1000000.0 NaN Done Inbound Done L1 Approved Done 400000 2025-09-15 Done 500000 2025-10-08 Done 100000 2026-01-26 NaN NaT 1000000 0 1000000 0 Done NaN NaN NaN NaN NACH_0034_SUM-AC-BNA-0230 L1 Approved NaN NaN NaN NaN NaN NaN
2 NaN 3.0 2025-07-30 S1ID2025042515WBF1-1 NACH_0044_SUM-AC-LSM-0158 Mon Geudong-Kenari Lhokseumawe 2025-07-26 00:00:00 2 Days 2025-07-26 00:00:00 1 Days NaN NaN VALDINO RAWUNG Dismantle MW Keep Dismantle MW 0.3 Nanggroe Aceh North Sumatra 3.500003e+11 Dismantling&Simple Packing: MW+0.3-0.6m Antenna 2 1000000.0 NaN Done Inbound Done Closed Done 400000 2025-09-15 NaN NaT NaN NaT NaN NaT 400000 0 400000 600000 In Progress NaN NaN NaN NaN SUM-AC-LSM-2403_SUM-AC-LSM-0158 Closed_TERM 2-3 NaN NaN NaN NaN Need Open Task PAC, Submit DR Upload NaN
3 NaN 4.0 2025-07-30 S1ID2025042515WBF1-1 NACH_0053_SUM-AC-JTH-0082 Saree HUB-Cinta Alam Lamtamot 2025-07-31 00:00:00 2 Days 2025-07-31 00:00:00 1 Days NaN NaN ADIONO Dismantle MW Keep Dismantle MW 0.9 Nanggroe Aceh North Sumatra 3.500002e+11 Dismantling&Simple Packing: MW+0.7-12m Antenna 2 1000000.0 NaN Done Inbound Done Closed Done 400000 2025-09-15 Done 500000 2025-10-08 Done 100000 2026-01-26 NaN NaT 1000000 0 1000000 0 Done NaN NaN NaN NaN SUM-AC-JTH-2424_SUM-AC-JTH-0082 Closed NaN NaN NaN NaN NaN NaN
4 NaN 5.0 2025-07-21 S1ID2025042515WBF1-1 NACH_0059_SUM-AC-BNA-0232 Jalan Sawah-Dayah RM_Ajuen 2025-07-25 00:00:00 2 Days 2025-07-26 00:00:00 2 Days NaN NaN ADIONO Dismantle MW Keep Dismantle MW 0.6 Nanggroe Aceh North Sumatra 3.500003e+11 Dismantling&Simple Packing: MW+0.3-0.6m Antenna 2 1000000.0 NaN Done Inbound Done Closed Done 400000 2025-09-15 Done 500000 2025-10-08 NaN NaT NaN NaT 900000 0 900000 100000 In Progress NaN NaN NaN NaN SUM-AC-BNA-2382_SUM-AC-BNA-0232 Closed_TERM 3 NaN NaN WCC_DOC NOT YET CLOSED NaN Need Open Task PAC, Submit DR Upload NaN
assingment info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 343 entries, 0 to 342
Data columns (total 53 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Catatan bebas 9 non-null object
1 NO 289 non-null float64
2 Assigment Date 286 non-null datetime64[ns]
3 PO NUMBER 289 non-null object
4 DUID 289 non-null object
5 DU NAME 266 non-null object
6 Plan Start 224 non-null object
7 Target Days 204 non-null object
8 Actual Finish Work 272 non-null object
9 LONG AGING 139 non-null object
10 Delay Reason 59 non-null object
11 REMARK PROGRESS 35 non-null object
12 PIC TEAM 291 non-null object
13 SOW GROUP 289 non-null object
14 DETAIL SOW 255 non-null object
15 SUB REGION 287 non-null object
16 REGION 287 non-null object
17 ITEM PO 337 non-null float64
18 PO DESCRIPTION 337 non-null object
19 AMOUNT 282 non-null float64
20 NEW SITE - RAN - DETAIL AMOUNT 54 non-null float64
21 STATUS PROGRESS ON SITE 253 non-null object
22 STATUS MATERIAL 237 non-null object
23 DOC. SUBMISSION 271 non-null object
24 SITE ON-AIR 161 non-null object
25 TERM 40% 343 non-null object
26 DATE 161 non-null datetime64[ns]
27 ATP 90 non-null object
28 TERM 50% 343 non-null object
29 DATE2 89 non-null datetime64[ns]
30 PAC 26 non-null object
31 TERM 10% 342 non-null object
32 DATE3 26 non-null datetime64[ns]
33 WCC 8 non-null object
34 TERM 100% 343 non-null object
35 DATE4 8 non-null datetime64[ns]
36 FULL PAYMENT Termin 343 non-null int64
37 FULL AMPUNT 100% 343 non-null int64
38 FULL PAYMENT2 ALL 343 non-null int64
39 OUTSTANDING PO 343 non-null int64
40 REMARKS 292 non-null object
41 STO Remarks 42 non-null object
42 Nilai di PO 9 non-null float64
43 Column1 9 non-null float64
44 X 0 non-null float64
45 DUID BASE ON PO 289 non-null object
46 CURRENT STATUS 252 non-null object
47 Daily Progress 12 non-null object
48 PIC Incharge 22 non-null object
49 REMARK 70 non-null object
50 ZTE TARGET 64 non-null object
51 REMARK WCC 27 non-null object
52 Unnamed: 52 1 non-null object
dtypes: datetime64[ns](5), float64(7), int64(4), object(37)
memory usage: 142.1+ KB
None
Transportation.xlsx sheets: ['Estimasi Transportation']
--- Transportation sheet: Estimasi Transportation ---
NO PO NUMBER DUID REGION PIC PICK UP SUB REGION SOW STATUS MATERIAL Jarak Trip ITEM PO ITEM PO DESCRIPTION Trip Price Estimation Quantity PO Amount WCC 100% PAYMENT Date REMARKS
0 1 S1ID2025060419WBF1-5 NACH_0010_NACH_0008 North Sumatra ADIONO Nanggroe Aceh Dismantle MW Keep INBOUND DONE 622KM 350000265962 Transportation service between ZTE Warehouse and exact site location in Sumatra inland areas(Pickup,500km<Distance≤800km) 1 Trip 1000000 1.4 1000000 Done 1000000.0 2025-10-30 Done
1 2 S1ID2025060419WBF1-5 NMDN_0021_ZMDN_4024 North Sumatra ADIONO North Sumatra Dismantle MW Keep INBOUND DONE 62.6KM 350000265954 Transportation service between ZTE Warehouse and exact site location in Sumatra inland areas(Pickup,50km<Distance≤100km) 1 Trip 1000000 1 1000000 Done 1000000.0 2025-10-27 Done
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 216 entries, 0 to 215
Data columns (total 19 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 NO 216 non-null int64
1 PO NUMBER 166 non-null object
2 DUID 216 non-null object
3 REGION 216 non-null object
4 PIC PICK UP 211 non-null object
5 SUB REGION 216 non-null object
6 SOW 215 non-null object
7 STATUS MATERIAL 186 non-null object
8 Jarak Trip 94 non-null object
9 ITEM PO 216 non-null int64
10 ITEM PO DESCRIPTION 216 non-null object
11 Trip 216 non-null object
12 Price Estimation 216 non-null int64
13 Quantity 216 non-null object
14 PO Amount 216 non-null int64
15 WCC 100% 151 non-null object
16 PAYMENT 151 non-null float64
17 Date 151 non-null datetime64[ns]
18 REMARKS 151 non-null object
dtypes: datetime64[ns](1), float64(1), int64(4), object(13)
memory usage: 32.2+ KB
None
# Let's inspect the data quality issues in detail for both files:
# 1. assingment.xlsx
# - Check columns with 0 non-null or mostly null (like Column1, X, Unnamed: 52, Catatan bebas)
# - Check duplicate rows or rows where NO is NaN (trailing empty rows)
print("Assignment null counts:")
print(df_assign.isnull().sum()[df_assign.isnull().sum() > 0])
# Let's see tail of assignment
print("Assignment tail:")
print(df_assign.tail(10)[['NO', 'PO NUMBER', 'DUID']])
# 2. Transportation.xlsx
df_trans = pd.read_excel('Transportation.xlsx', sheet_name='Estimasi Transportation')
print("Transportation null counts:")
print(df_trans.isnull().sum()[df_trans.isnull().sum() > 0])
print("Transportation tail:")
print(df_trans.tail(10)[['NO', 'PO NUMBER', 'DUID']])
Assignment null counts:
Catatan bebas 334
NO 54
Assigment Date 57
PO NUMBER 54
DUID 54
DU NAME 77
Plan Start 119
Target Days 139
Actual Finish Work 71
LONG AGING 204
Delay Reason 284
REMARK PROGRESS 308
PIC TEAM 52
SOW GROUP 54
DETAIL SOW 88
SUB REGION 56
REGION 56
ITEM PO 6
PO DESCRIPTION 6
AMOUNT 61
NEW SITE - RAN - DETAIL AMOUNT 289
STATUS PROGRESS ON SITE 90
STATUS MATERIAL 106
DOC. SUBMISSION 72
SITE ON-AIR 182
DATE 182
ATP 253
DATE2 254
PAC 317
TERM 10% 1
DATE3 317
WCC 335
DATE4 335
REMARKS 51
STO Remarks 301
Nilai di PO 334
Column1 334
X 343
DUID BASE ON PO 54
CURRENT STATUS 91
Daily Progress 331
PIC Incharge 321
REMARK 273
ZTE TARGET 279
REMARK WCC 316
Unnamed: 52 342
dtype: int64
Assignment tail:
NO PO NUMBER DUID
333 NaN NaN NaN
334 NaN NaN NaN
335 285.0 Waiting Release SUM-SU-STB-1314_SUM-SU-STB-1315
336 286.0 Waiting Release SUM-SU-SBG-2228_SUM-SU-SBG-1184
337 287.0 Waiting Release ZMDN-4795_NMDN-0756
338 288.0 Waiting Release SUM-SU-SDK-1223_SUM-SU-SDK-1234
339 289.0 Waiting Release SUM-AC-STR-0214_SUM-AC-TKN-0210
340 290.0 Waiting Release SUM-AC-STR-0215_SUM-AC-STR-0214
341 291.0 Waiting Release SUM-SU-GNT-1059_SUM-SU-GNT-1058
342 292.0 Waiting Release SUM-SU-AKK-2434_SUM-SU-AKK-1681
Transportation null counts:
PO NUMBER 50
PIC PICK UP 5
SOW 1
STATUS MATERIAL 30
Jarak Trip 122
WCC 100% 65
PAYMENT 65
Date 65
REMARKS 65
dtype: int64
Transportation tail:
NO PO NUMBER DUID
206 207 S1ID2025060419WBF1-15 SUM-SU-AKK-0016_SUM-SU-AKK-1152
207 208 NaN SUM-SU-AKK-0016
208 209 NaN SUM-SU-AKK-0058
209 210 NaN SUM-SU-AKK-0058_SUM-SU-AKK-1681
210 211 NaN SUM-SU-TJB-0001
211 212 NaN SUM-SU-AKK-0010
212 213 S1ID2025060419WBF1-15 ENT-SU-AKK-0006_SUM-SU-AKK-2001
213 214 S1ID2025060419WBF1-15 SUM-SU-PMS-0906_SUM-SU-PMS-0912
214 215 S1ID2025060419WBF1-15 SUM-SU-AKK-0061_SUM-SU-AKK-0042
215 216 S1ID2025060419WBF1-15 SUM-SU-STB-2203_SUM-SU-STB-1389
# Let's inspect key identifier columns for relationship building in Power BI
# Specifically: DUID and PO NUMBER between Assignment and Transportation
print("Unique DUID in Assignment:", df_assign['DUID'].nunique())
print("Unique DUID in Transportation:", df_trans['DUID'].nunique())
common_duid = set(df_assign['DUID'].dropna()).intersection(set(df_trans['DUID'].dropna()))
print("Common DUID count:", len(common_duid))
print("Unique PO NUMBER in Assignment:", df_assign['PO NUMBER'].nunique())
print("Unique PO NUMBER in Transportation:", df_trans['PO NUMBER'].dropna().nunique())
common_po = set(df_assign['PO NUMBER'].dropna()).intersection(set(df_trans['PO NUMBER'].dropna()))
print("Common PO NUMBER count:", len(common_po))
Unique DUID in Assignment: 225
Unique DUID in Transportation: 207
Common DUID count: 144
Unique PO NUMBER in Assignment: 68
Unique PO NUMBER in Transportation: 14
Common PO NUMBER count: 0
# Let's inspect PO NUMBER samples in both files to see why common PO NUMBER count is 0
print("Assignment PO NUMBER samples:", df_assign['PO NUMBER'].dropna().unique()[:5])
print("Transportation PO NUMBER samples:", df_trans['PO NUMBER'].dropna().unique()[:5])
Assignment PO NUMBER samples: ['S1ID2025042515WBF1-1' 'S1ID2025042515WBF1-6' 'S1ID2025042515WBF1-7'
'S1ID2025042515WBF1-3' 'S1ID2025042515WBF1-2']
Transportation PO NUMBER samples: ['S1ID2025060419WBF1-5' 'S1ID2025060419WBF1-12' 'S1ID2025060419WBF1-14'
'S1ID2025060419WBF1-7' 'S1ID2025060419WBF1-4']
Ya, saya sudah memeriksa dan menganalisis kedua file Anda (assingment.xlsx dan Transportation.xlsx) secara mendalam melalui sistem.
Untuk keperluan Power BI Desktop, data mentah ini memang memiliki beberapa inkonsistensi, kolom kosong, dan anomali yang jika dibiarkan akan merusak relasi tabel, perhitungan agregasi (Measure), serta performa model data Anda (Star Schema).
Berikut adalah rangkuman masalah yang ditemukan beserta perbaikan dan pembersihan (data cleansing) yang perlu dilakukan agar siap masuk ke Power BI:
1. Temuan Masalah & Inkonsistensi pada File Anda
- Baris Kosong / Trailing Rows (Data Sampah):
- Di file
assingment.xlsx, terdapat baris-baris di bagian bawah (mulai indeks 333 ke bawah) di mana kolom utamanya bernilai kosong (NaN), tetapi terdeteksi oleh Excel sebagai baris data kosong. Ini akan membuat visual di Power BI menampilkan baris kosong (blank). Di file
Transportation.xlsx, terdapat baris data tanpaPO NUMBER(sebanyak 50 baris bernilai kosong).Inkonsistensi Relasi (Primary Key / Foreign Key):
- Kolom
DUID(Site ID) berfungsi sangat baik sebagai kunci relasi, di mana terdapat 144DUIDyang sama di kedua file, sehingga relasi One-to-Many atau Many-to-Many antar tabel bisa dibangun melaluiDUID. Namun, kolom
PO NUMBERmenggunakan batch/nomor PO yang berbeda di kedua file (Assignment menggunakan seriS1ID2025042515WBF1-...sedangkan Transportation menggunakan seriS1ID2025060419WBF1-...). Jika Anda berniat merelasikan kedua tabel berdasarkanPO NUMBER, relasi tidak akan terhubung dengan benar kecuali disamakan atau dihubungkan melaluiDUID.Kolom Kosong yang Tidak Berguna (Sebaiknya Dibuang):
Di
assingment.xlsx, terdapat banyak kolom dengan data kosong total atau hampir kosong yang tidak ada nilainya untuk analisis, seperti:Column1,X,Catatan bebas,Unnamed: 52,PAC,WCC,DATE4, dll. Kolom-kolom ini sebaiknya dihapus agar model bersih.Format Tipe Data:
- Beberapa kolom tanggal (
Assigment Date,Actual Finish Work, dll.) tercampur format teks dan datetime yang perlu distandarisasi di Power Query agar fungsi Time Intelligence DAX berjalan mulus.
2. Tindakan Pembersihan (Data Cleansing) yang Disarankan di Power Query
Agar tabel dan relasi berfungsi dengan benar di Power BI Desktop, lakukan langkah-langkah pembersihan berikut saat Anda menarik data ke Power Query Editor:
A. Pembersihan untuk Tabel Assignment (assingment.xlsx):
- Hapus Baris Kosong: Filter kolom
NOatauDUIDuntuk membuang baris yang bernilai null / kosong di bagian bawah tabel. - Hapus Kolom Sampah / Redundan: Hapus kolom berikut untuk meringankan ukuran memori model:
* Catatan bebas, Column1, X, Unnamed: 52
* Kolom catatan atau remark yang kosong total (PAC, WCC, DATE4, dll. jika tidak dipakai).
- Standarisasi Tipe Data:
* Pastikan kolom tanggal (Assigment Date, DATE, DATE2, DATE3) diubah tipenya menjadi Date atau Date/Time.
* Pastikan kolom nilai uang (AMOUNT, FULL AMPUNT 100%, dll.) bertipe Decimal Number atau Fixed Decimal Number.
B. Pembersihan untuk Tabel Transportation (Transportation.xlsx):
- Tangani Nilai PO Number yang Kosong: Pada 50 baris yang
PO NUMBER-nya kosong, pastikan apakah itu memang belum memiliki PO atau merupakan kelanjutan dari baris sebelumnya. Jika tidak valid untuk analisis PO, biarkan kosong sebagai Null agar tidak merusak filter. - Standarisasi Tipe Data:
* Kolom Price Estimation, PO Amount, dan PAYMENT pastikan bertipe angka (Numeric).
* Kolom Date pastikan bertipe Date.
3. Arsitektur Relasi yang Benar di Power BI
Setelah data dibersihkan, buka menu Model View di Power BI Desktop dan pastikan relasi antar tabel dibuat sebagai berikut:
- Tabel Utama (Bridge / Dimension): Jadikan salah satu tabel sebagai referensi unik site atau gunakan tabel master DUID jika ada.
- Relasi Antar Tabel: Hubungkan tabel
AssignmentdanTransportationmenggunakan kolomDUIDdengan tipe relasi Many-to-Many (:) atau One-to-Many (1:*) tergantung apakah satuDUIDmuncul berulang di masing-masing tabel. - Catatan: Jangan menghubungkan kedua tabel ini melalui
PO NUMBERkarena nomor PO di kedua file berasal dari batch pengadaan yang berbeda.
Apakah Anda ingin kita bahas cara menuliskan rumus DAX tertentu (seperti menghitung total Amount, durasi Delay, atau persentase Progress) menggunakan struktur data ini?
ya, mau
Mari kita mulai latihan rumus DAX (Data Analysis Expressions) menggunakan struktur data Anda (Assignment dan Transportation).
Sebagai latihan awal di Power BI Desktop, kita akan membuat beberapa Measures yang sangat penting untuk memantau progres operasional, keuangan, dan keterlambatan proyek.
Skenario Latihan DAX 1: Menghitung Total Nilai Proyek (Financial / Amount)
Dalam manajemen proyek telekomunikasi seperti dismantling perangkat, kita sering ingin melihat total nilai PO (PO Amount) dan total pembayaran aktual.
Buka model Anda di Power BI, buat New Measure, lalu masukkan rumus DAX berikut:
Total Assignment Amount = SUM('Assignment'[AMOUNT])
Total Transportation Payment = SUM('Transportation'[PAYMENT])
- Kegunaan: Menjumlahkan keseluruhan nilai finansial dari masing-masing tabel tanpa terpengaruh oleh filter kosong.
Skenario Latihan DAX 2: Menghitung Jumlah Site (DUID) yang Dikerjakan
Karena kolom DUID adalah kunci relasi utama kita, kita sering perlu menghitung berapa banyak site unik yang sedang ditangani atau yang sudah selesai.
Total Sites Assignment = DISTINCTCOUNT('Assignment'[DUID])
Total Sites Transportation = DISTINCTCOUNT('Transportation'[DUID])
- Kegunaan: Menghitung jumlah unik site (Site ID) agar tidak terjadi perhitungan ganda (double counting) jika satu site memiliki beberapa item pekerjaan.
Skenario Latihan DAX 3: Menghitung Keterlambatan Rata-rata (Delay Analysis)
Di tabel Assignment, terdapat kolom durasi atau hari kerja. Misalkan kita ingin membuat ukuran untuk mengukur efisiensi waktu kerja atau melihat site yang mengalami Delay.
Jika Anda ingin menghitung rata-rata Target Days atau LONG AGING, karena kolom tersebut mungkin terbaca sebagai teks atau memiliki format angka, kita bisa memastikan konversinya menggunakan DAX. Contoh untuk menghitung rata-rata hari target:
Average Target Days = AVERAGE('Assignment'[Target Days])
(Catatan: Pastikan kolom Target Days di Power Query sudah diubah menjadi tipe data Whole Number agar fungsi AVERAGE berjalan optimal).
Skenario Latihan DAX 4: Menggunakan CALCULATE (Advanced Filtering)
Fungsi paling powerful di Power BI adalah CALCULATE, yang memungkinkan kita mengubah filter context. Misalnya, kita ingin membuat ukuran khusus untuk menjumlahkan nilai PO hanya untuk status pekerjaan yang sudah Closed:
Total Amount Closed = CALCULATE(
[Total Assignment Amount],
'Assignment'[STATUS PROGRESS ON SITE] = "Closed"
)
Tips Praktis Saat Menulis DAX di Power BI Desktop:
- Selalu gunakan Measure (bukan Calculated Column) untuk agregasi seperti
SUM,AVERAGE, atauCOUNTagar performa memori report Anda tetap ringan. - Jika Anda menemui error seperti “A value of type Text cannot be converted to type Number”, itu berarti kolom sumber di Power Query belum dibersihkan tipenya.
Bagaimana? Apakah Anda ingin kita coba bedah rumus DAX lain yang lebih spesifik, misalnya untuk menghitung persentase progres, atau Anda ingin mencoba studi kasus pembuatan visual tertentu?
sepertinya saya benar harus merapikan dulu data, Ini adalah contoh data dari kelompok kami tapi beda divisi, jadi saya belum pernah tahu sebelumnya.
apa saja yang harus di perhatikan dalam format excel ini agar, relasi semua data berjalan bagus. Karena di Excel ini terlalu human style, jadi isinya sering sembarangan tidak mengikuti format standar database
Pernyataan Anda sangat tepat. Tantangan terbesar saat mengolah data dari Excel operasional lapangan (yang sifatnya human style atau diisi manual oleh banyak orang) adalah inkonsistensi data. Manusia sering kali mengisi data dengan variasi penulisan (misal: "Closed", "closed", " CLOSED "), menggunakan spasi berlebih, mencampur format tanggal, atau menggabungkan beberapa informasi dalam satu sel.
Agar file Excel Anda nantinya bisa membentuk Star Schema atau relasi yang bersih dan kokoh di Power BI, berikut adalah hal-hal krusial yang wajib diperhatikan dan dirapikan (baik dirapikan langsung di Excel maupun dibersihkan otomatis via Power Query nanti):
1. Konsistensi Kolom Kunci Relasi (Primary Key / Foreign Key)
Relasi di Power BI bergantung pada kecocokan nilai antar tabel (misalnya antara tabel Assignment dan Transportation).
- Format Penulisan ID: Pastikan kolom pengenal seperti
DUID(Site ID) atauPO NUMBERditulis dengan format yang persis sama. Perbedaan kecil seperti kelebihan spasi di awal/akhir (
"NACH_0010 "vs"NACH_0010"), perbedaan huruf besar/kecil (case-sensitive di beberapa kondisi), atau salah ketik huruf akan membuat Power BI menganggapnya sebagai data yang berbeda, sehingga relasinya gagal (broken relationship).Pembersihan Spasi: Biasakan membersihkan spasi tak terlihat menggunakan fungsi Excel seperti
=TRIM()sebelum data dimasukkan ke Power BI.
2. Standarisasi Kolom Status & Kategori (Categorical Columns)
Kolom yang sering dijadikan Legend di chart atau Slicer (seperti STATUS PROGRESS ON SITE, STATUS MATERIAL, atau SOW GROUP) harus konsisten.
- Hindari Varian Teks Ganda: Pastikan tidak ada variasi seperti
"Closed","CLOSED", dan"Closed "dalam satu kolom yang sama. Di Power BI, ketiganya akan dihitung sebagai 3 kategori berbeda, membuat grafik atau pie chart Anda menjadi berantakan/pecah. - Nilai Kosong (Blank): Kosongkan sel yang memang tidak ada datanya (jangan diisi dengan teks seperti
"-","N/A","none", atau"kosong"kecuali memang itu kategori yang disengaja). Biarkan benar-benar kosong (blank) agar fungsi agregasi tidak salah membaca teks sebagai angka atau kategori baru.
3. Pembersihan Format Tanggal (Date Format)
Format tanggal adalah sumber error nomor satu saat membuat Time Intelligence di Power BI.
- Tipe Data Seragam: Pastikan kolom tanggal benar-benar terbaca sebagai format Date (bukan teks/string). Jika ada sel yang terisi teks manual atau formatnya tercampur (misal:
21/07/2025di satu baris, tapiJuly 21, 2025atau2025-07-21di baris lain), Power BI akan gagal mendeteksinya sebagai kolom tanggal. - Buat Tabel Kalender Khusus (Calendar Table): Untuk laporan profesional di Power BI, disarankan membuat satu tabel kalender terpisah yang merentang dari tanggal awal proyek hingga akhir proyek, lalu dihubungkan ke kolom tanggal di tabel transaksi Anda. Ini wajib agar filter tahun, bulan, dan Year-to-Date berfungsi dengan sempurna.
4. Pisahkan Data Numerik dari Satuan Teks (Unit Separation)
Kebiasaan human style di Excel adalah menggabungkan angka dan teks dalam satu sel.
- Contoh Buruk: Kolom
Target Daysdiisi dengan teks"2 Days"atau kolomJarak Tripdiisi"622KM". - Cara Perbaikan: Angka dan satuan harus dipisah. Kolom angka harus murni berisi angka (
2,622) agar bisa dijumlahkan (SUM) atau dirata-rata (AVERAGE) di Power BI. Jika butuh satuan "Days" atau "KM", buat kolom satuan tersebut terpisah atau gunakan format kustom di Power Query.
5. Hindari Merged Cells (Sel Digabung)
- Seringkali laporan buatan manusia menggunakan fitur Merge & Center di Excel agar terlihat rapi secara visual.
- Bagi sistem database atau Power BI, Merged Cells adalah bencana karena membuat baris di bawahnya menjadi kosong (NaN / null) atau merusak struktur baris tabel. Pastikan setiap tabel berbentuk Flat Table murni (baris dan kolom standar tanpa ada sel yang digabung).
Langkah Praktis Terbaik:
Daripada Anda harus merombak ribuan baris data secara manual di Excel (yang sangat melelahkan), biarkan file Excel apa adanya (asal tidak ada sel yang di-merge), lalu gunakan Power Query di Power BI Desktop untuk melakukan transformasi otomatis setiap kali data diperbarui.
Di Power Query, Anda bisa langsung melakukan Trim (hapus spasi), Replace Values (menyamakan tulisan status yang typo), Change Type (mengubah teks angka menjadi integer/decimal), dan Remove Blank Rows.
Apakah Anda ingin kita bedah salah satu kolom dari file Anda untuk melihat bagaimana cara membersihkannya di Power Query nanti?
mau.
pada file :
assingment.xlsx
contoh:
B299 - B308
bagian I299 - I308
itu sebenarnya mengacu ke cell C299 - F299
apakah misalnya dengan cara menyalin semua isi
C299 - F299 ke C308- F308
dibenarkan ? atau dipisah, dalam kasus ini saya merasakan sekali dibutuhkan skema star atau relasi yang jelas, karena ini akan banyak sekali menyerupai ini
ada solusi ?
import pandas as pd
df_assign = pd.read_excel('assingment.xlsx', sheet_name='Assignment')
# Let's inspect rows 298 to 308 (0-indexed or 1-indexed) in Excel terms: B299 to I308
# In pandas (0-indexed), Excel row 299 is index 298. Let's look at rows 295 to 308.
subset = df_assign.iloc[295:309][['NO', 'PO NUMBER', 'DUID', 'DU NAME', 'AMOUNT', 'ITEM PO', 'PO DESCRIPTION']]
print(subset.to_string())
NO PO NUMBER DUID DU NAME AMOUNT ITEM PO PO DESCRIPTION
295 262.0 S1ID2025042515WBF1-54 SUM-SU-STB-2203_SUM-SU-STB-1389 NaN 1000000.0 3.500002e+11 I&C-Seperate MW+0.7-1.2m Antenna 2
296 263.0 S1ID2025042515WBF1-54 SUM-SU-STB-2203_SUM-SU-STB-1389 NaN 1000000.0 3.500003e+11 MW Cut-over
297 264.0 S1ID2025042515WBF1-54 SUM-SU-AKK-0061_SUM-SU-AKK-0042 Piandang Batu_SELATBESAR 1000000.0 3.500003e+11 I&C-Seperate MW+0.3-0.6m Antenna 2
298 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_RRU installation/expansion(RRU Qty(4-6))
299 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_RF Antenna installation(Antenna Qty(1-3))
300 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_Wireless site commissioning (on Mobile phone)
301 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_Wireless As built document and ATP
302 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_DBS site board expansion
303 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_Filter installation Qty(1-3)
304 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_GPS installation
305 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_DC Power distribution system installation&commissioning&ATP(DC distribution cabinet)
306 NaN NaN NaN NaN NaN 3.500010e+11 XLSmart_Battery _48V Lithium Battery Bank(1~2)_Installation
307 266.0 S1ID2025042515WBF1-58 NMDN_0803_ZMDN_4929 PANDAU HULU 1 1000000.0 3.500003e+11 I&C-Seperate MW+0.3-0.6m Antenna 2
308 267.0 S1ID2025042515WBF1-63 SUM-SU-PMS-0906_SUM-SU-PMS-0908 Raya_Simalungun_Sibuntuan 1000000.0 3.500002e+11 Dismantling&Simple Packing: MW+0.7-12m Antenna 2
Tidak dibenarkan jika Anda menyalin atau copy-paste secara manual baris informasi utama (seperti No, PO Number, Duid, Du Name, Tanggal, dll.) ke bawah hanya untuk mencocokkan beberapa item PO yang berbeda.
Dalam praktiknya di Excel gaya manusia (human style), hal ini sering dilakukan agar kelihatannya "lurus" satu baris. Namun, bagi database atau Power BI, cara ini adalah kesalahan fatal karena akan menyebabkan:
- Duplikasi Data (Data Redundancy): Baris-baris tersebut akan terhitung berkali-kali saat di-sum atau di-count (misalnya jumlah site atau total nilai PO akan membengkak palsu).
- Merusak Relasi Star Schema: Power BI tidak akan bisa membuat relasi yang sehat jika satu entitas memiliki banyak header duplikat.
Solusi Ideal: Membangun Star Schema yang Benar
Kasus seperti ini sangat klasik dalam proyek telekomunikasi, di mana 1 Nomor PO / 1 Site (DUID) memiliki Banyak Jenis Item Pekerjaan (Item PO Description).
Pemisahan tabel mutlak diperlukan dengan menerapkan konsep Star Schema, yang memecah file Excel Anda menjadi dua tabel terpisah di Power BI (atau Power Query):
1. Tabel Dimensi (Dimension Table — Contoh: Dim_Site atau Dim_PO)
Tabel ini berisi informasi utama yang sifatnya unik (1 baris per Site / per PO).
- Kolom yang masuk:
PO NUMBER,DUID,DU NAME,REGION,SUB REGION,Assigment Date, dll. - Tidak boleh ada duplikasi
DUIDdi tabel ini. Setiap site hanya muncul 1 kali.
2. Tabel Fakta (Fact Table — Contoh: Fact_Assignment_Items)
Tabel ini berisi rincian transaksi atau item pekerjaan yang bisa terjadi berulang kali (One-to-Many).
- Kolom yang masuk:
DUID(sebagai foreign key),ITEM PO,PO DESCRIPTION,AMOUNT,STATUS PROGRESS, dll. - Baris 299 sampai 308 yang Anda sebutkan (
XLSmart_...) akan berada di sini, semuanya menunjuk ke satuDUIDyang sama di tabel Dimensi.
Bagaimana Cara Menangani File Excel Anda Saat Ini?
Jika data aslinya di Excel terlanjur kosong-kosong di bagian bawah seperti itu (karena manusia malas mengetik ulang PO Number di setiap baris item), Anda bisa memperbaikinya secara otomatis di Power Query menggunakan fitur Fill Down:
- Masuk ke Power Query Editor di Power BI Desktop.
- Pilih kolom-kolom utama seperti
PO NUMBER,DUID,DU NAME, danAssigment Date. - Klik kanan pada kolom tersebut, lalu pilih Fill > Down.
- Power Query secara otomatis akan mengisi sel-sel yang kosong di bawahnya dengan nilai dari baris di atasnya tanpa Anda harus copy-paste manual di Excel.
Dengan cara ini, file Excel asli Anda tetap bersih tanpa duplikasi ketikan manual, dan Power BI akan menerimanya sebagai struktur relasi yang sangat rapi.
ya, setuju. Kadang trik ini saya gunakan untuk keperluan Pivot Table di excel, ternyata berbahaya alias menimbulkan duplikasi secara PowerBI ( prinsip database ideal ? )
Betul sekali! Apa yang Anda sebutkan adalah salah satu jebakan paling umum ketika kebiasaan bekerja di Excel (human-style/spreadsheet mindset) dibawa langsung ke dalam dunia database atau Business Intelligence.
Di Excel, trik mengosongkan sel atau melakukan merge cells sering dipakai agar tampilan visual laporan terlihat bersih, mudah dibaca mata, atau enak saat ditarik ke dalam Pivot Table. Namun, bagi sistem database relasional dan Power BI, cara ini melanggar prinsip dasar database ideal.
Berikut adalah prinsip database ideal yang menjawab mengapa trik tersebut berbahaya di Power BI:
1. Prinsip Atomicity & Flat Table (Tabel Datar)
Dalam database relasional, setiap baris (row) harus berdiri sendiri sebagai satu entitas transaksi yang utuh dan independen. Jika baris di bawahnya dikosongkan karena dianggap "sama" dengan baris di atasnya, sistem database membacanya sebagai nilai Null (kosong), bukan sebagai kelanjutan data. Akibatnya, saat dilakukan agregasi (SUM, AVERAGE, atau COUNT), baris-baris kosong tersebut tidak akan terhitung dengan benar atau justru merusak konteks baris.
2. Prinsip Normalisasi & Penghindaran Duplikasi (Redundancy)
Dalam skema database ideal (seperti pembentukan Star Schema yang kita bahas sebelumnya):
- Tabel Dimensi (Master): Menyimpan informasi unik yang tidak boleh berulang (misalnya daftar site
DUIDatau nomor PO). Setiap site hanya muncul tepat 1 kali. - Tabel Fakta (Transaksi): Menyimpan rincian kejadian berulang (seperti item-item pekerjaan
Item POyang bisa banyak untuk satu site yang sama).
Ketika Anda mengisi ulang atau menyalin teks secara manual ke bawah agar sejajar dengan banyak item, Anda sedang menciptakan duplikasi data semu. Di Power BI, duplikasi ini akan membuat ukuran agregasi finansial (seperti total Amount atau nilai PO) berlipat ganda secara keliru (overcounting).
Solusi Terbaik di Power BI (Prinsip Kerja Modern):
- Biarkan Data Mentah Apa Adanya di Excel: Tidak perlu repot copy-paste manual atau melakukan merge cells demi estetika visual Excel. Biarkan sel di bawahnya kosong secara alami jika memang mengacu pada satu induk yang sama.
- Gunakan Fitur Fill Down di Power Query: Saat data ditarik ke Power BI, biarkan mesin Power Query yang meratakan nilai kosong tersebut secara otomatis di belakang layar. Dengan cara ini, file Excel Anda tetap bersih dari sudut pandang manusia, tetapi strukturnya menjadi 100% valid dan siap pakai bagi mesin database Power BI.
Masalah utama nanti, pada kiraan saya adalah.
managemen kami sementara masih sangat mengandalkan excel sebagai input sumber data, karena ini menyangkut banyak sub divisi ( pekerjaan lapangan dan berbeda-beda lokasi )
Saya hanya ingin memastikan data di isi secara terpisah tersebut bisa di baca atau ter update di PowerBI dari waktu ke waktu. Jika misalkan per sub divisi mengisi sendiri sendiri, bagaimana cara terbaik mengatasi ini nantinya ? apakah saya periksa satu satu dan gabungkan manual ?
Jangan pernah digabung secara manual satu per satu! Itu adalah jalan pintas yang cepat melelahkan, rentan انسانی (human error), dan tidak akanscalable begitu volume pekerjaan meningkat.
Mengandalkan Excel sebagai input sumber data yang diisi terpisah oleh banyak sub-divisi adalah skenario yang sangat lumrah dan normal dalam industri proyek lapangan. Kuncinya bukan memaksa staf lapangan menggunakan database langsung, melainkan menyiapkan mekanisme otomatis di belakang layar menggunakan Power Query di Power BI.
Berikut adalah cara terbaik dan standar industri untuk mengatasi skenario multi-file / multi-sub-divisi agar laporan di Power BI bisa update otomatis dari waktu ke waktu:
Solusi Terbaik: Gunakan Fitur Combine Files (Folder Connector)
Alih-alih Anda menggabungkan file Excel mereka satu per satu ke dalam satu master file, biarkan setiap sub-divisi tetap mengisi file Excel-nya masing-masing di dalam satu folder khusus di komputer lokal, jaringan lokal (LAN/NAS), atau cloud storage (seperti OneDrive/SharePoint).
Langkah kerjanya di Power BI Desktop:
- Pusatkan dalam Satu Folder: Tentukan satu folder khusus (misal:
Folder_Data_Lapangan), lalu minta setiap sub-divisi menyimpan atau memperbarui file Excel mereka di folder tersebut dengan format nama dan struktur kolom yang konsisten. - Hubungkan Power BI ke Folder:
* Di Power BI Desktop, pilih Get Data -> Folder. * Pilih folder tempat file-file Excel tersebut disimpan.
- Otomatisasi via Power Query (Combine Transform):
* Power BI akan mendeteksi semua file Excel yang ada di dalam folder tersebut. * Pilih opsi Combine & Transform Data. * Power Query akan secara otomatis membuat fungsi skrip untuk menggabungkan seluruh baris data dari berbagai file Excel yang berbeda menjadi satu tabel terpusat yang utuh.
Keuntungan Utama Pendekatan Ini:
- Otomatisasi Penuh (Refresh-Ready): Ketika sub-divisi A, B, atau C memperbarui data di file Excel mereka masing-masing minggu depan, Anda tidak perlu lagi copy-paste atau meraba ulang. Anda tinggal membuka Power BI Desktop dan menekan tombol Refresh, maka seluruh data baru dari semua file akan langsung tergabung dan merbarui laporan secara otomatis.
- Menghindari Konflik File (File Locking): Jika semua orang harus mengisi satu file Excel yang sama secara bersamaan, Excel sering menolak (read-only) atau file menjadi korup. Dengan file terpisah per sub-divisi, masing-masing tim bebas bekerja tanpa saling mengganggu.
- Validasi Cukup di Tingkat Struktur Kolom:
Yang perlu Anda standarisasi di awal bukanlah isi datanya, melainkan nama kolom header (misalnya kolom
DUID,PO NUMBER,AMOUNTharus memiliki ejaan yang persis sama di setiap file Excel sub-divisi). Selama nama kolom headernya konsisten, Power Query akan menggabungkannya dengan mulus.
Dengan cara ini, Anda tetap memfasilitasi kebiasaan tim lapangan menggunakan Excel, tetapi dari sisi pengolahan data, Anda sudah menerapkan standar arsitektur Business Intelligence yang otomatis dan profesional.
Mungkin untuk sementara menggunakan google drive secara bersama ? masalahnya adalah ber fornat excel, atau kita minta mereka full menggunakan google sheet yang bebasis web itu ? kendala lain: di lapangan tidak selalu ada jaringan internet...hmmm
Kendala lapangan seperti koneksi internet yang tidak selalu stabil adalah masalah klasik dan paling sering dihadapi dalam proyek telekomunikasi atau infrastruktur di lapangan.
Mari kita bedah pilihan antara Google Sheets (Berbasis Web) vs Excel Lokal (Offline-first) dengan mempertimbangkan kondisi lapangan Anda:
Analisis Pilihan: Google Sheets vs Excel Lokal
1. Jika Memaksa Menggunakan Google Sheets (Web-Based)
- Kelebihan: Semua orang mengetik di satu link yang sama secara real-time. Tidak ada lagi file terpisah, tidak perlu repot menggabungkan data (automatic single source of truth).
- Kekurangan Fatal di Lapangan: Sangat bergantung pada internet. Begitu teknisi di lapangan masuk ke area blank spot atau sinyal buruk, Google Sheets tidak bisa diakses, data gagal tersimpan, atau terjadi sync conflict jika ada yang offline lalu online bersamaan.
2. Menggunakan Excel Lokal + Mekanisme Sinkronisasi (Pilihan Terbaik)
Mengingat kendala internet di lapangan, tetap mempertahankan Excel lokal adalah keputusan yang paling realistis dan aman bagi teknisi. Namun, cara kerjanya yang diubah agar tidak merepotkan Anda.
Solusi Terbaik: Pendekatan Hybrid (Offline Local + Cloud Folder)
Agar teknisi tetap bisa bekerja tanpa pusing memikirkan internet, tetapi Anda juga tidak perlu menggabungkan file satu per satu secara manual, gunakan arsitektur berikut:
- Teknisi Bekerja 100% Offline di Perangkat Masing-masing:
* Setiap sub-divisi atau tim lapangan diberikan template file Excel standar yang sudah dikunci format kolomnya. * Mereka mengisi data secara lokal di laptop/komputer kantor site saat mereka offline.
- Sinkronisasi Otomatis Menggunakan Folder Cloud (OneDrive / Google Drive Desktop Sync):
* Install aplikasi klien cloud storage (seperti Google Drive for Desktop atau OneDrive) di laptop masing-masing sub-divisi atau di komputer utama tempat file dikumpulkan. * Atur agar file Excel tersebut disinkronkan ke folder khusus di cloud. * Cara Kerjanya: Saat teknisi di lapangan sedang offline, mereka cukup mengetik di file Excel lokal mereka. Begitu laptop mereka mendapatkan sinyal internet (misal saat kembali ke hotel/basecamp atau kantor cabang), aplikasi Google Drive/OneDrive akan secara otomatis mengunggah perubahan tersebut ke cloud di latar belakang tanpa teknisi harus melakukan apa pun.
- Power BI Menarik Data Langsung dari Folder Cloud:
* Di komputer Anda, arahkan sumber data Power BI langsung ke folder sinkronisasi tersebut (atau gunakan konektor OneDrive/SharePoint di Power BI). * Setiap kali Anda ingin memperbarui laporan, Anda cukup menekan tombol Refresh di Power BI Desktop. Power BI akan mengambil data terbaru yang sudah otomatis tersinkron dari lapangan.
Rangkuman Manfaat Solusi Ini:
- Bagi Tim Lapangan: Aman, bebas stres karena internet, bisa bekerja kapan saja secara offline.
- Bagi Anda (Data / IT Manager): Tidak ada lagi kerja manual copy-paste atau menggabungkan file satu per satu. Semua terotomatisasi melalui sinkronisasi folder dan Power Query.