INLINE CODE DYNAMIC REPORTING GOLD PRICES ANALYSIS

Integration Quarto Markdown with Python - (28/9/2024)

Author

Toni Andreas Susanto

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:

  1. Memantau Pergerakan Harga Secara Real-Time dalam rangka pengambilan keputusan.
  2. Menyajikan Laporan Dinamis dan Interaktif dengan mengurangi repetisi.
  3. Sarana pembelajaran penulis dan masyarakat secara luas.

Library dan Setup

Laporan ini dibuat dengan bantuan veverapa library yang perlu di install dan dipanggil.

# 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}'.format

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_desk
count     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]
  1. 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.
  2. 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

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 :

  1. Peningkatan dari dekade 1950-an hingga 1960-an.
  2. Peningkatan dari dekade 1960-an hingga 1970-an.
  3. Peningkatan dari dekade 1970-an hingga 1980-an.
  4. Penurunan dari dekade 1980-an hingga 1990-an.
  5. Peningkatan dari dekade 1990-an hingga 2000-an.
  6. Peningkatan dari dekade 2000-an hingga 2010-an.
  7. 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.