Wednesday, 7 June 2017

Kinerja Pembangunan Manusia Indonesia

IPM adalah salah satu Indikator penting dalam mengukur kinerja pemerintah baik daerah maupun pusat. Pada periode 2010 hingga 2015 provinsi-provinsi di luar pulau Jawa dengan status IPM rendah atau sedang menujukkan perkembangan IPM yang positif.

Latar Belakang

Indeks Pembangunan Manusia (IPM) menurut BPS satu indikator penting dalam mengukur keberhasilan pemabangunan manusia suatu wilayah atau Negara.  IPM menjelaskan tentang bagaimana penduduk suatu wilayah/Negara dapat mengakses hasil pembangunan dalam memperoleh pendapatan, pendidikan dan sebagainya.
Di Indonesia sendiri, IPM termasuk data strategis karena tidak hanya digunakan sebagai  ukuran kinerja pemerintah, tetapi IPM digunakan juga sebagai salah satu alokator penentuan Dana Alokator Umum (DAU).  Oleh karena itu, data IPM menjadi sangat penting untuk diperhatikan dalam memantau perkembangan pembangunan suatu wilayah/Negara.

Overview

Pada kesempatan kali ini, akan dilakukan analisa terhadap data IPM tiap provinsi di Indonesia periode 2010 hingga 2015 yang dipublikasikan oleh BPS. Pertama, mari kita lihat bagaimana perkembangan IPM provinsi-provinsi di Indonesia. 

BPS mengategorikan IPM menjadi empat kategori sebagai berkut:
  • IPM < 60 : IPM rendah
  • 60 < IPM < 70 : IPM sedang
  • 70 <  IPM < 80 : IPM tinggi
  • IPM > 80 : IPM sangat tinggi
Pada grafik diatas terlihat ada beberapa provinsi yang mengalami kenaikan status IPM dari sedang ke tinggi seperti Banten, Riau dan Sulawesi Utara serta dari rendah ke sedang yaitu Sulawei Barat dan Papua Barat. Provinsi lain statusnya  cenderung stagnan selama 2010 hingga 2015. Sekilas juga dapat kita lihat bahwa wilayah Indonesia timur masih tertinggal dalam pembangunan manusia dari wilayah-wilayah lain di Indonesia.
Catatan : Provinsi Kalimantan Utara baru disahkan tahun 2012 sehingga nilai IPM tahun 2010 hingga 2012 masih kosong.

Provinsi Berkinerja Terbaik

Selanjutnya, kita akan melakukan analisa lebih dalam untuk mengetahui provinsi mana yang melakukan perbaikan signifikan dalam pembangunan manusia. Untuk itu, ukuran yang lebih sesuai untuk menggambarkan kinerja pemerintah provinsi dalam pembangunan manusia adalah laju pertumbuhan IPM dari tahun ke tahun dibandingkan nilai IPM yang dimiliki. 

Dari grafik diatas dapat kita lihat bahwa tiga provinsi dengan laju pertumbuhan IPM terbesar berturut-turut adalah NTB, NTT dan Kalimantan Barat. Cukup menarik, dari sepuluh besar petumbuhan IPM terbesar, hanya Jawa Timur yang berasal dari pulau Jawa. Selebihnya adalah provinsi di luar pulau Jawa. Sisi positifnya adalah pembangunan di luar Jawa sudah semakin baik selama periode 2010-2015. (versi grafik interaktif disini
Grafik diatas adalah perbandingan rata-rata pertumbuhan IPM manusia tiap provinsi dengan rata-rata pertumbuhan Nasional. Provinsi dengan status IPM tinggi (70 – 80) seperti DKI Jakarta, DI Yogyakarta dan Bali rata-rata laju pertumbuhannya justru di bawah rata-rata nasional. (versi grafik interaktif disini)
Grafik diatas memperkuat temuan bahwa nilai IPM awal berbanding terbalik dengan rata-rata laju pertumbuhan. Semakin tinggi nilai IPM awal semakin rendah rata-rata laju pertumbuhannya dengan nilai korelai 0,65. (versi grafik interaktif disini).

Kesimpulan

Laju pertumbuhan pembangunan manusia Indonesia diukur dari IPM mengalami kenaikan di tahun 2010 hingga 2015. Kenaikan yang tinggi terjadi pada provinsi yang status awal IPM-nya adalah rendah atau sedang dan hal tersebut terjadi kebanyakan di provinsi yang berada di luar pulau Jawa, sebuah indikasi positif untuk pemerataan pembangunan. Sedangkan provinsi dengan status IPM tinggi cenderung lambat pertumbuhan IPM-nya.



Referensi :
https://www.bps.go.id/
http://ipm.bps.go.id/page/ipm


Saturday, 29 April 2017

Impelementing LSTMs using Keras Framework

Impelementing LSTMs using Keras Framework


This report is about experiment on LSTM implementation using Keras . Keras is high level neural network API written in Pyhton. Keras provides both TensorFlow and Theano for its backend. For this experiment, I used Theano backend because of some dependencie issues on my laptop, Keras uses TensorFlow backend by default though. Dataset used in this experiment is Pilkada DKI dataset which is collection of tweets mentioned all Jakarta governoral election candidates.


from __future__ import print_function

import numpy as np
import pandas as pd
import string

from gensim import corpora
from nltk.tokenize import word_tokenize 

from keras.preprocessing import sequence
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Embedding
from keras.layers import LSTM


Preparing Data

def load_data(path):
    print('import {} data...'. format(path))
    df = pd.read_csv(path)
    X_data = df['text']
    label_data = df['label']
    print('Data Shape', X_data.shape)
    return X_data, label_data


def preprocess(data_list):
    preprocess_doc = []
    stopwords = [line.rstrip('\n') for line in open('stopwords.txt')]
    
    for doc in data_list:
        doc_utf = doc.decode('utf-8').strip()
        tokens = word_tokenize(doc_utf)
        filtered = [word for word in tokens if word not in stopwords]
        #filtered.translate(string_trans, string.punctuation)
        preprocess_doc.append(filtered)
    return preprocess_doc


You can doing further preprocessing like remove punctuation, stemming, etc


def convert_to_token_id(processed_doc):
    print('converting to token ids...')
    word_id, word_id_len = [], []
    
    for doc in processed_doc:
        word_ids = [dictionary.token2id[word] for word in doc]
        word_id.append(word_ids)
        word_id_len.append(len(word_ids))
    return word_id, word_id_len


train_path = 'lstm_train.csv'
test_path = 'lstm_test.csv'

X_train, y_train = load_data(train_path)
X_test, y_test = load_data(test_path)

num_labels = len(np.unique(y_train))




import lstm_train.csv data...
Data Shape (2513L,)
import lstm_test.csv data...
Data Shape (629L,)


processed_docs_train = preprocess(X_train)
processed_docs_test = preprocess(X_test)


processed_docs_all = np.concatenate((processed_docs_train, processed_docs_test), axis=0)

dictionary = corpora.Dictionary(processed_docs_all)
dictionary_size = len(dictionary.keys())
print('dictionary size: ', dictionary_size)




dictionary size:  5916


word_id_train, word_id_len = convert_to_token_id(processed_docs_train)
word_id_test, word_ids = convert_to_token_id(processed_docs_test)




converting to token ids...
converting to token ids...


seq_len = np.round((np.mean(word_id_len) + 2*np.std(word_id_len))).astype(int)

#pad sequences
word_id_train = sequence.pad_sequences(np.array(word_id_train), maxlen=seq_len)
word_id_test = sequence.pad_sequences(np.array(word_id_test), maxlen=seq_len)
y_train_enc = np_utils.to_categorical(y_train, num_labels)

print('sequence length :', seq_len)




sequence length : 26


We need pad the input sequences so that they are all the same length for modeling. The model will learn the zero values carry no information so indeed the sequences are not the same length in terms of content, but same length vectors is required to perform the computation in Keras. I used maximum length 26 (average length of each tweet + 2 * its standard deviation)


word_id_train






array([[   0,    0,    0, ...,   11,   15,   14],
       [   0,    0,    0, ...,   15,   28,   25],
       [   0,    0,    0, ...,   34,   32,   36],
       ..., 
       [   0,    0,    0, ...,   11,   15, 5398],
       [   0,    0,    0, ...,   11,   15, 3323],
       [   0,    0,    0, ..., 1978, 4693, 4695]])



This is our final preprocessing data that will be used as input for LSTM model


Build Model>

I used simple architecture model with 3 layers. First layer is Embedding layer which wil process input into word embedding, then the second layer is lstm layer which will receive input from uotput of first layer. Finally, because this is a classification problem I used a Dense output layer with 3 neurons (as many as our label's shape) and a softmax activation function to make predictions for the three classes (positive, neutral and negative) in the problem.

The advantage of Keras is you can configure, extend and prototyping your architecture model easily because of its modularity and extensibility.

After we have constucted our model, then we just need to compile it all. In this model, I used categorical crossentropy for loss function (because this is multiple class) and adam optimization. Also used accuracy for evaluation metrics.


#LSTM
print('fitting LSTM ...')
model = Sequential()
model.add(Embedding(dictionary_size, 32))
model.add(LSTM(128))
model.add(Dense(num_labels))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(word_id_train, y_train_enc, epochs=3, batch_size=256, verbose=1)model.fit(word_id_train, y_train_enc, epochs=3, batch_size=256, verbose=1)




fitting LSTM ...
Epoch 1/3
2513/2513 [==============================] - 1642s - loss: 1.0667 - acc: 0.5193    
Epoch 2/3
2513/2513 [==============================] - 1561s - loss: 1.0014 - acc: 0.5376    
Epoch 3/3
2513/2513 [==============================] - 1636s - loss: 0.9570 - acc: 0.5376    



<keras.callbacks.History at 0x283cb828>



y_test_enc = np_utils.to_categorical(y_test, num_labels)

scores = model.evaluate(word_id_test, y_test_enc, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))




Accuracy: 52.15%


Problem when implementing deep learning without using GPU is its time consumption for running model. I only use 3 epoch from this example so that the accuracy still poor. Below is result of this model using 10 epoch I run before.

LSTM accuracy is out of perform compared to previous model that used SVM


Conclusion

  • Conclusion for Keras framework
    1. Keras is easy to use and good choice for research in deep learning
    2. LSTM give better result in Pilkada DKI dataset compared to previous model using SVM, just by using very simple model
  • Next move
    1. Start Implement aspect based sentiment analysis
    2. Combine LSTM with other word representation model (word2vector, etc)
  • Issue
    1. Deep learning run very slow when implemented without GPU
    2. Limited dataset that suits aspect based sentiment analysis especially for Indonesian language

Refferences


Sunday, 12 February 2017

Visualize Indonesia Population Density using ggplot2

Intro

Many peoples say that ggplot is a powerful package for visualization in R. I know that. But i'd never triggered to explore this package deeper (except just to visualize mainstream plot like pie chart, bar chart, etc.) till this post impressed me.

That post is about plotting map using ggplot. The pretty plots resulted on that post challenged me to explore ggplot more, especially in plotting map/spatial data.

Preparation


We always need data for any analysis. The author of those post use USA map data available in ggplot2 package. Though that post is reproducible research (data and code are available), but I want to go local by using Indonesia map data.

So, objective of this post is to visualize Indonesian population by province in Indonesia. So we need the two kinds of dataset. First is population data in province level and second is Indonesia map data.
The first data is available in BPS site. The data consists of population density (jiwa/km2) for each province in Indonesia from 2000 till 2014. I will go with the latest year available on the data which is 2014.

Oke, now we arrive to the hardest part. I stacked for a while when searching Indonesia map data that suit for ggplot2 geom_polygon format. But Alhamdillah, after read some articles about kind of spatial data, I got one clue, I need shape data with .shp format to plot map data. And just by typing "indonesian .shp data" on google, He will provide us tons of link results. Finally, I got Indonesian .shp data from one of the links suggested on this site. I downloaded level 1 data (province level) for this analysis.

Data Preprocessing


The fist step is load data into R. I use rgdal package to import .shp data. rgdal is more efficient in loading shape data compared to others package like maptools, etc.

#import data .shp file
library("rgdal")
#import .shp data
idn_shape <- readOGR(dsn = path.expand("~/your file directory"),
                     layer="YOUR_SHP_DATA")

Here's one of the advantages using rgdal package, though it is in shape format we can use operation like names(), table(), and $ subset operation like in data frame format. But, in this case the data I downloaded is in .rds format, so we just need use build in function in R readRDS() to import data. 

#if data has already on .rds format we can use this function
idn_shape <- readRDS("~/IDN_adm1.rds")

After data loaded into R workspace, we need to reformat shape data into format that suit to ggplot2 function.

#format data
library("ggplot2")
idn_shape_df <- fortify(idn_shape)

data will look like this


Next step, we will try to visualize the data we have

#visualize as in data
ggplot() +
  geom_polygon(data = idn_shape_df, aes(x=long, y = lat, group = group)) +
  coord_fixed(1.3
)
It works!, my data has suitable for ggplot2 format. Let's make it more colorful by colorize each province.

#add color by province
ggplot(data = idn_shape_df) +
  geom_polygon(aes(x = long, y = lat, fill = id, group = group), color = "white") +
  coord_fixed(1.3) +
  guides(fill=FALSE)  # do this to leave off the color legend

Woa! looks much better. But that's not the goal of this analysis. Let's moving forward. Now need to add population density data to complete the analysis.

#import density data
population <- read.csv("~/populasi_2014.csv")


population data has two column; provinsi and density with 32 rows fit to the number of province in Indonesia from Aceh to Papua. Next, we need to merge population dataset with idn_shape_df dataset. If you look in idn_shape, the id column in idn_shape dataset represents the province name. So, the id column in idn_shape_df should represents province name too. Then value in id column better we replace by province name.

#we need to creat dict of province id first
dict_prov_id = data.frame(idn_shape$ID_1, idn_shape$NAME_1)
colnames(id_prov) <- c("id", "province") #rename the column name

next, macth() (faster than merge() ) idn_shape_df$id with value in dict_prov_id 

idn_shape_df$id <- with(id_prov, province[match(idn_shape_df$id, id)])

since we have replaced value in id column by province name, it'll be better if we also rename the id column name into provinsi. Next, we will merge population dataset with idn_shape_df using inner_join from dplyr package.

#rename id column with provinsi
colnames(idn_shape_df)[6] <- "provinsi"
#make value in provinsi column to lower to avoid case sensitive
idn_shape_df$provinsi <- tolower(idn_shape_df$provinsi)
population$provinsi <-tolower(population$provinsi)
#join the two datasets
library(dplyr)
idn_pop_density <- inner_join(idn_shape_df, population, by = "provinsi")


the result will be like this


Finally, the dataset is ready now. Time to the main part of this analysis, plotting the density map.
#need this to remove background and outline of graph
ditch_the_axes <- theme(
  axis.text = element_blank(),
  axis.line = element_blank(),
  axis.ticks = element_blank(),
  panel.border = element_blank(),
  panel.grid = element_blank(),
  axis.title = element_blank()
)
#plot the map
map_pop_density <- ggplot(data = idn_shape_df, mapping = aes(x = long, y = lat, group = group)) +
  coord_fixed(1.3) + 
  geom_polygon(aes(x=long,y=lat, group=group, fill=density), data=idn_pop_density, color='black') +
  geom_polygon(color = "black", fill = NA) +
  theme_bw() +
  ditch_the_axes

map_pop_density

Cool! but it looks like it's hard to discern the different in area. Let's make it clearer by transforming the value of density by log10 

map_pop_density + scale_fill_gradient(trans = "log10")
It looks clearer now. Nothing special with the data as we know that Java has very high population compared to others province/area in Indonesia, and we are not discussing about that point this time. This is just an example of visualizing map/spatial data especially for Indonesian area using R which is open source (free) tools instead of using paid tools. We can then replace the fill by others value like number of sufferer of certain desaese to map the its spreadness or others data we desire.



Refference:
- http://eriqande.github.io/rep-res-web/lectures/making-maps-with-R.html
- https://www.bps.go.id/linkTableDinamis/view/id/843
- http://www.info-geospasial.com/2015/10/data-shp-seluruh-indonesia.html

source code:


Saturday, 31 December 2016

What is Machine Learning


Machine learning (ML) menjadi salah satu hot topic dalam dunia riset bidang teknologi dan sains dalam satu dekade terakhir. Lalu apa sebenarnya ML itu?

Tanpa kita sadari, sebenarnya setiap hari kita telah bersentuhan atau menggunakan aplikasi dari ML dalam aktivitas sehari-hari. Saat kita membuka facebook, news feed di krolonologi kita telah difilter untuk menampilkan news feed yang mungkin kita suka saja, saat membuka youtube kita akan melihat suggestion video yang sesuai dengan kegemaran kita, dan saat membeli barang di e-commerce atau membaca artikel di sebuah situs berita, kita akan di berikan rekomendasi barang/artikel yang berdekatan dengan interest kita, juga folder spam di email kita yang terisi sendiri tanpa perlu kita filter. Itu adalah beberapa contoh sederhana penerapan ML yang memudahkan kehidupan kita sehari-hari.

Definition

Sama halnya dengan data scientist, definisi ML sendiri ada banyak versi karena belum ada definisi baku yang di disepakati. Tetapi, definisi yang terkenal adalah pendapat Arthur Samuel yang mengatakan bahwa.
machine learning is field of study that gives computer ability to learn from data without being  explicitly programmed. (Arthur Samuel, 1959)
ya, perbedaan ML dengan progamming biasa adalah kita memberikan kemampuan kepada komputer untuk belajar sendiri dari data sehingga dia akan tahu tindakan apa yang seharusnya dilakukan berdasarkan data yang kita berikan tersebut, tanpa perlu menghandle segala kemungkinan sebagaimana programming biasa/tradisional lakukan.
software apps are programmed, intelligent apps are trained (with data).
(Carlos Guestrin)
Kevin P. Murphy dalam bukunya Machine learning : A Probabilistic Perspective memberikan definisi yang lebih "statistika" soal ML. Dia mengatakan bahwa ML adalah
A set of method that can automatically detects pattern in data, then use the uncovered pattern to predict future data, or perform other kinds of decision making under uncertainty (such as planning how to make collect to data). (Kevin P. Murphy)

Task

ML adalah subfield dari artifficial intelligence yang memadukan pendekatan computing dan juga matematics/statistics (liniar algebra, probabilistics, etc) sehingga jika ingin belajar ML harus punya bekal pengetahuan programming dan juga statistik untuk bisa menguasainya. Dalam hal permasalahan/kaskusnya, ML dibagi menjadi 3 bagian, yaitu:
  1. Supervised learning
    Pada supervised learning kita memberikan input data yang output atau responnya diketahui. Kemudian algoritma ML akan belajar dari data tersebut sehingga mampu memrediksi output atau respon dari data baru yang diberikan. Berdasarkan responnya supervised learning dibagi menjadi 2, yaitu:
    1. Classification
      Jika responnya adalah kategorik, maka kasusnya dinamakan classification. Misalnya adalah kita ingin memprediksi seseorang terkena kanker atau tidak, responnya adalah ya dan tidak. Algoritma yang digunakan untuk classification adalah logistic regression, support vector machine, decision tree, random forest, naive bayes, neural network, dsb
    2. Regression
      Kasus regresi adalah jika output atau responnya bersifat continue. Contoh kasusnya adalah prediksi harga saham, prediksi harga rumah, prediksi curah hujan dsb. Contoh algoritmanya adalah linear regression, polynomial regression, classification and regression tree (CART), random forest regression dsb.
  2. Unsupervised Learning
    Jika supervised learning memetakan input x ke output y, unsupervised learning tidak memiliki output sehingga yang dilakukan oleh algo-algo unsupervised learning adalah menemukan interesting pattern dari data yang ada. Contoh kasusnya adalah segmentasi customer dari e-commerce berdasarkan behaviour mereka sehingga tim marketing bisa memberikan treatment yang tepat sasaran sesuai dengan behaviour user.
    Contoh algoritmanya adalah k-means clustering, hierarchical clustering, mixture models dll. Selain clustering, pendekatan lain yang termasuk unsupervised adalah anomali detection dan dimensional reduction.
  3. Reinforcement Learning
    Dibandingkan dua kasus sebelumnya, RL bisa dikatakan lebih rumit tetapi lebih mendekati kasus yang terjadi dalam kehidupan nyata di dunia ini. Definisi RL adalah permasalahan untuk menemukan rule yang mengoptimumkan reward dalam suatu kondisi yang mana di kondisi itu terdapat reward dan punishment saat melakukan hal-hal tertentu.
    Agak susah sebenarnya menjelaskan apa itu RL, untuk lebih mudahnya analogikan saja seperti ini, kita ingin melatih kucing peliharaan kita agar tidak buang air sembarangan, kita tidak mungkin memberi tahu kepada kucing tersebut dengan bahasa kita karena dia tidak akan mengerti, maka cara yang bisa kita lakukan adalah memberikan reward misal makanan jika kucing kita buang air ditempat yang seharusnya dan juga punishment jika dia melakukan hal sebaliknya. Dengan sendirinya lama-kelamaan kucing kita akan mengerti mana yang harus dilakukan dan mana yang tidak boleh dilakukan berdasarkan reward dan punishment yang ada. Kita juga bisa menerapkan hal tersebut ke komputer. Contoh algoritma RL adalah markov decision process (MDP), multi arm bandit (MAB) dan A/B testing.

Future

Sebagai bagian dari rumpun ilmu artificial intellegence (AI), ML masih akan banyak dikembangkan baik di dunia riset maupun industri seiring dengan berkembangnya riset dan aplikasi AI saat ini. Topic yang sedang hot saat ini diantaranya adalah self driving car, deep learning, computer vision dan automation.


Referensi :
http://reinforcementlearning.ai-depot.com/

sumber gambar :dilbert.com