ইনক্রিমেন্টাল বেনিফিট-কস্ট অ্যানালাইসিস
এই পাঠে যা শিখবেন
- কেন আলাদাভাবে সর্বোচ্চ B/C রেশিওর অল্টারনেটিভ বাছাই করা সবসময় সঠিক নয়
- খরচ-অনুক্রমে ধাপে ধাপে ইনক্রিমেন্টাল B/C ($\Delta B/\Delta C$) হিসাব করার পদ্ধতি
- কীভাবে প্রতিটি ধাপের সিদ্ধান্ত ("আপগ্রেড করব, নাকি আগেরটাই রাখব") পরবর্তী তুলনার ভিত্তি হয়ে ওঠে
- Python দিয়ে ৩টি মিউচুয়ালি এক্সক্লুসিভ প্রজেক্ট স্কেলের নাইভ ও ইনক্রিমেন্টাল B/C অ্যানালাইসিস
১ · সমস্যা: সর্বোচ্চ B/C সবসময় সেরা বাছাই নয়
L25-এ দেখা গেছে একটি একক প্রজেক্ট গ্রহণযোগ্য কি না তা B/C ≥ 1 দিয়ে ঠিক করা যায়। কিন্তু যখন একাধিক মিউচুয়ালি এক্সক্লুসিভMutually Exclusiveএমন অল্টারনেটিভের সেট যেখান থেকে সর্বোচ্চ একটি বাছাই করা যায় — যেমন একটি প্ল্যান্টের তিনটি ভিন্ন আকার, একসাথে সবগুলো তৈরি করা যায় না। স্কেল বা ডিজাইন (যেমন একটি প্ল্যান্টের ছোট/মাঝারি/বড় সংস্করণ) থেকে একটি বাছাই করতে হয়, তখন শুধু "কার B/C সবচেয়ে বেশি" জিজ্ঞাসা করলে ভুল উত্তর আসতে পারে — ঠিক যেমন M5-এ শুধু "কার IRR সবচেয়ে বেশি" জিজ্ঞাসা করলে ভুল হতো (L22)। কারণ একটি ছোট, কম খরচের অল্টারনেটিভের B/C রেশিও বেশি হতে পারে, অথচ একটি বড় অল্টারনেটিভে অতিরিক্ত বিনিয়োগ করলে সেই অতিরিক্ত অংশও যথেষ্ট বেনিফিট আনতে পারে (অর্থাৎ অতিরিক্ত বিনিয়োগও ন্যায্য) — কিন্তু এটি রেশিও তুলনায় ধরা পড়ে না, কারণ রেশিও স্কেলের সাথে পরিবর্তিত হয়।
২ · ইনক্রিমেন্টাল B/C পদ্ধতি
পদ্ধতিটি তিন ধাপে চলে —
- সব অল্টারনেটিভকে তাদের PW(cost) অনুযায়ী ক্রমবর্ধমান ক্রমে সাজান।
- সবচেয়ে কম খরচের অল্টারনেটিভকে "do-nothing"-এর সাথে তুলনা করুন — এর নিজস্ব B/C ≥ 1 হলে এটিই প্রাথমিক (base) বেস-লাইন।
- একে একে পরের (বেশি ব্যয়বহুল) অল্টারনেটিভের সাথে বর্তমান সেরার তুলনা করুন — $\Delta B/\Delta C = (B_{\text{পরের}} - B_{\text{বর্তমান}}) / (C_{\text{পরের}} - C_{\text{বর্তমান}})$। এটি ≥ ১ হলে পরের অল্টারনেটিভে আপগ্রেড করুন (এটিই এখন নতুন "বর্তমান সেরা"); না হলে আগেরটাই রেখে দিন এবং পরের অল্টারনেটিভের দিকে এগিয়ে যান।
এই পদ্ধতিটি M5-এর ইনক্রিমেন্টাল রেট অফ রিটার্ন অ্যানালাইসিস-এর সাথে কাঠামোগতভাবে একই — শুধু IRR-এর জায়গায় B/C রেশিও ব্যবহৃত হচ্ছে। উভয় ক্ষেত্রেই মূলনীতি একটাই: আলাদা অনুপাত নয়, বরং অতিরিক্ত বিনিয়োগের অতিরিক্ত রিটার্ন/বেনিফিট ন্যায্য কি না তা যাচাই করাই আসল প্রশ্ন।
৩ · কোড: ৩টি পানি-শোধনাগার স্কেলের ইনক্রিমেন্টাল B/C
তিনটি মিউচুয়ালি এক্সক্লুসিভ পানি-শোধনাগার (water treatment plant) স্কেল বিবেচনা করা যাক — ছোট (A), মাঝারি (B) ও বড় (C) — প্রতিটির প্রাথমিক খরচ, বার্ষিক O&M ও বার্ষিক বেনিফিট বাড়ছে। প্রথমে নাইভ B/C র্যাঙ্কিং দেখানো হবে, তারপর সঠিক খরচ-অনুক্রমিক ইনক্রিমেন্টাল অ্যানালাইসিস।
# ইনক্রিমেন্টাল বেনিফিট-কস্ট অ্যানালাইসিস -- পানি-শোধনাগারের (water treatment plant) ৩টি স্কেল
def pa_factor(i, n):
return ((1 + i) ** n - 1) / (i * (1 + i) ** n)
i = 0.06 # সামাজিক ডিসকাউন্ট রেট
n = 20 # প্রজেক্ট লাইফ (বছর)
PA = pa_factor(i, n)
# প্রতিটি বিকল্প: প্রাথমিক খরচ, বার্ষিক O&M, বার্ষিক বেনিফিট
alternatives = [
{"name": "A -- ছোট প্ল্যান্ট", "cost0": 1_000_000, "om": 20_000, "benefit": 140_000},
{"name": "B -- মাঝারি প্ল্যান্ট", "cost0": 2_200_000, "om": 45_000, "benefit": 275_000},
{"name": "C -- বড় প্ল্যান্ট", "cost0": 3_600_000, "om": 75_000, "benefit": 420_000},
]
for alt in alternatives:
alt["pw_cost"] = alt["cost0"] + alt["om"] * PA
alt["pw_benefit"] = alt["benefit"] * PA
alt["bc"] = alt["pw_benefit"] / alt["pw_cost"]
# --- ধাপ ১: নাইভ (naive) পদ্ধতি -- শুধু আলাদা B/C অনুযায়ী র্যাঙ্ক ---
print("নাইভ B/C র্যাঙ্কিং (প্রতিটি বিকল্প আলাদাভাবে বিবেচনা করে) --")
for alt in sorted(alternatives, key=lambda a: a["bc"], reverse=True):
print(f" {alt['name']:<20} PW(cost)=${alt['pw_cost']:>12,.0f} PW(benefit)=${alt['pw_benefit']:>12,.0f} B/C={alt['bc']:.4f}")
naive_pick = max(alternatives, key=lambda a: a["bc"])
print(f"নাইভ সিদ্ধান্ত (সর্বোচ্চ আলাদা B/C): {naive_pick['name']} -- এটি ভুল হতে পারে!\n")
# --- ধাপ ২: সঠিক ইনক্রিমেন্টাল B/C -- খরচ অনুযায়ী সাজিয়ে ধাপে ধাপে তুলনা ---
ordered = sorted(alternatives, key=lambda a: a["pw_cost"])
print("ইনক্রিমেন্টাল অ্যানালাইসিস (খরচ অনুযায়ী ক্রমানুসারে) --")
current = ordered[0]
print(f" বেস: {current['name']} (B/C={current['bc']:.4f} >= 1, তাই do-nothing-এর তুলনায় গ্রহণযোগ্য)")
for nxt in ordered[1:]:
d_cost = nxt["pw_cost"] - current["pw_cost"]
d_benefit = nxt["pw_benefit"] - current["pw_benefit"]
d_bc = d_benefit / d_cost
if d_bc >= 1:
decision = "গৃহীত -- আপগ্রেড করা হলো"
else:
decision = "প্রত্যাখ্যাত -- আগেরটাই থাকছে"
print(f" {current['name']} -> {nxt['name']}: "
f"ΔPW(cost)=${d_cost:,.0f} ΔPW(benefit)=${d_benefit:,.0f} ΔB/ΔC={d_bc:.4f} -> {decision}")
if d_bc >= 1:
current = nxt
print(f"\nসঠিক ইনক্রিমেন্টাল সিদ্ধান্ত: {current['name']}")
মিউচুয়ালি এক্সক্লুসিভ পাবলিক প্রজেক্ট তুলনায় শুধু আলাদা B/C রেশিওর সর্বোচ্চ মান দেখে সিদ্ধান্ত নেওয়া ভুল হতে পারে — কারণ রেশিও স্কেল-নিরপেক্ষ নয়। খরচ অনুযায়ী সাজিয়ে ধাপে ধাপে ΔB/ΔC হিসাব করাই সঠিক পদ্ধতি, ঠিক যেমন IRR-এর ক্ষেত্রে ইনক্রিমেন্টাল অ্যানালাইসিস দরকার হয় (L22)।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ কেন অল্টারনেটিভগুলোকে খরচ অনুযায়ী ক্রমানুসারে সাজিয়ে তুলনা করা জরুরি, এলোমেলো ক্রমে নয়?
কারণ ইনক্রিমেন্টাল বিশ্লেষণে প্রতিটি ধাপে প্রশ্ন করা হয় — "আরও বেশি খরচ করার সিদ্ধান্তটা কি ন্যায্য?" এই প্রশ্নের অর্থবহ উত্তর পেতে হলে সবসময় কম-খরচ থেকে বেশি-খরচের দিকে এগোতে হয়, যাতে প্রতিটি ΔC (অতিরিক্ত খরচ) সবসময় ধনাত্মক থাকে। এলোমেলো ক্রমে তুলনা করলে ΔC ঋণাত্মকও হতে পারে, যা ΔB/ΔC-এর অর্থ ও সিদ্ধান্তের নিয়মকে ভুল দিকে নিয়ে যাবে।
প্র ০২ যদি A থেকে B-তে ΔB/ΔC ১-এর কম হতো, কিন্তু A থেকে C-তে (B বাদ দিয়ে সরাসরি) ΔB/ΔC ১-এর বেশি হতো, চূড়ান্ত সিদ্ধান্ত কী হতো?
পদ্ধতিটি ধাপে ধাপে চলে বলে B বাতিল হলে পরের তুলনা হয় বর্তমান সেরা (A) বনাম C-এর মধ্যে, B-কে সম্পূর্ণ বাদ দিয়ে। তাই এই পরিস্থিতিতে A থেকে সরাসরি C-তে যাওয়ার ΔB/ΔC হিসাব করা হতো, এবং তা ১-এর বেশি হলে চূড়ান্ত সিদ্ধান্ত হতো C — উপরের কোডের লুপ ঠিক এই যুক্তিই অনুসরণ করে, কারণ প্রতিটি ধাপে তুলনা হয় "বর্তমান সেরা" বনাম "পরবর্তী", B বাদ পড়লেও B-এর মান আর ব্যবহার হয় না।
প্র ০৩ যদি A-এর নিজের B/C-ই ১-এর কম হতো, তাহলে ইনক্রিমেন্টাল অ্যানালাইসিসের প্রথম ধাপ কীভাবে বদলাত?
A নিজেই do-nothing-এর তুলনায় ন্যায্য না হলে তাকে বেস-লাইন হিসেবে ব্যবহার করা যাবে না — সেক্ষেত্রে A প্রথমেই বাদ পড়বে এবং পরের সবচেয়ে কম খরচের অল্টারনেটিভ (যেমন B) দিয়ে do-nothing-এর সাথে তুলনা শুরু হবে (B-এর নিজস্ব B/C ≥ ১ কি না)। শুধু do-nothing-এর তুলনায় ন্যায্য এমন প্রথম অল্টারনেটিভ থেকেই ইনক্রিমেন্টাল ধাপ শুরু হতে পারে।
অনুশীলন
-
চিন্তা করুন: একটি প্রকৌশলী দল "সর্বোচ্চ B/C-এর অল্টারনেটিভ বেছে নেওয়াই সবসময় নিরাপদ,
কারণ এটি সবচেয়ে বেশি রিটার্ন দেয়" — এই দাবিতে কী ভুল আছে?
ভুলটি হলো B/C একটি অনুপাত, নেট মূল্য নয় — এটি প্রজেক্টের স্কেল বিবেচনা করে না। একটি ছোট প্রজেক্ট উচ্চ B/C দিতে পারে অথচ কম মোট বেনিফিট তৈরি করে, আর একটি বড় প্রজেক্ট কিছুটা কম B/C হলেও যথেষ্ট বেশি মোট নেট বেনিফিট তৈরি করতে পারে যদি অতিরিক্ত বিনিয়োগের ΔB/ΔC ≥ ১ হয়। তাই "সর্বোচ্চ রেশিও" নয়, বরং "সর্বোচ্চ ন্যায্য নেট বেনিফিট" — এটিই লক্ষ্য হওয়া উচিত, যা ইনক্রিমেন্টাল অ্যানালাইসিস দেয়।
-
পরীক্ষা করুন: উপরের কোড সেলে Alternative C-এর
benefit-কে $420,000 থেকে বাড়িয়ে $480,000 করে Run চাপুন। B থেকে C-তে ΔB/ΔC কীভাবে বদলায়, এবং চূড়ান্ত সিদ্ধান্ত কী হয়?benefit_C = 480,000হলেpw_benefit_C = 480,000 * 11.46992 ≈ $5,505,562। আগেরpw_benefit_B ≈ $3,154,229অপরিবর্তিত থাকলেΔPW(benefit) = 5,505,562 - 3,154,229 ≈ $2,351,333, আরΔPW(cost)আগের মতোই≈ $1,744,098— তাইΔB/ΔC ≈ 1.348 >= 1, এবার C-তে আপগ্রেড করা ন্যায্য হয়ে যায়, চূড়ান্ত সিদ্ধান্ত বদলে C হয়ে যাবে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ টাইম ভ্যালু অফ মানি, ক্যাশ ফ্লো সিরিজ, ওয়ার্থ-ভিত্তিক তুলনা, রেট অফ রিটার্ন, বেনিফিট-কস্ট অ্যানালাইসিস, ডেপ্রিসিয়েশন, ট্যাক্স, ইনফ্লেশন, রিস্ক অ্যানালাইসিস ও ক্যাপিটাল বাজেটিং — সব ৫৭টি পাঠ।
- Discrete Mathematics কোর্স সহোদর কোর্স সিকোয়েন্স ও সিরিজ অধ্যায় — এই কোর্সের P/A ফ্যাক্টরের গাণিতিক ভিত্তি সেই কোর্সেই তৈরি হয়েছে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation ও Engineering Economics — সব এক জায়গায়।