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। পুরো নাম উইন্ডোজ সাবসিস্টেম ফর লিনাক্স। ইনস্টল করতে সময় লাগবে এক মিনিট। কীভাবে করবেন দেখুন এখানে

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

দেখা যাক, স্পেসকে ডট দিয়ে রিপ্লেস করা যায় কি না।
echo "Welcome to stat mania" | tr [:space:] '.'
এটা থেকে আউটপুট আসবে 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

Thursday, March 14, 2019

এর আগের লেখায় আমরা দেখেছিলাম, কোনো সংখ্যাকে শূন্য দিয়ে ভাগ দেওয়া যায় না। দিতে গেলে আসে অদ্ভুত সব ফলাফল। ১ = ১০০ ইত্যাদি। ওখানে আমরা $\frac{০}{০}$ নিয়ে কিছু বলিনি। এবার এটা দেখা যাক!

এখানেও ০-এর কাছাকাছি সংখ্যাদেরকে নিয়ে ভাগ করে দেখি।
$$\frac{০.১}{০.১}=১$$
আবার, একই উত্তর পাব ০.০১ নিলেও। কারণ,
$$\frac{০.০১}{০.০১}=১$$
একইভাবে,
$$\frac{০.০০০১}{০.০০০১}=১$$
এবং
$$\frac{০.০০০০০১}{০.০০০০০১}=১$$
তার মানে, মনে হচ্ছে $\frac{০}{০}$ হয়ত ১-ই হবে। কারণ, ঋণাত্মক সংখ্যা নিলেও একই ফল আসবে। 
$\frac{-০.১}{-০.১}=১$, $\frac{-০.০১}{-০.০১}=১$, $\frac{-০.০০০১}{-০.০০০১}=১$ এবং $\frac{-০.০০০০০১}{-০.০০০০০১}=১$

অতএব, মনে হচ্ছে যথেষ্ট শক্তিশালী যুক্তি পাওয়া গেছে। $\frac{০}{০}=১$ ই হওয়া উচিৎ। 

কিন্তু এবার মুদ্রার উল্টো পিঠটা একটু দেখি। ০-কে ০ দিয়ে ভাগ না দিয়ে ক্রমেই ০-এর কাছাকাছি সংখ্যা দিয়ে ভাগ করি। এই কাজটা আমরা আগেও করেছি। 

$$\frac{০}{০.১}=০$$
আবার, একই উত্তর পাব ০.০১ নিলেও। কারণ, 
$$\frac{০}{০.০১}=০$$
একইভাবে,
$$\frac{০}{০.০০০১}=০$$
এবং 
$$\frac{০}{০.০০০০০১}=০$$

তার মানে, যতই ছোট সংখ্যা দিয়ে ভাগ করব, মান পাব ০-এর তত কাছাকাছি। তাহলে, আগের মতো একই যুক্তিতে বলা যায়, $\frac{০}{০}$ এর মান হবে ০। এই যুক্তি আগের যুক্তির (যেখানে ভাগফল ১ হয়েছিল) চেয়ে কোনো অংশে কম দুর্বল নয়। 

এবং আগের মতোই, ০-কে ঋণাত্মক সংখ্যা দ্বারা ভাগ করলেও একই অবস্থা হবে। তাহলে কোনটা ঠিক? ০, নাকি ১? 

ফলাফল আসলে যে-কোনো অশূন্য সংখ্যাকে শূন্য দিয়ে ভাগ করার মতোই। $\frac{০}{০}$-কে সংজ্ঞায়িত করার উপায় নেই। ফলে, (কোনোকিছু÷০) এর মতোই $\frac{০}{০}$ও অসংজ্ঞায়িত। 
তবে গণিতের আরও গভীরে প্রবেশ করলে $\frac{০}{০}$ কে অনির্ণেয় (indeterminate) বলা হয়। সেটাও আমরা দেখব ইনশাআল্লাহ।

আরও পড়ুন:
Category: articles
প্রথমে একটি মজার ফলাফল দেখি। চাতুরী খাটিয়ে দেখানো যায় ১ = ০। বা ১ = ১০০। অথবা আপনি যা চান তাই। এটা দেখানোর অনেকগুলো উপায়। অবশ্যই সবগুলো উপায় ভুল।


এর মধ্যে অন্যতম সহজ একটি উপায় এমন-

ধরি,
$$\begin{eqnarray}
x &=& 0      \nonumber \\
& \implies & x (x-1)=0 \nonumber \\
&\implies &(x-1)=0    \nonumber \\
&\implies &x=1   \nonumber
\end{eqnarray}$$
আমরা পেলাম x = 1, অথচ শুরুতে x = 0 ধরে নিয়েছিলাম।
মানে এখন ০ এবং ১ সমান। এখানে দ্বিতীয় লাইনে (x-1) এর বদলে (x-100) ধরলে 100 = 0 দেখানো যাবে। দেখানো যাবে অন্য যে-কোনো কিছুই। কিন্তু এটা আসলে ভুল।

ভুলটা হয়েছে তৃতীয় লাইনে। যেখানে আসলে আমরা উভয়পক্ষকে x দিয়ে ভাগ করেছি। কিন্তু x মানে আগেই ০ ধরে নিয়েছিলাম। আর ০ দিয়ে ভাগ দেবার নিয়ম নেই।

কিন্তু কেন? দিলে ক্ষতি কী? সেটাই আমরা দেখার চেষ্টা করব।

গণিতের গভীরে যাবার আগে প্রথমে একটু কমন সেন্স কাজে লাগাই। ভাগ দেওয়ার মানে আসলে কী? ধরুন, আপনার কাছে ২০টি আম আছে। ৫ জন বন্ধু এগুলো ভাগ করে খেতে চান। সবাইকে সমান আম দিলে সবাই $\frac{২০}{৫} = ৪$  টি করে পাবে। কিন্তু যদি বাকি ৪ বন্ধু খেতে না চায়, তাহলে একজনই ২০টি আম পেয়ে যাবে। কারণ, $\frac{২০}{১} =২০$।

এবার একটু ভাবুন: কেউই যদি খেতে না চায়, তাহলে কী হবে? ২০ টি আম ০ জন মানুষের কাছে কীভাবে বণ্টন করা যাবে? একটু ভাবুন। ভাগের ধারণাটাই কাজ করছে না।

আরেকভাবে দেখুন। ভাগ কিন্তু আবার গুণ করে মিলিয়ে নেওয়া যায়। $\frac{২০}{৫} = ৪$। এর মানে হলো, ৪-কে ৫ দিয়ে গুণ করলে ২০ পাওয়া যাবে। এবার $\frac{২০}{০}$ ভাগফলটি দেখুন। এটা সমান ধরুন 'ক' পাব। তার মানে 'ক'-কে ০ দিয়ে গুণ করলে ২০ পাওয়ার কথা। এবার একটু গভীরভাবে ভাবুন। এমন কোনো সংখ্যা আছে কি, যাকে ০ দিয়ে গুণ করলে ২০ পাব? ২০ এর বদলে অন্য যে-কোনো সংখ্যা (০ ছাড়া) নিয়ে ভাবলেও একই কথা পাওয়া যাবে।

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

যেমন ধরুন, আমরা কোনোকিছুকে শূন্য দিয়ে ভাগ দিলে যা হতে পারে সেটাকে ধরলাম 'ক'। এখন তাহলে $\frac{৯}{০}$ এর যে মান হবে, $\frac{১০০}{০}$ এর মানও তাই হবে। তাহলে তো মেনে নিতে হয় ৯ আর ১০০ সমান! এই অদ্ভুত ভাগটি করলে এমন অদ্ভুত সব ফলই আসবে। যেগুলো স্ত্যি হলে গণিতের ভিত্তিটাই ধসে পড়ে।

তবুও ধরা যাক, আমরা (কোনোকিছু ÷ ০) এর একটি মান বের করতেই চাই। তাহলে কী ঘটে দেখা যাক। সহজভাবে চিন্তা করতে আমরা ১-কে শূন্য এর কাছাকাছি বিভিন্ন সংখ্যা দিয়ে ভাগ করে দেখি।

  • ১-কে ০.১ দিয়ে ভাগ করলে পাব ১০
  • ১-কে ০.০১ দিয়ে ভাগ করলে পাব ১০০
  • ১-কে ০.০০০১ দিয়ে ভাগ করলে পাব ১০,০০০
  • ১-কে ০.০০০০০১ দিয়ে ভাগ করলে পাব ১০০,০০,০০
একটা বিষয় নিশ্চয়ই খেয়াল করেছেন। আমরা ০-এর যত কাছের সংখ্যা দিয়ে ভাগ দিচ্ছি, ভাগফল তত বেশি হচ্ছে। একই ব্যাপার ঘটবে আমরা ১-এর বদলে অন্য কোনো সংখ্যাকে ভাগ দিতে থাকলে। যেমন ১ এর বদলে ৭-কে ভাগ দিলে হত যথাক্রমে ৭০; ৭০০; ৭০,০০,০০ ও ৭০, ০০, ০০, ০০। 

তার মানে শূন্য দিয়ে ভাগ দিলে আমরা অনেক বিশাল একটি সংখ্যা পাব। যাকে অন্য অর্থে বলা চলে অসীম। এর জন্য একটি চিহ্নও আছে বটে। চিহ্নটা হলো ∞। অনেক সময় আমরা গাণিতিক কাজ করতে গিয়ে ব্যবহার করিও (সতর্কতার সাথে)। কিন্তু (কোনোকিছু ÷ ০) এর মান ∞ ধরে নিলে সমস্যা আছে। কারণ হলো এই কোনোকিছু যদি ঋণাত্মক হয়, তাহলে উত্তর আর ∞ হয় না। দেখুন না! 
  • ১-কে - ০.১ দিয়ে ভাগ করলে পাব - ১০
  • ১-কে - ০.০১ দিয়ে ভাগ করলে পাব - ১০০
  • ১-কে - ০.০০০১ দিয়ে ভাগ করলে পাব - ১০,০০০
  • ১-কে - ০.০০০০০১ দিয়ে ভাগ করলে পাব - ১০০,০০,০০

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

উপরের আলোচনা গ্রাফে বসালে এমন হয়। দেখুন x এর মান ধনাত্মক দিক থেকে ০-এর দিকে যেতে থাকলে $\frac{1}{x}$ এর মান ∞ এর দিকে যেতে থাকে। আবার ঋণাত্মক দিক থেকে ০-এর দিকে যেতে থাকলে $\frac{1}{x}$ এর মান -∞ এর দিকে যেতে থাকে।
ছবি: উইকিপিডিয়া কমন্স
এখন তাহলে (ঋণাত্মক সংখ্যা ÷ ০) এর মান আমরা ধরতে পারি ঋণাত্মক অসীম (-∞)। খেয়াল করুন, ধনাত্মক বা ঋণাত্মক, দুই ক্ষেত্রেই আমরা ভাগ দিতে দিতে ০-এর কাছাকাছি যাওয়ার চেষ্টা করেছি। কিন্তু দুই ক্ষেত্রে ফল এসেছে আলাদা। একবার পাচ্ছি ∞। আবার পাচ্ছি -∞। দুটো সংখ্যার মধ্যে সর্বোচ্চ দূরত্বের উদাহরণ এই দুটি সংখ্যা। থুক্কু! এদেরকে গণিতে সংখ্যা হিসেবে গণ্যই করা হয় না। এর আসলে শুধুই 'অনেক বড়' বা 'অনেক ছোট' ধারণাগুলো প্রকাশ করার একটি উপায় মাত্র। 

অসীম ও ঋণাত্মক অসীমকে সংখ্যারেখায় বসিয়ে দেখি-

তার মানে কী দাঁড়াল? (কোনোকিছু ÷ ০) এর কোনো ভাল উত্তর আমরা পাচ্ছি না। এ জন্যেই আগে বলেছি, এই না পাওয়ার বিষয়টি গণিতবিদদের কোনো দুর্বলতা নয়। এই ভাগফলটিই এমন। তাই গণিতবিদরা এর নাম দিয়েছেন অসংজ্ঞায়িত।

এ কারণেই কৌতুকবিদ স্টিভেন রাইট বলেছিলেন, "ব্ল্যাক হোলে ঈশ্বর শূন্য দিয়ে ভাগ দিয়েছেন ।" এটি বলার কারণ আসলে ব্ল্যাক হোলে ভেতরে পদার্থবিদ্যার সূত্রগুলো ভেঙে পড়ে। ওখানে ঠিক কী ঘটে তা সঠিক করে বলার উপায় নেই। যেভাবে বলার উপায় নেই শূন্য দিয়ে ভাগের ভাগফল।

সূত্র
১। খান অ্যাকাডেমি
২। উইকিপিডিয়া
Category: articles

Sunday, January 27, 2019

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



আরও পড়ুন
রোনাল্ড ফিশার কে ছিলেন?

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

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

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

এভাবে চলল কিছু দিন। আস্তে আস্তে পিয়ারসনের প্রভাব কমে এল। আর ফিশার হয়ে উঠলেন প্রভাবশালী। ১৯৩৬ সালে পিয়ারসন মারা গেলেন। তত দিনে তার প্রভাব এতই কমে গেছে যে মানুষ তাকে প্রায় ভুলেই গিয়েছে। অথচ ফিশার তখন ক্যারিয়ারের সেরা সময় অতিক্রম করছেন।

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

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

সূত্র: The Lady Tasting Tea by David Salsburg
Category: articles

Sunday, January 20, 2019

যে-কোনো গবেষণা বা স্টাডি পরিচালনা করতে গেলেই দরকার হয় ডেটা। ডেটা সংগ্রহ করতে গেলেই প্রশ্ন দাঁড়ায়, কত সাইজের স্যাম্পল নেব? লাখ টাকার প্রশ্ন। আক্ষরিক অর্থেই লাখ টাকার প্রশ্ন। কারণ আপাত দৃষ্টিতে সরল এই প্রশ্নটির জবাব আসলে অনেক জটিল। আর জটিল হিসাবটি সহজ করে দিয়ে পরিসংখ্যানবিদরা আসলেই লাখ লাখ টাকা কামান।

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



আজকে আমরা স্যাম্পল সাইজ পরিমাপের একবারে সাধারণ একটা উদাহরণ দেখব। ধরা যাক, আমার দেখতে চাই ঢাকার আরামবাগ এলাকায় কত শতাংশ মানুষের ডায়াবেটিস রোগ আছে? আমরা ধরে নিচ্ছি এক্ষেত্রে সরল দৈব নমুনায়ন (simple random sampling) পদ্ধতি কাজ করবে। এর মানে হলো আমরা যে মানুষদেরকে তথ্য নেবার জন্য বাছাই করব, বাছাইকৃত হবার সম্ভাবনা তাদের প্রত্যেকের ক্ষেত্রে সমান। ধরুন, আরামবাগ এলাকায় ১০,০০০ মানুষ আছেন। হয়ত আমরা স্যাম্পল নেব ৪০০ সাইজের। এখন এই ৪০০ জনের মধ্যে আসার সম্ভাবনা দশ হাজার মানুষের সবার জন্য সমান। অন্য কথায়, প্রত্যেকের সম্ভাবনা $\frac{১}{১০০০০}$।

এখন আমরা কত সাইজের নমুনা নেব? এর উত্তর জানতে হলে তার আগে আরেকটি প্রশ্নের উত্তর পেতে হবে। আমরা কতটা নির্ভুল পরিমাপ চাচ্ছি। ধরা যাক, আমরা যে পরিমাপ পাব, বাস্তব হার (ডায়াবেটিসের) সেটার ৫ শতাংশ এদিক-ওদিক হলেও কিছু মনে করব না। এর মানে হলো, ধরা যাক, আমরা স্যাম্পল নিয়ে হিসাব করে পেলাম ৩৫ শতাংশ। তাহলে সত্যিকার ডায়াবেটিস রোগীর হার (P) ৩০ থেকে ৪০ শতাংশের মধ্যে থাকবে।

এখানে আরেকটা কথা বলে না রাখলেই নয়। এই যে বললাম, ৩০ থেকে ৪০ এর মধ্যে থাকবে এটা পুরোপুরি নিশ্চিত কিছু নয়। তবে স্যাম্পল বড় হলে এর চেয়ে বেশি এদিক-সেদিক হবে না বলে আশা করা যায়। সাধারণভাবে বলা চলে ৫ শতাংশ ভুল মানে হলে প্রতি ২০টা নমুনার মাত্র একটায় ফল ৩০ থেকে ৪০ এর বাইরে চলে যাবে।

স্যাম্পল সাইজের হিসাবকে আরেকটু সরল করার জন্যে আমরা আরও ধরে নিচ্ছি শতাংশের পরিমাপটা পরিমিত বিন্যাস মেনে চলে। কথাটি অপরিচিত হলে এই লেখাটায় ঢুঁ মেরে আসতে পারেন। এছাড়াও আমরা আপাতত FPC (Finite population correction) কে বিবেচনা থেকে বাদ দিচ্ছি।

যেহেতু আমরা ধরে নিলাম p পরিমিত বিন্যাস মেনে চলবে, তাহলে এই লেখা অনুসারে p সত্যিকার হারের (P) ২ পরিমিত ব্যবধানের ($\sigma$) মধ্যে থাকবে। ২ পরমিত ব্যবধানে থাকবে বলার কারণ হলো ৫ শতাংশ এদিক-সেদিক মেনে নিয়েছি বলে। মাত্র এক শতাংশেরও কম এদিক-সেদিক মেনে নিতে চাইলে পরিমিত ব্যবধান নেব ৩ পর্যন্ত। যাই হোক, আপাতত আমরা জানলাম, আমাদের পরিমাপ $P \pm 2 \sigma$ এর মধ্যে থাকবে। ২০ বার পরিমাপ করলে একবার এর বিপরীত হয়ে যেতে পারে।

আবার আমরা জানি, $\sigma _p = \sqrt{\frac{PQ}{n}}$।

এখানে $Q = 100- P$ আর $n$ হলো আমাদের কাঙ্খিত স্যাম্পল সাইজ।

এখন, আগের কথা অনুসারে $\sigma _p$ এর দ্বিগুণ সমান 5 হবে। যেহেতু আমরা 5 শতাংশ কম-বেশি হওয়া মেনে নিয়েছি।

তাহলে,  $2 \sqrt{\frac{PQ}{n}} = 5$

বা, $n = \frac{4PQ}{25}$

এবার আমরা স্যাম্পল সাইজ বের করার একটা ফর্মুলা পেয়ে গেলাম। কিন্তু একটি সমস্যা রয়ে গেছে। স্যাম্পল সাইজ বের করতে গেলেই এই সমস্যার মুখে পড়তে হয়। এখানে $n$ বের করতে গেলে $P$ জানা দরকার হচ্ছে। অথচ $P$ জানার জন্যেই $n$ নিয়ে এত কিছু। ব্যাপারটা অনেকটা এই রকম। আপনি বাসার ছাদে বসে আছেন। নামতে হলে মই লাগবে। অথচ মইটা খাড়া করা নেই। তার মানে মই খাড়া করার জন্যে আপনাকে নামতে হবে। আহা! নামতে পারলে তো আর মইয়ের দরকারই হতো না। তাহলে উপায়?

উপায় আছে। অন্য কাউকে দিয়ে যেমন মইটা দাঁড় করিয়ে নেওয়া যায়, তেমনি অন্য কোনো উপায়ে $P$ জানারও বুদ্ধি বের করতে হবে। আগের তথ্য থেকে বা অন্য কোনোভাবে আমাদেরকে $P$ সম্পর্কে একটা মোটামুটি অনুমান তৈরি করে নিতে হবে। যেমন আমরা ধরে নিতে পারি আরামবাগে ডায়াবেটিস রোগীদের হার ৩০ শতাংশ থেকে ৬০ শতাংশের বাইরে হবে না। সেক্ষেত্রে $P = 30$ বা $60$ হবে। আপনি যুক্তি দেখাতেই পারেন, $P$ যদি ৮০, ৯০ হয়ে যায় তাহলে তার দায় কে নেবে?

আসলে সেটার দায় নেওয়া কঠিন কিছু না। উপরের সূত্রে খেয়াল করুন। P এর মান ৩০ ধরলে Q হবে ৭০। গুণফল হবে ২১০০। আর এদের মান যথাক্রমে ৮০ আর ২০ হলে গুণফল দাঁড়ায় ১৬০০, যা আগের চেয়েও ছোট। তার মানে $P$ আর $Q$ এর পার্থক্য যত বেশি হবে আমাদের তত ছোট স্যাম্পল লাগবে। তার মানে সবচেয়ে বড় স্যাম্পল লাগবে যদি $P$ আর $Q$ সমান হয়। মানে দুটোই ৫০। আর সেক্ষেত্রে $PQ$ হবে 2500।

তাহলে স্যাম্পল সাইজ, $n = \frac{4 \times 2500}{25} = 400$

তার মানে এক্ষেত্রে ৪০০ সাইজের স্যাম্পল নেওয়ায় যথেষ্ট। আর সত্যিকারের $P$ যদি ৩০ হয় (৭০ হলেও একই কথা) তাহলে লাগবে ৩৩৬ সাইজের স্যাম্পল। নিরাপদ থাকতে চাইলে ৪০০ নিয়ে ফেলাই যায়।

আপাতত এই $n$ দিয়েই কাজ চালানো যায়। তবে সমগ্রক (সকল মানুষের সংখ্যা) যদি ৮,০০০ এর কম হয় তবে আগে বাদ দিয়ে রাখা FPC নিয়েও চিন্তা করা দরকার হবে। আর বাকি ক্ষেত্রে ৪০০ দিয়েই মোটামুটি ঠিকঠাক কাজ চলবে। বাকি অনুমানগুলো সঠিক না হলে কীভাবে কী করা লাগবে সেটা আমরা অন্য কোনো সময় দেখব, ইনশাআল্লাহ।

সূত্র: Sampling Techniques (3rd edition) by William G. Cochran
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