# preprocessing data
import pandas as pd
import numpy as np
# Visualisasi
import plotly
import plotly.express as px
# pengaturan
pd.options.display.float_format = '{:,.2f}'.formatINLINE CODE DYNAMIC REPORTING GOLD PRICES ANALYSIS
Integration Quarto Markdown with Python - (28/9/2024)
Pendahuluan
Latar Belakang
Harga emas merupakan salah satu indikator utama dalam pasar komoditas global. Pergerakan harga emas dipengaruhi oleh berbagai faktor seperti inflasi, kebijakan moneter, nilai tukar mata uang, ketidakpastian geopolitik, dan permintaan serta penawaran di pasar internasional. Oleh karena itu, pemantauan dan analisis harga emas secara real-time menjadi sangat penting, baik bagi investor maupun pengambil kebijakan. Seiring berkembangnya teknologi, metode pelaporan dan analisis data semakin canggih. Salah satu pendekatan modern adalah inline code dynamic reporting, yang memungkinkan integrasi langsung antara analisis data dan pelaporan secara dinamis. Dengan menggunakan teknologi ini, para analis dapat menyajikan informasi terkini tentang harga emas dengan cepat dan akurat, serta memperbarui laporan secara otomatis berdasarkan data terbaru. Hal ini sangat bermanfaat dalam menghadapi fluktuasi harga yang cepat dan dinamis.
Dynamic reporting adalah teknik atau metode pembuatan laporan yang memungkinkan konten laporan berubah secara dinamis berdasarkan data atau masukan terbaru. Ini berarti laporan tersebut secara otomatis diperbarui dengan data baru atau dengan parameter yang berbeda tanpa perlu mengedit atau membuat laporan baru dari awal. Dynamic report ini dibuat dalam format dasar File Quarto Markdown dan dijalankan menggunakan bahasa pemrograman Python pada R Studio. Quarto adalah sebuah sistem untuk membuat dokumen, laporan, artikel, buku, situs web, dan presentasi yang interaktif dan dinamis menggunakan markdown. Quarto dirancang untuk ilmuwan data, penulis teknis, dan peneliti yang bekerja dengan berbagai bahasa pemrograman seperti R, Python, dll.
Dynamic reporting ini memanfaatkan konsep Inline code untuk membantu proses automatisasi pembuatan laporan selanjutnya dynamic. Inline code adalah kode singkat yang disisipkan langsung di dalam teks atau paragraf dalam sebuah dokumen atau laporan, dan biasanya digunakan untuk menampilkan hasil dari suatu ekspresi atau perhitungan secara langsung dalam teks. Ini sangat umum digunakan dalam dokumen Markdown, R Markdown, Quarto, dan alat lain yang mendukung laporan dinamis. Untuk memanfaatkan inline code, format yang bisa digunakan adalah Ellipsis. Dari format tersebut, dapat diisi dengan berbagai macam syntax dari chunk sebelumnya untuk digabungkan dengan teks ataupun narasi yang dipersiapkan.
Tujuan
Tujuan dari analisis ini adalah sebagai berikut:
- Memantau Pergerakan Harga Secara Real-Time dalam rangka pengambilan keputusan.
- Menyajikan Laporan Dinamis dan Interaktif dengan mengurangi repetisi.
- Sarana pembelajaran penulis dan masyarakat secara luas.
Library dan Setup
Laporan ini dibuat dengan bantuan veverapa library yang perlu di install dan dipanggil.
Dataset
Dataset yang digunakan adalah harga emas (Gold Prices) internasional dari tahun Jan 1950 - Juli 2020 (data bulanan) yang diperoleh dari platform kaggle berikut Gold Prices. Data ini terdiri dari dua kolom, yaitu Tanggal (Date) dan Harga (Price).
# membaca data
gold = pd.read_csv("data/monthly_csv.csv")
gold.tail()| Date | Price | |
|---|---|---|
| 842 | 2020-03 | 1,593.76 |
| 843 | 2020-04 | 1,680.03 |
| 844 | 2020-05 | 1,715.70 |
| 845 | 2020-06 | 1,734.03 |
| 846 | 2020-07 | 1,840.81 |
Pembahasan
1. Mengubah Tipe Data Date
Sebelum
gold.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 847 entries, 0 to 846
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 847 non-null object
1 Price 847 non-null float64
dtypes: float64(1), object(1)
memory usage: 13.4+ KB
Proses
gold['Date'] = pd.to_datetime(gold['Date'],
format = "%Y-%m")Selesai
gold.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 847 entries, 0 to 846
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 847 non-null datetime64[ns]
1 Price 847 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 13.4 KB
2. Mengecek Missing Value dan Data Duplikasi
Pada proses ini akan dilihat apakah terdapat nilai yang hilang atau data yang terduplikasi.
# Missing Value
gold.isna().sum()Date 0
Price 0
dtype: int64
# Data Duplikasi
gold.duplicated().sum()0
Jawabannya data kita sudah bersih (tidak ada missing value dan data duplikasi).
3. Feature Engineering - Mengekstrak Tahun dan Quarter
# menambahkan kolom tahun dan quarter
gold["Year"] = gold["Date"].dt.year
gold.head()| Date | Price | Year | |
|---|---|---|---|
| 0 | 1950-01-01 | 34.73 | 1950 |
| 1 | 1950-02-01 | 34.73 | 1950 |
| 2 | 1950-03-01 | 34.73 | 1950 |
| 3 | 1950-04-01 | 34.73 | 1950 |
| 4 | 1950-05-01 | 34.73 | 1950 |
gold.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 847 entries, 0 to 846
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 847 non-null datetime64[ns]
1 Price 847 non-null float64
2 Year 847 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(1)
memory usage: 20.0 KB
4. Analisis Statistik Deskriptif
statistik_desk = gold['Price'].describe()
statistik_deskcount 847.00
mean 416.56
std 453.67
min 34.49
25% 35.19
50% 319.62
75% 447.03
max 1,840.81
Name: Price, dtype: float64
Deskripsi :
- count : jumlah data.
- mean : nilai rata-rata dari data.
- std : nilai standar deviasi dari data.
- min : nilai terkecil dari data.
- 25% : nilai kuartil 1 dari data.
- 50% : nilai kuartil 2 atau median dari data.
- 75% : nilai kuartil 3 dari data.
- max : nilai terbesar dari data.
Simpan dalam Variabel
# Ekstrak tanggal terawal dan terakhir kemudian di urutkan menjadi tanggal-bulan-tahun
date_min = gold['Date'].min().date().strftime('%d-%m-%Y')
date_max = gold['Date'].max().date().strftime('%d-%m-%Y')
count = statistik_desk.iloc[0]
mean = statistik_desk.iloc[1]
min = statistik_desk.iloc[3]
persen50 = statistik_desk.iloc[5]
max = statistik_desk.iloc[7]
- Data harga emas ini terdiri dari 847.0 baris data dengan Rata-rata harga emas dari 01-01-1950 “hingga” 01-07-2020 adalah $416.5569055489965 dan nilai tengah/median sebesar $319.622.
- Harga terendah emas sebesar $34.49 dan tertinggi sebesar $1840.807 sepanjang 01-01-1950 “hingga” 01-07-2020.
5. Data Agregasi dan Visualisasi Perkembangan Harga Emas
5. A. Monthly Gold Price Trends
# Persiapan Data
trend_monthly = gold.groupby("Date")['Price'].mean().reset_index()
line_monthly = px.line(trend_monthly,
x="Date",
y="Price",
title="Monthly Gold Price Trends",
color_discrete_sequence=['blue'])
line_monthly.show()Trend harga emas cenderung meningkat sering waktu, namun tetap terdapat fluktuasi harga. Cenderung sekitar tahun 1980, 2011-2012, dan 2020-an terjadi peningktan yang signifikan.
5. B. Yearly Gold Price Trends
# Persiapan Data
trend_yearly = gold.groupby("Year")['Price'].mean().reset_index()
line_yearly = px.line(trend_yearly,
x="Year",
y="Price",
title="Yearly Gold Price Trends",
color_discrete_sequence=['blue'])
line_yearly.show()Pada trend tahunan juga menunjukkan hal yang sama cuma terlihat tampilannya kurang detail perubahannya. Trend harga emas cenderung meningkat sering waktu, namun tetap terdapat fluktuasi harga. Cenderung sekitar tahun 1980, 2011-2012, dan 2020-an terjadi peningktan yang signifikan.
6. Data Agregasi dan Visualisasi Perbandingan Harga Emas Per Dekade
# Definisikan kondisi untuk setiap dekade
conditions = [
(gold['Year'] >= 1950) & (gold['Year'] < 1960),
(gold['Year'] >= 1960) & (gold['Year'] < 1970),
(gold['Year'] >= 1970) & (gold['Year'] < 1980),
(gold['Year'] >= 1980) & (gold['Year'] < 1990),
(gold['Year'] >= 1990) & (gold['Year'] < 2000),
(gold['Year'] >= 2000) & (gold['Year'] < 2010),
(gold['Year'] >= 2010) & (gold['Year'] < 2020),
(gold['Year'] >= 2020) & (gold['Year'] < 2030),
]
# Nilai yang akan diisi di kolom 'Decade'
choices = [
'1950-an', '1960-an', '1970-an', '1980-an', '1990-an', '2000-an', '2010-an', '2020-an'
]
# Menggunakan numpy.select() untuk membuat kolom 'Decade'
gold['Decade'] = np.select(conditions, choices)
gold| Date | Price | Year | Decade | |
|---|---|---|---|---|
| 0 | 1950-01-01 | 34.73 | 1950 | 1950-an |
| 1 | 1950-02-01 | 34.73 | 1950 | 1950-an |
| 2 | 1950-03-01 | 34.73 | 1950 | 1950-an |
| 3 | 1950-04-01 | 34.73 | 1950 | 1950-an |
| 4 | 1950-05-01 | 34.73 | 1950 | 1950-an |
| ... | ... | ... | ... | ... |
| 842 | 2020-03-01 | 1,593.76 | 2020 | 2020-an |
| 843 | 2020-04-01 | 1,680.03 | 2020 | 2020-an |
| 844 | 2020-05-01 | 1,715.70 | 2020 | 2020-an |
| 845 | 2020-06-01 | 1,734.03 | 2020 | 2020-an |
| 846 | 2020-07-01 | 1,840.81 | 2020 | 2020-an |
847 rows × 4 columns
6. A. Comparison of Average Gold Prices Per Decade
mean_decade = gold.groupby("Decade")['Price'].mean().reset_index()
mean_decade['Decade'][7]'2020-an'
mean_decade_bar = px.bar(mean_decade.sort_values(by='Price'),
x="Price",
y="Decade",
title="Comparison of Average Gold Prices Per Decade",
color_discrete_sequence=['blue'])
mean_decade_bar.show()Maka dari itu harga emas mengalami :
- Peningkatan dari dekade 1950-an hingga 1960-an.
- Peningkatan dari dekade 1960-an hingga 1970-an.
- Peningkatan dari dekade 1970-an hingga 1980-an.
- Penurunan dari dekade 1980-an hingga 1990-an.
- Peningkatan dari dekade 1990-an hingga 2000-an.
- Peningkatan dari dekade 2000-an hingga 2010-an.
- Peningkatan dari dekade 2010-an hingga 2020-an.
6. B. Highest and Lowest Gold Prices by Decade
# Menghitung nilai tertinggi dan terendah untuk setiap dekade
agg_data = gold.groupby('Decade').agg(
lowest_price = ("Price", 'min'),
highest_price = ("Price", 'max')
)
# melt data agar bisa digunakan untuk bar chart
agg_data_melted = pd.melt(agg_data.reset_index(),
id_vars='Decade',
value_vars=['lowest_price','highest_price'],
var_name='Price_Type',
value_name='Price')
agg_data_melted| Decade | Price_Type | Price | |
|---|---|---|---|
| 0 | 1950-an | lowest_price | 34.49 |
| 1 | 1960-an | lowest_price | 35.06 |
| 2 | 1970-an | lowest_price | 34.95 |
| 3 | 1980-an | lowest_price | 299.83 |
| 4 | 1990-an | lowest_price | 256.20 |
| 5 | 2000-an | lowest_price | 260.75 |
| 6 | 2010-an | lowest_price | 1,068.32 |
| 7 | 2020-an | lowest_price | 1,560.67 |
| 8 | 1950-an | highest_price | 35.13 |
| 9 | 1960-an | highest_price | 43.46 |
| 10 | 1970-an | highest_price | 463.67 |
| 11 | 1980-an | highest_price | 674.58 |
| 12 | 1990-an | highest_price | 416.54 |
| 13 | 2000-an | highest_price | 1,135.01 |
| 14 | 2010-an | highest_price | 1,780.65 |
| 15 | 2020-an | highest_price | 1,840.81 |
# Membuat bar chart dengan Plotly Express
fig = px.bar(agg_data_melted.sort_values(by="Price_Type", ascending=False),
x='Decade',
y='Price',
color='Price_Type',
barmode='group',
title='Highest and Lowest Gold Prices by Decade')
# Menampilkan plot
fig.show() 6. C. Price Growth Every Decade
agg_data['Growth'] = round(((agg_data['highest_price'] - agg_data['lowest_price']) / agg_data['lowest_price'] * 100),2)
growth_data = agg_data['Growth'].reset_index().sort_values(by="Growth", ascending=False)
growth_data| Decade | Growth | |
|---|---|---|
| 2 | 1970-an | 1,226.81 |
| 5 | 2000-an | 335.29 |
| 3 | 1980-an | 124.99 |
| 6 | 2010-an | 66.68 |
| 4 | 1990-an | 62.59 |
| 1 | 1960-an | 23.96 |
| 7 | 2020-an | 17.95 |
| 0 | 1950-an | 1.86 |
Pertumbuhan harga emas (Selisih Harga Tertinggi dan Terendah) internasional tertinggi berada pada periode 1970-an dengan pertumbuhan sebesar 1226.81%. Sedangkan, pertumbuhan harga emas internasional terendah berada pada periode 1950-an dengan pertumbuhan sebesar 1.86%.
Penutup
INLINE CODE DYNAMIC REPORTING GOLD PRICES ANALYSIS ini menyajikan informasi interaktif dan analisis menyeluruh tentang perkembangan dan perbandingan harga emas internasional dari periode 01-01-1950 hingga 01-07-2020. Informasi ini dapat membantu perumusan strategi untuk jual-beli emas baik bagi pemerintah, investor maupun masyarakat secara luas.