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