Tuesday, November 5, 2024



R প্রোগ্রামিং: 1L, 2L, 3L কেন? ধরুন আমরা একটা ভেক্টর বানালাম এরকম:

 
 class(x) দেখলে দেখা যাবে "numeric"। 

এবার একটু আলাদা করে লিখুন।

   

এবার class(x) দেখলে দেখা যাবে "integer"। এখানেই পার্থক্য। শুধু 1, 2, 3 লিখলে R ধরে নেয় এটা নিউমেরিক ভেক্টর। মানে সংখ্যাগুলোতে ভগাংশও থাকতে পারে। তবে আমরা যদি জানি আমরা শুধু পূর্ণসংখ্যা নিয়ে কাজ করব তাহলে integer-এর ব্যবহার কাজের গতি বাড়িয়ে দিতে পারে। আর সেজন্যই c(1L, 2L, 3L) লিখে আমরা নির্দিষ্ট করে বলে দেই, আমাদের ভেক্টরটা হবে ইন্টিজার ভেক্টর। 

এতে সুবিধা হলো ভেক্টরটা কম্পিউটারে কম মেমোরি দখল করবে। numeric ভেক্টর প্রতিটি ভ্যালুর জন্য ৮ বাইট ব্যবহার করে। integer সেখানে ব্যবহার করে ৪ বাইট। object.size(x) দিয়ে ভেক্টরটার সাইজ দেখলে পাওয়া যায় ৬৪ বাইট। কিন্তু object.size(y) হলো ৮০ বাইট। ভেক্টরের মধ্যে শুধুই সংখ্যার সাইজ থাকলে আসলে হত যথাক্রমে ১২ ও ২৪ বাইট। কিন্তু আরও কিছু তথ্যও থাকে। এই যেমন এটা যে নিউমেরিক ভেক্টর সে তথ্যও মেমোরিতে থাকে। এগুলোকে ওভারহেড তথ্য। তাও বড় ডেটার ক্ষেত্রে ইন্টিজার ও নিউমেরিক ডেটার মধ্যে পার্থক্য গুরুত্বপূর্ণ হয়ে ওঠে। ইন্টিজার র‍্যামের ওপর প্রেশার কমাবে। 

কম্পিউটার সিপিইউ (CPU)কে দ্রুত কাজ করতে সহায়তা। আরেকটা উদাহরণ দেখুন।

   

 তবে R দিয়ে ইন্টিজার বানাতে হলে $-2 \times 10^9$ থেকে $2 \times 10^9$-এর মধ্যে সংখ্যা থাকতে হবে।
Category: articles

Friday, August 9, 2024

প্রথম অধ্যায় 

কিছুই না করার গল্প 

[শূন্যের সূচনা] 


তখন অস্তিত্ব বা অনস্তিত্ব কোনোটাই ছিল না। ছিল না স্থানের জগৎ, আর না ছিল তার বাইরের আকাশ। কে জাগাল? কোথায় জাগাল? 

-ঋগ্বেদ




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


ধারণাটির জন্ম প্রাচ্যের ফার্টাইল ক্রিসেন্ট[১] বা উর্বর চন্দ্রকলা অঞ্চলে। খ্রিস্টের জন্মের কয়েক শ বছর আগে। এই শূন্য শুধু আদিম শূন্যতার প্রতিচ্ছবিই নয়। এর ছিল ভয়ানক গাণিতিক ধর্মও। শূন্যের মধ্যে রয়েছে যুক্তির ভিত্তিকে গুঁড়িয়ে দেওয়ার শক্তি। 


ভেড়া গুনতে মানুষের মধ্যে গাণিতিক চিন্তার সূচনা ঘটে। এছাড়াও সম্পদের হিসাব রাখতে ও সময় মাপতে গণিত লাগত। এগুলোর কোনোটাতেই শূন্যকে দরকার হয়নি। শূন্যের আবিষ্কারের আগেও হাজার বছর ধরে সভ্যতা ঠিকঠাক কাজ করছিল। শূন্যের প্রতি ঘৃণা কাজ করায় কিছু কিছু সংস্কৃতির মানুষ সংখ্যাটিকে বাদ দিয়েই বাঁচতে চেয়েছিল। 


শূন্যবিহীন জীবন 

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

-আলফ্রেড নর্থ উইথহেড 


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


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


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


কিন্তু সংখ্যার একটি দারুণ বৈশিষ্ট্যের কারণে সংখ্যাপদ্ধতি সেখানেই থেমে যায়নি। সংখ্যাদেরকে যোগ করে নতুন নতুন সংখ্যা পাওয়া যায়। তাই কিছুদিন পরেই বুদ্ধিমান মানুষগুলো সংখ্যা-শব্দগুলোকে বিভিন্ন সারিতে সাজাতে লাগল। বর্তমান ব্রাজিলের বাকাইরি ও বোরোরো জাতির মানুষের ব্যবহৃত ভাষায় এই কাজটি করা হয়েছে। তাদের সংখ্যাগুলো এ রকম: এক, দুই, দুই ও এক, দুই ও দুই, দুই ও দুই এবং এক ইত্যাদি। তারা দুইয়ের মাধ্যমে হিসাব করে। গণিতবিদরা একে বলেন বাইনারি বা দ্বিমিক (binary) পদ্ধতি। 


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


কিন্তু কেন পাঁচ-ই? গভীরে গিয়ে চিন্তা করলে বোঝা যাবে আসলে যেকোনো একটি সংখ্যা নিলেই চলত। গগ চারটি নিয়ে গুচ্ছ করে দাগ টানলে এবং চার ও ষোলো এর গুচ্ছ বানালেও তার সংখ্যাপদ্ধতি ঠিকই কাজ করত। একইভাবে কাজ করত ছয় ও ছত্রিশের গুচ্ছও। কয়টা নিয়ে গুচ্ছ করা হলো সেটার ওপর হাড়ের ওপর দাগের সংখ্যা নির্ভর করে না। কিন্তু গগ চারের বদলে ৫টি নিয়ে গুচ্ছ করেছেন। পৃথিবীর সব মানুষই গগের বৈশিষ্ট্যটা পেয়েছে। মানুষের প্রতি হাতে পাঁচটি করে আঙ্গুল আছে। ফলে বিভিন্ন সংস্কৃতির সংখ্যাপদ্ধতির ভিত্তি হিসেবে ৫-কে জনপ্রিয় হতে দেখা গেল। যেমন, প্রাথমিক যুগের গ্রিকরা ট্যালি চিহ্ন আঁকাকে বলত 'ফাইভিং'।


এমনকি দক্ষিণ আমেরিকার দ্বিমিক গণনা পদ্ধতিতেও ভাষাবিদরা পাঁচভিত্তিক সংখ্যাপদ্ধতির সূচনা দেখেছেন। বোরোরো ভাষায় “দুই ও দুই এবং এক” বলার আরেকটি উপায় হলো, “এটা হলো আমার এই পুরো হাতের সমান।” বোঝাই যাচ্ছে, প্রাচীন আমলের মানুষ শরীরের অঙ্গ-প্রত্যঙ্গ দিয়ে গণনা করতে চাইত। পাঁচ (এক হাত), দশ (উভয় হাত) এবং বিশ (উভয় হাত ও উভয় পা) ছিল খুব পছন্দনীয় চিহ্ন। ইংরেজি ভাষার ইলেভেন (এগারো) ও টুয়েলভ (বারো) শব্দ দুটি সম্ভবত “ওয়ান ওভার টেন” ও “টু ওভার টেন” থেকে এসেছে। আর তের (থার্টিন), চৌদ্দ (ফোর্টিন), পনের (ফিফটিন) ইত্যাদি হলো যথাক্রমে “থ্রি অ্যান্ড টেন”, “ফোর অ্যান্ড টেন” এবং “ফাইভ অ্যান্ড টেন”-এর সংক্ষিপ্ত রূপ। এ কারণে ভাষাবিদরা মনে করছেন, যে জার্মানীয় আদিভাষাসমূহ থেকে ইংরেজি ভাষা এসেছে সেগুলোতে দশ ছিল মৌলিক একক। এ কারণে সেই ভাষাগুলোর মানুষরাও ১০-ভিত্তিক সংখ্যাপদ্ধতি ব্যবহার করতেন। অন্য দিকে ফরাসি ভাষায় আশি-কে বলে কোয়াত্রে ভিংত (চারটি বিশ)। আর নব্বইকে বলে কোয়াত্রে ভিংত দি (চারটি বিশ ও একটি দশ)। হয়ত এখনকার ফ্রান্সে যে মানুষগুলো বাস করতেন তারা ২০-ভিত্তিক বা ভিজেসিনাল (vigesimal) সংখ্যাপদ্ধতি ব্যবহার করতেন। সাত ও ৩১-এর মতো সংখ্যাগুলো এই সবগুলো সংখ্যাপদ্ধতিতেই ছিল। হোক সেটা ৫-ভিত্তিক, ১০-ভিত্তিক, কিংবা ২০-ভিত্তিক। কিন্তু এগুলোর কোনোটিতেই ছিল না শূন্যের জন্যে কোনো নাম। এই ধারণাটারই অস্তিত্ব ছিল না। 


শূন্যটি ভেড়ার যত্ন তো কখনও নিতে হয় না। কিংবা শুন্যসংখ্যক সন্তানের হিসাব রাখার দরকার হয় না। “আমার কাছে শূন্যটি কলা আছে” না বলে দোকানী বলেন, “আমার কাছে কোনো কলা নেই।” কোনো কিছুর অভাব বোঝানোর জন্যে আপনার সংখ্যার প্রয়োজন হয় না। আর কোনো বস্তুর অভাবকে প্রতীক দিয়ে প্রকাশ করার বিষয়টিও কারও মাথায় আসেনি। এ কারণেই শূন্য ছাড়াই মানুষ এতগুলো সময় পার করে দিয়েছে। শূন্যের দরকারই পড়েনি। শূন্যের উদয়ও তাই ঘটেনি। 


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


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


প্রথমদিকের লেখকদের লেখা সংখ্যাগুলোর সাথে তাদের সংখ্যাপদ্ধতির মিল থাকত। আর অনুমিতভাবেই তারা সেটা যথাসম্ভব সংক্ষিপ্ত উপায়ে লিখত। গগের সময়ের পরে সমাজ জীবনে উন্নতি সাধিত হয়েছে। একের পর এক ছোট ছোট দাগের গুচ্ছ না বানিয়ে লেখকরা প্রতিটি গুচ্ছের জন্যে প্রতীক তৈরি করল। পাঁচ-ভিত্তিক সংখ্যাপদ্ধতিতে লেখক এক লেখার জন্যে হয়ত একটি দাগ দেবেন। পাঁচ-এর একটি গুচ্ছ বোঝাতে আলাদা আরেকটি চিহ্ন ব্যবহার করবেন। ২৫-এর গুচ্ছ বোঝাতে ব্যবহার করবেন অন্য আরেকটি দাগ। এভাবেই চলবে। 


মিশরীয়রা ঠিক এই কাজটিই করেছে। ৫ হাজার বছরেরও আগে, পিরামিডও তৈরির আগেই মিশরীয়রা তাদের দশমিক পদ্ধতিকে লেখায় রূপ দেওয়ার একটি নিয়ম তৈরি করে। সেখানে তারা ছবি দিয়ে সংখ্যা বোঝাত। একটি খাড়া দাগ দিয়ে এক একক বোঝানো হত। আবার গোড়ালির একটি হাড় দিয়ে বোঝানো হত ১০, একটি মোচড়ানো দড়ি ছিল ১০০ ইত্যাদি। এভাবে সংখ্যা লিখে যাওয়ার জন্যে তাদেরকে শুধু এই প্রতীকগুলোর গুচ্ছ রেকর্ড করতে হত। এক শ তেইশ বোঝানোর জন্যে ১২৩টি দাগ দেওয়ার বদলে লেখকরা ছয়টি প্রতীক লিখত। একটি রশি, দুটি গোড়ালি ও তিনটি খাড়া দাগ। প্রাচীনকালেই মূলত এভাবেই গাণিতিক কাজ হত। আর অন্য অনেক সভ্যতার মতোই মিশরেও শূন্য ছিল না। বা বলা যায়, প্রয়োজন হয়নি। 


তবুও প্রাচীন মিশরীয়রা গণিতে ভালোই হাত পাকিয়েছিল। জ্যোতির্বিদ্যা ও সময় গণনায় তারা কারিশমা দেখিয়েছিল। তার মানে তাদেরকে উন্নত গণিত ব্যবহার করতে হয়েছিল। কারণ পঞ্জিকার পাতা খুব দ্রুত বদলে যায়। 


বেশিরভাগ প্রাচীন মানুষের কাছেই একটি স্থিতিশীল পঞ্জিকা বানানো ছিল বড় এক সমস্যার কাজ। এর কারণ ছিল তারা সাধারণত চান্দ্র পঞ্জিকা দিয়ে কাজ শুরু করতেন। পরপর দুটি পূর্ণিমার মাঝের সময়টুকু ছিল এক মাস। এভাবে গণনা করাই ছিল সহজাত অভ্যাস। আকাশে চাঁদের বড়-ছোট হওয়া সহজেই সবার নজর কাড়ে। আর সময়ের চক্র হিসাব করার জন্যে এখান থেকে সুবিধাজনক একটি উপায়ও খুঁজে পাওয়া যায়। কিন্তু চান্দ্র মাসের দৈর্ঘ্য হয় ২৯ থেকে ৩০ দিনের মাঝামাঝি। ১২টি মাস যোগ করে সব মিলিয়ে ৩৫৪ দিনের বেশি পাওয়া যায় না। যা সৌর বছরের চেয়ে ১১ দিন কম। চান্দ্র মাস তেরটি নিলে আবার ১৯ দিন বেশি হয়ে যায়। ওদিকে আবার চাষাবাদ নির্ভর করে সৌর বছরের ওপর, চান্দ্র বছর নয়। অসংশোধিত চান্দ্র মাস দিয়ে হিসাব করলে ঋতুর মাসগুলোকে বদলে যেতে দেখা যায়। 


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


চান্দ্র পঞ্জিকার মতোই তাদের মাস ছিল ১২টি। কিন্তু প্রতিটি মাস ছিল ৩০ দিনের। (১০-ভিত্তিক সংখ্যা ব্যবহার করায় তাদের এক সপ্তাহের দৈর্ঘ্য ছিল ১০ দিন। বছর শেষ হলে আরও বাড়তি পাঁচটি দিন যোগ করা হত। এতে করে সব মিলিয়ে ৩৬৫ দিন হয়ে যেত। এই পঞ্জিকাই আমাদের বর্তমান ক্যালেন্ডারের আদিরূপ। মিশরীয়দের এই পদ্ধতি গ্রিক ও পরে রোমানরা গ্রহণ করে। রোমানরা একে পরিমার্জন করে অধিবর্ষ যোগ করে। এটাই পরে পাশ্চাত্যে আদর্শ পঞ্জিকা হিসেবে আত্মপ্রকাশ করে। তবে মিশরীয়, গ্রিক ও রোমানদের কাছে শূন্যের ব্যবহার না থাকায় পশ্চিমা পঞ্জিকায়ও নেই শূন্য। এই অমনোযগই সহস্র বছর পরে সমস্যার কারণ হয়ে দাঁড়ায়। 


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


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


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

Category: articles

Thursday, July 25, 2024

জিরো: দ্য বায়োগ্রাফি অব অ্যা ড্যাঞ্জারাস আইডিয়া 

মূল: চার্লস সিফ 

অনুবাদ: আব্দুল্যাহ আদিল মাহমুদ 

শূন্যতম অধ্যায়: নাল অ্যান্ড ভয়েড 




ইউএসএস ইয়র্কটাউন জাহাজে শূন্যের আঘাতটা টর্পেডোর মতোই হলো। 


১৯৯৭ সালের ২১ সেপ্টেম্বর। জাহাজটি ভার্জিনিয়া উপকূল থেকে প্রমোদভ্রমণে বের হয়। শত কোটি ডলারের মিসাইল ক্রুজারটি হঠাৎ কাঁপতে কাঁপতে থেমে যায়। ইয়র্কটাউন জাহাজের সলীল সমাধি ওখানেই। 


যুদ্ধজাহাজগুলো বানানোই হয় টর্পেডো বা বিস্ফোরকের আঘাতের প্রতি সহনীয় করে। ইয়র্কটাউন জাহাজকে সব ধরনের অস্ত্র থেকে বাঁচানোর ব্যবস্থা করা হয়েছিল। কিন্তু শূন্য থেকে বাঁচানোর কথা কেউ ভাবেনি। মারাত্মক এক ভুল।


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


ইয়র্কটাউনের কম্পিউটার শূন্য দিয়ে ভাগ করার চেষ্টা করেছিল। সাথে সাথে ৮০ হাজার হর্সপাওয়ারের যান অকেজো হয়ে গেল। ইঞ্জিনকে জরুরি নিয়ন্ত্রণ ব্যবস্থায় আনতে প্রায় তিন ঘণ্টা সময় লেগে গিয়েছিল। পরে কোনোরকমে তীরে ভিড়তে সক্ষম হয়। শূন্য থেকে মুক্তি পাওয়া, ইঞ্জিন মেরামত করা ও ইয়র্কটাউনকে পুনরায় সচল করতে লেগে গেল দুই দিন সময়। 


অন্য কোনো সংখ্যার দ্বারা এমন ক্ষতি করা সম্ভব নয়। ইয়র্কটাউনে ঘটা কম্পিউটারের ত্রুটি শূন্যের ক্ষমতার খুব ছোট্ট এক নমুনা। বিভিন্ন সংস্কৃতির মানুষ শূন্যের বিরুদ্ধে রুখে দাঁড়িয়েছিল। শূন্যের মুখোমুখি হলে দার্শনিকদের বিদ্যেবুদ্ধি লোপ পেত। কারণ শূন্য অন্য সংখ্যা থেকে একেবারেই আলাদা। অবর্ণনীয় ও অসীমের এক ছোট্ট বহিঃপ্রকাশ। এ কারণেই মানুষ একে ভয় পেয়েছে। ঘৃণা করেছে। নিষিদ্ধ করেছে। 


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


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


প্রাচ্য ও পাশ্চ্যাতের সংঘাতের মূলে ছিল শূন্য। খৃষ্টধর্ম ও বিজ্ঞানের সংগ্রামের কেন্দ্রে ছিল শূন্য। শূন্য পরিণত হলো প্রকৃতির ভাষায়। হয়ে গেল গণিতের সবচেয়ে গুরুত্বপূর্ণ হাতিয়ার। পদার্থবিজ্ঞানের সবচেয়ে ব্যাপক সমস্যাগুলোর সমাধানে মোকাবেলা করতে হয় শূন্যকে। হোক সে ব্ল্যাকহোলের অন্ধকার কেন্দ্র কিংবা বিগ ব্যাংয়ের উজ্জ্বল ঝলক। 


কিন্তু ইতিহাসে পাতা বলছে, বাজিমাত সবসময় করেছে শূন্যই। প্রত্যাখ্যান, নির্বাসন সব মোকাবেলা করে শূন্য সবসময় প্রতিপক্ষকে হারিয়ে দিয়েছে। মানুষ কখনোই শূন্যকে দর্শনে অন্তর্ভূক্ত হতে বাধ্য করতে পারেনি। বরং মহাবিশ্ব ও ঈশ্বরের ধারণা পেতে শূন্যের কাছেই যেতে হয়েছে মানুষকে। 

Category: articles

Saturday, July 13, 2024

চলুন একটি খেলা খেলি। আপনাকে একটা খাম দিলাম। খুলে দেখলেন, এতে ২০ টাকা আছে। আর এদিকে আমার হাতে আছে আরেকটি খাম। আপনাকে জানালাম, আমার হাতের খামে হয় ১০ বা ৪০ টাকা আছে। মানে আপনার খামের টাকার অর্ধেক বা দ্বিগুণ। দুই পরিমাণের সম্ভাবনা সমান ৫০% করে। আপনাকে দুটো অপশন দিলাম।


খাম প্যাারাডক্স


১। ২০ টাকার খামটি রাখুন অথবা

২। আগের খান ফেরত দিয়ে আমার কাছে থাকা খামটা নিন


আপনি কী করবেন? অনেকেই হয়ত অতশত ভাবনায় না গিয়ে ১ম খামটাই (২০ টাকার) রেখে দিতে চাইবেন। তবে একটু হিসাব করেই দেখি না! 


এ ধরনের হিসাব করতে কাজে লাগবে পরিসংখ্যান। কারণ এখানে সিদ্ধান্ত নিতে গেলে দরকার হবে এক্সপেরিমেন্ট বা পরীক্ষার। তো করে ফেলি একটা সরল পরীক্ষা। ধরা যাক আমরা কাজটা করলাম ১০ বার। 


১। প্রত্যেকবার ২০ টাকার খামটাই রেখে দিলে মোট টাকা পাওয়া যাবে ২০ x ১০ = ২০০ টাকা।

২। খাম বদলে নিলে গড়ে ৫ বার ১০ টাকা আর ৫ বার ৪০ টাকা পাবেন (কারণ সম্ভাবনা সমান ৫০% করে)। তাহলে মোট পাবেন ১০ × ৫ + ৪০ × ৫ = ৫০ + ২০০ = ২৫০।


তাহলে দেখা গেল, পাল্টালে লাভ। দারুণ তো!


আরেকটা খেলা!


আমার হাতে আছে দুটো খাম। কোনটায় কত আছে তা আপনাকে জানাইনি। শুধু বললাম, একটায় আরেকটার দ্বিগুণ টাকা আছে। আপনাকে বললাম, ইচ্ছামতো একটা তুলে নিন। তবে আগের মতো ভেতরে কত আছে তা দেখা যাবে না। এবারও আপনাকে দুটো অপশন দিলাম৷ 


১। তোলা খামটা রেখে দিন। বা

২। অপর খামটা নিন, যাতে অর্ধেক বা দ্বিগুণ টাকা আছে।


আপনি কি খামটা পাল্টাবেন?


হিসাবে কী আসে দেখি!


ধরুন তোলা খামটায় 'ক' টাকা আছে। তাহলে অপর খামে আছে হয় ক/২ বা ২ক টাকা। দুটো পরিমাণেরই সম্ভাবনা সমান ৫০%।


আগের মতো ১০ বার কাজটা করলে কী হয় দেখি।


১। না পাল্টালে পাবেন ক × ১০ = ১০ক টাকা

২। পাল্টালে পাবেন ২ক × ৫ + ক/২ × ৫ = ১০ক + ৫ক/২ = ১২.৫ ক,  যা ১০ক-এর চেয়ে বেশি। 


দ্বিতীয় অপশনে গড়ে বেশি আসে আগের মতোই। তাহলে পাল্টালে লাভ!


গাণিতিক বুদ্ধির সদ্ধ্যবহার করে আপনি পাল্টানোর সিদ্ধান্ত নিলেন। আপনার হাতে এখন দ্বিতীয় খামটি। 

এবার আমি আপনাকে আরেকটা অফার দিলাম।  আমি বললাম, খাম আরেকবার পাল্টাবেন? 


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


এতে করে ফিরে গেলেন আগের জায়গায়। এবারও খাম নেওয়ার আগে মনে পড়ল, পাল্টে নিলে লাভের সম্ভাবনা বেশি। তাই, আবার পাল্টালেন। আবার, আবার, আবার...


শেষমেশ দেখা গেল, টাকা পাওয়ার বদলে আপনি বাকি জীবন খাম পাল্টাতে পাল্টাতে সময় পার করবেন। 

Category: articles

Sunday, June 23, 2024

কত শত কাজে এখন পাসওয়ার্ড লাগে। থাকে কত শর্ত। পাসওয়ার্ড হতে হবে শক্ত। এতে কোনো সন্দেহ নেই। R জানলে এ কাজটাও করা যায় সহজেই। যদিও কাজটা R দিয়ে করতে হবে এমন কোনো কথা নেই। আরও কত উপায় তো আছেই। তাও একটি কোডিং করেই দেখি না।




আমাদের পাসওয়ার্ডে থাকবে-

১। 0 থেকে 9 পর্যন্ত ডিজিটগুলো

২। ইংরেজি বড় ও ছোট হাতের অক্ষর 

৩। বিশেষ কিছু ক্যারেক্টার (যেমন @, #, $ ইত্যাদি) 


পাসওয়ার্ড বানানো যাবে যে-কোনো দৈর্ঘ্যের। প্রথমেই আমরা ওপরের সবগুলো ধরন থেকে একটি করে ক্যারেক্টার নেবো। তাহলে পেলাম চারটি ক্যারেক্টার। পাসওয়ার্ড চার ক্যারেক্টারের বেশি হলে আরও কিছু ক্যারেক্টার লাগবে। সেগুলো আমরা র‍্যান্ডমলি নেবো সব ধরনের ক্যারেক্টার থেকেই। এজন্য আগেই সবাইকে একত্র করে একটি ভেক্টর বানিয়ে রাখব। 



বিশেষ ধরনের ক্যারেক্টারগুলো S ভেক্টরে সেভ করলাম। সবগুলো একত্র করে রাখলাম allchr ভেক্টরের মধ্যে।  

nC = পাসওয়ার্ডের দৈর্ঘ্য। বাই ডিফল্ট ৮ অক্ষরের পাসওয়ার্ড তৈরি হবে। 

nD = ডিজিটের সংখ্যা 

nS = বিশেষ ক্যারেক্টারের সংখ্যা 

এভাবেই বাকিগুলো যথাক্রমে বড় হাতের ও ছোট হাতের অক্ষরের সংখ্যা। সবগুলোর ডিফল্ট মান ১ দেওয়া আছে। 


সবশেষে জেনারেটেড পাসোওয়ার্ডের ক্যারেক্টারগুলোকে র‍্যান্ডমলি সাজিয়ে নেবো। নাহলে সবসময় শুরুর ক্যারেক্টারগুলো একইরকম হবে। 


টেস্ট টাইম 



কিছু রেজাল্ট (১০ অক্ষরের)

"6ku$HdeNFy"
"#Yy|-vMIZ4"
"gz7Rer|*V?"
"2Gt/^v;967"
"`yHaD9KW/i"
"<o4eJ6-p8R"
"9kPG>A:F.l"
".i@19Rql3c"
"z@?;+9*Y*a"
"r`4yVcf6J*"


বলুন তো, একসাথে অনেকগুলো পাসওয়ার্ড বানাতে কী করব? একটু ভাবুন। 


জানতে এখানে ক্লিক করুন।

 

Category: articles

Sunday, June 12, 2022




হঠাৎ একটা প্রয়োজনে একটা ফোল্ডারের সব ফাইলের নাম চেঞ্জ করা দরকার হলো। ২৭টি ফাইলে একটি একটি করে কাজ করতে সময় লাগবে অনেক। তার চেয়ে খারাপ হলো বিরক্তি। মনে পড়ল লিনাক্স কমান্ড লাইনের কথা। মনে হতেই ব্যাশে গিয়ে কোড লিখলাম। 

এ কাজের জন্য এক লাইনের কোডই যথেষ্ট। 




এখানে একটি লুপ তৈরি করা হয়েছে। do এবং done দিয়ে লুপ শুরু ও শেষ হয়েছে। tr দিয়ে মূলত রিনেম করা হয়েছে। এখানে যেহেতু আমরা স্পেসকে পরিবর্তন করেছি তাই tr এর পরে ' ' দেওয়া হয়েছে। অন্য কিছু চেঞ্জ করতে হলে ' ' এর ভেতরে লিখলেই হবে। যেমন a বদলাতে চাইলে হবে tr 'a'। একইভাবে ঠিক পরের অংশ লিখতে হবে। 

আর বিশেষ কিছু ফাইল চেঞ্জ করতে চাইলে তা * এর পরে লিখতে হবে। যেমন শুধু পিডিএফ (pdf) ফাইলগুলো রিনেম করতে হবে in *.pdf;। 

লিনাক্সে mv কমান্ড দিয়েই মূলত রিনেম করা হয়। আর লুপের জন্যেই ডলার সাইন দেওয়া হয়েছে। 
Category: articles

Monday, August 30, 2021

 হ্যাঁ, R এর ggplot2 প্যাকেজে পাই চার্টের মতো নান্দনিক চার্ট আঁকার সরাসরি কোনো উপায় নেই। আঁকতে হয় বার চার্ট থেকে ঘুরিয়ে। কিন্তু আসলেই কি চার্ট দুটো আলাদা? আসলে তো পাই চার্টও এক ধরনের বার চার্টই! যেখানে বারগুলো সোজা দাঁড়িয়ে না থেকে বৃত্তাকার পথে চলছে। উপরের দিকে না গিয়ে ঘুরছে। 

এই যে চার্টটিই দেখুন। পাই চার্টের এরিয়াগুলোকে চাইলে আপনি কৌণিক পথ বেয়ে চলা বার বা স্তম্ভ মনে করতে পারেন। 

এখন আমরা ধাপে ধাপে দেখব, কীভাবে বার চার্টটিকে আপনি পাই চার্টে রূপান্তরিত করবেন। 

আমরা কাজ করব নিচের ডেটাটি দিয়ে। এটা হলো যুক্তরাষ্ট্রের বিভিন্ন জাতিগোষ্ঠীর মানুষের শতাংশ। 


এবার এখান থেকে বার চার্টটি আগে এঁকে ফেলি। বার চার্টের সংখ্যাগুলো একটি কলামে উপস্থিত থাকলে geom_bar() এর ভেতরে stat="identity" দিতে হয়। আর যদি এভাবে থাকে: true, false, false, true ইত্যাদি, তাহলে stat="identity" দেওয়া লাগবে না। width না দিলেও হবে। সেক্ষেত্রে স্বয়ংক্রিয়ভাবে বারগুলো মোটা বা চিকন হবে। 



%>% চিহ্নটির নাম পাইপ অপারেটর। এভাবে লেখা আর ggplot(data=us_races, aes...) লেখা একই কথা। তবে এটা ব্যবহার করতে হলে tidyverse প্যাকেজ লোড করে নিলেই। একই সাথে পাইপের magrittr, ggplot2, dplyrসহ অনেকগুলো দরকারি প্যাকেজ লোড হয়ে যাবে। 


এবারে RColorBrewer প্যাকেজ দিয়ে বারের কালারগুলো সাজিয়ে নেই। না করলেও ক্ষতি নেই। পাশাপাশি বারের মধ্যেই প্রতিটি বারের সাথে সংশ্লিষ্ট সংখ্যাগুলো দেখিয়ে দেই। 


 

খেয়াল করুন বারে ডান পাশে লিজেন্ড থাকার আসলে কোনো প্রয়োজন নেই। এটাকে ফেলেই দেওয়া যায়। 



এবার পাই চার্ট বানানো শুরু করা যাক। প্রথম কাজ হলো, x অক্ষে Race রাখা যাবে না। পাই চার্টে যেহেতু এরিয়াগুলো একটা আরেকটার ওপরে থাকবে, তাই y অক্ষে সংখ্যাগুলো বসিয়ে Race দিয়ে কালার করে নিচ্ছি। 




এটাকে পাই চার্ট বলার সময় হয়নি এখনও। পাই চার্ট হবার জন্যে প্রস্তুত বলতে পারি। 

এখন সে কাজটাই করব। বারগুলোকে ঘুরিয়ে দিতে হবে। এটাই করবে coord_polar() ফাংশনটা। 



দেখতে পাই চার্টের মতোই হয়েছে। তবে x অক্ষ, y অক্ষ ও আরও নানান জায়গায় অপ্রয়োজনীয় জিনিসে ভর্তি। এগুলো সরিয়ে একটু ক্লিন করি। theme_void() কাজটা করে দেবে। 




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



এবার কালার কম্বিনেশন আরেকটু ঠিক করে নেই। 






চাইলে তো আরও কত কিছুই করা যায়। করার আগে চিন্তা করতে হবে সেটা কতটা অর্থবহ। 

পাই চার্ট ভাল না লাগলে যদি ডোনাট চার্ট আঁকতে চান, সেটাও করতে পারেন। 

Category: articles

Saturday, August 28, 2021

 পত্রিকার পাতা খুললেই ইদানিং সুন্দর সুন্দর ডোনাট চার্ট দেখা যায়। এগুলোও আসলে পাই চার্টই। তবে মাখখানে থাকে একটি ছিদ্র। 

কিছু দিন মনে করতাম, R মনে হয় এমন প্লট বানাতে পারে না। মজার ব্যাপার হলো, অন্য কেউ পারে R পারবে না এমনটা হতেই পারে না। হলে এমন হতে পারে যে R পারে কিন্তু অন্যরা (যেমন এক্সেল, SPSS পাইথন) পারে না। 

এই প্লটটাও R-এই বানিয়েছি।

এমনিতে R-এর ggplot2 প্যাকেজে পাই চার্ট বানানোর জন্যে কোনো ফাংশন নেই। তবে একটু ঘুরিয়ে চিন্তা করলেই বোঝা যায়, পাই চার্ট আসলে এক ধরনের বার চার্টই। তবে বারগুলো খাড়াভাবে না থেকে কৌণিকভাবে অবস্থান করছে। একটা যেখানে শেষ আরেকটা সেখানে শুরু। 

ওপরের ডোনাট চার্টটির দিকেই দেখুন। এরিয়াগুলোকে চাইলেই বার হিসেবে কল্পনা করতে পারেন। অতএব, ডোনাট চার্টের কায়দা কানুন বুঝতে হলে বার চার্ট বানানোর নিয়ম জানতে হবে। একদম চিন্তা নেই, অনেকগুলো পোস্টে সেটা আমরা ব্যাখ্যা করেছি। 

☛ বার প্লট বানানোর কায়দা কানুন

তাহলে বানিয়ে ফেলি। ও, আগে কিছু ডেটা বানিয়ে নেই। টেবিলটা উইকিপিডিয়া থেকে নেওয়া। 



এখানে আমি ডেটাফ্রেইম তৈরি করার জন্যে tidyverse প্যাকেজমালার tibble() ফাংশন ব্যবহার করেছি। এভাবে করতে হলে আপনাকে library(tidyverse) কমান্ড দিয়ে এটা লোড করে নিতে হবে। চাইলে এটা লোড না করেও ডেটা বানাতে পারেন। সেক্ষেত্রে ফাংশনটা হবে data.frame()। তবে tidyverse লোড করলে সাথে সাথে ggplot2ও লোড হয়ে যায়। আলাদাভাবে ggplot2 লোড করতে রান করুন library(ggplot2)।  


এবার প্লট করে ফেললেই হলো। 

 

বার প্লট বোঝার পরেও এটা না বুঝতে না পারলে কিছু ব্যাপার খেয়াল করুন:`

  • এখানে পাই চার্ট বানানোর সুবিদার্থে আমরা geom_bar এর বদলে geom_col ব্যবহার করেছি। 
  • xlim দিয়ে ডোনাটের পুরুত্ব ঠিক করা হয়েছে। এর ওপর নির্ভর করে পাইয়ের ভেতরের ছিদ্র ছোট-বড় হবে।
  • মূলত coord_polar দিয়ে বারগুলোকে কৌণিক রূপ দেওয়া হয়েছে।
  • theme_void দিয়ে অপ্রয়োজনীয় ব্যাকগ্রাউন্ড রিমুভ করা হয়েছে। 
  • geom_text সম্পর্কে আরও জানতে এই লেখাটি দেখুন। 
  • বাকি জিনিসগুলো বিভিন্ন লেখায় আগেই বলেছি। দেখতে চাইলে দেখে নিন
  • প্লট কালারিং করার নানান উপায় দেখুন এখানে

আজ এ পর্যন্তই। 
Category: articles

Thursday, July 22, 2021

 ধরুন আমাদের কাছে একটি ডেটাফ্রেইম আছে যাতে অনেকগুলো কলাম আছে। এগুলোর সবগুলোর গড় , মধ্যমা বা পরিমিত ব্যবধান আমরা এক কমান্ডেই বের করতে চাই। 

আজকের পোস্টে আমরা R-এর বিল্ট-ইন ডেটাসেট airquality ব্যবহার করব। এতে ৬টি কলাম বা চলক আছে। Rstudio ব্যবহার করলে আপনি View(airquality) দিয়ে ডেটাকে একনজর দেখে নিতে পারেন। Rstudio ব্যবহার না করে থাকলে প্রথমে ডেটাকে লোড করে নিতে হবে।  


এবার str দিয়ে দেখে নিতে পারেন কলাম বা চলকগুলো কী ধরনের। দেখা যাবে, পাঁচটি কলামই পূর্ণ সংখ্যা দিয়ে তৈরি। একটিতে আছে ভগ্নাংশ। তাহলে সবগুলো কলামই সংখ্যাবাচক। 

তাহলে এবার গড় করে ফেলি। 

স্বাভাবিক উপায়ে গড় বের করতে গেলে হয়ত আমরা এভাবে করব:


এখানে na.rm = TRUE দেওয়ার কারণ হলো, ডেটায় কিছু মিসিং ভ্যালু  (NA) আছে। এই কথা দিয়ে আমরা বলে দিয়েছি, সেগুলোকে বাদ দিয়ে হিসাব করে দাও। 

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

আমরা চাইলে এভাবে করতে পারি:

 

 এখানে 2 দিয়ে বোঝানো হলো, আমরা কলামের গড় চাই। সারির (row) গড় চাইলে দিতাম ১। খেয়াল করে দেখুন চলকের নামসহ কত সুন্দর করে গড় দেখানো হয়েছে। আরও খেয়াল করলে দেখবেন, প্রথম দুই কলামের গড়ের জায়গায় NA লেখা। এর কারণ na.rm = TRUE দেওয়া হয়নি। দিয়ে দিন:

   

এখানে আমরা TRUE কে সংক্ষেপে T লিখেছি। এভাবে লিখলেও চলে, তবে আদর্শ কোডিং হলো না আর কি। 

 শুধু কি গড়? একইভাবে আমরা সব কলাম বা সারির অন্য কোনো তথ্যও বের করতে পারব। শুধু এতে ফাংশনটার নাম দিয়ে দিতে হবে। যেমন মধ্যমা বা পরিমিত ব্যবধান (standard deviation) বের করতে হলে:


এখন, মজার ব্যাপার হলো গড় বের করতে চাইলে এতটুকুও কষ্ট করার দরকার নেই আসলে। কল্পনাও করতে পারবেন না, এর চেয়েও সহজ একটি কোডও আছে। কলামের গড় বের করতে চাইলে:

  

একইভাবে সারির গড় বের করতে চাইলে ফাংশনটা হবে rowMeans()। 

আপাতত আর কোনো কৌশল দেখব না। তার চেয়ে একটা সমস্যার সমাধান করি। আমরা উপরে যে উদাহরণ দেখলাম, এখানে সবগুলো কলাম ছিল সংখ্যাসূচক। নিউমেরিক বা ইন্টিজার। যদি এক বা একাধিক character ভেক্টর থাকে? যেমন ধরুন আমরা যদি mpg ডেটা দিয়ে এই কাজ করতে যাই তাহলে কী হয় দেখুন:

 

error দেখাবে। তাহলে সমাধান হলো সংখ্যাবাচক কলামগুলোকে আলাদা করে নিতে হবে।

 

অথবা ব্যবহার করতে পারেন tidyverse প্যাকেজমালা থেকে dplyr এর ফাংশনটা।

 

এসব উপায়ে গড় বের করার আরেকটা সুবিধাও আছে। গ্রাফ আঁকতে চাইলেও ডেটা প্রস্তুত হয়েই আছে। যেমন ধরুন, আমরা যদি airquality ডেটার গড়গুলো বারপ্লটে দেখাতে চাই। 



ডেটাফ্রেইমের কলাম ইনফরমেশন থেকে সহজ বারপ্লট

☛ প্লট আঁকার কলাকৌশল দেখতে দেখুন এই লিঙ্কটি। 

ব্যস! হ্যাপি প্রোগ্রামিং !!!
Category: articles

Thursday, October 1, 2020

 

চেনাজানা সংখ্যাগুলোর সূচকের নিয়ম তো আমরা জানি। $3^2$ এর অর্থ হলো $3 \times 3$। মানে ৩ কে নিজের সাথে দুইবার গুণ করা। কিন্তু কাল্পনিক সংখ্যা  $i^i$ এর মানে কী? এর মানই বা কী হবে? কেন হবে? সেটার অর্থ কী? 

 

জটিল জিনিসকে সহজ করে চিন্তা করি।  $i^i$কে $1 \cdot i^i$ চিন্তা করি। মানে আমরা ১ থেকে $i^i$ সংখ্যাটিতে যাব। আর ভাবব সেটার মানে আসলে কী। 


আগেই বলেছি, ১ যেকোনো গুণের মৌলিক অংশ। ১-কে বলা হয় গুণজ অভেদ। যেভাবে যোগ-বিয়োগের মৌলিক অংশ শূন্য। যোগ-বিয়োগ করে কিছু না থাকলে থাকে শূন্য। গুণ (ও ভাগে) কাটাকাটি করে কিছু নেই মানে ১ আছে। যেমন, ৩কে ২ দিয়ে গুণ করা মানে আসলে ১কে ৬ দিয়ে গুণ করা। গুণ মানে আসলে ১কে ফুলিয়ে দেওয়া।

 

 সংখ্যাকে একটু ভিন্নভাবে চিন্তা করতে শুরু করি। ধরুন একটি গ্রামে ৩০০ জন শিক্ষিত মানুষ আছেন। এখন আপনি চাইলেই এই ৩০০ সংখ্যাকে ভিন্নভাবে চিন্তা করতে পারেন। শুরু করি ১ থেকে। শুরুতে গ্রামে একজন শিক্ষিত মানুষ ছিলেন। তিনি এবং ক্রমেই তার ছাত্ররা বাকিদের শিক্ষিত করেছেন। 

 

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


 সূচকীয় ফাংশনের ব্যবহারটা দেখে নেই। সূত্রটা এ রকম: $P=P_oe^{rt}$

 

এখানে 

 

P =বৃদ্ধির পরে যা হবে। আমাদের উদাহরণে এটা ৩০০। 


$P_o$= শুরুতে যা ছিল। এটা আমাদের উদাহরণে ১। কারণ আমরা ধরে নিয়েছি ১ জন শিক্ষিত মানুষ আছেন। 


e = অয়লার সংখ্যা (২.৭১৮...)। এখানে এটা নিয়েও আলোচনা আছে। 


r = বৃদ্ধির হার 


t = $P_o$ থেকে $P$ হতে যতটুকু সময় লাগবে। 

 

সূত্রে মানগুলো বসালে আমরা পাই, 

 

$300=1 \cdot e^{rt}$

 

বা $\ln(300)=rt$

 

বোঝার সুবিধার্থে সময়কে এক একক (যেমন এক মাস) ধরে নিলে এই কথার অর্থ হয়: $\ln(300)$ হারে ১ জন শিক্ষিত মানুষ গ্রামের সবাইকে অবিরাম পড়াতে থাকলে এক মাসেই ৩০০ জন মানুষ শিক্ষিত হয়ে যাবেন। $\ln(300)$ এর মান ৫.৭০২ দেখে ভাববেন না, কীভাবে এটা সম্ভব? মনে রাখতে হবে, তিনি একজনকে শিক্ষিত করা মাত্রই সেই শিক্ষিত মানুষ আরেকজনকে, তিনি আরেকজনকে, ... এভাবে শিক্ষাদান এগিয়ে যেতে থাকবে। 

 

তার মানে, সহজ কথা হলো, ৩০০ মানে আমরা বুঝব, $\ln(300)$ হারে অবিরাম কিছু একটা বৃদ্ধি পেতে থাকলে চূড়ান্ত মান হবে ৩০০। একইভাবে $\ln(5)$ হারে একইভাবে বৃদ্ধি পেলে মান হবে ৫। এটাই হলো সংখ্যাকে অন্য আরেকভাবে চিন্তা করা। সবসময় হয়ত আপনি ৩, ৫ কে এভাবে সূচকীয় বৃদ্ধির মাধ্যমে পাবেন না। তবে এটাও কিন্তু সংখ্যাকে অনুভব করার আরেকটি উপায়। 


দেখা যাক, এই অনুভব দিয়ে কাল্পনিক সংখ্যাকে বোঝা যায় কি না। প্রথমে ১ থেকে i তে যাওয়া যাক। এজন্যে আমাদেরকে ৯০ ডিগ্রি বাঁয়ে ঘুরতে হবে। মানে X অক্ষ থেকে ঘড়ির কাঁটার উল্টো দিকে ঘুরে Y অক্ষে যেতে হবে। কারণ i এর অবস্থান ১ একক সমান দৈর্ঘ্যের Y অক্ষে। 

 


তাহলে ১ থেকে iতে যেতে হলে আমাদেরকে $\frac {\pi} 2$ পরিমাণ বা ৯০ ডিগ্রি ঘুরতে হবে। তাহলে আমাদের বৃদ্ধির হার হবে $i \cdot \frac{\pi}{2}$। 

 

বৃদ্ধির ফর্মুলাটা হলো, $e^{rt}$। আমাদেরকে এই ফর্মুলা দিয়ে $i$ অবস্থানে যেতে হবে। তাহলে ১ থেকে ১ একক সময়ে i অবস্থানে যেতে হলে আমাদেরকে ঐ সময়ে ৯০ ডিগ্রি ($\frac{\pi}{2}$ রেডিয়ান) ঘুরতে হবে। অতএব, ১ থেকে $i$ পেতে আমরা এই সূত্র ব্যবহার করতে পারি 

  

$i=e^{i \frac{\pi}{2}}$

 

একে আরেকভাবেও চিন্তা করা যায়। ১ থেকে (-১) এ যেতে আমরা ১৮০ ডিগ্রি ঘুরি। আর সেটাকে অয়লারের অভেদ দিয়ে প্রকাশ করি $e^{i \pi}$ দিয়ে। তাহলে ১৮০ এর অর্ধেকটা মানে ৯০ ডিগ্রি বা $i$ অবস্থানে যেতে ফর্মুলাটা হবে $e^{i \frac{\pi}{2}}$। 


এ তো গেল i। কিন্তু i এর পাওয়ারও তো i। সেটার কী হবে? এটা বলছে আমাদেরকে $i \frac{\pi}{2}$ হারের বদলে  $i \frac{\pi}{2} \cdot i$ হারে বৃদ্ধি করতে হবে। ঠিক যেমন $3^4$ মানে আমাদেরকে $\ln(3)$ হারে বৃদ্ধি করে তার আবার চারগুণ যেতে হবে। মানে নতুন হার হয়েছিল $\ln(3) \times 4$।

 

তার মানে বৃদ্ধির হার হবে $i \frac{\pi}{2} \cdot i = \frac{\pi}{2} \cdot -1 = - \frac{\pi}{2}$ 

 

 কারণ, আমরা জানি, $i \cdot i $ বা $i^2$ এর মান (-1)। 


 আমাদের বৃদ্ধির হারটা বাস্তব সংখ্যা হয়ে গেল!  কিন্তু নেগেটিভ। এর মানে আসলে বৃদ্ধির বদলে হ্রাস ঘটবে। তার মানে, আমরা শুরু করেছিলাম ১ থেকে। আর এখন যাকে পাব সে হবে ১ এর চেয়ে ছোট। দেখা যাক, সেটা কী? 

0.2078796

আপনি কম্পিউটারের $i^i$ বা $e^{- \frac{\pi}{2}}$ যেটাই দিন, উপরের মানটাই আসবে। যেমন R প্রোগ্রামিং দিয়ে করলে
 
  
 
তাহলে দেখতে অদ্ভুত হলেও কাল্পনিক সংখ্যার ভিত্তি ও সূচক মিলেও পাওয়া গেল বাস্তব সংখ্যা! 
 

i এর মান যে $e^{i \cdot \frac{\pi}{2}}$ সেটা আমরা অয়লারের ফর্মুলা থেকেও বের করতে পারি। আমরা জানি, $e^{ix}=cos(x)+isin(x)$। এখন, এখানে x এর জায়গায় $\frac{\pi}{2}$ বসালে হয়
 
 
$e^{i \frac{\pi}{2}}=cos(\frac{\pi}{2})+isin(\frac{\pi}{2})=0+i \cdot 1=i$
 
সূত্র 
 
আরও পড়ুন 
Category: articles

Sunday, September 27, 2020

আমরা জানি, $e^{iπ}=-1$। কিন্তু কেন? যারা গণিতকে শুধু বইয়ের অক্ষরের মধ্যেই সীমিত মনে করেন, তাদের মতে এই সূত্রের কোন বাস্তব তাৎপর্য নেই। এটা নিছক সূত্রের মারপ্যাঁচে ঘটে গেছে।

ঠিক যেমনটা বলেছিলেন, আঠারশ শতকের গণিতবিদ বেঞ্জামিন পিয়ার্স
 
সূত্রটা স্বাভাবিক বুদ্ধির সম্পূর্ণ বিপরীত। একে আমরা না বুঝতে পারি, আর না জানি এটা কী বোঝায়। তবে যেহেতু এর প্রমাণ আছে, তা বাধ্য হয়ে একে মানতে হচ্ছে। 
 
কিন্তু গণিতের সব সূত্রেরই বাস্তব ও মজার তাৎপর্য থাকে। আছে অদ্ভুতদর্শন এই সূত্রেরও। সূত্রটি গণিতের অনেকগুলো শাখাকে একত্রিত করেছে। e এর আবির্ভাব ক্যালকুলাস থেকে, π আসে জ্যামিতি থেকে, i এর পদচারণা জটিল সংখ্যার জগতে। আর ০ ও ১ এর ব্যবহার পাটিগণিতে। 
 

লিওনার্দ অয়লার ছিলেন সুইস গণিত ও পদার্থবিদ। অবদান রেখেন জ্যোতির্বিদ্যা, ভূগোল, যুক্তিবিদ্যা ও প্রকৌশলেও। গ্রাফ থিওরি ও টপোলজির সূচনা তাঁর হাত ধরেই।

 
১-কে বলা হয় গুণজ অভেদ। যেকোনো গুণের মৌলিক অংশ ১। যেভাবে যোগ-বিয়োগের মৌলিক অংশ শূন্য। যোগ-বিয়োগ করে কিছু না থাকলে থাকে শূন্য। গুণ (ও ভাগে) কাটাকাটি করে কিছু নেই মানে ১ আছে। যেমন, ৩কে ২ দিয়ে গুণ করা মানে আসলে ১কে ৬ দিয়ে গুণ করা। গুণ মানে আসলে ১কে ফুলিয়ে দেওয়া।
 
অন্য গুণের মতোই ধরুন আমরা ১ থেকে শুরু করছি। তারপর একে $e^{iπ}$ দিয়ে গুণ দিচ্ছি। 
 
e দ্বারা বোঝায় সূচকীয় বৃদ্ধি। এক কথায় এর অর্থ হলো ১কে কোনো একটি হারে নির্দিষ্ট সময় ধরে বাড়াতে থাকা। সূচকীয় বৃদ্ধি আসলে জ্যামিতিক বৃদ্ধিরই অন্য একটি রূপ, যেখানে নির্দিষ্ট সময় পরপর বৃদ্ধির বদলে বৃদ্ধি ঘটে প্রতি মুহূর্তে। 
 
এখানে e এর পাওয়ার হিসেবে আছে i, যা কাল্পনিক সংখ্যার প্রতীক। নামে কাল্পনিক হলেও সংখ্যাটা বাস্তব সংখ্যার চেয়ে কোনো অংশে কম বাস্তব নয়। এখানে e এর উপর i দিয়ে বোঝাচ্ছে আমাদের সূচকীয় বৃদ্ধিটা রৈখিক হবে না। হবে বৃত্তাকার। একটি বৃত্তকে বেয়ে ঘড়ির কাঁটার উল্টো দিকে ঘুরে আসার মতো। উল্টো দিকে কেন? কারণ ত্রিকোণমিতিকে বৃত্তাকার চলনকে এভাবেই সংজ্ঞায়িত করা হয়েছে। 
 
এখন কতটুকু চলব? সেটা বলে দিচ্ছে পাই (π)। মানে আমরা পাই রেডিয়ান বা ১৮০ ডিগ্রি ঘুরব।
এখন এটা জানা কথা সংখ্যারেখায় ১ আর (-১) থাকে ১৮০ ডিগ্রি উল্টো দিকে। কত দারুণ ফর্মুলাটা! 
 

এ কারণেই আমরা ১ থেকে শুরু করে (-১) এ গিয়ে থেমেছি। 
 
আরও পড়ুন 
Category: articles

Tuesday, September 8, 2020

অনলাইন ক্লাসের জন্য প্রতিদিন প্রেজেন্টেশন স্লাইড বানাতে হয়। MS পাওয়ারপয়েন্ট স্লাইডকে বিদায় জানিয়েছি এক বছর আগে। এখন স্লাইড বানাই কোড লিখে লিখে। ব্যবহার করি এক গাদা ল্যাংগুয়েজ। অন্তত সাতখানা। R, Markdown, Javascript, HTML, CSS, Tex (Latex) ও bash। প্রতিটা ল্যাংগুয়েজই অসাধারণ। মিলেমিশে টিমওয়ার্ক করে আমার মনের মতো স্লাইড বানিয়ে দেয়।

 


তা কোনটা কেন ইউজ করি?
R: বহুমুখী কাজের জন্য। প্রথমত Rstudio এর মাধ্যমে স্লাইড ফাইলগুলো এর মধ্যেই তৈরি করি। তবে R এর মূল অবদান আরও বড়। আমার স্লাইডে মাঝেমধ্যেই গ্রাফ বা টেবিল ও সেগুলোর হিসাব-নিকাশ থাকে। এই কাজগুলো R অটো করে দেয়। প্লট বা গ্রাফ এঁকে সেটাকে পিসিতে সেভ করে তারপর ইনসার্ট করার কোনো ঝামেলা নেই। ডেটা আর কোড লিখে দেব। গ্রাফ বা রেজাল্ট অটো চলে আসবে। ইডিট করা অনেক flexible। কোনো ভুল হলে নতুন করে গ্রাফ বানিয়ে আবারও ইনসার্ট করা- সেই দিন এখন অতীত।
 
Markdown মূলত R এ তৈরি ফাইলকে সুন্দর করে পাবলিশ করে দেয়।
এটাকে MS Word এর বিকল্প ভাবতে পারেন। Rstudio তে .Rmd ফাইলগুলোই R এর মধ্যে Markdown implement করিয়ে দেয়।
সাথে revealjs প্লাগইন ফাইলটাকে সুন্দর স্লাইড আকারে পাবলিশ করতে হেল্প করে। revealjs আবার Javascript দিয়ে করা। js হলো Javascript এর abbreviation।
 
CSS: স্লাইডের ওভারঅল থিম নির্ভর করে সরল এই ল্যাঙ্গুয়েজটার ওপর। styles.css নামে ফাইলটা প্রোজেক্ট ফোল্ডারে রেখে দিলেই কেল্লা ফতে!
 
আর HTML ছাড়া তো css ও js ইমপ্লিমেন্ট করা যাবে না। তাই তাকেও রাখতে হলো। বিশেষ করে দুই বা বহু কলামের কন্টেন্ট জাভাস্ক্রিপ্ট দিয়ে বানাতে গেলে HTMLও লাগে। আবার ক্লিক করলে দেখা যাবে এমন js script এর জন্য দরকার html।
 
Javascript এর ব্যবহার অলরেডি বলাই হয়ে গেছে। revealjs প্লাগইন দিয়ে Rmd ফাইলকে স্লাইড আকারে পাবলিশ করতে শুরুতেই js লাগছে। R এর মধ্যে এটা আছে revealjs package হিসেবে। আরও বেশ কিছু কাজে দারুণ পাওয়ারপুল js ভাষাটা ইউজ করা হয়, যার কিছু উদাহরণ অলরেডি বলেছি।
 
Tex (উচ্চারণ টেক) এর প্রশংসা তো করে শেষ করাই যাবে না। গণিতের যত কঠিন সমীকরণই দেবেন Tex সেটা পাব্লিশ করে দেবেই। Tex এর জনপ্রিয় implementation লেটেক (Latex) ইউজ করি এ কাজের জন্য।
 
bash মূলত একটি লিনাক্স শেল বা কমান্ড লাইন। এটা ইউজ করি মূলত Git ও Github এর জন্য। কাজ করা ফাইলগুলো নিয়মিত ট্র্যাক করি এর মাধ্যমে। একে বলা হয় ভার্সন কন্ট্রোল। এর প্রয়োজন ২/১ কথায় বলা সম্ভব নয়।
 
এতগুলো ল্যাংগুয়েজ ভালোই টিমওয়ার্ক করে যাচ্ছে। কোড করে কাজ করায় মজাই আলাদা ❤
কোড দেখতে চাইলে এখানটায় ঘুরে আসুন
Category: articles

Friday, August 21, 2020

 টেক্সট অ্যানালাইসিস আমার খুব প্রিয় জিনিস। প্রিয় ওএস লিনাক্সে আসার পর কাজটা আরও অনেক সহজ হয়ে গেছে। কীভাবে হলো একটু দেখাই যাক। 

 

 

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




এই কোড hello শব্দের h-কে t দিয়ে বদলে দেবে। শুরুতেই s দিয়ে বলা হচ্ছে, বদলে দাও। ইংরেজিতে substitution আরকি।

এখানে আমরা যে টেক্সট নিয়ে কাজ করব সেটাকে আগে echo দিয়ে প্রিন্ট করে নিয়েছি। কিন্তু বাস্তবে আমাদেরকে ফাইন্ড ও রিপ্লেসের এই কাজখানি করতে হবে ফাইল দিয়ে। সে কাজটাও পানির মতোই সোজা। ধরুন আমাদের কাছে file নামে একটি ফাইল আছে। চাইলে আপনি এক্সটেনশনসহ ফাইল নিতে পারেন। যেমন file.txt। তাতে কোনোই অসুবিধা হবে না। ধরা যাক file ফাইলটিতে এই তথ্যগুলো আছে।



এবার ধরুন, আমরা এখান থেকে প্রথম line শব্দটাকে statement শব্দ দিয়ে বদলে দিতে চাই।



তবে ফাইলের সবগুলো কাঙ্ক্ষিত শব্দকে চেঞ্জ করা নিশ্চিত করতে চাইলে "g" অংশ যোগ করতে হবে। মানে এ রকম:



এটা কেন দরকার দেখতে হলে নীচের দুই লাইন কোড রান করে দেখুন। দেখবেন দুটো থেকে দুরকম আউটপুট মিলবে।  


  

 

তবে এখানে যে আউটপুট প্রিন্ট হচ্ছে সেটা কিন্তু এখানেই শেষ। সেভ কিন্তু হচ্ছে না। শেভ করতে হলে ">" বা ">>" দিয়ে সেভ করে নিতে হবে। মনে রাখতে হবে > দিলে কিন্তু ফাইলে আগের কিছু থাকবে না। 
 

 

 

এ তো গেল শুধু একটা একটা অংশ রিপ্লেস করতে চাইলে। আপনি চাইলে অনেকগুলো অংশকে অনেকগুলো আলাদা আলাদা শব্দ দিয়েও রিপ্লেস করতে পারেন। এক্ষেত্রে প্রতিটি অংশের আগে "-e" দিতে হবে। 

 

Category: articles

Wednesday, August 12, 2020

দিন দিন R-এ ম্যাপ আঁকা সহজ থেকে সহজতর হচ্ছে। একটু চেষ্টা করেই কোভিড-১৯ মহামারীর চিত্র ওয়ার্ল্ড ও বাংলাদেশের ম্যাপে দেখিয়ে ফেলতে পেরেছি। কীভাবে এত কঠিন কাজ সহজ হলো সেটা বলতেই আজকের লেখা।

বাংলাদেশের কোভিড-১৯ মহামারীর প্রকোপ 
আগে অবশ্যই দরকারি প্যাকেজগুলো লোড করে নিতে হবে।



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

ডাউনলোড করে নিয়ে আনজিপ করে নিন। এবার কী করবেন সেটা এই লেখায় আগেই বলা হয়েছে

লেখাটির plot(zilla, col="green") কোড পর্যন্ত অন্তত অনুশীলন করে আসুন।

এসেছেন তো? এবার সামনে যাওয়া যাক।

আমরা এবারে ম্যাপ আঁকব ggplot2 দিয়ে। ggplot2 সব অবজেক্টকে ডেটাফ্রেইম হিসেবে দেখতে চায়। তাই শেইপফাইলকে ডেটাফ্রেইম বানিয়ে নিতে হবে। কিন্তু সেটা এমনভাবে করতে হবে যেন ম্যাপের সবকিছু আবার উলটপালট হয়ে না যায়। সেজন্য ব্যবহার করতে হবে fortify ফাংশন।



এবার আরেকটি বড় কাজ বাকি। করোনার তথ্য এই ডেটাফ্রেইমে নিয়ে আসতে হবে। সেটা আমরা করব। তার আগে আপনি একটু দেখে নিন zilla_gg ডেটাফ্রেইমে কী আছে। এই কোড রান করতে হলে Rstudio লাগবেই আপনার।



কলামগুলো দেখে নিন একবার। ও আচ্ছা, তার আগে শুধু zilla অবজেক্টটাও দেখে নিন। খেয়াল করলে দেখবেন NAME_2 কলামে দেশের জেলাগুলোর নাম আছে। তবে fortify করার পর এতকিছু নেই। ম্যাপের তথ্য এখানে long, lat নামে দ্রাঘিমা ও অক্ষাংশ হিসেবে সংরক্ষিত আছে। zilla_ggতে id নামে একটি কলাম আছে। একটু মিলিয়ে দেখলে বুঝবেন এটা আসলে ৬৪ জেলার জন্য ইউনিক আইডি। শুরু ০ থেকে আর শেষ ৬৩-তে। এখন এই আইডির বিপরীতে আমাদের করোনার তথ্য বসিয়ে নিলেই আমাদের ডেটা প্রস্তুত।

কাজটি একটু বিরক্তিকর। সেটাকে সহজ করার জন্যে আমি সবসময় একটি csv ফাইল রেডি রাখি। আপনি চাইলে এখান থেকে ফাইলটি ডাউনলোড করে নিতে পারেন। corona নামে এখানে একটি কলাম আছে। এই কলামটি আপডেট তথ্য দিয়ে পূর্ণ করা আপনার দায়িত্ব। এখন কাজ হলো এই তথ্যকে zilla_gg ডেটাফ্রেইমে নিয়ে আসা।

সেটা করার জন্যে আমরা ব্যবহার করব dplyr প্যাকেজের left_join ফাংশন। এই ফাংশনগুলো কীভাবে কাজ করে দেখতে হলে এখানটায় ঢুঁ মেরে আসুন। ও, তার আগে csv ফাইলটা পড়ে নিই। আরেকটি কাজ করা লাগবে। zilla_gg এর id কলামটা character হয়ে আছে। কিন্তু আমাদের csv ফাইলে id কলাম হলো numeric। তাই zilla_gg কে numeric করে নিতে হবে।
তারপর জয়েন করে ফেলি।



এবার শুধুই আঁকা।



আপাতত আমরা এটা পেলাম।

কিন্তু নিজের ইচ্ছেমতো রং দেওয়া না গেলে কি আর মনে শান্তি পাওয়া যায়? এজন্যে RColorBrewer প্যাকেজ দারুণ উপকার করে। তবে এখানে আমরা সেটা ছাড়াই রং করে ফেলব। আগের কোডের পরে "+" চিহ্ন দিয়ে এটা যুক্ত করে দিন।



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

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

মূল কাজ তো শেষ। এখন আরও কিছু ফাইন-টিউনিং করে নিলে মন্দ কী!

Category: articles

Sunday, May 17, 2020

লিনাক্সের গুণের কথা তো বলে শেষ করা যায় না। আজ দেখব কীভাবে খুব সহজ হিসাব-নিকাশ করবেন। ভণিতা না করে দেখে ফেলি।



আগে চলুন ১০ আর ১১ যোগ করি।




একইভাবে বিয়োগ



এখানে expr আসলে expression বা গাণিতিক পদ বোঝায়।

তবে গুণ সোজাসুজি কাজ করবে না। এই কোডটা দিয়েই দেখুন না।



দিতে হবে এভাবে



তবে ভাগ কাজ করবে ফরোয়ার্ড স্ল্যাশ দিয়েই।



তবে পরের এক্সপ্রেশনটার আউটপুট দেখলে খেয়াল করবেন, ফল এসেছে পূর্ণ সংখ্যায়। আসলে সহজ এই টুলটি ভগ্নাংশ নিয়ে কাজ করতে পারে না।

সেজন্যে আপনার লাগবে bc টুল। কমান্ড লাইনে হিসাব-নিকাশের জন্যে এটা অন্যতম সেরা একটি টুল। দারুণ ব্যাপার হলো এখানে আপনি ভগ্নাংশ নিয়েও কাজ করতে পারেন। এখানে echo দিয়ে expression লিখে পাইপ অপারেটর দিয়ে তাকে bc টুলের মধ্যে দিয়ে দিতে হবে পাইপ অপারেটর ("|") দিয়ে।



আরও পড়ুন
লিনাক্স কমান্ড লাইন: হাতে খড়ি

চাইলে কত ঘর পর্যন্ত দশমিক চান সেটা বলে দিতে পারবেন। এজন্য scale বলে দিতে হবে।



বুঝতেই পারছেন, scale এর পজিশন যেকোনো জায়গায় হতে পারে।

bc নিয়ে বিস্তারিত গল্প অন্য সময় করব ইনশাআল্লাহ।

একটি সংখ্যার উৎপাদক বের করাও কমান্ড লাইনে এক শব্দের খেল।



মনে করুন, এক সারি নাম্বার চাই আপনার। তাও জেনারেট করতে পারবেন সহজে। ধরুন আমরা ৫ টি সংখ্যা জেনারেট করব যারা শুরু হবে ১০১ দিয়ে।



আরেকটু কাজের কাজ করি। ধরুন আমাদের May1, May2, May3 ইত্যাদি এক সারি আউটপুট লাগবে। বারবার এটা না লিখে এটা আমরা jot দিয়ে বানিয়ে নিতে পারি। হ্যাঁ, এখানে আমাদের bash loop কমান্ড লাগবে।

আরও পড়ুন
লিনাক্স কমান্ড লাইন: সহজ লুপ



চাইলে এই আউটপুট একটি ফাইলেও সেভও করে নিতে পারেন।



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



একই কোড দুইবার দিলাম দেখানো জন্যে যে দুইবার আসবে আলাদা আলাদা আউটপুট। র‍্যান্ডম নাম্বার বলে কথা!

এখন যা করব সেটা নিছক মজা পাওয়ার জন্যে। আপনি চাইলে পালাতে পারেন এখান থেকে। অবশ্য শিখি তো মজা পাবার জন্যেই।

আমরা দেখব ১ থেকে ৫ পর্যন্ত সংখ্যাগুলো থেকে দৈবভাবে ১,০০০ টা সংখ্যা নিলে কয়টা সংখ্যা কয়বার আসে।



সূত্র
১। নেটওয়ার্ক ওয়ার্ল্ড
Category: articles

Tuesday, May 5, 2020

ডেটা সায়েন্সে লিনাক্স কমান্ড লাইন কীভাবে কাজে লাগতে পারে সেটা আগেও বলেছি। আর লিনাক্স টার্মিনাল থেকে কম্পিউটার অপারেট করা অনেক সহজ।

আজকের কমান্ড: লুপ
উদ্দেশ্য: একই রকম কাজের জন্য বারবার ক্লিক না করে এক লাইনে করা। তবে কাজটি আমরা করব প্রচলিত do এর বদলে খুবই সহজ কোড দিয়ে। দেখে হাস্যকর মনে হবে। লুপ এত সহজ!
উদাহরণ



এই কোডখানি file_1.txt থেকে শুরু করে file_5.txt পর্যন্ত ৫টি ফাইল তৈরি করবে। আপনি চাইলে ls কমান্ড ব্যবহার করে কারেন্ট ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলো দেখে নিতে পারেন।

এই ফাইলগুলো ডিলিট করা আরও সহজ।



বুঝতেই পারছেন, এটা দেখাতে গিয়ে আমরা লুপের আরও একটি উদাহরণও দেখে ফেললাম।

বাস্তব উদাহরণ

এই সাইটে উমার সিরিজের ভিডিওগুলো আপলোড করা আছে। ভিডিও ফাইলগুলোর নাম দারুণভাবে দেওয়া হয়েছে। ep1, ep2, ... ep29 ইত্যাদি। যেমন প্রথম ভিডিওটির লিঙ্ক http://www.ummahrc.com/omar-series-bangla/ep1.mp4

আপনি পণ্ডশ্রম করতে ভালবাসলে একটি একটি করে ভিডিওগুলো ডাউনলোড করতে পারেন। তবে আমি তা করতে রাজি নই। তাই আমি ডাউনলোড করব এভাবে-



তবে এখানে আমরা do loop দেখিনি। শিরোনামেই যে বলেছি, "সহজ লুপ!" অবশ্য do এর অনেক কাজই আজকের দেখা কমান্ড দিয়েই করা সম্ভব। 
Category: articles

Friday, April 24, 2020

ডিএনএ ও আরএনএ দুটোতেই জিনগত তথ্য সংরক্ষিত থাকে। তবে দুটোর মধ্যে পার্থক্য আছে। চলুন দেখেই নিই।

ডিএনএ বনাম আরএনএ। সূত্র
১। ডিএনএ তে থাকে ডিওক্সিরাইবোজ শুগার। আর আরএনএ-এর শুগারের নাম রাইবোজ। ডিওক্সিরাইবোজ ও রাইবোজের একমাত্র পার্থক্য হলো রাইবোজে একটি বাড়তি -OH গ্রুপ থাকে। যেখানে বলয়ের দ্বিতীয় কার্বনের সাথে -H সংযুক্ত থাকে।

২। ডিএনএ একটি দুই সুতার অণু। অন্য দিকে আরএনএ এর সুতা একটিই।

৩। ডিএনএ ক্ষারীয় পরিবেশে স্থিতিশীল, কিন্তু আরএনএ অস্থিতিশীল।

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

৫। ডিএনএ ও আরএনএ এর ক্ষার জোড়গুলোও একটু আলাদা। ডিএনএ এর ক্ষারগুলো হলো অ্যাডেনিন, থাইমিন, গুয়ানিন ও সাইটোসিন। অন্য দিকে আরএনএ ব্যবহার করে অ্যাডেনিন, ইউরাসিল, সাইটোসিন ও ইউরাসিল। থাইমিনের সাথে ইউরাসিলের পার্থক্য হলো এর বলয়ে একটি মিথাইল গ্রুপ কম থাকে।

সূত্র
* থটকো ডট কম 
Category: articles