เหตุใดเราใช้ ภาษา R แทน Excel – ตอน 3 รันรวดเดียว 200 ชุด ( Multiple Regression )

0
GornNutagorn_R_Regression

เคยไหมครับที่อยากจะซอยข้อมูลใหญ่ๆเป็นชุดๆ แล้วคำนวณแบบเดิมซ้ำๆเพื่อให้ได้ผลลัพธ์ของข้อมูลย่อยแต่ะละอัน เช่น อยาก run regression แต่

  • มีตั้ง 10 ตัวแปร เอาอะไรมาคู่กับอะไรดี?
  • รันช่วงเวลาไหนดี?
  • อยากรันมันทุกสรรพสิ่ง แต่ใช้ Excel หรือ SPSS เสียเวลาโคต

ในบทความนี้ผมจะยกตัวอย่างการรัน Multiple Regression จำนวนมากในโค้ดเดียวผ่านข้อมูล 1 ชุด

ขออธิบายลักษณะ / จุดประสงค์และวิธีซอยชุดข้อมูลตัวอย่างนี้ก่อนครับ

ผมต้องการ Predict ค่า Nominal GDP (USD) (Dependent Variable) ของประเทศต่างๆ โดยใช้ Multiple Linear Regression ผ่านตัวแปรอิสระ (Independent Variable) ที่ผมเล็งไว้ 3 ตัว คือ

  • Unemployment : Unemployment Rate (% of total labor force)
  • Inflation : Inflation by consumer prices (annual %)
  • Nettrade : Net trade in goods (BoP, current US$)

โดยผมแยกอยากจะรันโดยแยกเป็นหลายๆมิติดังนี้

  • รันทีละประเทศ จำนวน 68 ประเทศ
  • รันแยก 2 ช่วงเวลาคือปี 2001 – 2010 และ 2006 – 2015
  • รันคู่กับตัวแปรอิสระ ทีละ 2 ตัวแปร เป็น 2 แบบนี้
    • Unemployment กับ Inflation
    • Unemployment กับ Nettrade

ดังนั้น ผมจะต้องรัน Multiple Regression ทีเดียวทั้งหมด คือ 68 x 2 x 2 = 272 ชุดนั่นเอง

**ขอหมายเหตุไว้ก่อนนะครับ ว่าตัวอย่างนี้ไม่มีเหตุผลทางทฤษฎีรองรับนะครับ เป็นแค่ตัวอย่างวิิธีทำครับ

บอกสิ่งที่จะทำคร่าวๆไปแล้ว มาดูการทำทีละ step เลยนะครับ

1. เตรียมข้อมูล

( สำหรับท่านที่ไม่เคยใช้ R ลองดูบทความนี้ช่วงท้าย ผมใส่วิธี set up ย่อๆไว้ครับ https://gornnutagorn.com/2018/04/29/r-excel-2-market-basket-analysis/)

ผมไปเอาข้อมูลมาจาก World Bank นะครับ สามารถไปหาโหลดได้ที่ลิงค์ด้านล่างนี้เลยครับ

http://databank.worldbank.org/data/reports.aspx?source=world-development-indicators#

โดยผมจะเลือกตัวแปรแค่ 4 ตัวนี้ครับ

  1. GDP (current US$)
  2. Unemployment, total (% of total labor force) (national estimate)
  3. Inflation, consumer prices (annual %)
  4. Net trade in goods (BoP, current US$)

และปรับ Layout ผมจะให้

  • Time – row
  • Series – Column
  • Country – Page

เพื่อความง่ายในการจัดข้อมูลครับ ทีนี้ ผมได้ทำการจัดเรียงข้อมูลใหม่ดังนี้นะครับ (แต่ผมใช้ Excel จัดนะครับ ที่จริงใช้ R ได้ แต่เดี๋ยวบทความจะยาวไปครับ)

  • เปลี่ยนชื่อคอลัมน์เพื่อให้ดูง่าย
  • ตัดทุกประเทศที่ข้อมูลไม่ครบสำหรับปี 2001 – 2015 ออกไป (จาก 264 ประเทศจะเหลือ 68 ประเทศ) รวมถึง
  • ตัดข้อมูลปีอื่นๆนอกเหนือจาก 2001 – 2015 ออกไป

จะได้หน้าตาข้อมูลออกมาเป็นแบบนี้ครับ

gornnutagorn_multiple_regression_data

โดยผู้อ่านสามารถโหลดข้อมูลที่ผมจัดเรียงแล้วได้ตามลิงค์ด้านล่างเลยนะครับ
https://gornnutagorn.com/wp-content/uploads/2018/04/datareg1.xlsx

ส่วนอันนี้จะเป็นตารางความหมายชื่อย่อประเทศนะครับ
https://gornnutagorn.com/wp-content/uploads/2018/04/gornnutagorn_multiple_regression_country_code.xlsx

เมื่อทำความเข้าแล้ว ก็โยนไฟล์ที่ผมจัดเรียงแล้วข้างต้น (datareg1.xlsx) เข้า working directory ของท่านได้เลยครับ

2. รันโค้ดกันเลย

ก่อนจะอธิบายโค้ด ผมจะพูดถึงการสิ่งที่ R ทำและ การวาง Structure ของผลลัพธ์ก่อนนะครับ
ผมจะให้แต่ละประเทศรัน 4 โมเดล ตามนี้นะครับ

  1. Model 1 – Independent Variables เป็น Unemployment กับ Inflation ข้อมูลปี 2001 – 2010
  2. Model 2 – Independent Variables เป็น Unemployment กับ Nettrade ข้อมูลปี 2001 – 2010
  3. Model 3 – Independent Variables เป็น Unemployment กับ Inflation ข้อมูลปี 2006 – 2015
  4. Model 4 – Independent Variables เป็นUnemployment กับ Nettrade ข้อมูลปี 2006 – 2015

โค้ดที่ผมเขียน มันจะวิ่งไปดึงข้อมูลออกมาทีละชุด เช่น ชุดแรก มันจะไปดึงข้อมูลประเทศ ALB และเรียงข้อมูล GDP / Unemployment / Inflation ตั้งแต่ปี 2001 – 2010 มาเก็บไว้ก่อนเพื่อ Run Regression – Model 1
และค่าที่ผมต้องการจะดึงจาก Regression แต่ละชุดจะมี

  • Adjusted R Square
  • Intercept
  • Coefficient (x1, x2)
  • Durbin Watson Statistic

ที่จริงแล้วสามารถดึงมาได้มากกว่านี้ เช่น ค่า sig / ค่า VIF อันนี้แล้วแต่ท่านจะดึงมาเลยครับ

ดังนั้น หน้าตาผลลัพธ์ของผม จากภาพจะเป็นแบบนี้ครับ

gornnutagorn_multiple_regression_result

ไล่ตาม Column จะเป็นดังนี้นะครับ

  • (index)
  • Country [ชื่อย่อประเทศ]
  • ar_M1 [Adjusted R Square ของ Model1]
  • ar_M2 [Adjusted R Square ของ Model2]
  • ar_M3 [Adjusted R Square ของ Model3]
  • ar_M4 [Adjusted R Square ของ Model4]
  • M1_intercept [ค่า Intercept ของ Model 1]
  • M1_Unemployment_Coef [ค่า Coefficient : Unemployment ของ Model 1]
  • M1_Inflation_Coef [ค่า Coefficient : Inflation ของ Model 1]
  • M1_DW [ค่า Durbin Watson Statistic ของ Model 1]

.
.
.
.
.

  • M4_intercept [ค่า Intercept ของ Model 4]
  • M4_Unemployment_Coef [ค่า Coefficient : Unemployment ของ Model 4]
  • M4_Nettrade_Coef [ค่า Coefficient : Nettrade ของ Model 4]
  • M4_DW [ค่า Durbin Watson Statistic ของ Model 4]

มาดูโค้ดกันเลยครับ

-----
## required packages
library(sqldf)
library(xlsx)
library(car)
library(MASS)
## step 1 - load data
data1 <- read.xlsx("./datareg1.xlsx",sheetIndex = 1,header = TRUE,stringsAsFactors=FALSE)
## step 2 - prepare country list to run regression
a <- unique(data1[,1])
alist <- as.list(unique(data1[,1]))
## step 3.1 - prepare sql statement to run regression
query1 <- "SELECT * FROM data1 WHERE Countrycode='xxx' AND (Yr BETWEEN '2001' AND '2010')"
query2 <- "SELECT * FROM data1 WHERE Countrycode='xxx' AND (Yr BETWEEN '2006' AND '2015')"
## step 3.2 - prepare blank dataframe with header for filling data
x <- data.frame(matrix(ncol = 21, nrow = 0))
colnames(x) <- c("Country", "ar_M1", "ar_M2", "ar_M3","ar_M4",
 "M1_intercept","M1_Unemployment_Coef","M1_Inflation_Coef","M1_DW",
 "M2_intercept","M2_Unemployment_Coef","M2_Nettrade_Coef","M2_DW",
 "M3_intercept","M3_Unemployment_Coef","M3_Inflation_Coef","M3_DW",
 "M4_intercept","M4_Unemployment_Coef","M4_Nettrade_Coef","M4_DW")
## step 4 - using "for" loops to fill all regression results
# step4.1 - looping for period of 2001 - 2010
for(i in alist){
 data = sqldf(gsub("xxx",i,query1))
 fit1 <- lm(GDP ~ Unemployment + Inflation, data=data)
 fit2 <- lm(GDP ~ Unemployment + Nettrade, data=data)
 i_index <- split(seq_along(a), a)
 b <- i_index[[i]]
 x[b,1] <- i
 x[b,2] <- summary(fit1)$adj.r.squared
 x[b,3] <- summary(fit2)$adj.r.squared
 x[b,6] <- summary(fit1)$coefficients[1, 1]
 x[b,7] <- summary(fit1)$coefficients[2, 1]
 x[b,8] <- summary(fit1)$coefficients[3, 1]
 x[b,9] <- durbinWatsonTest(fit1)[[2]]
 x[b,10] <- summary(fit2)$coefficients[1, 1]
 x[b,11] <- summary(fit2)$coefficients[2, 1]
 x[b,12] <- summary(fit2)$coefficients[3, 1]
 x[b,13] <- durbinWatsonTest(fit2)[[2]]
}
# step4.2 - looping for period of 2006 - 2015
for(i in alist){
 data = sqldf(gsub("xxx",i,query2))
 fit3 <- lm(GDP ~ Unemployment + Inflation, data=data)
 fit4 <- lm(GDP ~ Unemployment + Nettrade, data=data)
 i_index <- split(seq_along(a), a)
 b <- i_index[[i]]
 x[b,4] <- summary(fit3)$adj.r.squared
 x[b,5] <- summary(fit4)$adj.r.squared
 x[b,14] <- summary(fit3)$coefficients[1, 1]
 x[b,15] <- summary(fit3)$coefficients[2, 1]
 x[b,16] <- summary(fit3)$coefficients[3, 1]
 x[b,17] <- durbinWatsonTest(fit3)[[2]]
 x[b,18] <- summary(fit4)$coefficients[1, 1]
 x[b,19] <- summary(fit4)$coefficients[2, 1]
 x[b,20] <- summary(fit4)$coefficients[3, 1]
 x[b,21] <- durbinWatsonTest(fit4)[[2]]
}
## step5 - Write Excel File
write.xlsx(x, "./Regression_Result1.xlsx")
-----

 

อธิบายโค้ดนะครับ

## required packages
คือแพคเกจที่ต้องเตรียมพร้อมก่อน ถ้ายังไม่เคยลงให้ใช้คำสั่ง
install.packages()
เพื่อลงก่อนนะครับ

## step 1 – load data
นำเข้าข้อมูลจากไฟล์ที่ผมเตรียมไว้

## step 2 – prepare country list to run regression
เตรียมรายชื่อประเทศที่จะทำการ Looping กับ Regression

## step 3.1 – prepare sql statement to run regression
เตรียม SQL Statement เพื่อ query ข้อมูลทีละส่วน

—– คั่น (เริ่ม) —–

อันนี้ที่จริงแล้ว ท่านจะใช้แพคเกจอะไรก็ได้สำหรับซอยข้อมูลมารัน สำหรับคนใช้ R น่าจะถนัดพวก

dplyr
data.table
reshape2

แต่ผมจะถนัดภาษา SQL ที่สุดเพื่อจัดเรียงข้อมูล เพราะผมใช้ประจำอยู่แล้ว

ตรงนี้ผมขอพูดเรื่องภาษา SQL เพิ่มเติมนิดนึงครับว่า ถ้าท่านจะใช้ภาษา R หรือ programming language ใดใดในการคำนวณแล้ว ท่านเรียนรู้ภาษานี้ไว้เถอะครับ (สำหรับท่านที่ไม่รู้จัก) ผมคิดว่า R นั้นเหมาะกับการใช้เพื่อจัดการคำนวณข้อมูลขนาดกลางขึ้นไป บางท่านอาจมีความคิดว่าอยากเรียนภาษา R แต่ไม่รู้ว่าจเรียนไปจัดการกับข้อมูลอะไร ส่วนมากข้อมูลที่เริ่มจะใหญ่ ไม่น่าจะมาในแบบ Excel หรือ CSV แล้วครับ แต่จะอยู่ในรูปอื่นเช่น Database JSON ฯลฯ แทนครับ ซึ่งภาษา SQL นั้น มีไว้เพื่อจัดการกับ Relational Database เช่นระบบที่นิยมคือ MySQL, PostgreSQL

ผมอาจจะรู้ไม่มากเท่าไหร่ในเรื่องพวกนี้ แต่เท่าที่ได้ยินมา หากท่านต้องถึงกับใช้ R ในองค์กร ข้อมูลที่ท่านต้องใช้เพื่อจัดการ ไม่น่าจะอยู่ในรูป Excel แล้วครับ

—– คั่น (จบ) —–

## step 3.2 – prepare blank dataframe with header for filling data
สร้างตารางเปล่าพร้อมชื่อ column เพื่อหย่อนข้อมูลผลลัพธ์

## step 4 – using “for” loops to fill all regression results
ใช้ For Loop เพื่อทำซ้ำการรัน Regression ทีละชุด และหย่อนข้อมูลลงไปใน dataframe ลงมาเรื่อยๆ

โดยในการรันแต่ละครั้ง จะนำชื่อประเทศในลิสตอนแรกมาแทนค่าใน SQL statement เพื่อเตรียมข้อมูล และรันจนจบ จากนั้นก็จะเริ่มประเทศต่อไปเรื่อยๆจนหมดลิส

การรัน 2 ช่วงคือ ช่วงแรก รันข้อมูลเฉพาะปี 2001 – 2010 ก่อน (Model 1&2) จนจบก่อน จากนั้นค่อย รันข้อมูลปี 2006 – 2015 (Model 3&4)

## step5 – Write Excel File
Export ผลลัพธ์ออกมาเป็น Excel ไฟล์ชื่อ Regression_Result1.xlsx

โดยหน้าตาจะออกมาเป็นแบบนี้นะครับ(ภาพเดิม)

gornnutagorn_multiple_regression_result

Download ผลลัพธ์ได้ตรงนี้ครับ

https://gornnutagorn.com/wp-content/uploads/2018/04/Regression_Result1.xlsx

จบจ้ะ

—————————————-

เรื่องที่อยากพูดเพิ่มเติมในบทความนี้

สิ่งที่ผมต้องการนำเสนอเรื่องราวความสามารถของภาษา R ผ่านบทความนี้คือ “ความสามารถในการประหยัดเวลา” และ “ความยืดหยุ่น” เช่น

  1. การทำซ้ำ (Loopping) – คือ R มันเป็น Programming Language ชนิดหนึ่ง เราเลยสั่งให้มันทำงานซ้ำๆไปเรื่อยๆโดยแค่เรากำหนดว่าจะให้มันวนไปแค่ไหน คือผมคิดภาพไม่ออกเลยว่า ถ้าผมเถือกทำเอง จะต้องใช้เวลาสักเท่าไหร่
  2. มันเก็บค่า Multiple Regression ที่คำนวณไว้ได้หมดเลย คือเวลามันคำนวณ 1 ครั้ง มันจะเก็บค่าสถิติที่สำคัญของผลลัพธ์ไว้หมดเลย ซึ่งเราจะดึงค่าไหนออกมาดูก็ได้
  3. การใช้ร่วมกับภาษา/ format อื่น ในบทความนี้ผมใช้ภาษา SQL ร่วมด้วย คือ R มันมีคนทำ package ฟรีมาเยอะแยะ ผมจะใช้มันไปเก็บข้อมูลเว็บก็ได้ เช่นผ่าน html xml หรือ จะใช้มันเก็บข้อจากไฟล์ PDF ก็ยังได้ (ถ้ามีเวลาจะเขียนเป็ยบทความครับ)

ที่จริงแล้วผมลองไปดูมา 3 ข้อข้างต้น ใน Excel ก็ทำได้นะครับโดยการเขียน VBA (แต่ผมคงไม่รู้ว่าเขียนยังไง) จะมีก็แค่ข้อ 2 ที่ผมไม่แน่ใจว่าทำได้เหมือน R หรือเปล่า

สื่งที่ต้องระวัง ในบทความนี้

คือจะเห็นว่า ผมรันแบบรัวๆเพื่อความเข้าใจเฉยๆ แต่วิธีการทางสถิติที่ดี ไม่ควรทำแบบนี้ โดยมีประเด็นตามนี้ครับ

  • ควรมีสมมติฐานที่หนักแน่นรองรับก่อน ไม่งั้นจะเกิดปัญหา 2 แบบ (ที่ผมคิดออก)
    • เสียเวลา เพราะมีคนเคยคิดแล้ว
    • ปัญหา confounder เช่น
      • สมมติพบว่ายอดขายไฮศกรีมกับอัตราการเกิดการฆาตกรรมในเมืองหนึ่ง มีความสัมพันธ์กันสูง แต่ที่จริงนั่นเพราะ อากาศที่ร้อน นำไปสู่การเพิ่มขึ้นของทั้ง 2 สิ่ง
      • สมมติพบว่า ขนาดรองเท้ากับความฉลาดสัมพันธ์กัน แต่ที่จริงแล้ว ความฉลาดแปรผันตามอายุ ซึ่งทำให้ขนาดรองเท้าใหญ่ขึ้นตามด้วย (อายุคือ confounder)
  • เมื่อได้ตัวแปรแล้ว ไม่ควรชักเข้าออกมั่วๆ ควรจะมีวิธีการคัดเลือกตัวแปร เช่นวิธีการตามนี้
    • Hierarchical (Block wise entry)
    • Forced Entry (Enter)
    • Stepwise
  • การ Run Linear Regression มีสมมติฐานมากมาย เช่น No Multicollinearity, Homoscedasticity ตรงนี้ เมื่อรันเสร็จแล้วก็ต้องมาเช็คด้วย ไม่งั้นจะได้โมเดลที่ไม่มีความหมาย

อย่างไรก็ตาม สำหรับผมแล้ว สถิติ มันจะพลิกยังไงก็ได้ ผมเคยนำสิ่งที่ผิดกฎมาคิดไปๆมาๆ บางครั้งมันก็มีผลลัพธ์ออกมาบ้าง ใช้ได้บ้างไม่ได้บ้าง เพราะสุดท้ายมันคือการนำเสนอข้อมูลอย่างหนึ่ง จะใช้ยังไงก็ตามแต่วัตถุประสงค์ครับ แค่ cross check มันเยอะๆหน่อยละกันครับ

ถึงตรงนี้ผิดพลาดประการใด ต้องขออภัยไว้ตรงนี้ และ คอมเมนต์ได้เลยครับ

ขอบคุณที่อ่านจนจบครับ

(บทความนี้ เขียนเมื่อ 2017-09-18)

Created by : GornNutagorn

 

ช่องทางอื่นๆของ GornNutagorn

Facebook : https://www.facebook.com/GornNutagorn/

Youtube : www.youtube.com/c/GornNutagornChannel

 

Sponsored by :

#####################################

grocerlock_โกรเซอล็อค

 

สนับสนุนโดย : www.grocerlock.com (คลิกเพื่อเข้าเว็บ)

ซุปเปอร์มาร์เก็ตออนไลน์ ขายสินค้าอุปโภคบริโภคทั่วไป

ขายปลีก-ส่ง / ต่อรองได้ / ส่งทั่วประเทศ

FB อินบ้อกได้ที่ : https://www.facebook.com/grocerlock (คลิกเพื่อส่งข้อความทางอินบ็อกซ์)

ซื้อผ่านไลน์ได้ที่ Line ID : @grocerlock (คลิกเพื่อเพิ่มเพื่อน)

#####################################

LEAVE A REPLY

Please enter your comment!
Please enter your name here