เอกสาร R Markdown ภาษาไทยชุดนี้อธิบาย การทำงานของโปรแกรม R/RStudio programming หัวข้อเรื่อง Introduction to R programming ในรายวิชา 2104525 Compuational Methods for IE เอกสารภาษาไทยชุดนี้ประกอบด้วย 3 ส่วน ได้แก่
data.table
จงคำนวณหาดัชนีชี้วัดทาง เศรษฐวิศวกรรม Net Present Value (NPV), Payback Period, and Internal Rate of Return (IRR) ของกระแสเงินสดต่อไปนี้
ปี | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Cashflow | -1350 | 363 | 551 | 681 | 761 | 821 | 1467 |
หากอัตราส่วนดอกเบี้ยรายปีคือ 8%
เศรษฐศาสตร์วิศวกรรม เป็นการประเมินความคุ้นทุนของโครงการซึ่งมีกระแสเงินเข้า (Cash Inflow) และ กระแสเงินออก (Cash Outflow) แตกต่างกัน เทียบกับการไม่ดำเนินโครงการใดๆ
ดังนั้นการเปรียบเทียบโครงการควรพิจารณาถึงอัตราผลตอบแทนทั้งโครงการ ณ ช่วงเวลาปัจจุบัน และพิจารณาอัตราผลตอบแทนขั้นต่ำ เรียกว่า NPV (Net Present Value) ซึ่งแสดงความสัมพันธ์ระหว่างกระแสเงิน ช่วงเวลา และอัตราผลตอบแทนดังนี้
\[NPV = \sum_{t=0}\frac{1}{(1+i)^t} cf_t\]
เมื่อ - NPV มูลค่าปัจจุบันจองโครงการ - \(cf_t\) กระแสเงินในช่วงเวลาที่ \(t\) - i อัตราผลตอบแทน
นอกเหนือจาก NPV ซึ่งเป็นการวัดมูลค่าเงินตัววัดโครงการแล้วยังมีดัชนีที่สำคัญอีก 2 ตัวได้แก่
IRR (Net Present Value) เป็นการวัดอัตราตอบแทนของโครงการ หรือ \[IRR = \arg_i \sum_{t=0}\frac{1}{(1+i)^t} cf_t = 0\]
Payback Period เป็นการวัดค่าช่วงเวลาที่โครงการเริ่มสร้างกำไร หรือ \[Payback = \arg_{\hat{t}} \sum_{t=0}^{\hat{t}} \frac{1}{(1+i)^t} cf_t = 0\]
function()
และ return()
ตามลำดับcashflow <- c(-1350, 363, 551, 681, 761, 821, 1467)
intDef <- 0.08
จากข้อมูลกระแสเงิน (cashflow) เราสามารถคำนวนระยะเวลาและสามารถแสดงระยะเวลาของกระแสได้โดย
length(cashflow) -1
## [1] 6
0:(length(cashflow) -1)
## [1] 0 1 2 3 4 5 6
เงินและมูลค่าปัจจุบันได้โดยสร้งตัวแปรชื่อ period
สำหรับระยะเวลาของกระแสเงิน
period <- 0:(length(cashflow) -1)
cashflow/(1+intDef)^(period)
## [1] -1350.0000 336.1111 472.3937 540.5998 559.3577 558.7588 924.4588
cashflow
และ intDef
ดังต่อไปนี้ และคำนวน NPVfindPV <- function(cashflow, intDef){
period <- 0:(length(cashflow) -1)
result <- cashflow/(1+intDef)^(period)
return(result)
}
findNPV <- function(cashflow, intDef){
sum(findPV(cashflow, intDef))
}
cashflow <- c(-1350, 363, 551, 681, 761, 821, 1467)
intDef <- 0.08
findPV(cashflow, intDef)
## [1] -1350.0000 336.1111 472.3937 540.5998 559.3577 558.7588 924.4588
sum(findPV(cashflow, intDef))
## [1] 2041.68
findNPV(cashflow, intDef)
## [1] 2041.68
ในการหา Payback period อาจเริ่ใโดยการ plot ซึ่งต้องการค่า ผลรวมมูลค่าปัจจุบันสะสม (Cummerative Present Value) และ ช่วงเวลา
cashflow.pv.sum <- cumsum(findPV(cashflow, intDef))
periods <- 0:(length(cashflow) -1)
plot(periods,cashflow.pv.sum,pch=16,type='b')
abline(h=0,col="red")
เราสามารถให้ R คำนวนประมาณจุดตัดแกน \(x\) ได้โดยการใช้ตำสั่ง approx()
payback <- approx(x=cashflow.pv.sum,y=periods,xout=0.0)
payback$y
## [1] 3.001601
ในการทดสอบหาค่า IRR สามารถทำได้โดยทดลองอัตราผลตอบแทนตั่งแต่ 0% ถึง 100% seq(0.0,1.0,0.01)
โดยอาจจใช้การสร้างค่าหลอกแล้ววนลูป for
หรือ การตำนวนครั้งเดียวด้วยฟังก์ชั่น sapply()
ก็ได้
interest <- seq(0.0,1.0,0.01)
npv.loop <- rep(NA,length(interest))
for(i in 1:length(interest)){
npv.loop[i]<- findNPV(cashflow=cashflow,intDef=interest[i])
}
npv.sapply <- sapply(interest,findNPV,cashflow=cashflow)
เมื่อทำการ plot จะได้ว่า
plot(interest,npv.sapply,pch=1)
points(interest,npv.loop,pch=16,cex=0.5,col="green")
abline(h=0,col="red")
เราสามารถให้ R คำนวนค่ารากของฟังก์ชั่น (จุดตัดแกน \(x\)) ได้โดยการใช้ตำสั่ง `uniroot()’ ซึ่งเป็นการหาคำตอบโดยวิธีการ trial-and-error ด้วย Algorithm Bi-Section Search ซึ่งมีแนวคิดในการทดสอบและเปรียบเทียบค่าของฟังก์ชั่น โดยแบ่งช่วงคำตอบเป็น 2 ส่วน
uniroot(findNPV,interval=c(0,1),cashflow=cashflow)
## $root
## [1] 0.3948883
##
## $f.root
## [1] -0.02120321
##
## $iter
## [1] 5
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
เนื่องจาก ค่า IRR เป็นค่ารากของสมการคำตอบ NPV (ดอกเบี้ยที่ทำให้ค่า NPV = 0) หรือ
\[ 0 = -1350 \left( \frac{1}{1+i} \right)^0 + 363 \left( \frac{1}{1+i} \right)^1 + 551 \left( \frac{1}{1+i} \right)^2 + 681 \left( \frac{1}{1+i} \right)^3 + 761 \left( \frac{1}{1+i} \right)^4 + 821 \left( \frac{1}{1+i} \right)^5+ 1467 \left( \frac{1}{1+i} \right)^6 \]
หากพิจารณาว่า \(x \equiv \left( \frac{1}{1+i} \right)\) จะได้ว่า
\[ 0 = -1350 + 363 x + 551 x^2 + 681 x^3 + 761 x^4 + 821 x^5+ 1467 x^6 \]
ซึ่งเป็นสมการในรูปะพหคูณ (polynormial function) และสามารถใช้คำสั่ง polyroot
ในการหาค่าได้
result <- polyroot(cashflow)
intRate <- 1/result - 1
intRate[ abs(Im(intRate)) < 0.001 & Re(intRate) >0 ] ## เลือกคำตอบที่เป็นจำนวนบวก
## [1] 0.3948815+0i
polyroot
Copyright 2019 Oran Kittithreerapronchai. All Rights Reserved. Last modified: 2021-23-02,