Tuesday, 14 July 2015

বাংলায় R Programming এর কিছু রেসিপি

R Programming Tutorial

টিউটোরিয়াল ১

ভূমিকা (Introducton): প্রথমেই যেটা জানা দরকার তা হল R কি? যারা computer language এর ধারনার সাথে পরিচিত, তারা অবশ্যই C, BASIC ইত্যাদির নাম শুনে বা ব্যবহার করে থাকবে। R হল ঠিক সেরকমই একটি computer language বা programming language। এটি বিশেষত Statistical Computing এবং Graphics এর কাজে ব্যবহার করা হয়। ১৯৯৩ সালে এটির জন্ম হয় University of Auckland, New Zealand এ Sir Robert Gentleman এবং Sir Ross Ihaka এর হাত ধরে। এটি একটি GNU Project অর্থাৎ এটির যাবতীয় source code মুক্ত। যে কেউ যেমন খুশি করে নিজের মতো একে ব্যবহার করতে পারে। R language এর সম্পর্কে আরও জানতে এখানে যাও
R এর বর্তমান stable release এর copy পাওয়া যাবে এখান থেকে । Statistics এর মানুষদের কাছে R খুব সুবিধাজনক ও প্রিয় হলেও প্রথম ব্যবহারকারীর কাছে এটি একটি বিরক্তির কারণ হয়ে উঠতে পারে, যদি না এর সবরকম syntax ও command ঠিকভাবে না বোঝা যায়। তাই আর বেশী কথা না বলে সরাসরি R এর syntax ও command এর আলোচনায় আসা যাক, যা জানা প্রথম ব্যবহারকারীর কাছে অত্যন্ত প্রয়োজন।
সাধারণ গণিতে R কে ব্যবহার করা (Applying R to general mathematics): প্রথমেই বলেছি যে R একধরনের calculator বিশেষ, নীচের উদাহরণ গুলো দেখলে সহজেই তার প্রমাণ মেলে।
  • x<-log(2.843432)*pi
    x
    [1] 3.283001
  • sqrt(x) [1] 1.811905
  • floor(x)
    [1] 3 # largest integer ≤ x
  • ceiling(x)
    [1] 4 # smallest integer ≥ x
মনে রেখঃ R language এ কোন comment লিখতে হলে # চিহ্নটি দিয়ে comment লেখা শুরু করতে হয়। এক্ষেত্রে R Compiler # চিহ্নের পরের সবকিছুকে অগ্রাহ্য করে। এছাড়াও আরও উদাহরণ লক্ষ্য কর, যেমন-
  • 2+3*5
    [1] 17
  • log(10) [1] 2.302585
  • 4^2 [1] 16
  • abs(3-7) # absolute value of (3-7) [1] 4
  • pi [1] 3.141593
  • exp(2)
    [1] 7.389056
    ইত্যাদি।
Complex Number দের নিয়ে বিভিন্ন কাজও R এর মাধ্যমে করা যায়। নীচের উদাহরণ গুলো দেখলে এক্ষুনি তা স্পষ্ট হয়ে যাবে।
  • x<-3 a="" code="" complex="" defines="" i="" number="" x="">
  • Re(x) # real part of x
    [1] 3
  • Im(x) # imaginary part of x
    [1] 2
  • <- -1="" another="" code="" cplx.="" defines="" i="" number="" y="">
  • x+y
    [1] 2+3i
  • x*y # product of x and y
    [1] -5+1i
মনে রেখঃ '<- assignment="" code="" expression="" mathematical="" operator="" r="">x <-log code="" pi=""> এর '<- i="" store="" value="" variable="">
ভেক্টরের ধারণা (Concept of vector): Linear Algebra-য় vector বলতে যা বোঝায় তা হল কতকগুলি সংখ্যাকে একটি বিশেষ ভাবে ("( )" বা "[ ]" এর মধ্যে) লেখা, যেখানে ঐ সংখ্যাগুলিকে বলা হয় vector টির element বা component এবং যদি মোট r সংখ্যক সংখ্যা থাকে, তবে ঐ vector টিকে বলা হয় একটি r-component vector।
R এর মাধ্যমে বিভিন্ন ভাবে ভেক্টর তৈরী করা (Creating vector in different ways with R):
    ধরা যাক, x একটি 6-component vector। R language এ এটি বোঝাবার সবচেয়ে প্রথম নিয়মটি হল ‘c(...)’ concatenation function -এর ব্যবহার করা। যদি x vector টির component গুলো হয় -9, 5, 3.2, 2.85, 6.35 ও 13 তবে এটি বলার নিয়ম হল,
    x<-c br=""> x
    [1] -9.00 5.00 3.20 2.85 6.35 13.00

    এরকম আরও কিছু vector এর উদাহরণ এবার দেখা যাক...
  • x<-1:5 br=""> x
    [1] 1 2 3 4 5 ...(i)
  • y<-seq length.out="5)<br/"> y
    [1] -1.0 -0.5 0.0 0.5 1.0 ...(ii)
  • z<-c br="" rep=""> z
    [1] 1 1 1 2 5 ...(iii)
  • u<-seq br=""> u
    [1] 1 3 5 7 9 ...(iv)
  • v<-rbinom br=""> v
    [1] 4 6 6 4 4 ...(v)
  • x<-c br=""> y<-x>14.53
    y
    [1] TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE ...(vi)
চল এবার উপরের উদাহরণ গুলোকে ব্যাখ্যা করা যাক। এখানে মোট ছয় ধরনের vector দের কথা বলা হয়েছে।
(i) এর দ্বারা 1 থেকে 5 অবধি একটি সংখ্যার sequence তৈরী করতে বলা হয়েছে।
(ii) এর দ্বারা বলা হয়েছে [-1,1] interval কে সমান পাঁচ ভাগে ভাগ করতে, যেখানে প্রতিটি ভাগ হল y vector এর এক একটি component।
(iii) এ rep(a,r) নামের একটি function কে কাজে লাগানো হয়েছে, যার কাজ হল a কে পরপর r বার লেখা বা পুনঃরাবৃতি করা এবং সেগুলিই হল z vector টির components ।
(iv) দিয়ে 1 থেকে শুরু করে 10 অবধি একটি সংখ্যার sequence তৈরী করতে বলা হয়েছে, যেখানে sequence টির প্রতিটি component এর মধ্যে পার্থক্য হল 2।
(v) এর দ্বারা rbinom(m,n,p) function কে কাজে লাগিয়ে binomial population থেকে পাঁচটি random number তোলা হয়েছে, যেখানে parameter গুলি হল n=10 এবং p=0.5 আর এখানে ঐ random number গুলোই হল v vector টির পাঁচটি component। (vi) এর y vector টি তৈরী হয়েছে "x vector টির প্রতিটি element কি 14.53 এর চেয়ে বড়?" তুলনা করে। y এর মতন vector দের R এর ভাষায় বলা হয় logical vector।
ভেক্টর বীজগণিতে R এর প্রয়োগ (Applying R in vector algebra): ধরা যাক, x ও y দুটি vector R এ define করা হয়েছে। নীচে কি কি function ব্যবহার করে কি কি করা যায় তা ব্যাখা করলাম...
Function Output
x+y component wise summation
x-y component wise subtraction
x*y component wise multiplication
x/y component wise division
sort(x) sorting the elements of x in ascending order
sort(x,decreasing=TRUE) sorting the elements of x in descending order
cumsum(x) returns a vector of cumulative sums
max(x) returns the maximum among the elements of x
min(x) returns the minimum among the elements of x
sqrt(x) returns a vector of the sqr. roots of the elements of x
mean(x) returns the arithmatic mean of the elements of x
sd(x) returns the std. dev. of the elements of x
var(x) returns the variance of the elements of x
cor(x,y) returns correlation coeff. between x & y
length(x) shows the cardinality of the vector x

Probability density নির্ণয় করা, Cumulative probability নির্ণয় করা, Quantile নির্ণয় করা ও random number তুলতে শেখা (To determine the probability density, cumulative probability, quantiles and generation of random observations associated with a random variable with R): প্রত্যেক probability distribution এর ই R language এ কিছু সংক্ষিপ্ত নাম আছে, যেগুলির তালিকা নীচে দেওয়া হলঃ
Distribution R name Additional arguments
Beta beta shape1,shape2,ncp
Binomial binom trial number(n),probability of success in a single trial
Cauchy cauchy location,scale
Chi-squared chisq df,ncp
Exponential exp rate
Snedecor's F f df1,df2,ncp
Gamma gamma shape,scale
Geometric geom probability
Hypergeometric hyper m,n,k
Log-normal lnorm meanlog,sdlog
Logistic logis location,scale
Negative binomial nbinom size,probability
Normal norm mean,sd
Poisson pois lambda
Signed rank signrank n
Student's T t df,ncp
Uniform unif minimum,maximum
Weibull weibull shape,scale
Wilcoxon wilcoxon m,n
  • কোনো distribution এর একটি point, x এ density বের করার জন্য ddistribution(x) ব্যবহার করতে হবে, যেখানে distribution হল একটি specific distribution, যেমন norm অর্থাৎ normal distribution।
  • Cumulative probability অর্থাৎ P[X ≤ x] বের করার জন্য pdistribution(x) ব্যবহার করতে হবে। কিন্তু যদি কোনো সময় upper tail probability বের করতে হয়, তবে pdistribution(x,lower.tail = FALSE) বা 1-pdistribution(x) ব্যবহার করতে হবে। যেমন-
    pnorm(0.0,mean = 0,sd = 1) #P[X <= 0.0] where X~N(0,1)
    [1] 0.5
    pnorm(1.25,lower.tail = FALSE) #P[X>1.5]
    [1] 0.1056498
    pchisq(5.5,df = 2,lower.tail = FALSE) #P[X > 5.5] where X~ Chisqr(2)
    [1] 0.06392786
  • Quantile দের বের করার জন্য qdistribution(prob) ব্যবহার করতে হবে, যেখানে distribution হল আগের মতোই কোনো নির্দিষ্ট probability distribution। ধরা যাক, আমাদের বলে দেওয়া আছে α = 0.05, standard normal variate এর ক্ষেত্রে কোন্‌ point এর উপরে থাকার probability 0.05 অর্থাৎ τα=0.05 বের করতে হবে। এখানে R code টি হবে,
    qnorm(0.05,lower.tail = FALSE)
    ফলে R console এ উত্তর আসবে,
    [1] 1.644854
    যেহেতু আমরা এখানে upper α value টি কে চাইছি, তাই lower.tail = FALSE লেখা হয়েছে। একই রকম ভাবে χ2-distribution with degree(s) of freedom m = 7 এর জন্য upper α=0.05 value পাওয়া যাবে এরকম ভাবে,
    qchisq(0.05,df = 7,lower.tail = FALSE)
    যার উত্তর হবে,
    [1] 14.06714
    আবার binomial(n = 10,p = 0.35) এর ক্ষেত্রে α=0.05 জন্য p-value টি পাওয়া যাবে এরকম ভাবে,
    qbinom(0.05,10,0.35,lower.tail = FALSE)
    [1] 6

  • কোনো distribution (অথবা population) থেকে random number তোলার জন্য rdistribution(# of samples, distributional parameters) function টি ব্যবহার করতে হবে, যেখানে আগের মতোই distribution হল কোনো নির্দিষ্ট probability distribution। উদাহরণস্বরূপ binomial(n=10,p=0.35) থেকে 10 টি random number তোলা যাবে এরকম ভাবে,
    rbinom(10,10,0.35)
    [1] 4 3 3 2 3 1 7 3 2 2
    আবার N(µ = 3.5,σ = 0.04) distribution থেকে 15 টি random number তোলা যাবে এরকম ভাবে,
    rnorm(15,3.5,0.04)
    [1] 3.489114 3.488796 3.447587 3.543243 3.514604 3.466185 3.508065 3.524532
    [9] 3.429224 3.515787 3.463531 3.574148 3.516575 3.537501 3.479112
মনে রেখঃ যে কোনো distribution থেকে R ব্যবহার করে কোনো তথ্য (যেমনঃ cumulative probability) জানার আগে সেই distribution এর সবরকম additional argument গুলি R code টি তে অবশ্যই ব্যবহার করতে হবে, তা না হলে syntax error দেখাবে।
খুব স্বাভাবিক ভাবেই তোমাদের মনে প্রশ্ন আসতে পারে যে বাম দিকের ওই "[1]" , "[9]" কেন লেখা হচ্ছে ??? আসলে এর কারন হলো যে সমস্ত output একটি লাইনে লেখা যায় নি, কিছু output নিচের নাইনেও লেখা হয়েছে। উপরের উদাহরণে [1] ও [9] এর মাধ্যমে বলতে চাওয়া হয়েছে যে প্রথম লাইন টি 1 নম্বর ও দ্বিতীয় লাইন টি 9 নম্বর output দিয়ে শুরু হয়েছে।


R ব্যবহার করে ম্যাট্রিক্স সংক্রান্ত সমস্যার সমাধান করা (Application of R to matrix related problems): একটি বাস্তব ঊদাহরণ নিয়ে কাজ করার জন্য আমরা R এর built-in package ‘MASS’ কে ব্যবহার করব এইভাবে,
library(MASS)
data()
এর ফলে R console এ যা ভেসে উঠবে তার ছবিটি নীচে দেওয়া হল,

এখানে "AirPassengers","BJsales",...,"OrchardSprays",... এইগুলি হল একেকটি dataset, যাদের প্রতিটির মধ্যে কিছু real life data রয়েছে। এখন আমরা CO2 dataset এর অন্তর্গত data নিয়ে কাজ করতে চাই। এই data কে R console এ নিয়ে আসার জন্য console এ যা type করতে হবে তা হল,
CO2
এরফলে নীচের ছবির মতন একটি আলাদা window দেখতে পাবে,

এখানে একটি ব্যাপার খুব ভালো করে লক্ষ্য কর, সেটি হল head(CO2)। এটার কাজ হল একটা বড় ডাটা'র প্রথম ৬ টি row কে print করা। এবার তোমরা ঠিক একই ভাবে tail(CO2) দিয়ে দ্যাখতো কি হয়। খুব বড় data এর structure বোঝার জন্য এদু'টিকে মাঝে মাঝেই ব্যবহার করা হয়। এবার আসল কথায় আসি, এখানে uptake একটি variable, যার মধ্যে রয়েছে বিভিন্ন গাছের দ্বারা CO2 শোষণের পরিমাণ। এখানে আমরা ভাবতেই পারি যে uptake একটি vector, যার element গুলো হল 16.0, 30.4, ..., 38.8, ..., 19.9। আমাদের উদ্দেশ্য হল ঐ সব পরিমাণ সূচক সংখ্যা গুলো কে একটি matrix এর আকারে প্রকাশ করা। কিন্তু সমগ্র dataset থেকে uptake নামক column টিকে আলাদা করা যাবে কি ভাবে?? এটা করা যাবে দুই ভাবে,
CO2$uptake (এক লাইনে)
অথবা,
attach(CO2)
uptake (দুই লাইনে)
দুই লাইনে হলেও প্রথমের কায়দাটায় একটু বেশী লিখতে হওয়ার জন্য আর সেই সঙ্গে লেখাটাও একটু জটিল হওয়ার কারণে এইসব ক্ষেত্রে প্রথমেই attach(dataset_name) এর মাধ্যমে dataset টিকে R console এ attach করে নেওয়া হয়। তারপর এর অন্তর্গত প্রতিটি data column সাধারণ নিয়মে access করা হয়। যায়হোক, উপরের কোনো একটি কোড ব্যবহার করার ফলে console এ যা দেখাবে তা এরকম,

এবার তাহলে আলাদা করা গেছে। এখন এই সংখ্যা গুলোকে আমরা matrix form এ লিখব। সবার আগে CO2$uptake vector টির length জানা দরকার।
length(CO2$uptake)
উত্তর আসবে,
84
ধরা যাক 84 টি সংখ্যা কে আমরা 7X12 আকারের matrix form এ row wise লিখতে চাই। তবে তা করা যাবে এভাবে,
matrix(CO2$uptake,nrow = 7,ncol = 12,byrow = TRUE)
এরফলে তুমি দেখতে পাবে নীচের ছবির মতন একটি matrix,

যদি কেউ সংখ্যা গুলোকে column wise লিখতে চাই, তবে তাকে byrow = FALSE লিখতে হবে। এটা নিজে করে দ্যাখ। এখন ধরা যাক, x = (5.6,2.3,3.2,4.25,6.39,2.56,5.78,7.45,4.36)y = (1,0,0,0,1,0,0,0,1) vector দুটি থেকে A ও B দুটি matrix তৈরী করা হয়েছে। আমরা যেসব matrix operations জানি, তা R দিয়ে কিভাবে সহজে করা যায়, সেসব নীচের ছবি গুলোতে R code সহ দেখানো হল,
  • ম্যাট্রিক্সের যোগ ও বিয়োগ-
    বিয়োগ করা যাবে একই নিয়মে। নিজে করে দ্যাখ।

  • ম্যাট্রিক্সের গুণন- এর জন্য সাধারণ গুণন চিহ্ন '*' এর বদলে '%*%' ব্যবহার করা হয়।

  • ম্যাট্রিক্সের পদ অনুযায়ী গুণন (elementwise product)- এর জন্য সাধারণ গুণন চিহ্ন '*' ব্যবহার করা হয়।

  • ট্রান্সপোজ নির্ণয়- এর জন্য t(matrix) ব্যবহার করা হয়।

  • ডিটারমিন্যান্ট নির্ণয়- এর জন্য det(matrix) ব্যবহার করা হয়।

  • ইনভার্স বা বিপরীত ম্যাট্রিক্স নির্ণয়- এর জন্য solve(matrix) ব্যবহার করা হয়।
    A matrix ও তার inverse এর product করে দ্যাখতো identity matrix হয় কি না।

  • AX=b আকারের সমীকরণের সমাধান করা- A ও b দেওয়া থাকলে সমাধান vector,x, পাওয়ার জন্য solve(A,b) ব্যবহার করা হয়।

  • Eigen values ও eigen vectors বের করা- একটি matrix এর eigen value ও eigen vector সমূহ নির্ণয়ের জন্য eigen(matrix) ব্যবহার করা হয়।
    এখানে $values হল eigen value দের নিয়ে তৈরী একটি vector এবং $vectors হল eigen vector দের নিয়ে তৈরী একটি matrix।

  • ম্যাট্রিক্সের diagonal element দের নিয়ে একটি vector তৈরী করা- একটি square matrix দেওয়া থাকলে, তার diagonal elements গুলোকে নিয়ে একটি vector তৈরী করার জন্য diag(matrix) ব্যবহার করতে হয়।

  • vector এর element দের নিয়ে diagonal matrix তৈরী করা- একটি vector x দেওয়া থাকলে, তার element গুলোকে নিয়ে একটি diagonal matrix তৈরী করতে হলে diag(x) ব্যবহার করতে হবে।

  • বিভিন্ন মাত্রার identity matrix তৈরী করা- একটি k মাত্রার diagonal matrix পাওয়ার জন্য diag(k),k=1,2,3,… ব্যবহার করতে হবে।

  • Row vector দের একত্র করে matrix তৈরী করা- row vector বলতে বোঝায় সেসব vector দের, যারা কতকগুলি সংখ্যাকে আনুভূমিক ভাবে পাশাপাশি রেখে তৈরী হয়েছে অর্থাৎ কোনো matrix এর যেকোনো একটি row। এইরকম কতকগুলি row vector দের একত্র করে একটি matrix তৈরী করতে rbind(vector_1,vector_2,...) ব্যবহার করা হয়।

  • Column vector দের একত্র করে matrix তৈরী করা- একই ভাবে column vector বলতে বোঝায় সেসব vector দের, যারা কতকগুলি সংখ্যাকে উল্লম্ব ভাবে উপর-নীচে রেখে তৈরী হয়েছে অর্থাৎ কোনো matrix এর যেকোনো একটি row। এইরকম কতকগুলি row vector দের একত্র করে একটি matrix তৈরী করতে cbind(vector_1,vector_2,...) ব্যবহার করা হয়।


Book Reference

An Introduction to R (shipped with R installation, also available from CRAN)
The R language definition (shipped with R installation, also available from CRAN)
The R Student Companion, Brian Dennis, Chapman and Hall
Introductory Statistics with R (ISwR), Peter Daalgard

2 comments: