GOOGLE APPS SCRIPT RASA JAVASCRIPT: NGODING SEKALIGUS PROBLEM SOLVING

Tantangan Menulis Hari ke-159

Oleh: Bernardus Ari Kuncoro

Dalam sebuah organisasi apapun, apalagi itu organisasi bisnis, problem itu pasti ada. Jika tidak ada, berarti ada hal yang kurang beres. Jika memang benar-benar tidak ada, berarti organisasi itu sudah mati rasa. Tidak ada inovasi. Stuck. Tidak ada sebuah organisasi yang benar-benar fully automatic. Minimal satu orang lah yang ‘jaga lilin’. Hihi.

Well, beberapa waktu yang lalu saya menemukan persoalan di tempat saya bekerja. Apa itu? Detailnya tidak bisa saya ungkapkan di sini. Tetapi yang jelas, ada kendala komunikasi dalam menangani rikues.

Saya coba cari sakitnya apa. Sambil diskusi dengan anggota tim.

Saya tawarkan sebuah solusi agar mampu meminimalisasi miskomunikasi. Solusi ini terinspirasi waktu saya dulu bekerja sebagai ‘tukang’ jaga mesin billing and charging system di perusahaan Telekomunikasi.

Pada intinya, klien wajib membuat request. Caranya dengan mengisi formulir di Google Form. Beberapa item perlu diisi. Ada yang wajib dan ada yang sifatnya opsional. Lalu dia dapat nomor tiket request. Nomor tiket tersebut secara otomatis dikirim lewat email. Setiap request tercatat dalam Google Sheet. Si requestor bisa mengetrack dan memfollow up lewat email yang dimaksud.

Selama minggu ini saya pun berkutat dengan bahasa pemrograman Google Apps Script rasa JavaScript plus sedikit HTML. Penasaran? Cobain aja deh.

File .gs besutan Google: Google Apps Script rasa Javascript

Mungkin kalau saya tidak menemukan problem ini, saya tidak pernah bernostalgia ngoding lagi.

Kalideres, 7 September 2021

TEXT TO SPEECH BESUTAN gTTS VS pyttsx3

Tantangan Menulis Hari Ke-39 Batch Kedua

Oleh: Bernardus Ari Kuncoro

Sudah lama sekali saya tidak ngoprek Python. Mengapa? Keadaan memaksa saya demikian. Yang ditangani di kantor seringkali terkait dengan bagaimana mengelola teamwork. Memastikan berbagai tugas beres dan workload tidak berat sebelah. Me-manage konflik. Meeting dengan klien dan divisi terkait, dan semacamnya.

Hari Sabtu yang lumayan sela ini saya pakai untuk mengoprek sesuatu. Apa itu? Mengubah naskah teks menjadi audio. Dengan bantuan Python.

Apa yang saya lakukan? Pertama-tama googling. Kata kuncinya adalah “how to convert text to speech with python.” Hasil pencarian mengarahkan saya pada sebuah website berikut ini. Ada dua cara ternyata. Yang pertama dengan menggunakan google text to speech secara online. Yang kedua menggunakan library pyttsx3 (Text to Speech library for Python 3) secara offline.

Segera langsung saya coba dengan Visual Code yang baru kali ini saya buka lagi sejak saya pasang di komputer beberapa bulan lalu.

Jika saya menggunakan gTTS, maka hasilnya demikian.

Jika saya menggunakan Pyttsx3, hasilnya sebagai berikut.

Bagaimana. Lebih natural mana menurut Anda?

Waduh, barusan saya test kok nggak bisa dimainkan untuk yang kedua. Padahal di komputer bisa. Bisa jadi karena Codex nya tidak umum.

Will troubleshoot someday.

Kalideres, 8 Mei 2021

NORMALISASI DAN DENORMALISASI DALAM DATA MODELING

Tantangan Menulis Hari ke-181 

Oleh: Bernardus Ari Kuncoro

Normal. Sebuah kata yang sering digunakan untuk kepentingan politik Jakarta beberapa tahun silam. Penggunaannya dirangkaikan dengan imbuhan -isasi dan sebuah kata benda yaitu sungai. Tertulis sebagai normalisasi sungai. 

Eiiits, tenang. Ini bukan tentang politik. Dunia yang sulit ditebak ending-nya. Banyak variabel kepentingan yang terlibat di dalamnya.

Anyway, normalisasi dan denormalisasi ini juga ada maknanya dalam dunia data. Terutama terkait data modeling. Coba Anda perhatikan gambar berikut. 

1 Database Design and Development: A Visual Approach © 2006 Prentice Hall  Chapter 4 DATABASE DESIGN AND DEVELOPMENT: A VISUAL APPROACH Chapter 4  Normalization. - ppt download

Kira-kira hal penting apa yang dapat Anda tarik?

Gambar di atas menujukkan bahwa normalisasi adalah sebuah proses untuk menstrukturkan database agar redundansi data yang tertulis didalam sebuah tabel dapat dihilangkan. Fokusnya menghilangkan database dari data-data yang tidak berguna dan untuk menurunkan inconsistency. 

Sebaliknya, denormalisasi dilakukan untuk mengkombinasikan tabel dua atau lebih sedemikian sehingga dapat di-query secara cepat. 

Wah, musim hujan tiba. Apa kabar ya, program normalisasi sungai di Jakarta? Mudah-mudahan tidak banyak sampah yang ‘tertimbun’ di sana. Reduce the dirt and inconsistency. 

awsimages.detik.net.id/visual/2018/11/03/28e597...
Sumber: CNBC Indonesia

Kalideres, 28 Januari 2021

TEBAK GAMBAR TENTANG DATA

Tantangan Menulis Hari ke-167

Oleh: Bernardus Ari Kuncoro

Pukul lima pagi. Aku terjaga dari mimpi. Tidak ingat aku mimpinya apa, tetapi yang jelas aku ingin segera beranjak dari tempat tidur.

Lantas tergoda aku membuat sesuatu. Tentunya yang fun, relax, dan joyful. Apa itu? Membuat tebak gambar. Menerka kata-kata yang berhubungan dengan bidang yang selama ini aku tekuni, data science.

Ada tiga tema yang aku ambil dari buku ini. Visualisasi. Koding. Machine Learning

Ini dia tebakannya. Selamat mengerjakan. Enjoy!

Tebakan tambahan dengan level kesulitan lebih tinggi bisa dikunjungi di sini.

Kalideres, 14 Januari 2021

JIKA MAKA DALAM GOOGLE SHEET

Tantangan Menulis Hari ke-162

Oleh: Bernardus Ari Kuncoro

Dalam Data Science, Anda akan sering menemukan tabel. Di dalam tabel tersebut, acapkali ada update yang perlu dilakukan. Pembaharuan dari sisi baris maupun kolom. Keduanya sama-sama butuh kreativitas. Mengingat adanya perubahan akan membawa dampak ke logika-logika lainnya.

Dalam kasus saya, ada satu dashboard yang saya buat dalam Google Data Studio dengan ‘sumber makanan’ dataset dari tabel yang saya masukkan ke dalam Google Sheet. Mau tidak mau, karena Tahun Baru, saya mesti melakukan update. Adapun yang saya lakukan adalah sebagai berikut.

Awal mulanya, ada sebuah tabel dengan snippet kolom sebagai berikut

Kolom D dengan salah satu nilainya adalah 12. Nomor tersebut menunjukkan urutan minggu dalam tahun tersebut, pada tanggal 16 Maret 2020

Saya ingin jadikan Week itu menjadi YearWeek, supaya nanti jika ada group-by berdasarkan minggu, tetapi beda tahun, tidak akan teragregasi. Kurang lebih jika Week awal = 12, maka YearWeek = 202012. Begitu juga jika tahun berganti, misalkan 2021, maka Yearweek menjadi 202112.

Bagaimana rumusnya? Well, setelah pencarian di mesin Google beberapa menit, akhirnya menemukan rumus Jika Maka berikut. Perhatikan di bagian awal setelah ‘if’ ada weeknum(c2)<10, artinya ada perlakuan yang berbeda, karena ada angka di bawah 10 yang jumlah digitnya ada 1. Saya ingin menambahkan angka 0 jika demikian, supaya jumlah digitnya seragam enam.

Rumus konversi dari Week ke YearWeek.

Hasil tabel yang diharapkan menjadi sebagai berikut..

Hasil Kolom D yang diinginkan

Dengan demikian saya telah memiliki tabel yang bisa menghindari agregasi campur minggu dari tahun yang berbeda. Tadinya saya pikir harus membuat ulang lagi Google Sheet. Namun lebih efisien seperti ini.

Selamat mencoba!

Jika kalian ingin mengetahui lebih lanjut mengenai kelas Data Studio, silakan kunjungi IYKRA, khususnya kelas Analytics with Google Data Studio ini.

Kalideres, 9 Januari 2020

MENGENAL APACHE CASSANDRA

Mengenal Apache Cassandra

Tantangan Menulis Hari ke-156

Oleh: Bernardus Ari Kuncoro

Ada pepatah “Tak kenal maka tak sayang”. Hal ini berlaku juga ketika Anda mengenal suatu sistem database. Kali ini saya ingin memperkenalkan Anda dengan Apache Cassandra. Suatu sistem database yang ditujukan untuk kemudahan proses scalability dan memiliki high availability, tanpa mengesampingkan performa.

Tahukah Anda, bahwa Apache Cassandra menggunakan bahasa query CQL? CQL (dibaca si kyu el) Cassandra Query Language. Pada dasarnya, CQL ini mirip dengan SQL.

Perusahaan apa saja yang memanfaatkan Apache Cassandra?

Aplikasi Uber
Layanan Netflix
  1. Uber menggunakan Apache Cassandra untuk backend
  2. Netflix menggunakaannya untuk melayani pelanggan ketika streaming video

Use case apa saja yang dapat ditalangi oleh NoSQL (dalam hal ini Apache Cassandra)

  1. Pencatatan transaksi (retail, health care, toko online)
  2. Internet of Things (IoT)
  3. Data timeseries
  4. Beban kerja apapun yang berat ketika menuliskannya ke dalam database.

Apakah Apache Cassadra memiliki hambatan untuk pekerjaan analitik? Ya, akan ada. Seperti ketika Anda menggunakan statement GROUP BY. Mengingat Apache Cssandra membutuhkan data modeling berdasarkan query yang Anda mau, Anda tidak dapat melakukan queries ketika sekonyong-konyong dibutuhkan. Akan tetapi, Anda dapat menambahkan kolom-kolom clustering pada data model dan dan membuat tabel-tabel baru.

QUIZ

Kapan Anda sebaiknya menggunakan Database NoSQL?

  1. Saat data yang akan digunakan sangat besar
  2. Ketika akan melakukan agregasi
  3. Pada saat Anda membutuhkan availability tingkat tinggi
  4. Waktu Anda butuh scale out segera
  5. Ketika Anda butuh untuk melakukan join ke beberapa tabel

Hint: Anda sebaiknya tetap menggunakan relational database untuk proses join dan agregasi, terutama untuk data yang tidak terlalu besar. Namun, NoSQL sangat mumpuni jika datanya besar, butuh high scalability dan scale out segera.

Jadi jawabannya? Silakan direnungkan. Ada tiga jawaban yang benar.

Disadur dan diterjemahkan dari Data Engineering Nanodegree Udacity.

Kalideres, 3 Januari 2020

BICARA TENTANG NOSQL

Not only SQL

Tantangan Menulis Hari ke-155

Oleh: Bernardus Ari Kuncoro

NoSQL merupakan singkatan dari Not Only Structured Query Language. Database NoSQL menyediakan mekanisme untuk penyimpanan dan pengambilan data yang dimodelkan dengan cara yang berbeda dari relasi tabular yang digunakan pada relational databases. Istilah NoSQL mulai digunakan sejak 1970, tetapi baru naik daun pada 2000-an.

Bermacam-macam variasi No-SQL mulai dari Document store, graph, key-value, dan wide-column.

Ada banyak variasi NoSQL. Apa saja?

  1. Apache Cassandra (Partition Row store). Data didistribusikan berdasarkan partisi ke dalam beberapa node atau server. Diatur dalam format kolom dan baris.
  2. MongoDB (Document store). Merupakan database berorientasi dokumen. Selain adanya Key Lookups yang dilakukan oleh key-value store, database ini juga menawarkan API atau query language yang akan mengeluarkan dokumen berdasarkan apa yang ada di dalam database. Bayangkan Anda memaknai proses ini sebagai pencarian dari kumpulan dokumen-dokumen.
  3. DynamoDB (Key-value store). Database yang terkumpul berdasarkan pasangan-pasangan antara key dan value.
  4. Apache HBase (Wide Column Store). Menariknya dari database ini selain kolomnya ‘melebar’ adalah nama kolom dari baris ke baris dapat berbeda-beda.
  5. Neo4J (Graph Database). Dalam database ini, data direpresentasikan oleh nodes dan edges.

Perlu diingat bahwa Anda tidak perlu menghafal semua variasi NoSQL di atas. Peruntukannya berbeda-beda tergantung kebutuhan. Anda dapat memulainya dengan Apache Cassandra, karena memiliki kedekatan dengan Relational Database. Mengingat bentuknya masih tabel. Selebihnya, tetap harus belajar untuk memahami masing-masing karakteristiknya, namun proses belajar jadi lebih mudah.

Sebagai pengayaan, Anda dapat merenungi gambar berikut.

Penggunaan NoSQL dan SQL yang bervariasi

Disadur dan diterjemahkan dari Data Engineering Nanodegree by Udacity.

Kalideres, 2 Januari 2021

Mapping the geopoint (Latitude & Longitude) to Shapefile

Sometimes you want to know what Kelurahan (Village), Kecamatan (District), Kabupaten (Region), and Province are from latitude and longitude. I did it with R, here the script is.

This is part of the analysis you may need when you handle GeoSpatial Data.

Thank someone who gave me the example from this link.

library(rgdal)
library(sp)

#load shapefile
data.shape <-readOGR(dsn="/nama/direktori/shapefile/anda",
layer="nama_shapefile")
data.shape <- spTransform(data.shape, CRS("+proj=longlat +datum=WGS84"))

#create csv file that want to be mapped into shapefile
csvfile <- data.frame(LONGITUDE = c(106.6882639, 106.7705755),
LATITUDE = c(-6.1342941, -6.1642941))

# convert data frame to SpatialPoints class
coordinates(csvfile) <- ~LONGITUDE+LATITUDE

# make sure the two files share the same CRS
csvfile@proj4string <- data.shape@proj4string

# visual check
plot(data.shape, border = "grey")
points(csvfile, col = "red", cex = 5)
axis(1) # showing the axes helps to check whether the coordinates are what you expected
axis(2)

#mapping
points_in_shape <- over(csvfile, data.shape)

#output
points_in_shape


The comparison between randomForest and ranger

A couple days ago I had a chance to be a speaker on internal data scientist meeting at the company that I work for: Stream Intelligence. The meeting is usually held on monthly basis, and the last meeting in October was 6th meeting. We used Skype for Business to connect between the Data Scientists in Jakarta and in London.

I delivered a topic titled Random forest in R: A case study of a telecommunication company. For those who do not know Random Forest, an Indian guy, Gopal Malakar, had made a video uploaded in Youtube. He elaborated the definition of random forest. First of all, check the video out!

Based on the video, one important thing that you have to remember about random forest is that, it is a collection of trees. It was built by a number of decision trees. Each decision trees is formed by random variables and observations of the training data.

Supposed that we have trained a random forest model, and it was made from 100 decision trees. One test observation was inputted on the model. The decision tree outputs will result 60Y and 40N. Hence the output of random forest model is Y with score or probability 0.6.

OK, let’s practice how to train random forest algorithm for classification in R. I just knew it couple weeks ago from Datacamp course, that there are two random forest packages: 1) randomForest and 2) ranger. They recommend ranger, because it is a lot faster than original randomForest.

To prove it, I have created a script using Sonar dataset and caret package for machine learning, with methods: ranger / rf, and tuneLength=2 (this argument refers to mtry, or number of variables that was used to create trees in random forest). In random Forest, mtry is the hyperparameter that we can tune.

# Load some data 
library(caret)
library(mlbench)
data(Sonar)

# Fit a model with a deeper tuning grid 
ptm <- proc.time()
model <- train(Class~., data = Sonar, method="ranger",tuneLength=2)
proc.time() - ptm

ptm2 <- proc.time()
model_rf <- train(Class~., data = Sonar, method="rf",tuneLength=2)
proc.time() - ptm2

Output of ranger training

> proc.time() - ptm
user system elapsed
22.37 0.29 23.66

Output of random forest training

> proc.time() - ptm2
user system elapsed
26.75 0.29 27.80

So, the random forest training with ranger function is 26.75-22.37 = 4.38 seconds or 25% faster than original random forest (Assume we use user time).

However, if I tried to change tuneLength parameter with 5. It reveals that the original randomForest function is faster than ranger. Hmmm… seems that I have to upload a question to stackoverflow or Datacamp experts.

> library(mlbench)
> data(Sonar)
> 
> # Fit a model with a deeper tuning grid 
> ptm <- proc.time()
> model <- train(Class~., data = Sonar, method="ranger",tuneLength=5)
> proc.time() - ptm
   user  system elapsed 
 137.19    0.69  141.67 
> 
> ptm2 <- proc.time()
> model_rf <- train(Class~., data = Sonar, method="rf",tuneLength=5)
> proc.time() - ptm2
   user  system elapsed 
  79.30    0.10   81.55

Import from a Database in R

Importing database to R
Importing database to R

When you use R for data analysis, sometimes you have to import data from a Database (e.g. SQL), instead of just import data by reading the csv, excel, or mat file. To do this, we have to do several steps. Good thing Datacamp course provide us step-by-step guidance.

There are 5 steps you need to do if you did not install RMySQL package yet. If you have installed the package, you could skip step 1. In step 2, you need to establish connection with database with dbconnect() function. Then, in step 3 you can list the database tables using dbListTables(), in which three tables are available: users, tweats, and comments. In Step 4, you can import the table and assign into a data frame variable. Last but not least, if you have finish importing data, the polite way must be performed is disconnecting the database using dbDisconnect() function.

You can find the R-script described as follow:

#Step 1, install the RMySQL package (only if you did not install the package) 
install.packages("RMySQL")


#Step 2, Establish a connection 
library(DBI)
con <- dbConnect(RMySQL::MySQL(), 
dbname = "tweater", 
host = "courses.csrrinzqubik.us-east-1.rds.amazonaws.com", 
port = 3306,
user = "student",
password = "datacamp")


#Step 3, List the database tables
tables <- dbListTables(con)
str(tables) #display structure of tables

#Step 4, Import data from a table
users <- dbReadTable(con,"users")
users #print users

tweats <- dbReadTable(con,"tweats")
tweats #print tweats

comments <- dbReadTable(con,"comments")
comments #print comments

#Step5, disconnect database 
dbDisconnect(con)

Hope it helps! ;D