การคำนวนผลที่ได้จากนโยบายด้วย Causal Impact Analysis
ไม่ว่าจะเป็นองค์กรของรัฐบาลหรือบริษัทเอกชน ผู้ที่มีอำนาจตัดสินใจย่อมต้องการวัดผลที่ได้รับจากนโยบายหรือโครงการที่ได้นำมาใช้เพื่อประเมินว่าผลที่ได้รับนั้นคุ้มค่ากับค่าใช้จ่ายในการดำเนินนโยบายหรือไม่ โดยวันนี้เราจะมาทำความรู้จักกับการทำ Causal Impact Analysis
ตัวอย่างในวันนี้เราจะทำการวิเคราะห์ผลกระทบต่อราคาหุ้นของเครือ Volkswagen หลักจากที่ถูกฟ้องร้องเรื่องละเมิดกฎหมายควบคุมมลพิษ เหตุการณ์ครั้งนี้เป็นที่รู้จักกันในชื่อว่า Volkswagen Emission Scandal
โดยปกติแล้ว คำถามประเภทนี้เราจะนำข้อมูลจากกลุ่มตัวอย่างที่ไม่ได้รับผลกระทบมาเปรียบเทียบ แต่ในกรณีนี้นั้นเป็นไปไม่ได้ ดังนั้นเราจะใช้ข้อมูลที่มีก่อนเกิดเหตุการณ์เพื่อมาใช้ทำนายค่าชี้วัดหลังจากเกิดเหตุการณ์ และนำผลมาเปรียบเทียบ
Causal Impact Analysis: Simple Model
เราจะใช้ R programming เพื่อทำการวิเคราะห์ในบทความนี้ เราจะเริ่มโดยการ plot ข้อมูลราคาปิดตลาดต่อหุ้นของ Volkswagen เพื่อพิจารณา ก่อนอื่นเราจะโหลด packages ที่จำเป็นแล้วก็เริ่มทำการ plot (หากยังไม่เคยติดตั้ง packages เหล่านี้ ให้ใช้คำสั่งที่ถูก commented ไว้นะครับ)
options(warn = -1)
#install.packages("tseries")
library(tseries)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("devtools")
#devtools::install_github("google/CausalImpact")
library(CausalImpact)
#install.packages("lubridate")
library(lubridate)
# กำหนดช่วงเวลาของ Time Series
start = "2011-01-03"
end = "2017-03-20"
quote = "AdjClose"
# ดาวน์โหลดข้อมูลราคาหุ้น
VolksWagen <- get.hist.quote(instrument = "VOW.DE", start, end, quote, compression = "w")
series <- cbind(VolksWagen)
# ใส่วันที่เกิดเหตุการณ์
scandalDate <-ymd('2015-09-14')
colnames(series) <- c("VolksWagen")
# plot time series ราคาพร้อมกับเส้นแนวตั้ง ณ วันที่เกิดเหตุการณ์
autoplot(series, facet = NULL) +
xlab("") +
ylab("Adjusted Close Price") +
geom_vline(xintercept = scandalDate,
linetype = 'dashed')

จะเห็นได้ว่า หลังจากเส้นประที่ขีดไว้ ราคาปิดตลาดต่อหุ้นนั้นลดลงอย่างรวดเร็วมาก เราต้องการประเมินว่าผลกระทบนี้เป็นเท่าไหร่ เบื้องต้นเราอาจจะใช้วิธีการ Time Series แบบมาตรฐานเพื่อนำมาใช้ประเมิน จะได้ผลการวิเคราะห์ดังนี้
options(warn = -1)
# กำหนดช่วงก่อนและหลังเกิดเหตุการณ์
pre.period <- as.Date(c(start, "2015-09-14"))
post.period <- as.Date(c("2015-09-21", end))
impact_vw_reg <- CausalImpact(series, pre.period, post.period, model.args = list(niter = 1000, nseasons = 52))
# niter คือ จำนวนครั้งการทำ Optimisation Steps
# nseasons คือ ค่าความยาวของ seasonality cycle ในกรณีนี้เราใช้เป็น 52 (สัปดาห์)= 1 ปี
plot(impact_vw_reg)

จะเห็นได้ว่าการประเมินในรูปแบบนี้ไม่สามารถใช้ได้ในระยะยาว เนื่องจากค่าความไม่แน่นอนจะสูงขึ้นอย่างรวดเร็ว ซึ่งค่อนข้างสมเหตุสมผล เนื่องจากว่าข้อมูลราคาในอดีตอาจจะบอกข้อมูลได้ไม่สมบูรณ์ ดังนั้นเราจะเลือกนำ Time Series ชุดอื่นที่มีพฤติกรรมคล้าย ๆ กัน และไม่ได้รับผลกระทบจากเหตุการณ์นี้ ในกรณีนี้เราจะนำเอาราคาปิดตลาดของผู้ผลิตรถยนต์รายอื่น เช่น BMW และ Allianz มาพิจารณาเปรียบเทียบกัน
start = "2011-01-03"
end = "2017-03-20"
quote = "AdjClose"
# ดาวน์โหลดข้อมูลราคาหุ้น
VolksWagen <- get.hist.quote(instrument = "VOW.DE", start, end, quote, compression = "w")
BMW <- get.hist.quote(instrument = "BMW.DE", start, end, quote, compression = "w")
Allianz <- get.hist.quote(instrument = "ALV.DE", start, end, quote, compression = "w")
# นำ Time Series ทั้งสามอันมารวมเป็น Data Frame
series <- cbind(VolksWagen, BMW, Allianz)
scandalDate <-ymd('2015-09-14')
colnames(series) <- c("VolksWagen", "BMW", "Allianz")
autoplot(series, facet = NULL) +
xlab("") +
ylab("Adjusted Close Price")+
geom_vline(xintercept = scandalDate, linetype = 'dashed')

จะพบว่าแนวโน้มของทั้งสามราคามีค่าใกล้เคียงกัน แต่ว่า BMW และ Allianz ไม่ได้รับผลกระทบกับคดีความครั้งนี้ เราจึงมีแนวคิดที่ว่าจะใช้ Time Series ของราคา BMW และ Allianz เพื่อมาทำนายราคาในกรณีที่การฟ้องร้องครั้งนี้ไม่เกิดขึ้น
Bayesian Structural Time Series
Bayesian Structural Analysis จะนำเอาการ Regression มารวมกันกับเทคนิคทาง Time Series โดยจะสรุปได้ในโดยสมการ

เราจะใช้ Package ใน software R และหลักการทาง Bayesian Inference เพื่อประมาณค่าของ และค่าความคลาดเคลื่อนที่เป็นไปได้ของการประมาณ โดยผลลัพธ์ที่ได้สามารถนำมาแสดงผลได้ดังแผนภาพข้างล่างนี้ โดยที่ตัวแปร series ในโค้ดข้างล่างนี้เป็นตัวแปรเดียวกันกับโค้ดที่ใช้สร้าง Figure 3 ข้างบน
library(CausalImpact)
# ระบุวันที่ช่วงก่อน และหลังเกิดเหตุการณ์
pre.period <- as.Date(c(start, "2015-09-14"))
post.period <- as.Date(c("2015-09-21", end))
# นำข้อมูลที่ได้มาใส่ใน CausalImpact package เพื่อทำการวิเคราะห์
impact_vw_reg <- CausalImpact(series, pre.period, post.period,
model.args = list(niter = 1000, nseasons = 52))
plot(impact_vw_reg)

จะเห็นได้ว่า confidence interval นั้นไม่ได้กว้างขึ้นในระยะยาว ทำให้การทำนายระยะยาวพอมีความเป็นไปได้มากขึ้น นอกจากนี้เรายังสามารถดู Summary Statistics เพื่อประเมินความมั่นใจของค่าประมาณของเราได้

References
- Causal Impact Package – ทดลองการแยก Impact ด้วย Intervention ที่จำลองขึ้นมา
- Causal Impact Analysis on Volkswagen Emissions Scandal – การวิเคราะห์ impact ของ Emissions Scandal