ไม่ว่าจะเป็นองค์กรของรัฐบาลหรือบริษัทเอกชน ผู้ที่มีอำนาจตัดสินใจย่อมต้องการวัดผลที่ได้รับจากนโยบายหรือโครงการที่ได้นำมาใช้เพื่อประเมินว่าผลที่ได้รับนั้นคุ้มค่ากับค่าใช้จ่ายในการดำเนินนโยบายหรือไม่ โดยวันนี้เราจะมาทำความรู้จักกับการทำ 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')
Figure 1: กราฟแสดงราคาหุ้นของเครือ Volkswagen ช่วงก่อนและหลัง Emission Scandal

จะเห็นได้ว่า หลังจากเส้นประที่ขีดไว้ ราคาปิดตลาดต่อหุ้นนั้นลดลงอย่างรวดเร็วมาก เราต้องการประเมินว่าผลกระทบนี้เป็นเท่าไหร่  เบื้องต้นเราอาจจะใช้วิธีการ 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)
Figure 2: แสดงผลการทำ Causal Impact Analysis ภาพด้านบนสุดเป็นการเปรียบเทียบค่าที่เกิดขึ้นจริง และค่าที่น่าจำเกิดขึ้นถ้าไม่มีเหตุการณ์ ภาพกลางแสดงผลต่าง และภาพล่างสุดแสดงผลต่างสะสม

จะเห็นได้ว่าการประเมินในรูปแบบนี้ไม่สามารถใช้ได้ในระยะยาว เนื่องจากค่าความไม่แน่นอนจะสูงขึ้นอย่างรวดเร็ว ซึ่งค่อนข้างสมเหตุสมผล เนื่องจากว่าข้อมูลราคาในอดีตอาจจะบอกข้อมูลได้ไม่สมบูรณ์ ดังนั้นเราจะเลือกนำ 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')
Figure 3: ราคาหุ้นเปรียบเทียบทั้งสามกลุ่มผู้ผลิตรถยนต์

จะพบว่าแนวโน้มของทั้งสามราคามีค่าใกล้เคียงกัน แต่ว่า 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 เพื่อประเมินความมั่นใจของค่าประมาณของเราได้

Figure 4: สรุปผล Impact และ Confident Interval ของเหตุการณ์ครั้งนี้ โดยเฉลี่ยเหตุการณ์ครั้งนี้ทำให้ราคารายวันโดยประมาณ 46USD จากที่ควรจะเป็น 176USD

References

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

Data Scientist
Government Big Data Institute (GBDi)

Recommended Posts