Saturday, July 28, 2018

[স্টিফেন হকিং এর লেখা ও আব্দুল্যাহ আদিল মাহমুদ অনূদিত অ্যা ব্রিফার হিস্ট্রি অব টাইম বই অবলম্বনে]  

বিজ্ঞানী হতে হলে জানতে হবে বিজ্ঞান বা বৈজ্ঞানিক তত্ত্ব কাকে বলে।


সোজা কথায় বললে, থিওরি বা তত্ত্ব হচ্ছে একটি মডেল বা নমুনা, অথবা সেই নমুনার কোন সীমিত অংশবিশেষ এবং এমন এক গুচ্ছ নিয়ম বা সূত্র, যে সূত্রগুলো পর্যবেক্ষণে প্রাপ্ত তথ্যকে মডেলের মাধ্যমে ব্যাখ্যা করতে পারবে। এই তত্ত্ব থাকে আমাদের মস্তিষ্কে এবং এর অন্য রকম কোনো বাস্তবতা নেই (বাস্তবতার সংজ্ঞা যা হয় হোক)।

একটি তত্ত্বকে ভালো বলা হয় যদি এর মধ্যে দুটো গুণ পাওয়া যায়। এক, অনেকগুলো পর্যবেক্ষণকে এটি অল্প কথায় সঠিকভাবে ব্যাখ্যা করতে পারবে। দুই, একে ভবিষ্যত পর্যবেক্ষণের ফলাফল সম্পর্কে সুনির্দিষ্ট পূর্বাভাস [১] দিতে হবে। অ্যারিস্টটল এমপেডোক্লেসের এই তত্ত্ব  মেনে নিয়েছিলেন যে জগতের সবকিছু মাটি, বায়ু, আগুন ও পানি- এই চারটি উপাদান দিয়ে তৈরি। তত্ত্বটি যথেষ্ট সরল ছিল, কিন্তু এটি কোনো সুনির্দিষ্ট পূর্বাভাস দিতে পারেনি। অন্য দিকে, নিউটনের মহাকর্ষ তত্ত্বটি উপস্থাপন করা হয় আরো সরল ভাবে। এই তত্ত্বে বস্তুরা একে অপরকে তাদের ভরের সমানুপাতিক ও তাদের মধ্যবর্তী দূররত্বের বর্গের ব্যস্তানুপাতিক বলে আকর্ষণ করে। তত্ত্বটি দেখতে সরল হলেও এটি অনেক নিখুঁতভাবে সূর্য, চন্দ্র এবং গ্রহদের গতির পূর্বাভাস দিতে পারে।

যে কোনো ভৌত তত্ত্বই (physical theory)এই অর্থে অস্থায়ী যে এটি শুধুই একটি অনুমান। একে কখোনই পুরোপুরি প্রমাণ করা যাবে না। পরীক্ষার ফলাফলের সাথে হাজারবার মিলে গেলেও আপনি কখোনই নিশ্চিত করে বলতে পারবেন না এটি পরের বার বিপরীত ফলাফল দেবে না। উল্টো দিকে একটি তত্ত্বকে ভুল বলার জন্যে এর বিপক্ষে একটি মাত্র পর্যবেক্ষণই যথেষ্ট। বিজ্ঞানের দার্শনিক কার্ল পপার যেমন জোর দিয়ে বলেছেন,
একটি ভালো তত্ত্বের বৈশিষ্ট্য হচ্ছে, এতে এমন অনেকগুলো পূর্বাভাস থাকবে যাদেরকে পর্যবেক্ষণের মাধ্যমে ভুল বা মিথ্যা প্রমাণ করার সুযোগ থাকবে। 

যখনি নতুন কোনো পরীক্ষার সাথে এর পূর্বাভাস মিলে যাবে, তত্ত্বটি বেঁচে যাবে। কিন্তু কখনো নতুন কোনো পর্যবেক্ষণ এর সাথে না মিললে আমাদেরকে তত্ত্বটিকে পরিত্যাগ বা সংস্কার করতে হবে।

বাস্তবে দেখা যায় নতুন তত্ত্ব আসলে আগের তত্ত্বেরই পরিবর্ধন মাত্র। উদাহরণ হিসেবে বলা যায় বুধ গ্রহের গতির কথা। নিউটনের মহাকর্ষ তত্ত্বের পূর্বাভাসের সাথে এর গতির সামান্য ভিন্নতা দেখা দেয়। আইনস্টাইনের সার্বিক আপেক্ষিক তত্ত্ব নিউটনের তত্ত্বের চেয়ে কিছুটা ভিন্ন অনুমান প্রদান করে, যা পর্যবেক্ষণের সাথে ঠিক ঠিক মিলে যায়। নিউটনের তত্ত্বের জায়গায় নতুন এই তত্ত্বের জায়গা করে নিতে এটি গুরুত্বপূর্ণ ভূমিকা রাখে। তবু এখনও আমরা বাস্তবে নিউটনের তত্ত্বই বেশি ব্যবহার করি, কারণ আমাদের দৈনন্দিন জীবনের প্রয়োজনীয় ক্ষেত্রে দুটো থিওরির পার্থক্য সামান্য। নিউটনের তত্ত্বের আরেকটি সুবিধা হল এটি আইনস্টাইনের সূত্রের চেয়ে অনেক সরল।

বিজ্ঞানের চূড়ান্ত লক্ষ্য হচ্ছে এমন একটি তত্ত্ব প্রদান করা,  যা সমগ্র মহাবিশ্বকে ব্যাখ্যা করতে পারবে। অবশ্য অধিকাংশ বিজ্ঞানীই বাস্তবে সমস্যাটিকে দুই ভাগে বিভক্ত করে কাজ করেন। প্রথমত, কিছু সূত্র আমাদেরকে বলছে যে সময়ের সাথে সাথে মহাবিশ্বের কীরূপ পরিবর্তন ঘটছে। (আমরা যদি কোনো একটি সময়ে মহাবিশ্বের অবস্থা জানি, এই ভৌত সূত্রগুলো আমাদের বলবে পরবর্তী কোনো সময়ে মহাবিশ্ব কী অবস্থায় থাকবে।) দ্বিতীয় প্রশ্নটি হল মহাবিশ্বের আদি অবস্থা নিয়ে। কেউ কেউ মনে করেন, বিজ্ঞানের উচিত শুধু প্রথম অংশটি নিয়ে কাজ করা। তাদের মতে, মহাবিশ্বের আদি অবস্থার বিষয়টি অধিবিদ্যা[২] বা ধর্মের আলোচ্য বিষয়। তাদের মতে, সর্বশক্তিমান ঈশ্বর মহাবিশ্বের সূচনা নিজের যেভাবে ইচ্ছা সেভাবেই করেছেন[৩]। তা হলেও হতেও পারে, কিন্তু সেক্ষেত্রে ঈশ্বর মহাবিশ্বকে কোনো অনির্দিষ্ট প্রক্রিয়াতেই বিবর্তিত হতে দিতেন। কিন্তু বাস্তবে দেখা যাচ্ছে তিনি একে কিছু নির্দিষ্ট নিয়মের অধীন করেছেন, যা কিছু সূত্র মেনে চলছে। কাজেই মহাবিশ্বের আদি অবস্থাও কিছু নিয়ম মেনে চলছিল মনে করাটাই যুক্তির দাবি।

মহাবিশ্বের সবকিছুকে একই তত্ত্বে গেঁথে ফেলা কঠিন একটি কাজ। ফলে আমরা একে ভেঙে অনেকগুলো আংশিক তত্ত্ব তৈরি করি। এই আংশিক তত্ত্বদের প্রতিটি কিছু নির্দিষ্ট পর্যবেক্ষণের ব্যাখ্যা ও পূর্বাভাস দিতে পারে। এর আওতার বাইরের বিষয়গুলো সম্পর্কে এটি নীরব থাকে অথবা তাদেরকে কিছু সংখ্যা দ্বারা প্রকাশ করে। খুব সম্ভব, এটি একটি ভুল পদ্ধতি। যদি মৌলিক জায়গাটিতে মহাবিশ্বের সবকিছু অন্য সব কিছুর উপর নির্ভরশীল হয়, তাহলে এদেরকে আংশিকভাবে মূল্যায়ন করে পূর্ণাঙ্গ সমাধানে পৌঁছা সম্ভব নাও হতে পারে। তবুও, আমরা অতীতে কিন্তু এটাই করে এসেছি।

উদাহরণ হিসেবে আবারও বলব নিউটনের মহাকর্ষ তত্ত্বের কথা। এটি বলছে, দুটো বস্তুর মধ্যে ক্রিয়াশীল মহাকর্ষ বল বস্তুদ্বয়ের একটিমাত্র নিজস্ব বৈশিষ্ট্যের উপর (ভর)নির্ভরশীল[৪]। বস্তু কী দিয়ে তৈরি তার উপর এই বল নির্ভর করে না। কাজেই গ্রহদের কক্ষপথের হিসাব বের করার জন্য এদের এবং সূর্যের গঠন ও উপাদানের জন্যে আমাদের আলাদা কোনো তত্ত্বের প্রয়োজন নেই।

বর্তমানে মহাবিশ্বের ব্যাখ্যায় বিজ্ঞানীরা দুটি মৌলিক আংশিক তত্ত্ব কাজে লাগাচ্ছেন। এরা হল জেনারেল থিওরি অব রিলেটিভিটি বা সার্বিক আপেক্ষিক তত্ত্ব ও কোয়ান্টাম মেকানিক্স। এই দুটি তত্ত্ব বিংশ শতাব্দীর প্রথমার্ধের বুদ্ধির জগতের এক বিরাট অর্জন। সার্বিক আপেক্ষিক তত্ত্ব মহাকর্ষ বল ও মহাবিশ্বের বড় দৈর্ঘ্যের কাঠামোকে (Large scale structure) ব্যাখ্যা করে। মাত্র কয়েক মাইল থেকে শুরু করে অন্তত এক হাজার কোটি কোটি কোটি (১ এর পরে ২৪ টি শুন্য) মাইল তথা পর্যবেক্ষণযোগ্য মহাবিশ্বের আকারের সমপরিমাণ অংশ এই তত্ত্বের আওতায় আছে। অন্য দিকে কোয়ান্টাম মেকানিক্স কাজ করে এক ইঞ্চির এক লক্ষ কোটি ভাগের এক ভাগের মতো অত্যন্ত ক্ষুদ্র দৈর্ঘ্যের জগতে।

পরমাণু থেকে মহাবিশ্ব। [বিংশ শতকের প্রথমার্ধ পর্যন্ত নিউটনীয় পদার্থবিদ্যার সূত্রগুলো কাজ করত শুধু দৈনন্দিন জীবনের ক্ষেত্রগুলোতে। এরপরে এসে পদার্থবিদ্যার পরিধি বিস্তৃত হয়ে পৌঁছায় মহাবিশ্বের ক্ষুদ্রতম থেকে বৃহত্তম চৌহদ্দি পর্যন্ত। ] 

এই দুটি তত্ত্ব আবার একে অপরের বিরোধী- এদের দুটোই যে ঠিক হবে সেটি সম্ভব নয়। বর্তমানে পদার্থবিদ্যার একটি প্রধান লক্ষ্য হচ্ছে নতুন একটি তত্ত্ব প্রদান করা, যা এই দুটো তত্ত্বকে একীভূত করে কোয়ান্টাম গ্র্যাভিটি নামে কমন একটি তত্ত্বের জন্ম দেবে। এখনও এমন তত্ত্ব প্রস্তুত করতে হয়নি। হতে পারে, আমরা এখনও এর থেকে বহু দূরে আছি। কিন্তু এই তত্ত্বের কী কী বৈশিষ্ট্য থাকা উচিত তার অনেকগুলোই ইতোমধ্যে জানা সম্ভব হয়েছে।

এখন আমরা যদি বিশ্বাস করি যে মহাবিশ্ব এলোমেলোভাবে নয় বরং চলছে কিছু নির্দিষ্ট নিয়ম মেনে, তাহলে এই আংশিক সূত্রগুলোকে অবশ্যই একটি পূর্ণাংগ একীভূত তত্ত্বে রূপদান করতে হবে, যা ব্যাখ্যা দেবে মহাবিশ্বের সব কিছুর। কিন্তু এরকম একটি একীভূত তত্ত্বের সন্ধানে নামলে একটি সঙ্কটের মুখে পড়তে হয়। ওপরে উল্লিখিত বিজ্ঞানের এই চিন্তা- ভাবনাগুলোতে ধরে নেওয়া হচ্ছে যে আমরা বুদ্ধিমান জীব, যারা স্বাধীনভাবে মহাবিশ্বকে দেখছি ও তা থেকে সিদ্ধান্ত নিচ্ছি। যদি এটা সঠিক হয়ে থাকে, তাহলে আমরা উন্নতি করতে করতে একদিন মহাবিশ্বের কার্যকরী নিয়মগুলোর কাছাকাছি পৌঁছতে পারব বলে মনে করা খুবই স্বাভাবিক।

অনুবাদকের নোটঃ
১। যেমন আইনস্টাইনের জেনারেল থিওরি অব রিলেটিভিটি বা সার্বিক আপেক্ষিক তত্ত্ব। ১০০ বছর আগে এর মহাকর্ষ তরঙ্গের পূর্বাভাস ২০১৬ এসে প্রমাণিত হয়। ফলে এটি ভালো তত্ত্ব হিসেবে আরো জোরালো স্বীকৃতি লাভ করে।
২। অধিবিদ্যা (Metaphysics) হল দর্শনের একটি শাখা। অন্য অনেক কিছুর মতো এরও জনক এরিস্টটল। বিশ্বের অস্তিত্ব, আমাদের অস্তিত্ব, সত্যের ধারণা, বস্তুর গুণাবলী, সময়, স্থান, সম্ভাবনা ইত্যাদি এর আলোচ্য বিষয়।
৩। অর্থ্যাৎ,তাদের মতে নির্দিষ্ট কোনো সূত্র প্রয়োগ করে মহাবিশ্ব সৃষ্টি করা হয়নি, তাই সেই আদি অবস্থার ব্যাখ্যা দেবার মত কোনো নির্দিষ্ট সূত্রের ব্যাখ্যা খোঁজা অনর্থক।
৪। মহাকর্ষ বল বস্তুদের দূরত্বের উপরও নির্ভরশীল- এটা ঠিক, কিন্তু দূরত্বতো আর বস্তুর নিজস্ব কোনো বৈশিষ্ট্য নয়।
৫। কারণ আমরাওতো মহাবিশ্বেরই একটি অংশ।
Category: articles

Thursday, July 26, 2018

একটি উদাহরণ চিন্তা করি। আমরা দেহের ওজোনের সাথে উচ্চতার সম্পর্ক দেখতে চাই। উচ্চতার উপর ওজোনের (ভর) প্রভাব কতটা সেটা জানতে চাই। ব্যাপারটার যৌক্তিকতা নিয়ে প্রশ্ন তোলা যেতেই পারে। আপাতত আমাদের উদ্দেশ্য রিগ্রেশন লাইন আঁকা বলে সে বিতর্ক তোলা থাকল।

তাহলে শুরুতেই আমরা গ্রাফের মাধ্যমে দুটো চলকের সম্পর্ক দেখব। ধরা যাক আমাদের কাছে নীচের ডেটা আছে।

আরও পড়ুন
R প্রোগ্রামিং: কীভাবে ইনস্টল ও ব্যবহার করবেন?

height = c(176, 154, 138, 196, 132, 176, 181, 169, 150, 175)
bodymass = c(82, 49, 53, 112, 47, 69, 77, 71, 62, 78) 

এবার এ দুটো নিয়ে একটি Scatter plot বা বিক্ষেপণ চিত্র আঁকা যাক।
plot(bodymass, height)

প্লটটিকে চাইলে আরেকটু স্টাইলিশ করে নেওয়া যায়। 
 plot(bodymass, height, pch=19, col="blue", xlab="Body Mass (kg)",
     ylab="Height (cm)", main="Bodymass vs Height")

এগুলোর মধ্যে কোন argument কেন ব্যবহার করা হল জানতে হেল্প সেকশন দেখতে পারেন। 
?plot

এবার আমরা কাঙ্খিত রিগ্রেশন লাইন আঁকব। আপাতত আমরা লিনিয়ার রিগ্রেশন লাইন নিয়ে কাজ করছি। 

আরও পড়ুন

এক্ষেত্রে আমরা ব্যবহার করছি abline() ফাংশন। এ ফাংশনটি দিয়ে প্লটে অনুভূমিক (horizontal) বা উলম্ব (vertical) রেখা টানা হয়। যেমন উপরের প্লটে আমরা এভাবে বিভিন্ন রেখা টেনে বিন্দুগুলোর অবস্থান বুঝতে পারি। 
abline(h=155
abline(v=87))
এখানে h ও v বোঝাচ্ছে যে যথাক্রমে x ও y অক্ষের কোন পয়েন্ট দুটিতে রেখা আঁকা হবে। তবে ফাংশনটির প্রথম দুটি আর্গুমেন্ট হলো a ও b। এগুলো হলো রেখার যথাক্রমে ইন্টারসেপ্ট ও ঢাল। lm(height ~ bodymass) কমান্ডের মাধ্যমে আমরা এই a ও b এর মানই পাব। 
abline(lm(height ~ bodymass))
ব্যস রেখা হয়ে গেল। চাইলে এটাকে কাস্টোমাইজও করতে পারেন। কালার দিতে পারেন। 

আরও পড়ুন

পুনশ্চ: 
যারা বুঝতে চান উপরের রিগ্রেশন রেখা কীভাবে এল। 

উপরের lm(height ~ bodymass) কমান্ড থেকে আমরা নীচের মডেলের মান পাব। 
$$Y=\alpha + \beta X + \epsilon$$
কমান্ডটির ফলাফল: 
Call:
lm(formula = height ~ bodymass)
Coefficients:
(Intercept)     bodymass
    98.0054       0.9528

এখানে $\alpha$ এর পরিমাপকৃত মান (a) 98.0054 আর $\beta$ এর মান (b) 0.9528। এরা হলো যথাক্রমে রিগ্রেশন লাইনের ইন্টারসেপ্ট বা x অক্ষ থেকে কর্তিত অংশ ও রেখার ঢাল। ঢাল মানে হলো x এক একক বাড়লে y কত একক বাড়ে। তার মানে আমাদের মডেলে ভর এক কেজি বাড়ালে উচ্চতা গড়ে ০.৯৫২৮ সেমি. বাড়ে। 

abline(lm(height ~ bodymass)) কমান্ডের মাধ্যমে এই দুটি মানই কাজে লেগেছে। উপরের প্লটের দিকে তাকালে খেয়াল করবেন, রেখাটিকে পেছন দিকে বাড়িয়ে দিলে বিন্দুতে গিয়ে 98.0054 বিন্দুতে গিয়ে x অক্ষকে ছেদ করবে। 
Category: articles
রিগ্রেশন অ্যানালাইসিসের বড় একটি সমস্যা হলো লিনিয়ার ও নন-লিনিয়ার রিগ্রেশন মডেল আলাদা করে চিনতে পারা। সাধারণ ডেটা অ্যানালাইসিস বা মেশিন লার্নিং অ্যালগোরিদম প্রয়োগ করা-দুই ক্ষেত্রেই লিনিয়ার ও নন-লিনিয়ার মডেল চেনা খুব জরুরি।

বিষয়টি বলার আগে রিগ্রেশন (regression) আমরা কেন করি বা কী কাজে সে সম্পর্কে একটু বলে নেই।

একটি দৈব চলককে (random variable) আরেকটি চলকের মাধ্যমে প্রেডিক্ট বা অনুমান করার জন্য আমরা রিগ্রেশন মডেল ব্যবহার করি। রিগ্রেশনের মাধ্যমে প্রতিটি স্বাধীন (independent) চলক অধীন (dependent) চলককে কতটুকু প্রভাবিত করে সেটা জানা যায়। আর অধীন চলক সম্পর্কে অনুমানও করা হয় এই তথ্য কাজে লাগিয়েই।

যেমন ধরা যাক, আমরা জানতে চাই, মানুষের মাসিক আয় বাড়লে মাসিক খরচের কী অবস্থা হয়। অর্থাৎ কতটুকু আয় বাড়লে গড়ে কতটুকু খরচ বাড়ে। এবার ধরা যাক, দুটো চলকের সম্পর্ক তুলে ধরার জন্য আমরা একটি মডেল চিন্তা করলাম। যেটা এ রকম:
$$Y=\alpha + \beta X + \epsilon$$
এখানে Y হলো অধীন চলক। মানুষের আয়। আর X হলো স্বাধীন চলক। মাসিক খরচ। আর $\epsilon$ হলো ভ্রান্তি পদ (error term)। এই পদটি থাকার কারণ হলো আমরা আয় থেকে খরচ পুরোটা অনুমান করতে পারব না। অনুমান একটু এদিক-ওদিক হবে। $\epsilon$ এই "এদিক-ওদিক" বিষয়টিই দেখে। আর $\alpha$ ও $\beta$ নিয়ে একটু পরে বলছি।

এখানে আমাদের হাতে অনেকগুলো X ও Y এর মান থাকবে। যেমন ধরুন
\begin{array}{|c|c|}
\hline
X, & Y \\ \hline
৩০০০০ & ২৫০০০\\ \hline
৫০০০০ & ৪৩০০০ \\ \hline
১০০০০০ & ৮৬০০০\\ \hline
৫৫০০০ & ৪৯০০০ \\ \hline
৭৫৯০০ & ৬৭৫৫০\\ \hline
...& ...\\ \hline
\end{array}
এবার এই টেবিলের মানগুলো ব্যবহার করে আমরা উপরের মডেলের $\alpha$ ও $\beta$র মান পাব।  এখানে $\alpha$ ও $\beta$ হলো মডেলের প্যারামিটার (parameter)। $\alpha$ মানে হল X না থাকলে Y এর মান কত হবে। যেমন আমাদের মডেলে এর মানে হলো আয় না থাকলেও কত খরচ হবে। $\alpha$ এর মান সব সময় যৌক্তিক নাও হতে পারে।যেমন ধরুন X ও Y যদি হয় যথাক্রমে তুলা ও সুতার পরিমাণ, তাহলে $\alpha$ মানে হবে সুলা ছাড়াই কতটুকু সুতা পাওয়া যাবে। এই উদাহরণে এটার বাস্তব কোনো ভিত্তি নেই। তাই এক্ষেত্রে $\alpha$কে মডেল থেকে বাদ দিতে হবে।

আর $\beta$ মানে হলো X এক একক বাড়লে Y কতটুকু বাড়বে বা কমবে। যেমন উপরের মডেলে যদি আমরা $\beta$র মান পাই ০.২৫, তাহলে এর মানে হবে আয় ১ টাকা বাড়লে গড়ে খরচ বাড়বে ২৫ পয়সা।

এবার আজকের আলোচনার মূল বিষয়।
উপরে আমরা যে মডেলটা করলাম এটাকে বলে সিম্পল লিনিয়ার বা সরল রৈখিক রিগ্রেশন (simple linear)। কিন্তু এখানে X এর উপর যে-কোনো পাওয়ার থাকতে পারত। $\beta$ ও X এর সম্পর্কের রূপ হতে পারত কিম্ভুতকিমাকার।

তাহলে কীভাবে বুঝব কোন মডেলটা লিনিয়ার বা রৈখিক (linear) আর কোনটা নন-লিনিয়ার?

এখানে আরেকটি বিষয় মাথায় রাখতে হবে। রিগ্রেশনের ক্ষেত্রে মডেলকে লিনিয়ার বা নন-লিনিয়ার বলা হয় প্যারামিটারের সাপেক্ষে। গাণিতিকভাবে দেখলে নীচের সমীকরণটি নন-লিনিয়ার।
$$Y=\alpha + \beta X^2$$
কারণ X এর পাওয়ার এক (১) নয়। কিন্তু এই সমীকরণের সাথে $\epsilon$ যোগ করে রিগ্রেশন মডেল বানালে সেটি হবে লিনিয়ার মডেল।

তাহলে কখন নন-লিনিয়ার চিনব কীভাবে? 
তার জন্য আগে লিনিয়ার মডেল চিনতে হবে। একটি মডেল লিনিয়ার হবে যদি মডেলের প্রতিটি পদ হয় ধ্রুবক হয়, অথবা একটি প্যারামিটার ও একটি স্বাধীন চলকের (X) গুণফল হয়। আর সাথে ভ্রান্তি পদ তো থাকবেই। অতএব লিনিয়ার মডেলের সাধারণ রূপ হলো এ রকম:
$$Y=\alpha + \beta _1 X_1 + \beta _2 X_2 +\beta _k X_k + \epsilon \tag{1}$$
X এর পাওয়ার কম-বেশিও হতে পারে। কিন্তু প্যারামিটারের সাথে সম্পর্ক এই সমীকরণের মতো হলেই কেবল তাকে আমরা লিনিয়ার রিগ্রেশন বলব। এখন X এর জায়গায় যদি $X^2$ বা $X^3$ থাকে তাতেও লিনিয়ারই হবে। মানে নীচের মডেলও লিনিয়ার:
$$Y=\alpha + \beta _1 X_1 + \beta _2 {X_2}^2 + \epsilon$$
অনেকে আবার বলে থাকেন প্যারামিটারের ওপর পাওয়ার একের বেশি হলে নন-লিনিয়ার হবে। যেমন:
 $Y=\alpha + {\beta _1}^2 X_1 + \beta _2 {X_2}^2 + \epsilon$
কিন্তু এটি আসলে লিনিয়ার-ই। খেয়াল করে দেখুন $\beta$ এর উপর পাওয়ার হলেও পাওয়ার করে পাওয়া মান একটি ধ্রুবক-ই হবে। সেই ধ্রুবককে আমরা $\gamma$ বলতে পারি। ফলে সমীকরণ কিন্তু সেই "$X \times$" ধ্রুবক-ই হলো। ফলে এটিও লিনিয়ার-ই।

তার মানে লিনিয়ার রিগ্রেশনেও সরল রেখার বদলে কার্ভও পাওয়া যেতে পারে। নীচের ছবিতে শরীরের চর্বি ও বিএমআই (BMI = Body Mass Index) এর জন্য মডেল দেখানো হয়েছে। মডেল করা হয়েছে লিনিয়ার রিগ্রশন দিয়েই।

এ ছবিতে BMI ও চর্বির পরিমাণের সম্পর্কের নন-লিনিয়ার (অরৈখিক) রূপ দেখে মনে হতে পারে নন-লিনিয়ার রিগ্রেশন করতে হবে। আসলে এই অরৈখিক সম্পর্কের জন্যেও লিনিয়ার রিগ্রেশন যথেষ্ট। ছবির সোর্স: MiniTab ব্লগ। 

এবার তাহলে নন-লিনিয়ার মডেল কারা?
খুব সহজ। যে মডেলে উপরের ১ নং সমীকরণের মতো আকৃতি থাকবে না তারাই নন-লিনিয়ার। মানে লিনিয়ার মডেল মূলত এক রকম হলেও নন-লিনিয়ার মডেল নানা আকৃতিতে থাকতে পারে।

নিচে এমন কিছু উদাহরণ দেওয়া হলো।
$Y=\theta _1 \times X^{\theta _2} + \epsilon\\
Y=\theta _1 + (\theta _1 -\theta _2) \times e^{\theta _3 \times {\theta _4}}  + \epsilon\\
Y=\sqrt{\beta _1 + \beta _2 X} + \epsilon\\
Y=\sqrt{\beta _1 + \beta _2 X^2} + \epsilon
$

নন-লিনিয়ার রিগ্রেশনের এমন হাজারও উপায় থাকতে পারে। 

শেষ একটি বিষয়। উপরে আমরা দেখলাম, লিনিয়ার মডেলেরও কার্ভ থাকতে পারে। তাহলে কখন আমরা নন-লিনিয়ার মডেল ব্যবহার করব? এটা নিয়ে ভবিষ্যতে বিস্তারিত লিখব ইনশাআল্লাহ। আপাতত এই লেখাটি পড়তে পারেন। 

সূত্র
১। মিনিট্যাব ব্লগ
২। Johnson, J., Econometric Methods, 3rd Edition. 
Category: articles

Wednesday, July 25, 2018

জিডিপি ও জিএনপি। দুটোই অর্থনীতির গুরুত্বপুর্ণ বিষয়। দুটোই একটি অর্থনীতিতে উৎপাদিত সবগুলো পণ্য ও সেবার (goods and services) বাজার মূল্য পরিমাপ করার চেষ্টা করে। তাহলে পার্থক্যটা কোথায়? পার্থক্যটা হলো ব্যাখ্যায়। 


জিডিপির পূর্ণ রূপ হলো Gross Domestic Product (GDP)। বাংলায় বলা হয় মোট অভ্যন্তরীণ উৎপাদন। একটু চিন্তা করলেই বোঝা যাবে অভ্যন্তরীণ শব্দটিই এখানে জিডিপির মূল ব্যাখ্যা। কোনো একটি দেশের সীমানার অভ্যন্তরে একটি নির্দিষ্ট সময়ে যে পণ্য ও সেবাগুলো তৈরি হবে, সেগুলোর মোট বাজার দরই হলো জিডিপি। দেশের অর্থনীতির শক্তি যাচাই করা হয় এর মাধ্যমেই। অনেক সময় বিনিয়োগকারীরা দেখেন, যে দেশে তারা বিনিয়োগ করতে যাচ্ছেন, তার জিডিপি যথেষ্ট ভালো কি না। নীতিমালা প্রণয়নের জন্যে সরকারকেও জিডিপি নিয়ে কাজ করতে হয়। 

তাহলে জিএনপি কী হতে পারে? অনেকের কাছে এটা ইতোমধ্যে স্পষ্ট হয়ে গেছে। অবশ্য এটা মনে হওয়াও অস্বাভাবিক নয় যে জিডিপির মতো দারুণ একটি পরিমাপ থাকতে অর্থনীতির শক্তি পরীক্ষার জন্য আর কিছুর কি প্রয়োজন হতে পারে?

আসলে এমন দেশ খুঁজে পাওয়া দুষ্কর যেখানে সব মানুষই নিজের দেশে থাকেন। দেশের অর্থনীতে তো সেইসব প্রবাসীদের অনেকও ভূমিকা রাখেন। কিন্তু জিডিপেতে সেই হিসেবটা আসেনি। সেই কাজটি করে জিএনপি বা Gross National Product (GNP)। বাংলায় বলে মোট বা স্থুল জাতীয় উৎপাদন। এটি হিসেব করে যে দেশের সকল মানুষ বা দেশীয় সকল প্রতিষ্ঠান পৃথিবীর যে কোন প্রান্তে বসেই মোট কী পরিমাণ উৎপাদন করল। যেমন ধরুন, বাংলাদেশি একটি প্রতিষ্ঠান কাজ করছে জার্মানিতে। তাহলে এটি যে পরিমাণ বাজারমূল্যের উৎপাদন করবে, সেটিও জিএনপিতে যোগ হবে। 

জিএনপি কি জিডিপির চেয়ে কম হতে পারে?
সাধারণত হয় না। তবে অনেক সময় হতেই পারে। যদিও ব্যাপারটাকে অসম্ভব মনে হচ্ছে। অসম্ভব মনে হবার কারণ হলো জিএনপিতে তো বেশি সংখ্যক মানুষ বা প্রতিষ্ঠানের উৎপাদনের হিসেব আসছে। কিন্তু একটু ভালো করে খেয়াল করলেই দেখা যাবে, জিডিপির সংজ্ঞায় ছিল দেশের সীমানা। আর জিএনপির সংজ্ঞায় আছে দেশীয় সব মানুষ বা প্রতিষ্ঠান। এ কারণে দেশের সীমানার ভেতরে থেকেও কিছু মানুষ বা প্রতিষ্ঠান জিএনপির হিসেবে আসবে না। কারণ সেই মানুষ বা প্রতিষ্ঠানগুলো ভিন্ন দেশীয়। ফলে তাদের উৎপাদনের হিসেব চলে যাচ্ছে ভিন্ন দেশের জিএনপিতে। 

জিডিপি বেশি হবে নাকি জিএনপি সেটা তাই নির্ভর করে দেশে বিদ্যমান দেশীয় ও বিদেশী প্রতিষ্ঠানের উৎপাদনের অনুপাতের উপর। 

চীনের কথাই ধরুন। পাব্লিক ডেটা প্ল্যাটফর্ম Knoema-এর হিসেব অনুসারে দেশটির জিডিপি জিনপির চেয়ে ৩০ হাজার কোটি ডলার বেশি। কারণ হলো দেশটিতে বিদেশি প্রতিষ্ঠানের কাজ অনেক বেশি। আবার ঠিক উল্টো কারণে যুক্তরাষ্ট্রের জিনপি জিডিপির চেয়ে ২৫ হাজার কোটি ডলার বেশি। 

জিডিপি ভালো না জিএনপি ভালো?
দুটি পরিমাপ প্রায় একই কাজ করলেও জিডিপির ব্যবহারই বেশি। সে তুলনায় জিএনপির ব্যবহার কম। তবে অর্থিনীতির সঠিক চিত্র তুলে ধরতে দুটোরই ব্যবহার হওয়া উচিত। 

এদিকে বিশ্ব ব্যাংক ও জাতিসংঘ আরেকটি পরিমাপ ব্যবহার করার প্রতি জোর দেয়। এটি তাদের মানব সূচকের (Human Development Index) ওপর ভিত্তি করে তৈরি। নাম জিএনআই বা মোট জাতীয় আয় (Gross National Income)। তবে জিডিপি ও জিএনপি উৎপাদন পরিমাপ করলেও নাম থেকেই বোঝা যাচ্ছে জিএনআই আসলে পরিমাপ করে ইনকাম বা আয়। 

সূত্রঃ
২। উইকিপিডিয়া: Knoema 
Category: articles

Wednesday, July 18, 2018

[লিখেছেনঃ ড. রহমতুল্লাহ ইমন] 


পরিসংখ্যানের সঠিক সংজ্ঞা নিয়ে নানা মুনির নানা মত রয়েছে। সন্দেহ নেই সবচে জনপ্রিয়তা পেয়েছে এটি উপাত্ত সংগ্রহ আর উপস্থাপনের বিষয় হিসেবে। তবে পরিসংখ্যানের এমন সংজ্ঞা কিন্তু খুবই সেকেলে। আজ থেকে হাজার পাঁচেক বছর আগেও কিন্তু মানুষ উপাত্ত সংগ্রহ করেছে, উপস্থাপন করেছে। অথচ আমরা বলছি পরিসংখ্যানের উৎপত্তি উনিশ শতকের শেষে। কী এমন হয়েছিল সে সময় যাতে আমরা তাকে পরিসংখ্যানের উদ্ভবের কাল বলতে পারি?

আসলে সে সময়ে সম্ভাবনা তত্ত্বকে কাজে লাগিয়ে বর্তমানের তথ্য উপাত্তের ওপর ভিত্তি করে ভবিষ্যৎ সম্পর্কে পূর্বাভাস দেয়া শুরু হয়েছিল। চেরনভ ও মোজেস যেমনটা ১৯৫৯ সালে বলেছেন,
 Statistics is the science of prediction and decision making in the face of uncertainty। 

আসলেও তাই। অনিশ্চয়তার মুখে সিদ্ধান্ত নিতে পারার ক্ষমতা যার আছে সে যে কালের বিচারে সবার থেকে এগিয়ে যাবে সেটাই তো স্বাভাবিক। কিন্তু কীভাবে আমরা অনিশ্চয়তার মুখে সিদ্ধান্ত নেই?

এ জগতে কোন কিছুই নিখুঁত নয়, আবার কোন কিছুই আমরা পুরোপুরি জানতেও পারি না। তারপরেও সত্য সন্ধানের প্রচেষ্টা তো থেমে থাকেনি কখনো। অজানাকে জানার, অচেনাকে চেনার প্রচেষ্টাই হল বিজ্ঞান। পরিসংখ্যানও বিজ্ঞান একারণেই। আমরাও অজানাকে জানার চেষ্টা করে থাকি। আমাদের অজানা হল সমগ্রকের (population) কোন বিশেষ বৈশিষ্ট যাকে আমরা পরামিতি (parameter) বলে থাকি। আর তা আমরা জানার চেষ্টা করে থাকি সংগৃহীত তথ্য উপাত্তের ভিত্তিতে।

তাহলে কী দাঁড়াল অবশেষে? পরিসংখ্যান হল জানার মাধ্যমে অজানাকে সন্ধান করার বিজ্ঞান। কী অবাক করা কথা? বিশ্বকবি রবীন্দ্রনাথ ঠাকুর ঠিক এই কথাটিই বলেছিলেন শতবর্ষ আগে। ১৯২৪ সালে তাঁর লেখা গান,

আকাশভরা সূর্য-তারা, বিশ্বভরা প্রাণ,
তাহারি মাঝখানে আমি পেয়েছি মোর স্থান,
বিস্ময়ে তাই জাগে আমার গান॥
এই গানটির মাঝেই তিনি উল্লেখ করেছেন সেই অমোঘ বাক্যটি

কান পেতেছি, চোখ মেলেছি, ধরার বুকে প্রাণ ঢেলেছি,
জানার মাঝে অজানারে করেছি সন্ধান,
বিস্ময়ে তাই জাগে আমার গান॥

আমার ক্ষুদ্র জ্ঞানে পরিসংখ্যানের এর চাইতে ব্যাপক ও নিখুঁত সংজ্ঞা আর কেউ কখনো দেননি।
ছোট্ট একটা উদাহরণ দেয়া যাক। আমার জানার ইচ্ছে হল রাজশাহী বিশ্ববিদ্যালয়ের ছাত্ররা সপ্তাহে গড়ে কতক্ষণ লাইব্রেরী ব্যবহার করে। এর একটি প্রকৃত মান নিশ্চয়ই আছে কিন্তু আমার সেটা জানা নেই। আমি দৈবচয়নের (random sampling) মাধ্যমে ১০ জন ছাত্রছাত্রীকে নির্বাচন করলাম। এবার তাদের জিজ্ঞাসা করলাম সপ্তাহে তারা কতক্ষণ লাইব্রেরি করে? তাদের কাছ থেকে পাওয়া উত্তরগুলো হল ঘন্টার হিসেবে ০, ১, ০, ৪, ০, ০, ৬, ৮, ৩, ০।

এই উপাত্তগুলো এখন আমার জানা। আর এই জানা মানগুলো দিয়েই আমি অজানা কে জানার চেষ্টা করব। যদিও আমি জানি না এর মান কত তবুও যুক্তির খাতিরে ধরে নিলাম তা ২। তাহলে আমি কি আমার জানা তথ্যগুলোকে এভাবে প্রকাশ করতে পারি না?
০ = ২ – ২
১ = ২ – ১
০ = ২ – ২
৪ = ২ + ২
০ = ২ – ২
০ = ২ – ২
৬ = ২ + ৪
৮ = ২ + ৬
৩ = ২ + ১
০ = ২ – ২

অর্থাৎ
জানা (উপাত্ত) = অজানা (প্রকৃত মান) + বিচ্যুতি

এখানে প্রকৃত অজানা মান ২, আর তা থেকে উপাত্তগুলো কখনো -২, -১, -২, +২, -২, -২, +৪, +৬, +১, -২ এভাবে বিচ্যুত হয়ে আছে। এখান থেকে আরও বোঝা যাচ্ছে যে বিচ্যুতি (error) যত কম হবে ততই উপাত্ত প্রকৃত অজানা মানের কাছকাছি পৌঁছাবে। সবচে ভাল হত যদি সবগুলো বিচ্যুতিই শূন্য হত যাতে প্রতিটি উপাত্তই হুবহু প্রকৃত মানের সমান হত। কিন্তু বৈচিত্রই তো এ জগতের প্রধান বৈশিষ্ট। স্রষ্টা কোন কিছুই তো একদম এক ছাঁচে সৃষ্টি করেননি। আমরা বড়জোর যা পারি তা হল এই বিচ্যুতিকে যথাসম্ভব কমিয়ে আনতে।

আমরা লিখতে পারি
বিচ্যুতি = উপাত্ত - প্রকৃত অজানা মান

আমরা এমনভাবে উপাত্ত থেকে প্রকৃত অজানা মান বের করব যাতে বিচ্যুতির বর্গ সমষ্টি (sum of square errors) হয় সর্বনিম্ন।

আমরা এখানে কেন বিচ্যুতির বর্গ নিলাম? গণিতের কলনবিদ্যার (calculus) অন্তরীকরণ (differentiation) থেকে আমরা জানি যে কোন ফাংশন ভা অপেক্ষককে (function) তার পরামিতির সাপেক্ষে অন্তরীকৃত করার পর সেখান থেকে পরামিতির এমন মান পাওয়া যাবে যা ঐ অপেক্ষককের বৃহত্তম বা ক্ষুদ্রতম মান নির্ণয় করতে পারবে। বিচ্যুতির চিহ্নমুক্ত সমষ্টি (sum of absolute errors) পরামিতি থেকে উপাত্তগুলোর দূরত্ব নির্দেশ করে বটে কিন্তু এই অপেক্ষকটিকে পরামিতির সাপেক্ষে অন্তরীকরণ করা যায় না।

তাই গাণিতিক সুবিধার কারণেই আমরা বিচ্যুতির বর্গসমষ্টিকে বেছে নিয়েছি। এর অর্থ কিন্তু আবার এও নয় যে বিচ্যুতির চিহ্নমুক্ত সমষ্টির সর্বনিম্ন মান বের করা যায় না। এটা যায়, তবে অন্তরীকরণের মাধ্যমে নয়- তুলনামূলকভাবে অনেক বেশি জটিল পদ্ধতির মাধ্যমে। আর সেকারণেই এটা জনপ্রিয় হয়ে উঠতে পারেনি।

অপেক্ষকটিকে অন্তরীকরণের পর এখান থেকে যে সমাধান আসে তা খুবই চিত্তাকর্ষক। পরামিতির নিরূপকটি (estimate) আসলে নমুনা গড় (sample mean)। আমরা আগেই বলেছি যে পরামিতির নিরূপকটি ঐ অপেক্ষককের বৃহত্তম বা ক্ষুদ্রতম মান নির্ণয় করতে পারে। নমুনা গড় আসলে কী দেবে সেটা পরীক্ষার জন্য আমরা অপেক্ষকটিকে তার পরামিতির সাপেক্ষে আরেক দফা অন্তরীকৃত করব। শাস্ত্র বলছে অপেক্ষকটির দ্বিতীয় দফা অন্তরীকৃত মান ধণাত্মক হলে অপেক্ষকটি ক্ষুদ্রতম মান দেবে আর অন্তরীকৃত মান ঋণাত্মক হলে অপেক্ষকটির মান হবে বৃহত্তম।

বিচ্যুতির বর্গসমষ্টিকে দ্বিতীয় দফা অন্তরীকরণ করার পর যেহেতু এর মান পাওয়া যায় ২, সেহেতু একথা নির্দ্বিধায় বলা চলে যে নমুনা গড় জানা অজানার পার্থক্যের দূরত্বকে সবচে কমিয়ে আনবে। আর সে কারণেই নমুনা গড় হবে প্রকৃত মানের সবচাইতে গ্রহণযোগ্য অনুমিত মান।
এই উদাহরণের উপাত্ত থেকে পাওয়া নমুনা গড় হল ২.২ ঘন্টা। তাই ছাত্রছাত্রীদের লাইব্রেরীতে কাটানোর প্রকৃত সময় যদি সত্যি সপ্তাহে ২ ঘন্টা হয় তবে অনুমিত মান তার বেশ কাছাকাছি। তবে এই কাছাকাছি ব্যাপারটা তাৎপর্যপূর্ণ কিনা সেটাও পরীক্ষা করার পদ্ধতি আছে। আর এক্ষেত্রে নমুনা সংখ্যা যেহেতু কম আমরা বেছে নেব স্টুডেন্টের t নিবেশনকেই।

আর এভাবেই বারে বারে জানার মাঝে অজানাকে খুঁজে নেয় পরিসংখ্যান।
জয়তু রবীন্দ্রনাথ!

লেখক: অধ্যাপক, ম্যাথেম্যাটিক্যাল সায়েন্সেস,  Ball State University। 
Category: articles

Tuesday, July 17, 2018

R-এ অধিকাংশ কাজই একাধিক উপায়ে করা যায়। নান্দনিক গ্রাফিক্সের জন্য কালার বড় ভূমিকা পালন করে। R-এ প্লট কালার করা যায় অন্তত ৯ উপায়ে। চলুন জেনে নেওয়া যাক সে উপায়গুলো।

ও, আচ্ছা। প্লট করার জন্যে তো হাতে কিছু ডেটা লাগবে। আগে ডেটা বানিয়ে নিই তাহলে।

x=rexp(1000)
y=(rnorm(1000)

আর R এর ডিফল্ট ফন্ট আমার পছন্দ না। তাই ফন্টটা একটু পালটে নিচ্ছি। এটা অপশনাল। না করলেও দুনিয়া ধ্বংস হয়ে যাবে না।

par(family="serif")

তাহলে এবার আসল কাজে আসা যাক! মনে রাখতে হবে R-এ কমেন্ট শুরু হয় # চিহ্ন দিয়ে। মানে # চিহ্নের পরের কোড রান হবে না। 

১। কালার সিকুয়েন্স 

plot(x, y, col=4, pch=16, cex=1.4, main="Scatter Plot",
     xlab="X values", ylab="Y values")
grid() # optional

এখানে plot ফাংশনের col ছাড়া বাকি আর্গুমেন্টগুলো অপশনাল। প্লটের নান্দনিকতার স্বার্থেই যোগ করা। যাই হোক, এখানে খেয়াল করুন, আমরা শুধু একটি সংখ্যা বসিয়ে দিয়েছি। R-এ প্রায় প্রতিটি সংখ্যার বিপরীতে একটি করে কালার আছে। আপনি চাইলে এখানে 4,5,10, 25, 36- যাই ইচ্ছে বসিয়ে দেখতে পারেন। 

আবার কখনও একই সাথে অনেকগুলো কালারের প্রয়োজন হলে col=1:10 বা c(1,2,4,6,7,3) ফরম্যাটেও লিখতে পারেন। চেক করেই দেখুন না!

আবারও মনে করিয়ে দেই। উপরের grid কমান্ডটি কিন্তু অপশনাল। এটা আসলে প্লটে বক্স আঁকে। # দিয়ে অপশনাল কথাটা বলা আছে।

২। কালার নেইম 

এক্ষেত্রে আমরা সরাসরি কালারের ইংরেজি (সাধারণত) নাম বসিয়ে দেব।

plot(x, y, col="blue", pch=16, cex=1.4, main="Scatter Plot",
     xlab="X values", ylab="Y values")

একই প্লট পাওয়া গেল। এখানেও চাইলে আপনি একাধিক কালার ব্যবহার করতে পারেন একই প্লটে। Scatter প্লটের ক্ষেত্রে একাধিক কালার আপাতত দরকার না হলেও হিস্টোগ্রামে দরকার হতে পারে। যেমনঃ
hist(x, col=c("blue", "grey"))
box() #optional
grid() #optional
এক্ষেত্রে যেটা দরকার, তা হলো সবগুলো কালারের নাম জানা। সেটাও সহজ। প্রথমত, এই লিঙ্ক থেকে R-এর সবগুলো কালার নেইম পাবেন। অফলাইনে ব্যবহার করতে ডাউনলোড করে নিতে পারেন। আরও সহজে নামগুলো দেখতে চাইলে colors() কোড ব্যবহার করুন। তবে এক্ষেত্রে কোন কালারের চেহারা কেমন সেটা বোঝা যাবে না। সেটা বোঝা যাবে পিডিএফ ফাইলটা থেকে (লিঙ্কের)।

৩। অটো কালার ১ (topo.colors(10))
hist(y, col=topo.colors(10))
grid() #optional
box() #optional

যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

৪। অটো কালার ২
hist(x, col=heat.colors(12))
grid() #optional
box() #optional

এক্ষেত্রেও যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

৫। অটো কালার ৩
hist(x, col=terrain.colors(3))
grid() #optional
box()#optional
এক্ষেত্রেও যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

৬। হেক্সাডেসিমাল কোড

এই সাইট ভিজিট করুন। অথবা hexadecimal colors লিখে সার্চ দিলে আরও নানান সাইট পাওয়া যাবে। এখান থেকে হেক্সাডেসিমাল কোডটি বা কোডগুলো বসিয়ে দিতে পারেন। 
hist(x, col="#80ff00")
grid() #optional
box()#optional

৭,৮। Rgb ও hsl কালার কোড

উপরে দেওয়া লিঙ্কেই বাকি দুটি কালার কোডও পাবেন। এ দুটোতে সামান্য জটিলতা আছে। লিঙ্কে যেভাবে আছে ঠিক সেভাবে দিলে হবে না। rgb() ফাংশনের ভেতরে ৩টি সংখ্যা দিতে হবে। rgb মানে আসলে রেড, গ্রিন ও ব্লু। অতএব, ভেতরে যথাক্রমে লাল, সবুজ ও নীলের অনুপাত বসাতে হবে। প্রতিটি সংখ্যা হবে ০ থেকে ১ এর মধ্যে। ০ ও ১ দেওয়া যাবে। 

hist(x, col=rgb(0,0.8,0.9))
grid() #optional
box()#optional

আর hsl কোডে আরেকটু জটিলতা আছে। এটাকে ব্যবহার করতে চাইলে এই টিউটোরিয়াল পড়ুন। 

৯। সেরা কৌশল 

এতক্ষণ যেগুলো বললাম এগুলোর অনেকগুলো থেকেই অনেক সময় সেরা কম্বিনেশন বাছাই করা কঠিন। যেমন নীচের ম্যাপটি আঁকতে চাই। ম্যাপটি আঁকার বিস্তারিত কোড আছে এখানে। 

spplot(zilla, "literacy",col.regions=terrain.colors(5),
       cuts=4, col='transparent', main='Sample Map',
       scales=list(draw=T))

এখানে terrain.colors(5) ভালো কাজ করেছে। তবে কালারের সিকুয়েন্স ধরে রাখতে পারেনি। 

কিন্তু এটায় দেখুন, মান বাড়ার সাথে কালার গাঢ় হয়েছে। অথবা নীচের হিস্টোগ্রাম দেখুনঃ
নানান ক্ষেত্রেই এটার প্রয়োজন অনুভব করবেন। এক্ষেত্রে একটি প্যাকেজ লাগবে। নাম RColorBrewer। ইন্সটল করে লোড করে নিন। 

install.packages("RColorBrewer")
library(RColorBrewer)

এবার আবার হিস্টোগ্রাম আঁকি। 
hist(x, col=brewer.pal(n=5, name='YlGn'), ylim=c(0,500))

এখানে n এর জায়গায় যতগুলো কালার চান সেটা বসাবেন। আর name এর জায়গায় কী বসাবেন সেটার উপরই বির্ভর করছে কালার কেমন হবে। নীচের ছবিতে দেখে নিন কোডগুলো। বড় করে দেখতে এখানে ক্লিক করুন। 

 

আপনাকে আর পায় কে। দৃষ্টিনন্দন প্লট এঁকে তাক লাগিয়ে দিন বসকে!

এর বাইরে আপনি আরও কিছু জানলে কমেন্টে অবশ্যই জানাবেন।
Category: articles

ইংরেজি উইকিপিডিয়ার বাংলাদেশ পেইজের এজুকেশন সেকশনে শোভা পাচ্ছে আমার আঁকা এই ম্যাপটি। ম্যাপটিতে বাংলাদেশের বিভিন্ন এলাকার স্বাক্ষরতার চিত্র তুলে ধরা হয়েছে। এমন একটি ম্যাপ R-এ আঁকা অকল্পনীয় রকম সহজ। এটা নিয়েই আজকের পোস্ট।

প্রথম কাজ ম্যাপ আকাঁর জন্য প্রয়োজনীয় শেইপ ফাইল (shape file)। R এর plot ফাংশন দিয়ে শুরুতে আমরা এই ফাইলের একটি অংশই প্লট করব। বাংলাদেশের জন্য বানানো শেইপ ফাইলটি আপনাকে ডাউনলোড করে নিতে হবে। এটা পাওয়া যাবে এই লিঙ্কে। লিঙ্ক থেকে Shapefile টি ডাউনলোড করে নিন।

এখানে ক্লিক করেও ডাউনলোড করতে পারেন।

একটি জিপ ফাইল ডাউনলোড হবে। ফাইলটাকে আনজিপ করে নিন। আনজিপ করে এমন একটি ফোল্ডার পাবেন।



এই ফোল্ডারে আসলে বিভিন্ন আলাদা আলাদা ম্যাপ আঁকার ফাইল আছে। যেমন আলাদা করে বিভাগের ম্যাপ আঁকতে চাইলে দরকার হবে BGD_adm1 ফাইলটি। জেলাগুলোও দেখাতে চাইলে BGD_adm2 ফাইলটি। আর উপেজেলাগুলোও আলাদা করে দেখাতে চাইলে লাগবে BGD_adm3 ফাইলটি।

☛ লক্ষ্য করুন 
ভার্সনভেদে ডাউনলোড করে আনজিপ করা ফাইলের নাম আলাদা হতে পারে। যেমন একটি ক্ষেত্রে এটির নাম gadm36_BGD_2। 

একটি বিষয় বুঝে নেওয়া ভাল। Shapefile আসলে অনেকগুলো আলাদা ফাইলের সমন্বয়। যেমন, BGD_adm1 নামে অনেকগুলো ফাইল আছে। একই নামের সবগুলো ফাইল একই ফোল্ডারে থাকলে তবেই কেবল ফাইলটি কাজ করবে। তার মানে এই নয় যে ঐ ফোল্ডারে অন্য ফাইল থাকা যাবে না। আমাদের এই ফোল্ডারেই কিন্তু চারটি ম্যাপ আঁকার ফাইল আছে।

এবার ম্যাপটিকে R-এ পড়াতে হবে। এজন্য "rgdal" নামে একটি প্যাকেজ লাগবে। R এর প্যাকেজ ইনস্টল করার মতো সহজ কাজ দুনিয়াতে আর নেই। ইনস্টল ও লোড করে নিন।

☛ টিপস: Rstudio ব্যবহার করলে কাজটি সহজ হবে। না থাকলে ইনস্টল করে নিন। শুধু ম্যাপিং-ই না, R এর করা কাজগুলো হাজারো উপায়ে সহজতর হয়ে যাবে। Rstudio তে কোড run করতে Ctrl+Enter চাপুন।

install.packages("rgdal")
library(rgdal)

এবার Shapefile টিকে লোড করার পালা।

zilla=readOGR("D:/R/RGIS/BD", layer="BGD_adm2")

খেয়াল করুন, এখানে "D:/R/RGIS/BD" হলো BGD_adm2 ফাইলটি যে ফোল্ডারে আছে তার লোকেশন। আপনি ফাইলগুলো যেখানে রাখবেন সেই ফোল্ডারের লোকেশন এখানে লিখতে হবে। আর layer অংশটিতে কিছু করা লাগবে না। অবশ্য আপনি যদি উপজেলার ম্যাপ আঁকতে চান, তাহলে BGD_adm3 লিখতে পারেন।

☛ layer এর জায়গায় ফোল্ডারের ফাইল থেকে সঠিক নামটি বসাতে হবে।

এবার "zilla" অবজেক্টটি প্লট করে দেখুন। বাংলাদেশের ম্যাপ পেয়ে যাবেন।

plot(zilla, col="green")

কিন্তু আমরা তো শুধু এটা চাই না। আমরা চাই, অন্য একটু ক্রাইটেরিয়ার ভিত্তিতে আলাদা আলাদা জেলায় আলাদা আলাদা কালারিং হবে। তাহলে প্রতিটা জেলার সেই তথ্যটা লাগবে। আমরা আপাতত চাই বাংলাদেশের স্বাক্ষরতার হারের ভিত্তিতে রং-এর তারতম্য। এই কাজটি করার জন্য আমাদের sp প্যাকেজটি লাগবে। 

install.packages("sp")
library(sp)

বাংলাদেশের প্রতিটি জেলার স্বাক্ষরতার হার আমাদেরকে zilla অবজেক্টটিতে যোগ করতে হবে। তার আগে ৬৪টি জেলার তথ্য zilla অবজেক্টে-এর সাথে মিলিয়ে সাজিয়ে নিতে হবে। এখানেই Rstudio না থাকলে একটু সমস্যা হবে। zilla অবজেক্টে জেলাগুলোর ক্রম দেখার জন্য Rstudioতে View(zilla) কোড রান করলে ID_2 ও NAME_2 কলামে যথাক্রমে জেলার ক্রম ও নাম দেখা যাবে। এই ক্রম অনুসারেই আপনাকে স্বাক্ষরতার তথ্য লিপিবদ্ধ করতে হবে। 



কাজটি আপনি অনেকভাবে করতে পারেন। ৬৪টি জেলার হার একটি এক্সেল ফাইলে বসিয়ে ফাইলটিকে .csv আকারে সেইভ করে নিতে পারেন। আবার এক্সেল ফাইল সরাসরি পড়াতেও পারেন। এক্ষেত্রে readxl প্যাকেজ ব্যবহার করতে পারেন। আবার চাইলে সরাসরি R এর মধ্যেই হারগুলো নিয়ে একটি ভেক্টর বানিয়ে নিতে পারেন। যেমনঃ

literacy=c(61.24, 43.24,...) 

আপাতত আমরা csv ফাইল বানিয়ে রেখেছি। এটাই Rকে দিয়ে পড়াচ্ছি। এখান থেকে ডাউনলোড করে নিন। 

literacy=read.csv("D:/R/RGIS/literacy.csv")

"D:/R/RGIS/literacy.csv" অংশটিতে ফাইলটি যে ফোল্ডারে রেখেছেন তার পূর্ণ লোকেশন লিখতে হবে। 

এবার এটাকে আমরা zilla-এর সাথে যুক্ত করব। zilla অবজেক্টি ডেটা ফ্রেইম না হলেও ডেটা ফ্রেইমের কিছু নিয়ম এখানে খাটে। সেই কৌশলই আমরা কাজে লাগাব। 

zilla$literacy=literacy

Rstudio-তে View(zilla) রান করলে একেবারে ডান পাশের কলামে literacy দেখা যাবে। 


এবার আমরা প্রায় প্রস্তুত। তাহলে ম্যাপটা এঁকেই ফেলি! 

spplot(zilla, "literacy",col.regions=topo.colors(5),
       cuts=4, col='transparent', main='Sample Map',
       scales=list(draw=T))

বাহ! এইমাত্র আপনি সফল একজন ম্যাপ আর্টিস্ট হয়ে গেলেন। পাওয়া গেল ম্যাপটি।

এই কোডটির ব্যাখ্যা
Shapefile টিকে রাখতে হবে একদম শুরুতে (আমরা এখানে যাকে zilla নামে সেইভ করেছি)। তারপরেই যে কলামের তথ্যের ভিত্তিতে প্লট করতে চাই তার নাম (যেমন আমাদের এখানে literacy)। col.regions= অংশে হবে কালারগুলোর নাম। R প্রোগ্রামিং-এ কালার বসানোর অনেক উপায় আছে। topo.colors(5) হলো এমন একটি উপায়। যেখানে ৫টি কালার সেট হয়ে যাবে। আপনি চাইলে c("red", "green", ...) এভাবেও বসাতে পারেন। আবার heat.colors(5) বা terrain.colors(5) বসিয়েও দেখতে পারেন।

আরও পড়ুন 
☛ R প্রোগ্রামিং: প্লট কালারিং এর ৯ উপায়

col.regions অংশে যতগুলো আলাদা কালার বসিয়েছেন cuts অংশে তার ১ কম সংখ্যা বসবে। আপাতত এটা জানাই যথেষ্ট। আরও জানতে হলে ?spplot রান করে জেনে নিতে পারেন। 
Category: articles