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

Thursday, June 27, 2019

১ ১ ২ ৩ ৫ ৮ ১৩ ...

দেখতে মনে হবে সাদামাটা কতগুলো সংখ্যা। অথচ কত অসাধারণ!

বুঝতেই পারছেন, পরপর দুটো সংখ্যা যোগ করে পাওয়া যায় পরের সংখ্যা। তো? এর মধ্যে আর এমন কী ই বা আছে?


আসলে গণিত যে সুন্দর হতে পারে তার অন্যতম ভাল উদাহরণ হলো এই সংখ্যাগুলো। নাম ফিবোনাচি সংখ্যা (Fibonacci number)।

কী সূর্যমুখী ফুল, কী শামুকের খোলস, কোথায় নেই এই ধারার কারিশমা। কিন্তু কীভাবে এই ধারা লুকিয়ে আছে প্রকৃতিতে? সংক্ষেপে এটা দেখেই আমরা দেখব কীভাবে আমরা সংখ্যাগুলো জেনেরেট করব।

আগেই দেখেছি, ফিবোনাচি সংখ্যাগুলো হলো যথাক্রমে  ১ ১ ২ ৩ ৫ ৮ ১৩ ২১ ---। অনেক সময় অবশ্য শুরুতে ০ কে রাখা হয়। মানে এভাবে- ০ ১ ১ ২ ৩ ---।

এবার একটা কাগজে ১ একক বাহু নিয়ে একটি বর্গ আঁকুন। পরের ফিবোনাচি সংখ্যাও ১। আগের বর্গের পাশে আরেকটি এক একক বাহুর বর্গ আঁকুন। এবার এ দুটি বর্গের ওপরে (নীচে আঁকলেও দুনিয়া ধ্বংস হবে না!) ২ এককের একটি বর্গ আঁকুন। এই তিনটি বর্গের পাশে আঁকুন ৩ এককের আরেকটি বর্গ। এভাবে এগিয়ে চলুন।

এভাবে যেতে থাকলে আমরা পাব নীচের আয়তক্ষেত্রটি।

ফিবোনাচি সংখ্যা নিয়ে আঁকা বর্গ থেকে পাওয়া আয়ত। 

এবার ক্রমান্বয়ে ছোট থেকে বড় বর্গের দিকে বর্গের কর্ণ বরাবর সর্পিল বাহু এঁকে যেতে থাকলেই আমরা পাব দারুণ একটি সর্পিল রেখা। আর হ্যাঁ, শামুকের খোলসে এমন সর্পিল নকশাই তো দেখি আমরা।

ফিবোনাচির মধ্যে লুকিয়ে থাকা নকশা 
ছবি: মাইক্রোসফট

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

একটি মজার সম্পর্কের কথা না বললেই নয়। ফিবোনাচি সংখ্যার সাথে সম্পর্ক আছে আরেক মজার ধ্রুবক সোনালী অনুপাতের (Golden ratio)। অনুপাতটির মান হলো ১.৬১৮...। মজার ব্যাপার হলো ফিবোনাচি সংখ্যা থেকে এটি পাওয়া যায়।

ফিবোনাচি সংখ্যাগুলোতে আবার একটু চোখ বুলিয়ে নেই।

১ ১ ২ ৩ ৫ ৮ ১৩ ২১ ৩৪ ৫৫ ৮৯ ১৪৪ ২৩৩ ৩৭৭ ---। ফিবোনাচি ধারার প্রতিটি সংখ্যাকে পরের সংখ্যা দিয়ে ভাগ দিতে থাকলে আমরা সোনালী অনুপাতের কাছাকাছি সংখ্যা পেতে থাকব।

\begin{array}{|c|c|}
\hline
Fibonacci \space number (x)& \frac{x[i+1]}{x[i]} \\ \hline
1 & 1.000 \\ \hline
1 & 2.000 \\ \hline
2 & 1.500 \\ \hline
5 & 1.667 \\ \hline
8 & 1.600 \\ \hline
13 & 1.625 \\ \hline
21 & 1.615 \\ \hline
34 & 1.619 \\ \hline
55 & 1.617 \\ \hline
89 & 1.618 \\ \hline
\end{array}

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

এবার আমরা দেখবো, নান্দনিক এই সংখ্যাগুলো কীভাবে R প্রোগ্রামিং দিয়ে তৈরি করা যায়। কোডখানা নীচে দেওয়া হলো। ব্যবহারের সুবিদার্থে আমরা fibo নামে একটি ফাংশন বানিয়ে নিচ্ছি। আর ভেতরে থাকছে একটি for loop। প্রথমে একটি ফাঁকা ভেক্টর বানিয়ে নেওয়া হলো। এরপর ধারার প্রথম দুটি সংখ্যা ১ হওয়ায় আমরা আগেই সেটা বসিয়ে দিলাম। বাকি সংখ্যাগুলো ক্রমান্বয়ে যোগ করে তৈরি করা হলো।



এবার চাইলে আপনি fibo ফাংশন দিয়ে ইচ্ছেমতো সাইজের ফিবোনাচি ধারা তৈরি করে নিতে পারেন।যেমন প্রথম ২০টি সংখ্যা পেতে চাইলে-



ওপরের সোনালী অনুপাতগুলো R দিয়েই বের করেছি। চাইলে কোডটা দেখে রাখতে পারেন।



বিদায় নেবার আগে ফিবোনাচি ধারার আরও কিছু বাস্তব নমুনা দেখে নেওয়া যাক।

Cycas circinalis উদ্ভিদে। উদ্ভিদটি পাওয়া যায় দক্ষিণ ভারতে। 

ছবি: phillipsnaturalworld
ছবি: phillipsnaturalworld

আরও পড়ুন

R প্রোগ্রামিং: বাহারি ফুলের ডিজাইন
☛ গণিতের সবচেয়ে সুন্দর সমীকরণ 

সূত্র
১। R-bloggers
২। উইকপিডিয়া: Fibonacci number
৩। ইউটিউব: টেড টকের একটি সিগমেন্ট 
Category: articles
কমান্ড লাইন ব্যবহার করলে আপনার ডিভাইসের নিয়ন্ত্রণ থাকবে আপনার হাতে। ছোটভাই তুহিনের মতে তো কমান্ড লাইন দিয়ে কম্পিউটার কেন, মহাকাশ পর্যন্ত কাঁপিয়ে দেওয়া যাবে।

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

আরও পড়ুন
☛ কেন লিনাক্স ব্যবহার করবেন?

১। pwd

এই কমান্ড আপনাকে বলবে, এই মূহূর্তে আপনি কোন ডিরেক্টরিতে আছেন। R-এ আমরা এটা জানি getwd() কমান্ড দিয়ে। pwd হলো present working directory এর সংক্ষিপ্ত রূপ।

২। ls

এই কমান্ড আপনাকে জানিয়ে দেবে, আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে কী কী কন্টেন্ট আছে। হোক সেটা ফাইল, বা অন্য ফোল্ডার বা ডিরেক্টরি।

৩। man

মনে করুন, আপনার একটা কমান্ডের নাম মনে আছে। কিন্তু ভুলে গেছেন কীভাবে ব্যবহার করবেন । লিনাক্স কমান্ড লাইনে প্রায় প্রতিটি টুলের সাথেই নানান অপশন আছে। অপশনগুলো বসাতে হয় সাধারণত কমান্ডের পর একটি হাইফেন (-) দিয়ে। যেমন ওপরের ls কমান্ডের সাথে -c, -h, -m বা -t ইত্যাদি নানান অপশন ব্যবহার করা যায়। নীচের কমান্ড আপনাকে ফাইল ও ডিরেক্টরির লিস্ট দেবে। তবে সর্বশেষ যে ফাইল বা ফোল্ডার নিয়ে কাজ করেছেন সেটার নাম আগে থাকবে।



এখন, এই অপশনগুলো আপনি কীভাবে জানবেন? ভয় নেই। এর জন্য গুগোল করতে হবে না। জাস্ট টাইপ করুন man ls। অথবা যে টুল সম্পর্কে জানতে চান man লিখে সেই কমান্ড লিখে এন্টার চাপুন। চাইলে জেনে রাখুন, man আসলে ম্যানুয়াল (manual) এর সংক্ষিপ্ত রূপ।

৪। cd

মনে করুন, আপনি এখন যে ডিরেক্টরিতে আছেন, সেটা থেকে অন্য কোথাও যেতে চান। তাহলেই আপনার লাগবে cd কমান্ড। শুধু cd লিখে এন্টার চাপলে আপনি চলে যাবেন হোম ডিরেক্টরিতে। আবার cd .. আপনাকে নিয়ে যাবে আগের ডিরেক্টরিতে। cd মানে change directory।

আবার ধরুন এখন যে ফোল্ডারে আছেন তাতে work নামে আরেকটি ফোল্ডার আছে। এতে যেতে চাইলে কমান্ড হবে-



আবার work ডিরেক্টরিতে যদি আবার recent নামে আরেকটি ফোল্ডার থাকে, আর আপনি সেখানেই যেতে চান, তবে-



৫। touch

কমান্ডটাকে চাইলে জটিল করেও বলা যায়। তবে একেবারে সহজ করে বললে এটার কাজ হলো ফাঁকা ফাইল তৈরি করা। ফাইল তৈরির সময় আপনার হাতে কোনো ডেটা না থাকলে এই কমান্ড দিয়ে ফাইল বানিয়ে রেখে দিতে পারেন। নীচের কমান্ড mytext.txt নামে একটি ফাইল তৈরি করবে।



ফাইলটা অবশ্যই আপনার ওয়ার্কিং ডিরেক্টরিতে তৈরি হবে। ধরুন linux ফোল্ডারের ভেতরে ne.txt নামে ফাইল তৈরি করবেন। তাহলে এই কমান্ড-



এখন চাইলে আপনি  ls কমান্ড দিয়ে চেক করে নিতে পারেন এই নামে ফাইল আছে কি না।

৬। nano

শুধু ফাইল তৈরি করে বসে থাকলে তো হবে না। ফাইলে কিছু তথ্যও তো রাখা চাই। nano কমান্ড আপনাকে ফাইল ইডিট করার সুযোগ দেবে। ঠিক touch কমান্ডের মতোই nano লিখে ফাইলের নাম path লিখুন।

ধরুন, আমাদের ওয়ার্কিং ডিরেক্টরিতে employee.txt নামে একটি ফাইল আছে। তাহলে একে ইডিট করতে-



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

100  Sultan  Manager    Sales       5,000
200  Niaz  Developer  Technology  5,500
300  Abir Sysadmin   Technology  7,000
400  Riyad   Manager    Marketing   9,500
500  Kabir  DBA        Technology  6,000

কিছু লিখে বা পেস্ট করে সেভ করতে চাপুন: ctrl + o। এবার এন্টার চেপে কনফার্ম করুন। ইডিট মুড থেকে বের হয়ে আসতে চাপুন ctrl + x।

৭। cat

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




আরও বিস্তারিত জানতে লিখুন man cat।

৮। echo

এটার সাধারণ ব্যবহার হলো টার্মিনাল কিছু প্রিন্ট করতে। যেমন Hello world প্রিন্ট করতে-



তবে এটা দিয়ে আরও দারুণ দারুণ কাজও করা যায়। যেমন nano ব্যবহার না করেই কোনো ফাইলে টেক্সট যুক্ত করতে চাইলে echo ব্যবহার করতে পারেন।



এই কমান্ড echo এর ভেতরের লাইনটি employee.txt ফাইলের শেষে যুক্ত করবে। এখানে শুধু '>' চিহ্ন ব্যবহার করলে আগের কন্টেন্ট মুছে যাবে। এটা ব্যবহার করতে হবে সাবধানে। আসলে এটা কাজে লাগে আগে থেকে ঐ নামে কোনো ফাইল না থাকলে। আগে থেকে ফাইল থাকলে তার শেষে নতুন তথ্য যুক্ত করতে সবসময় '>>' ব্যবহার করুন।

এই কমান্ডকে অন্য কমান্ডের ইনপুট হিসেবেও ব্যবহার করা যায়। যেমন, bc কমান্ড দিয়ে আমরা হিসাব-নিকাশ করি। দুটো সংখ্যা যোগ করা যায় এভাবে-



এখানে '|' কে বলা হয় পাইপ অপারেটর। এই কমান্ড দিয়ে এক কমান্ডের রেজাল্টকে আরেক কমান্ডের ইনপুট হিসেবে ব্যবহার করা যায়।

৯। mkdir

এটা আসলে make directory এর সংক্ষিপ্ত রূপ। বুঝতেই পারছেন, নতুন ডিরেক্টরি বানাতে এটা ব্যবহার করবেন। নীচের কোড ওয়ার্কিং ডিরেক্টরিতে linux নামে ফোল্ডার বানাবে।



বানানো হয়ে গেলে অবশ্যই ls কমান্ড দিয়ে চেক করে নিতে পারেন।

১০। rm

ফাইল বানালে ডিলিট করাও দরকার হবেই। এইজন্যেই remove এর সংক্ষিপ্ত রূপ rm। তবে directory ডিলিট করতে হলে কমান্ড হবে rmdir। নীচে আমরা এই প্রসেসটা বিস্তারিত দেখাচ্ছি-



বোঝার জন্যে এক লাইন করে করে রান করুন।


১১। passwd

পাসওয়ার্ড চেঞ্জ করতে ও নতুন পাসওয়ার্ড সেট-আপ করতে।

১২। mv

এটা ব্যবহার করবেন ফাইল স্থানান্তর করতে। আবার মজার ব্যাপার হলো, ফাইল রিনেইম করতেও এই কমান্ড ব্যবহার করা যায়। মনে করি, আমাদের ওয়ার্কিং ডিরেক্টরিতে sum.txt নামে একটি ফাইল আছে। একে হোম ডিরেক্টরিতে নেব এভাবে-



ফাইল রিনেইম করা তো আরও সহজ।



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

 ☛ লিনাক্স ও ডেটা সায়েন্স: একটি সরল টেক্সট মাইনিং
 ☛ লিনাক্স ও ডেটা সায়েন্স: tr কমান্ডের কারিশমা
 ☛ লিনাক্স টেক্সট প্রসেসিং: নির্দিষ্ট প্যাটার্নের পর সব ডিলিট করুন সহজে
Category: articles

Saturday, June 15, 2019

কে সেরা? পাইথন একটি জেনারেল-পারপাজ ল্যাংগুয়েজ হওয়ায় সার্বিকভাবে অবশ্যই পাইথনই সেরা। কইম্পিউটার প্রোগ্রামিং এর জগতের সবকিছুই পাইথন দিয়ে করা যায়। তাই C, C++, Java প্রোগ্রামিংগুলো ক্রমাগত পাইথনের পেছনে পড়ে যাচ্ছে।

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



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

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

শেখা
অনেকেই বলেন পাইথন R এর চেয়ে সহজে শেখা যায়। অথচ পাইথনে ডেটা সায়েন্সের কাজ শুরু করতে গেলেই অনেকগুলো প্যাকেজ শিখতে হবে। এই যেমন NumPy, Pandas, matplotlib। অথচ R-এ একজন সাধারণ মানুষও মুহুর্তের মধ্যেই জটিল জটিল সব কাজ করা শুরু করে দিতে পারবেন। ম্যাট্রিক্স ক্যালকুলেশন, প্লটিং, মডেলিং ইত্যাদি।

প্যাকেজ
R প্যাকেজের মূল রিপো হলো CRAN। যার পূর্ণরূপ কম্প্রিহেন্সিভ R আর্কাইভ নেটওয়ার্ক। এই আর্টিকেল লেখার সময় এখানে প্যাকেজ সংখ্যা ১৪৪৪০। এছাড়াও গিটহাব ও বায়োকন্ডাক্টর (বায়োইনফরমেটিক্স নিয়ে) ওয়েবসাইটে প্রচুর প্যাকেজ আছে।

অন্য দিকে পাইথন প্যাকেজের সংখ্যা প্রায় ১ লাখ ৮৩ হাজার। তবে মনে রাখতে হবে, সব কিন্তু ডেটা সায়েন্সের জন্য নয়। ডেটা সায়েন্সের কথা চিন্তা করলে আসলে পাইথন অনেক পিছিয়ে আছে। বেশিরভাগ কাজ করতে গেলেই আপনি R-এ রেডিমেড প্যাকেজ পেয়ে যাবেন। পাইথনে অনেক সময়ই পাবেন না সেটা।

আর কাঙ্খিত প্যাকেজ খুঁজেও পাওয়াটাও পাইথনে R-এর চেয়ে বেশ কঠিন।

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



কিন্তু একই রকম কাজ R-এ একটু কঠিন।



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

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

R-কে বলা হয়,
R is written by statisticians, for statisticians 
ফলে R-এর কম্পিউটেশন বেশিরভাগ ক্ষেত্রেই নির্ভরযোগ্য হাত থেকে আসা।

মেশিন লার্নিং
এখানে পাইথনকে একটু বেশি কৃতিত্ব দিতে হয়। সাধারণত R বনাম পাইথনের আরেক নাম হলো পরিসংখ্যান বনাম কম্পিউটার সায়েন্স (CS)। মেশিন লার্নিং এর নিউরাল নেটওয়ার্কে (NN) CS-এর বেশি অবদান থাকায় পাইথনে NN সহজে করা যায়। keras নিয়ে RStudio এর কাজের কল্যাণে R-ও পিছিয়ে নেই অবশ্য।

অন্য দিকে মেশিন লার্নিং এর র‍্যান্ডম ফরেস্ট অ্যালগোরিদম নিয়ে পরিসংখ্যানের লোকেরা বেশি কাজ করেছেন। এ ক্ষেত্রে তাই R এগিয়ে। এছাড়া R-এ মেশিন লার্নিং এর অনেকগুলো কাজ বিল্ট-ইন আছে। নতুন কোনো প্যাকেজ লাগে না। ওদিকে caret  প্যাকেজ তো প্রায় ১৫০ মেশিন লার্নিং অ্যালগোরিদমকে দারুণভাবে গেঁথে ফেলছে।

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

উল্লেখ্য, আমাদের এই সাইটের (সহ এইরকম ও আরও নানান রকম অসংখ্য সাইটের) অরিজিনাল টেমপ্লেট পাইথনে লেখা।

প্যারালেল কম্পিউটেশন
R বা পাইথন কারোই মূল ভার্সনে মাল্টিকোর কম্পিউটেশনের ভালো ব্যবস্থা নেই। দুটোর জন্যেই এক্সটারনাল লাইব্রেরি ব্যবহারের ভালো সূযোগ আছে অবশ্য।

C/C++ ইন্টারফেস
পাইথনে C/C++ এর ইন্টারফেস হিসেবে swig এর মতো টুল থাকলেও R এর Rcpp এর মতো পাওয়ারপুল টুল নেই। Pybind11 প্রস্তুত হলে পাইথন একটু ভালো হবে অবশ্য। এদিকে R আবার নিয়ে আসছে ALTREP। পারফরম্যান্স ও ব্যবহার দারুণ হবে এটি দিয়ে।

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

অনলাইন হেল্প 
প্রোগ্রামিং এর জগৎ হেল্প ছাড়া অচল। কাজ করতে গেলে হেল্প দরকার হবেই। সমস্যায় পড়বেন। ডকুমেন্টেশন দেখবেন। অন্য কোথাও সমাধান খুঁজবেন। গুগোলে সার্চ দেবেন। সমাধান পেয়ে যাবেন। এটা যত দ্রুত পারবেন ততই ভালো। তবে এক্ষেত্রেও R দারুণ। helP() লিখে কি-ওয়ার্ড লিখলেই চলে আসবে সমাধান। বা ?keyword বা ??keyword।

সোজাসাপ্টা
যে কাজগুলো R-এ এক/দুই লাইনের কাজ, বেশিরভাগ ক্ষেত্রেই সেসব কাজ পাইথনে একগাদা কোড লিখতে হবে।

শেষ কথা
কে ভালো? 

কে ভালো জেনে আসলে লাভ আছে? আপনার ভালো লাগাকেই মূল্য দিন। ভাবছেন যেটায় বেশি টাকা সেটা শিখবেন? বেশি টাকা আসলে কোনো প্রযুক্তির কাছে থাকে না। থাকে স্কিলের মধ্যে।
যেটাই শিখুন, বা যদি দুটোই শিখুন, শিখুন ভালো করে। 
সূত্র
১। নর্ম ম্যাটলফ, প্রফেসর, কম্পিউটার সায়েন্স, ইউনিভার্সিটি অব ক্যালিফোর্নিয়া, ইউসিডেভিস

আরও জানতে পড়ুন- Datacamp: R vs Python 
Category: articles

Tuesday, June 11, 2019


ধরুন আমাদের কাছে replace.txt নামে একটি ফাইল আছে। এতে আছে অনেকগুলো ওয়েবপেইজের ঠিকানা (URL)। ধরা যাক, ফাইলের শুরুর অংশ এমন:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

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

sed কমান্ড

কমান্ডটা কীভাবে কাজ করে দেখতে আগে অন্য একটা উদাহরণ দেখা যাক। ধরুন আমরা Go শব্দটার G-কে P বানিয়ে ফেলতে চাইল। তাহলে কোড হবে-
echo "Go" | sed 's/G/P/'
আউটপুট: Po

বুঝতেই পারছেন s এর পরে স্ল্যাশ ("/") দিয়ে যে মুছতে চাই সেটা লিখব। আবার স্ল্যাশ দিয়ে যেটা বসাতে চাই সেটা।

এবার তাহলে replace.txt ফাইলে ফিরে আসা যাক। আমরা .txt ফাইল নিয়ে দেখাচ্ছি, কিন্তু তার মানে এই নয় যে অন্য ফাইলে এটা কাজ করবে না। কাজ করবে যে-কোনো টেক্সট ফাইলের জন্যেই। সেটা হতে পারে r বা পাইথন স্ক্রিপ্ট।

তাহলে .com এর পরের অংশ মুছতে কমান্ড হবে-
sed 's/.com.*/.com/' replace.txt
আর আপনি যদি .com সহ মুছে ফেলতে চান, তাহলে পরের .comটা ফেলে দিলেই হলো। 
sed 's/.com.*//' replace.txt
sed কমান্ডের কারিশমা 
তবে এখানে প্রাপ্ত আউটপুট টার্মিনালে প্রিন্ট হবে, কিন্তু কোথাও সেভ হবে না। কোনো ফাইলে সেভ করতে শেষে > filename.extension বসাতে হবে। অথবা >>। যদি বর্তমান কোনো ফাইলের শেষে এটা যোগ করতে চান। যেমন-
sed 's/.com.*//' replace.txt > rep2.txt
এখন নতুন সৃষ্ট rep2.txt ফাইল দেখতে cat কমান্ড ব্যবহার করুন। 
cat rep2.txt
তবে ফাইল বড় হলে পুরো ফাইল না দেখে উপরের কিছু লাইন দেখতে পারেন। 
head -4 rep2.txt
awk কমান্ড

cat replace.txt | awk -F '\\.com' '{print $1".com"}'
এখানে '\$1' এর কাজ হলো এক নম্বর কলাম প্রিন্ট করা। আর তার আগে -F অংশ দিয়ে লাইনগুলোকে .com পজিশনে আলাদা কলামে ভাগ করা। তার মানে এখন প্রতি লাইন দুই কলামে ভাগ হয়ে গেল। এবার এখান থেকে '\$1' দিয়ে প্রথম কলাম নিয়ে নিলাম। তবে যেহেতু -F দিয়ে .com পজিশনে লাইন বিভক্ত হয়েছে, সে কারণে .com কলাম সেপারেটর হিসেবে কাজ করেছে। সাধারণ csv ফাইলে যেখানে থাকে কমা। এখন .com তো আমরা এখানে মুছতে চাই না। তাই '\$1' এর সাথে আবার .com রেখে দিয়েছি।

সূত্র
১। Stackoverflow
২। Lifewire
Category: articles

Thursday, May 16, 2019

ডেটা সায়েন্সের জন্য লিনাক্স টার্মিনাল দারুণ এক জিনিস। এর আগে আমরা tr কমান্ড নিয়ে বলেছিলাম। আজকে দেখব, সামান্য কয়েকটি কমান্ড এক সঙ্গে ব্যবহার করে কত দারুণ একটা কাজ করা যায়।


যাদের লিনাক্স নেই তারা এই মিনি টিউটোরিয়ালকে ফলো করতে WSL (উইন্ডোজ সাবসিস্টেম ফর লিনাক্স) ব্যবহার করতে পারেন। আমি নিজেও আসলে তাই করছি।

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

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

  • তাহলে শুরুতে আমরা আর্টিকেলের টেক্সটটা কপি করে নেই। আমরা শুরু থেকে Contents সেকশনের আগ পর্যন্ত কপি করব। এই মুহূর্তে লাস্ট লাইনটা এ রকম: ...such as a star cluster or a galaxy। উইকপিডিয়া পরিবর্তনশীল বলে এটা হয়ত সব সময় নাও থাকতে পারে। 
  • এবার লিনাক্স টার্মিনালে আসি। একটা ফাইল বানাই। নাম দেই star_wiki.txt। এটার জন্য কোড touch star_wiki.txt
  • এবার এই ফাইলে টেক্সটখানা বসাতে হবে। তাহলে ইডিট মোডে যেতে টাইপ করি: nano star_wiki.txt
  • এবার আগে কপি করা টেক্সটটুকু এখানে বসিয়ে দেই। এখানে Ctrl + V সবসময় কাজ করে না। তার চেয়ে বরং মাউসের রাইট ক্লিক করলেই পেস্ট হয়ে যায়। 
  • এবার Ctrol + O এবং এন্টার চেপে তারপর Ctrl + X চেপে বের হয়ে আসুন। 
আমাদের মূল কাজ আসলে এখনও হয়নি। তবে এবার হবে। আমরা যা করতে চাই তার জন্যে পুরো কমান্ড হলো:

cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' | sort | uniq -c | sort -nr | head -n 10
চাইলে পুরোটা রান করে দেখতে পারেন। তবে আমরা কাজটা করব ধাপে। প্রত্যেক লাইনে কী ঘটছে সেটা বুঝে বুঝে। 

উপরের কমান্ডে আমরা "|" চিহ্নটা বেশ কয়েকবার ব্যবহার করেছি। লিনাক্স কমান্ড লাইনে একে বলে পাইপ কমান্ড। এটা দিয়ে একটা কাজের রেজাল্টকে আরেকটা কাজের ইনপুট হিসেবে ব্যবহার করা যায়। ব্যাপারটা R এর dplyr ও আরও ভাল করে বললে magrittr প্যাকেজের পাইপের সাথে মিল আছে। অবশ্য R এর পাইপ কমান্ড হলো %>%। এর ব্যবহার দেখতে এই লেখাটি দেখুন। 

তাহলে একে একে দেখা যাক, ওপরের পুরো কোডটা আসলে কী করল। 
  • cat কমান্ড কোনো ফাইলের টেক্সটগুলোকে টার্মিনালে প্রিন্ট করে। ফাইল জোড়া দিতেও এটা ব্যবহার করা যায়। তবে সেটা আমাদের আজকের আলোচনার অংশ নয়। তাহলে আপাতত শুধু রান করুন cat star_wiki.txt। এটা আসলে টেক্সটটা দেখানো ছাড়া আর কিছুই করবে না। ফাইলটায় যেহেতু টেক্সট খুব বেশি নেই, তাই একে প্রিন্ট টার্মিনালে প্রিন্ট করতে অসুবিধা নেই। এবার পাইপ কমান্ড দিয়ে আমরা অ্যানালাইসিসের দিকে যাব। 
  • tr কমান্ডের কারিশমা নিয়ে আমরা আগেই বলেছিলাম। টেক্সট কনভার্ট বা ডিলিট করতে এর ব্যবহার খুব বেশি। এখানে tr '[:upper:]' '[:lower:]' কমান্ড দিয়ে আমরা আমাদের ফাইলের সব লেখাকে ইংরেজি ছোট হাতের বানিয়ে নিলাম। তাহলে এবার কোড হলো-  
cat star_wiki.txt | tr '[:upper:]' '[:lower:]'
  • এখনও টেক্সটটা আছে প্যারাগ্রাফ আকারে। অ্যানালাইসিসের সুবিদার্থে আমরা প্রতিটি শব্দকে আলাদা আলাদা লাইনে নিয়ে আসব। এ জন্যেই পাইপ দিয়ে পরের কমান্ডে চলে গেলাম। বাড়তি কোড লাগবে grep -oE '\w+' । তাহলে সব মিলিয়ে হবে- 
cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' 
  • এবার আমরা শব্দগুলোকে আদ্যক্ষর অনুসারে সাজিয়ে নেব। এ জন্য লাগবে sort কমান্ড। এবার কোড হলো- 
cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' | sort 
  • এখানে একাধিকবার থাকা শব্দগুলোকে একাধিকবারই দেখাচ্ছে। যেমন দেখুন উপরের দিকে অনেকগুলো a দেখা যাচ্ছে। নীচে আবার with আছে চারবার। আমরা এবার একটা শব্দকে একবারই শুধু রাখব। সাথে সেটা কয়বার ছিল সেই তথ্য নিয়ে আসব। এর জন্য কোড হলো uniq -c। c হলো count বা গণনার জন্যে। সব মিলিয়ে এবার-
cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' | sort | uniq -c 
  • এটা ভালোই হলো। কিন্তু কোন শব্দগুলো বেশি আছে সেটা সহজে বোঝা যাচ্ছে না। তাই আবার sort করা দরকার। যাতে বেশি ফ্রিকুয়েন্সির শব্দগুলো শুরুতে থাকে। এজন্য আমরা sort -nr ব্যবহার করব। এখানে n মানে হলো নিউমেরিক সর্ট। আর r মানে হলো রিভার্স সর্ট। এটা না করলে বেশি ফ্রিকুয়েন্সির শব্দ থাকবে শেষে। এবার তাহলে-  
cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' | sort | uniq -c | sort -nr
  • মূল কাজ আসলে শেষ। কিন্তু সব শব্দের ফ্রিকুয়েন্সি দেখে কোনো লাভ নেই। আমরা দেখব কোন দশটি শব্দ সবচেয়ে বেশি আছে। head -10। অবশ্যই ১০ এর বদলে আপনি অন্য কিছি দিতেই পারেন। 
  • তাহলে ফাইনাল কমান্ড দাঁড়াল 
cat star_wiki.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\w+' | sort | uniq -c | sort -nr | head -10

এবার আমরা পেয়ে গেলাম সবচেয়ে বেশি ব্যবহৃত শব্দগুলো। চাইলে এটাকে আমরা আলাদা ফাইলে সেভও করে নিতে পারি। সেজন্যে বাড়তি লিখতে হবে > star_wiki_top.txt। 

কত সহজে কেল্লা ফতে হয়ে গেল! 

আগেই বলেছি, উইকিপিডিয়া পরিবর্তনশীল। তাই আপনার রেজাল্ট আমার রেজাল্টের সাথে নাও মিলতে পারে। তাতে কী এসে যায়? মূল বিষয়টা তো জানা হয়েই এল! 

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

সূত্র:  Data Science at the Command Line নামের অসাধারণ বইটি। লেখক: Jeroen Janssens
Category: articles

Monday, May 13, 2019

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



খুব সাধারণ একটা উদাহরণ দিয়ে শুরু করি। To follow along, আপনার লিনাক্স টার্মিনাল খুলুন। উইন্ডোজে লিনাক্সের সুবিধা ব্যবহার করতে ব্যাবহার করুন WSL। পুরো নাম উইন্ডোজ সাবসিস্টেম ফর লিনাক্স। ইনস্টল করতে সময় লাগবে এক মিনিট। কীভাবে করবেন দেখুন এখানে

১। স্পেসকে রিপ্লেস করতে

দেখা যাক, স্পেসকে ডট দিয়ে রিপ্লেস করা যায় কি না।


এটা থেকে আউটপুট আসবে Welcome.to.stat.mania.

চাইলে কমা (,), কোলন (:) বা অন্য যে-কোনো ক্যারেক্টার দিয়েই রিপ্লেস করা যায়।

যেমন echo "Welcome to stat mania" | tr [:space:] '_' থেকে আসবে Welcome_to_stat_mania_।

আর স্পেসকে ট্যাব দিয়ে রিপ্লেস করতে এই কোড
echo "Welcome to Stat Mania" | tr "[:space:]" "\t"
আসবে: Welcome to      Stat    Mania

২। আপার কেইস থেকে লোয়ার কেইস বা উল্টোটা

ইংরেজি ছোট হাতের অক্ষর থেকে বড় হাতের অক্ষরে রূপান্তর করতে এই কমান্ড সিদ্ধহস্ত।
echo "Weclcome to Stat Mania" | tr "[:upper:]" "[:lower:]"
আসবে: weclcome to stat mania

মানে, সব অক্ষর ছোট হাতের হয়ে যাবে। একইভাবে ছোট হাতের অক্ষরকে বড় হাতের করতে হলে upper আর lower কে ইন্টারচেঞ্জ করে দিতে হবে।
echo "Welcome to Stat Mania" | tr "[:lower:]" "[:upper:]"
আসবে: WELCOME TO STAT MANIA

এই একই কাজটি করা যায় আরেকভাবে।
echo "Welcome to Stat Mania" | tr "[a-z]" "[A-Z]"
আসবে: WELCOME TO STAT MANIA

৩। {} থেকে ()
cat sample.txt  | tr "{}" "()"
এবারে আমি sample.txt ফাইলে রেখেছিলাম এই কথা।
GO OFF
{My OS is Ubuntu}

কমান্ড অ্যাপ্লাই করে পেলাম
GO OFF
(My OS is Ubuntu)

আবার চাইলে এই কোডকে একটু বড় করে tr আবারও অ্যাপ্লাই করা যায়।
cat sample.txt  | tr "{}" "()" | tr "[A-Z]" "[a-z]"
এবার এল:
go off
(my os is ubuntu)

৪। নির্দিষ্ট কোনো ক্যারেক্টার ডিলিট করতে

অদ্ভুত কোনো কিছু ডিলিট করতে এটা দারুণ কাজে আসবে। ডেটা সায়েন্সে ডেটা ক্লিনিং করতে এটি খুব কাজে লাগবে। যেমন ধরুন ভুলক্রমে শহরে নাম টাইপ করতে গিয়ে সব শহরের শেষে একটা বাড়তি . পড়ে গেছে। ধরুন আমরা city.csv ফাইলের শহরের লিস্ট নিয়ে কাজ করছি। এটা আছে এরকম আপাতত।

id, city
1,Dhaka.
2, Cumilla.
3, Lakshmipur.
4, Feni.
5, Chandpur.
6, Barishal.
7, Rangpur.
8, Rajshahi.
9, Sylhet.

এবার আমরা শহরের ডটগুলো মুছে ফেলব।
cat city.csv | tr -d "."
আসবে:
id, city
1,Dhaka
2, Cumilla
3, Lakshmipur
4, Feni
5, Chandpur
6, Barishal
7, Rangpur
8, Rajshahi
9, Sylhet

বুঝতেই পারছেন, -d এর পরের কোটেশনের মধ্যে যা দেবেন সেটা ডিলিট হয়ে যাবে। অবশ্যই এই কমান্ড সতর্কতার সাথে ব্যবহার করতে হবে।

৫. নির্দিষ্ট কোনো ক্যারেক্টার রিপ্লেস করতে 

এর আগে আমরা দেখেছি বিশেষ কিছু দিয়ে অন্য কিছু রিপ্লেস করা। এবার দেখব যে-কোনো কিছুকে যে-কোনো অন্য কিছু দিয়ে রিপ্লেস করার উপায়।
echo "Nothing is impossible" | tr "i" "P"
এখানে সবগুলো i এর বদলে P চলে আসবে।
আসবে: NothPng Ps PmpossPble

এই আউটপুটটা দেখতে বিদঘুটে হলেও এর শক্তি কিন্তু বোঝা গেছে।

৬. সব সংখ্যা (আসলে ডিজিট বা অঙ্ক!) ডিলিট করতে
echo "My roll number is 123" | tr -d "[:digit:]"
হয়ে যাবে: My roll number is

আবার উল্টোও করা যাবে। মানে ডিজিট থাকবে। আর সব মুছে যাবে। তাহলে এই কোড:
echo "My roll number is 123" | tr -cd "[:digit:]"
আসবে: 123

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

সূত্র:
১। Geeksforgeeks
Category: articles

Friday, April 26, 2019

বেইজ R দিয়েও সহজেই দুই ধরনের বার চার্টই আঁকা যায়। তবে ggplot2 দিয়ে আকাঁ চার্টের দিকে তাকিয়ে থাকতে ইচ্ছে করবে। আজ আমরা নীচের বার চার্টটি আঁকব।

এটাই আঁকব। তবে ধাপে ধাপে দেখা যাক।

ও আচ্ছা। এই লেখায় আমরা gcookbook প্যাকেজের ডেটা ব্যবহার করব। তাই, ভালো হয় প্যাকেজটি ইনস্টল ও লোড করে নিন।
install.packages("gcookbook")
library(gcookbook)
এই প্যাকেজের cabbage_exp ডেটা ব্যবহার করব। আপনি Rstudio ব্যবহার না করে থাকলে এই ডেটা লোড করে নিন। data(cabbage_exp) কমান্ড দিয়ে। 

এবার আকাঁ শুরু করা যাক। 
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
  geom_bar(position = "dodge", stat = "identity")+
  ggtitle("Grouped Bar Chart of Weight by Cultivar")
এখানে position = "dodge" দেওয়াতে বারগুলো পাশাপাশি বসেছে। এটাই গ্রুপড বার চার্ট করার কমান্ড। স্ট্যাকড বার তৈরি করতে হলে এখানে দিতে হবে "stack"। আর stat = "identity" দিতে হয়েছে, কারণ cabbage_exp ডেটায় weight এর মানগুলো সরাসরি দেওয়া আছে। এভাবে না থেকে ধরুন এভাবে থাকল, "Male", "Male", "Female", "Male", "Female"। এখান থেকে Rকে হিসবে করে নিতে হত কোন গ্রুপে কয়টা আছে। সেক্ষেত্রে আমরা দিতাম stat="count"। অবশ্য এই অপশনটা ডিফল্ট কাজ করে বলে কিছুই না দিলেও চলবে। 

এবার আমরা কিছু অপশন পাল্টে দেখি। 
  • আমরা গ্রুপড না করে স্ট্যাকড বার আঁকব। position = "stack"
  • অটো কালারে বদলে RColorBrewer প্যাকেজ দিয়ে কালার দেব। আরও দেখুন এখানে
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
  geom_bar(position = "stack", stat = "identity")+
  scale_fill_brewer(palette = "Paired")+
  ggtitle("Grouped Bar Chart of Weight by Cultivar")
এবার আমরা 
  • বারের সাথে প্রতি বারের মান দেখাব। 
  • আমরা বারগুলো খাড়া না রেখে অনুভূমিক করে দেব। এজন্য বাড়তি কোড: coord_flip()
  • এক্ষেত্রে স্ট্যাকড এর চেয়ে গ্রুপড বার ভাল দেখায় বলে আমরা আবারও position="dodge" ব্যবহার করব। 
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
  geom_bar(position = "dodge", stat = "identity")+
  scale_fill_brewer(palette = "Paired")+
  geom_text(aes(label=Weight), vjust=1.5, colour="black",
            position=position_dodge(0.9), size=4)+
  coord_flip()+
  ggtitle("Grouped Bar Chart of Weight by Cultivar")

আমরা পেয়ে গেলাম কাঙ্খিত চার্ট। সরল বার চার্ট আঁকার কৌশল দেখে নিন এখানে

পুনশ্চ: dplyr বা magrittr প্যাকেজ লোড করা থাকলে ggplot(cabbage_exp,aes অংশটুকুকে আরও সহজ করেও লেখা যায়।

cabbage_exp %>% ggplot(aes(...

%>% কে বলা হই পাইপ অপারেটর। dplyr প্যাকেজে এটার ব্যবহার খুব দারুণ। 
Category: articles

Thursday, April 25, 2019

নান্দনিক গ্রাফের জন্য ggplot2 ব্যবহার না করলে জীবনটাই বৃথা। সাথে যদি RColorBrewer যুক্ত হয় তাহলে তো সোনায় সোহাগা। কথা কম বলে কাজে নেমে পড়ি।

এটাই আমরা শেষে দেখব 
ইনস্টল করা না থাকলে install.packages("ggplot2") দিয়ে ও একইভাবে RColorBrewer ইনস্টল করে নিন। এবার প্যাকেজ দুটি লোড করে নেই। মনে রাখবেন, লোড করার সময় কোটেশন দিতে হবে না।
library(ggplot2)
library(RColorBrewer)
এবার এঁকে ফেলি। মনে রাখতে হবে, ggplot2 প্যাকেজ ভেক্টরের বদলে ডেটাফ্রেইম নিয়ে কাজ করে। এখানে আমরা ggplot2 এর বিল্ট-ইন ডেটাসেট diamonds ব্যবহার করব। প্রথমে আমরা RColorBrewer ছাড়া এঁকে দেখি। 
ggplot(diamonds, aes(cut))+
  geom_bar(fill="blue")+
  labs(title="Diamonds Quality Bar Plot")

এখানে blue কালার দিলাম। এবার দেখা যাক RColorBrewer কীভাবে একে আরও আকর্ষণীয় করে।
ggplot(diamonds, aes(cut))+
  geom_bar(fill=brewer.pal(n=9, name='GnBu')[9:5])+
  labs(title="Diamonds Quality Bar Plot")
এখানে brewer.pal কীভাবে কাজ করে বুঝতে অসুবিধা হলে এখান থেকে প্লট কালারিং এর উপায়গুলো দেখে নিন। বর্ণিত ৯টি উপায়ের মধ্যে ৯ নম্বরটি দেখতে হবে। 

দুই প্যাকেজের সমন্বয় 
তবে একটি সমস্যা হয় অনেক সময়। RColorBrewer এর কালারের ৩ সেট কম্বিনেশন আছে। পুরো লিস্ট দেখতে পারেন এখানে। এগুলোর মধ্যে সর্বোচ্চ ১২টি পর্যন্ত কালার আছে। আমাদের বার চার্টের বার আরও বেশি হয়ে গেলেই R-এ error দেখায়। 

এটার সমাধানও সোজা। আগে থেকে কালার বানিয়ে রেখে দিলে সুবিধা। 
col <- brewer.pal(9, "Spectral")
আপনি চাইল Spectral এর বদলে অন্য প্যালেটও দিতে পারেন। লিঙ্কটা থেকে দেখে নিলেই হলো। এবার অনেকটা আগের মতোই। শুধু একটি পার্থক্য। colorRampPalette ফাংশনের ভেতরে প্যালেটকে দিয়ে দিতে হবে। 

ও আচ্ছা। কালার যেহেতু ১২টার বেশি হলে সমস্যা হবে, তাই আগেই ১২টার বেশি বার হবে এমন একটি ডেটা বানিয়ে নেই। 
df <- data.frame(x=sample(15, 1000, replace = T))
এবার শুধু আঁকা বাকি। 
ggplot(df, aes(x))+
  geom_bar(fill=colorRampPalette(col)(15))+
  coord_flip()
এটাই উপরে দেখানো গ্রাফটা। বিভিন্ন কালার কম্বিনেশন দিয়ে পাল্টে নিন চেহারা! আপনি চাইলেয়াগে থেকে না বানিয়ে রেখে একবারেও বসিয়ে দিতে পারেন। কেউ কিছু মনে করবে না।
ggplot(df, aes(x))+
  geom_bar(fill=colorRampPalette(brewer.pal(8, "GnBu"))(15))+
  coord_flip()
সূত্রঃ
১। R graph gallery
Category: articles

Wednesday, April 24, 2019

ডেটা নিয়ে কাজ করতে গেলেই অনিবার্যভাবে রিলেশনাল ডেটাবেজের ধারণা চলে আসবে। আমরা সাধারণত যেসব ডেটা নিয়ে কাজ করি তাতে সব ডেটা থাকে একই টেবিলে বা ডেটাফ্রেইমে। উল্লেখ্য, R-এ যেটাকে আমরা ডেটাফ্রেইম বলি, SQL এ সেটাকে টেবিল বলে। নীচে কয়েকটি টেবিলের কলাম বা ভ্যারিয়েবলগুলো দেখানো হলো। এগুলো R এর nycflights13 প্যাকেজ থেকে নেওয়া।

nycflights13 প্যাকেজের কয়েকটি ডেটাফ্রেইম বা টেবিল। সোর্সঃ tidyverse
দেখুন, flights টেবিলের কলামগুলো হলো year, month, day, hour, origin, tailnum ইত্যাদি। প্রায় একই কলাম আছে weather টেবিলেও। আবার planes টেবিলে আছে tailnum, year ইত্যাদি কলাম। airlines টেবিলে আছে tailnum, names ইত্যাদি।

তবে flights টেবিলে names কলামটা নেই। চাইলে আমরা airlines থেকে names কলামটা flights টেবিলে নিয়ে আসতে পারি। এক টেবিলের কলামকে আরেক টেবিলে নিয়ে আসার এই প্রক্রিয়াই হলো রিলেশনাল কাজ। তবে অবশ্যই দুটো টেবিলকে লিঙ্ক করার জন্যে কমন একটা টেবিল কলাম থাকা চাই। এই কলামকে বলা হয় key। যেমন flights এবং arilines এর মধ্যে carrier কলাম হলো key।

খেয়াল করলে দেখবেন, অন্য টেবিলের মধ্যেও এমন key আছে।

এবার দেখা যাক, কাজটা আমরা কীভাবে করব। ডেটাবেজ ম্যানেজমেন্টের সবচেয়ে মৌলিক ল্যাংগুয়েজ হলো SQL। পুরো নাম Structured Query Language। এখানে রিলেশনাল টেবিল নিয়ে কাজ করার চারটি অপশন আছে।
  • Inner Join
  • Left Join
  • Right Join
  • Full Join
R-এও রিলেশনাল টেবিল নিয়ে কাজ করার সময় এই চারটি জয়েন নিয়ে কাজ করা হয়। তাই প্রথমে কোনটির কী কাজ সেটা দেখে নেই। কথাগুলো একটু কঠিন লাগতে পারে। তবে পরের উদাহরণ দেখলে পরিষ্কার হয়ে যাবে। 
  • Inner Join: দুটো টেবিলের শুধু কমন মানগুলো যে যে  সারি (row) তে আছে সেগুলো রিটার্ন করবে।  
  • Left Join: বাম পাশের টেবিলের সব সারি দেখাবে। ডান পাশের যে সারিগুলো বাম পাশের সাথে মিলে যাবে সেগুলো নিয়ে আসবে। 
  • Right Join: ডান পাশের টেবিলের সব সারি দেখাবে। বাম পাশের যে সারিগুলো ডান পাশের সাথে মিলে যাবে সেগুলো নিয়ে আসবে। 
  • Full Join: দুই টেবিল থেকেই সব সারি নিয়ে আসবে। মিল না পেলে missing value হিসেবে থাকবে। R এ যেটাকে NA হিসেবে দেখানো হয়। 
নানান রকম join
এবার কিছুটা বাস্তব টেবিল থেকে যাক কোন জয়েন কী রেজাল্ট দেবে।

এই ছবিটিকে এক মিনিট চোখ বড় বড় করে দেখলেই স্পষ্ট হয়ে যাবার কথা কোন জয়েন কী কাজ করে।

আমরা R এর ছোট্ট একটা উদাহরণ দেখি। উপরের টেবিলের মতো করেই আগে ডেটা বানিয়ে নিই। ডেটাফ্রেইম বানানোর জন্য আমরা সাধারণত data.frame ফাংশন ব্যবহার করি। তবে tidy ডেটার কনসেপ্টে থাকার জন্য এখানে আমরা tibble ফাংশন ব্যবহার করব। অবশ্যই dplyr প্যাকেজটি লোড করে নিতে হবে।
x <- tibble(key=1:3, val_y=c("x1", "x2", "x3"))
y <- tibble(key=c(1,2,4), val_y=c("y1", "y2", "y3"))
x %>% inner_join(y, by="key")
বাকিগুলো একইভাবে নিজেই করে দেখুন। কোডগুলো কী হবে বুঝতেই পারছেন। left_join, right_join এবং full_join।

এই কাজগুলো SQL দিয়ে করতে গেলে একটু ভিন্নভাবে কোড লিখতে হবে। আগ্রহী হলে দেখে আসুন এখান থেকে। 
Category: articles

Wednesday, April 3, 2019

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

অনলাইন কোর্স
১। DataCamp: Introduction to R

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


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

ডেটাক্যাম্পR এর সব কোর্সের লিঙ্ক

২। Coursera
এখন পর্যন্ত অনলাইন কোর্সের সবচেয়ে বড় মাধ্যম Coursera। এখানে ডেটা সায়েন্স নিয়ে বেশ কিছু কোর্স আছে। তার একটির একাংশে আছে R Programing নামে R নিয়ে একটি মোটামুটি পূর্ণাঙ্গ কোর্স। কোর্সটি জনস হপকিন্স ইউনিভার্সিটির প্রফেসরদের দ্বারা পরিচালিত। এতে আগের কোর্সটির কন্টেন্ট এর পাশপাশি লুপ ও সিমুলেশনও আছে। কোর্সটি ৪ সপ্তাহের। প্রতি সপ্তাহেই আছে অ্যাসাইনমেন্ট। এগুলো করতে করতে R অনেকটাই সহজ হয়ে উঠবে।

Courseraয় প্রায় সব কোর্সই টাকা দিয়ে করতে হয়। তবে প্রায় যে-কোনো কোর্সেই Financial aid এর জন্যে অ্যাপ্লাই করা যায়। এটায়ও করা যায়। অ্যাপ্লিকেশনের ১৫ দিন পরে অনুমোদন হলো কি না জানা যায়। হলে তখনই শুরু করা যায়। তবে অ্যাপ্লিকেশন রিজেক্ট হবার নজির আমি দেখিনি কখনও।

৩। Essential R (পেন স্টেইট ইউনিভার্সিটি) 
এটা ওদের অনলাইন কোর্সের জন্যে করা হলেও খুবই হেল্পফুল। পাশাপাশি ওদের R এর অনলাইন কোর্সটাও চেখে দেখার মতো।

আরও কোর্স
১। EDX: The Analytics Edge
২। EDX: Statistics and R


বই

১। R Programming for Data Science, Roger Peng
 এই বইটি মূলত Coursera'র কোর্সের আলোকে করা। এটা পড়লেই কোর্সের প্রায় সব কিছু জানা হয়ে যাবে।

২। R in a Nutshell, Joseph Adler
নাটশেল বলা হলেও আসলে বইটির কলেবর বেশ বড়। পিডিএফে ৭২২ পৃষ্ঠা! তবে ধাপে ধাপে R বিশেষজ্ঞ হতে এর জুড়ি নেই।

৩। R for Data Science: IMPORT, TIDY, TRANSFORM, VISUALIZE, AND MODEL DATA
Hadley Wickham & Garrett Grolemund

বইটির অন্যতম লেখক হ্যাডলি উইকাম। বর্তমান সময়ের সবচেয়ে প্রভাবশালী ডেটা সায়েন্টিস্ট। R এত জনপ্রিয় হবার পেছনে আছে এই মানুষটির অবদান আমার মতে সবচেয়ে বেশি। tidyr, ggplot2, dplyr, readr, devtools, roxygen2 এর মতো জনপ্রিয় R প্যাকেজগুলোর ডেভেলপার তিনি। ডেটা সায়েন্সের কোনো প্রোজেক্ট R দিয়ে একদম শুরু থেকে শেষ পর্যন্ত করতে যা যা লাগবে তার সব এই বইতেই আছে। বইটির একটি বড় অংশ অনলাইনেই পড়া যায়। এই লিঙ্ক থেকে


৪। ggplot2: Elegant Graphics for Data Analysis; Hadley Wickham
যে প্যাকজটির জন্যে হ্যাডলি সবচেয়ে বিখ্যাত সেটি হলো ggplot2। দারুণ সব গ্রাফিক্স আঁকতে এই প্যাকেজের জুড়ি নেই। ggplot2 এর সব খুঁটিনাটি নিয়েই এই বই।

৫। Machine Learning with R, Brett Lantz
মেশিন লার্নিং এর কাজগুলো কত দারুণভাবে R দিয়ে করা যায় তা জানা যায় এই বইটি পড়লে। শুরুর দিকে R এর বেসিক বিষয়গুলোও দারুণভাবে উঠে এসেছে।

৬। Introduction to visualising spatial data in R

এটা ফ্রিতে ডাউনলোড করা যায় এই লিঙ্ক থেকে। জিওগ্রাফিক ডেটা অ্যানালাইসিস ও ম্যাঁপ আঁকা শুরু করতে এটার জুড়ি নেই।

আরও কিছু বই
১। Advanced R, Hadley Wickham
২। Applied Predictive Modeling, Max Kuhn and Kjell Johnson
৩। Hands-On Programming with R, Garrett Grolemund
৪। R Graphics Cookbook, Winston Chang
৫। Machine Learning for Hackers, Drew Conway and John Myles White
৬। Machine Learning Mastery With R, Jason Brownlee

এই বইটার কন্টেন্ট আমার খুব নজর কেড়েছে।



অনলাইন টিউটোরিয়াল
১। R tutorial: listendata.com
শুধু এখানে যে আছে শেষ করতে পারলেই R এর বিশেষজ্ঞদের সাথে পাল্লা দেওয়া যাবে।

২। টিউটোরিয়াল পয়েন্ট
এখানে একেবারে বেসিক থেকে ধারাবাহিকভাবে সবে কিছু আলোচনা করা আছে।

৩। GIS in R by Nick Eubank
R দিয়ে ম্যাপ আঁকতে ও জিওগ্রাফিক ডেটা অ্যানালাইসি শিখতে।

আরও কিছু ওয়েবসাইট
১। R graph gallery
২। Variance explained

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

এখানে r ট্যাগযুক্ত প্রশ্নোত্তরগুলো চর্চা করতে থাকলে ক্রিয়েটিভিটি লাফিয়ে লাফিয়ে বৃদ্ধি পাবে।

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

ভালো থাকুন!
Category: articles

Sunday, January 6, 2019

হুম, আমরা নীচের চিত্রটিই আঁকতে চাই। এতে প্রয়োজন হবে R এর অন্যতম জনপ্রিয় প্যাকেজ ggplot2। হ্যাঁ, প্যাকেজ ছাড়াই আপনি এমন গ্রাফ আঁকতে পারেন। তবে দেখতে সেটা এতটা দৃষ্টিনন্দন নাও হতে পারে।

R প্রোগ্রামিং প্যাকেজ ggplot2 এর কারসাজি 

তাহলে প্যাকেজটি না থাকলে ইনস্টল করে নিন। library ফাংশন দিয়ে লোড করতেও ভুলবেন না কিন্তু!
install.packages("ggplot2")
library(ggplot2)

বরাবরের মতোই আগে একটি ডেটা লাগবে। বানিয়ে নেই তাহলে। 
x <- sample(10)
y <- sample(10)
z <- sample(10)

তবে এটাকে ggplot2 পরিচ্ছন্ন (tidy) ডেটা বলতে রাজি না। তাহলে ডেটাকে পরিশুদ্ধ করে নেই। পরিচ্ছন্ন ডেটা সম্পর্কে আরও জানতে এই লিঙ্কটা ঘুরে আসুন। রেফারেন্সে থাকা লিঙ্কগুলোয়ও ঢুঁ মেরে আসতে পারেন। 
যাই হোক, পরিচ্ছন্ন হবে এভাবে:
dt <- data.frame(var=rep(c("x","y","z"), each=10), val=c(x,y,z),
                 crit=1:10)

উল্লেখ্য, এটা আমি নিজের মতো করে বানিয়েছি। tidy করার ফর্মাল উপায়ের জন্যে tidy প্যাকেজে gather নামে একটা ফাংশন আছে। আপনার ইচ্ছা আপনি কীভাবে করবেন। নিয়ম মেনে করাই ভাল। যাই হোক, সামনে যাওয়া যাক। বড় কোড দেখে ঘাবড়াবেন না! কোডের শেষের তিন লাইনই অপশনাল। করলে ভালো, না করলে নাই। 

ggplot(data=dt, aes(crit, val, color=var))+
  geom_line()+geom_point(size=2)+
  xlab("Criteria")+
  ylab("Value")+
  ggtitle("My title")

আমরা পেয়ে গেলাম উপরের গ্রাফের মতো গ্রাফ। 

চাইলে কাজটি আপনি ggplot2 ব্যবহার না করেও করতেই পারেন। এর আগে আমরা টাইম সিরিজ ডেটার জন্যে এমন গ্রাফ দেখেছিও। তবে এবার দেখব যে-কোনো রকম ডেটার জন্যে। 

ধরে নিলাম আগের x, y, z চলক তিনটা স্টোর করা আছে। 

এবার আগে তিনটা কালার বানিয়ে রেখে দেই। 
col <- c("blue", "black", "green4")
এবার একে একে তিনটা চলক প্লট করা:
plot(x, col=col[1], pch=19, xlab="Some text", ylab="other text")
lines(x, col=col[1])
points(y, col=col[2], pch=15)
lines(y, col=col[2])
points(z, col=col[3], pch=18)
lines(z, col=col[3])
legend("topright", legend=c("x", "y", "z"), col=col, pch=c(19,15,18),
       ncol=3)

পাওয়া গেল গ্রাফখানি
বেইজ R দিয়ে মাল্টিপল লাইন প্লটিং। বড় করে দেখতে ক্লিক করুন এখানে
এই কোডটিকে নানানভাবে কাস্টোমাইজ করে প্লট আরও সুন্দর করে নিতে পারেন। তবে আমার মতে ggplot-ই ভালো। নিজে নিজে সব করতে গেলেই ঝামেলা বাঁধে। আমার খুব প্রিয় একটা কথা হলো:
Category: articles