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

    Friday, May 24, 2019

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


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

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

    আজ থেকে প্রায় ২৮ বছর আগে লিনাস টরভাল্ডস নামের ফিনল্যান্ডের একজন উদাসমনা ভদ্রলোক এই 'লিনাক্স' জিনিসটা তৈরী করেছিলেন তার ইউনিভার্সিটির প্রজেক্টটা ঠিকঠাকমতো শেষ করবার জন্যে। যাই হোক, সেই কাহিনি আমরা অন্যদিন শুনবো! সেসময় কম্পিউটারগুলো চলত 'UNIX' অপারেটিং সিস্টেম ব্যাবহার করে। এই ইউনিক্সের সোর্সকোড জনসাধারণের জন্যে উন্মুক্ত ছিল না। মানে ডেভেলপাররা কীভাবে এই জিনিসটি বানিয়েছেন তার কোড কেউ জানত না, জানার সুযোগও ছিল না!

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

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

    যাইহোক, আবারো লিনাক্স কার্নেলের কথায় ফেরত আসি। লিনাক্স কার্নেলটাকে বেজ হিসেবে ধরে বানানো শুরু হলো নানা রকম অপারেটিং সিস্টেম। এই লিনাক্স বেজড অপারেটিং সিস্টেমগুলোকে আমরা আদর করে ডাকি "ডিস্ট্রিবিউশন" বা "ডিস্ট্রো"। এখন পর্যন্ত বাজারে অন্তত পাঁচশ অপারেটিং সিস্টেম আছে লিনাক্সের। যার যেমনটা দরকার সে তেমন করেই বানিয়ে নিয়েছে। যেমন হ্যাকার বা সিকিউরিটি বিশেষজ্ঞরা ব্যাবহার করেন "Kali Linux", "Parrot Os", "Black Arch"। আবার শিক্ষার্থীদের জন্যে আছে Edubuntu, Endless OS। বিজ্ঞানীরা ব্যবহার করেন 'Scientific Linux', 'Fedora Scientific' ইঞ্জিনিয়াররা ব্যবহার করেন 'LinuxCNC', 'CAELinux', জেনেটিক ইঞ্জিনিয়ার কেমিক্যাল ইঞ্জিনিয়াররা ব্যবহার করেন 'Bio Linux', 'Poseidon Linux' ইত্যাদি!

    আর আমার প্রায় পাঁচ বছরের লিনাক্স অভিজ্ঞতায় প্রায় চল্লিশটির মত অপারেটিং সিস্টেম ব্যাবহার করার সুযোগ হয়েছে। আমার কাছে মনে হয়েছে লিনাক্স মোটেও কঠিন কিছু নয়। এটি সার্বজনীন!

    কেন উইন্ডোজ ছেড়ে লিনাক্স ব্যাবহার করবেন? 
    • সিকিউরিটি: নাসা, সার্ন, গুগল, ফেসবুক সার্ভার সহ পৃথিবীর সমস্ত গুরুত্বপূর্ণ জায়গাগুলোতে লিনাক্স অপারেটিং সিস্টেম ব্যাবহার করা হয়। ইন্টারনেট দুনিয়ার প্রায় ৯০% সার্ভারে লিনাক্স ব্যাবহার করা হয় এর সিকিউরিটি সুনামের কারণে। লিনাক্স সার্ভারে অ্যাটাক করা প্রায় অসম্ভব একটি কাজ হ্যাকারদের জন্যে। একজন সাধারণ ইউজার হিসেবে সার্ভার সিকিউরিটি নিয়ে হয়ত আপনার মাথাব্যথা নাও থাকতে পারে, কিন্তু আপনি যদি পার্সোনাল কম্পিউটারের সিকিউরিটির কথা চিন্তা করেন সেক্ষেত্রেও লিনাক্স সবার আগে। উইন্ডোজ কম্পিউটারে হরেক রকম অ্যান্টিভাইরাস ইউজ করেন আপনারা ভাইরাস বা ম্যালওয়্যার থেকে বাঁচার জন্যে। অনেক অ্যান্টিভাইরাস কোম্পানি বাজারে তাদের ব্যাবসা টিকিয়ে রাখতে নিজেরাই ভাইরাস আপলোড করে থাকে। অনেক দাম দিয়ে এসব অ্যান্টিভাইরাস কিনতে হয়। সিরিয়াল কী আপডেট করতে হয়। উইন্ডোযে যেখানে এত ঝামেলা সেখানে লিনাক্স একদম দুর্ভেদ্য একটা অপারেটিং সিস্টেম। কোনোরকম অ্যান্টিভাইরাস প্রয়োজন নেই। আমি আজ পর্যন্ত কাউকে বলতে শুনিনি যে তার লিনাক্স কম্পিউটার এ ভাইরাস এ্যটাক হয়েছে!
    • দাম: উইন্ডোজ এর জেনুইন ভার্সন যদি আপনি ব্যাবহার চান তাহলে আপনাকে প্রায় ১০০ থেকে ২৫০ ডলার গুণতে হবে। কিন্তু লিনাক্স আজীবনের জন্য ফ্রি! হ্যা আপনি ঠিকই পড়েছেন! একটি টাকাও খরচ করতে হবে না আপনাকে।
    • পারফরম্যান্স: নতুন কম্পিউটার কেনার দুই-তিন মাস পরেই ভীষণ স্লো হয়ে যায় উইন্ডোজ কম্পিউটার। একটা ক্লিক দিয়ে ঘুমিয়ে যাচ্ছেন, ঘুম থেকে উঠে দেখবেন তখনো কাজ হয়নি! মাঝেমধ্যেই আছাড় মেরে ল্যাপটপ ভেঙ্গে ফেলার ইচ্ছে করে হয়ত। বছরের পর বছর লিনাক্স ইউজ করবেন, একটা দিনও স্লো হবে না! কম্পিউটার বন্ধও করে রাখতে হবে না। দিনের পর দিন কম্পিউটার চালু রাখতে পারবেন। আমি যখন এই লিখাটা লিখছি তখনো আমার কম্পিউটার একটানা ২২ দিন ধরে চলছে, এরমধ্যে একবারও শাট ডাউন করার দরকার হয়নি। বাইরে যাবার সময় ঘুম পাড়িয়ে রেখে গেছি (মানে স্লিপ মুডের কথা বলছি)। 
    • আপডেট: উইন্ডোজের বিরক্তিকর আপডেটের সম্মুখীন হননি এরকম মানুষ হারিকেন দিয়েও খুঁজে একটা পাওয়া যাবে বলে আমার মনে হয় না! ভীষণ রকম স্লো আর ল্যাগি আপডেট, সাথে রিস্টার্ট করার প্যারা তো আছেই! রিস্টার্ট করতে গেলেও চার পাচ মিনিট সময় চলে যায়! জীবনটাই তামাতামা হয়ে যায়! 😀লিনাক্সের যেকোনো অপারেটিং সিস্টেমে এই আপডেটের কাজটা সেরে ফেলতে পারবেন মাত্র একটা ক্লিক দিয়েই। সেইসাথে ইনস্টল থাকা প্রত্যেকটা অ্যাপ আপডেট হয়ে যাবে কোনো ঝামেলা ছাড়াই। উইন্ডোজের মত শুধুমাত্র সিস্টেম আপডেট হবে না। খুঁজে খুঁজে আলাদাভাবে আর কোনো অ্যাপ আপডেট করতে হবে না।
      মাত্র এক ক্লিক এ আপডেটের ঝামেলা শেষ!
    • অ্যাপ ইনস্টলেশন: উইন্ডোজে নতুন কোনো অ্যাপ ইনস্টল করাও ঝামেলা! গুগল থেকে খুজে খুজে ডাউনলোড করো, তারপর ইনস্টল করো, দুদিন যেতে না যেতেই আবার রেজিস্ট্রেশন কী দিতে হবে নাইলে অ্যাপ কাজ করবে না! মহা মুশকিল! লিনাক্সে এত খোঁজাখুঁজি করতে হবে না। সফটওয়্যার ম্যানেজারে সার্চ করবেন আপনার প্রয়োজনীয় অ্যাপ, একটা ক্লিক করবেন, কিচ্ছা খতম! কোনো সিরিয়াল কী, রেজিট্রেশন ফী হ্যানত্যান ঝামেলা নেই! সফটওয়্যার ম্যানেজার জিনিসটা প্লেস্টোরের মত, সার্চ করবেন আর ডাউনলোড করবেন। এই ফাঁকে একটি তথ্য জানিয়ে দেই, আপনার হাতে থাকা অ্যান্ড্রয়েড ফোনটিও কিন্তু লিনাক্স অপারেটিং সিস্টেম!
      Software Manager/Store
    • প্রাইভেসি: উইন্ডোজ আপনার অগোচর আপনার প্রত্যেকটি কর্মকাণ্ডই নজরদারী করে, আপনার প্রত্যেকটি ডেটা তাদের সার্ভারে জমা হতে থাকে। লিনাক্স আপনার কোনো ডেটাই তাদের সার্ভারে পাঠায় না, যদি প্রয়োজন বশত কোনো ডেটা বা সিস্টেম লগ তারা নিতে চায়, তার আগে অবশ্যই আপনাকে নোটিফাই করবে।
    • ইউজার ইন্টারফেস: এবার আসি ইউজার এনভায়রনমেন্ট এর ব্যাপারটায়। সারাটা জীবন ধরে উইন্ডোজের চেহারা দেখতে দেখতে বিরক্ত হয়েছেন? মাঝেমধ্যেই একটু সুন্দর করে সাজাতে চেয়েছেন নিজের কম্পিউটার? কিন্তু কালার ছাড়া আর কোনোকিছু চেঞ্জ করতে পারেননি? তাহলে আপনি চোখ বন্ধ করে লিনাক্স ব্যাবহার শুরু করুন। কালার, ফন্ট, আইকন থেকে শুরু করে কার্নেল পর্যন্ত চেঞ্জ করতে পারবেন দুই একটা ক্লিক করেই! আমি নিজেই তো Asus ল্যাপটপ এ MacBook এর স্বাদ নিচ্ছি! ও আচ্ছা! ম্যাক অপারেটিং সিস্টেমও কিন্তু লিনাক্স কার্নেলেই বানানো! মোদ্দাকথা, আপনি চাইলেই আপনার মনের মাধুরী মিশিয়ে আপনার কম্পিউটার কাস্টমাইজ করতে পারবেন। টাকা দিয়ে কিনেছেন, আপনার কম্পিউটার থাকবে আপনার ইচ্ছামত, তাহলে কেন উইন্ডোজ এর কাছে বন্দী হয়ে থাকবেন? আমার ল্যাপটপের স্ক্রিনশটগুলো দেখুন, ম্যাকবুক ভেবে ভুল করবেন না!

      ফাইল ম্যানেজার

      Application Drawer
      System Info
      System Monitor
    • টার্মিনাল: আপনি যদি অ্যাডভান্স ইউজার হয়ে থাকেন তাহলে উইন্ডোজ কমান্ড লাইনের সাথে নিশ্চয় পরিচিত। উইন্ডোজ কমান্ড লাইন অথবা পাওয়ারশেল জিনিসটাকে আমার কাছে নিছক খেলনা মনে হয়েছে লিনাক্স টার্মিনালের তুলনায়। টার্মিনাল দিয়ে আপনি চাইলে আপনার কম্পিউটার কেন মহাকাশ পর্যন্ত কাঁপিয়ে দিতে পারবেন। আমি একটুও বাড়িয়ে বলছি না, টার্মিনাল এতটাই শক্তিশালী! 
      Terminal
    যাই হোক, উইন্ডোজ এ কুয়োর ব্যাঙ হয়ে না থেকে লিনাক্সে আসুন, কম্পিউটিং বিস্ময়কর জগৎটা দেখুন! তবে আশার কথা হলো, দেরীতে হলেও মাইক্রোসফট এতদিনে বুঝতে শুরু করেছে ওপেন সোর্সের গুরুত্ব, লিনাক্সের গুরুত্ব। এবছরই তারা উইন্ডোজের ভিতরেই লিনাক্স ব্যাবহার করার জন্যে WSL (Windows Subsystem for Linux) রিলিজ করেছে। আগে এই কাজটিই করতে হতো বিভিন্নরকম ভার্চুয়াল মেশিন সফটওয়্যার ব্যাবহার করে। এছাড়াও তারা উইন্ডোজের জন্যে নতুন টার্মিনাল ডেভেলপ করা শুরু করেছে।
    New cmd
    এতক্ষণ ধরে বকবক করেও আমি শুধুমাত্র লিনাক্সের বাহ্যিক দিকটাই একটুখানি তুলে ধরেছি। ভেতরের কথাবার্তা নিয়ে, একজন বিগিনার হিসেবে লিনাক্সের কোন অপারেটিং সিস্টেমটি ব্যাবহার করতে পারেন, কীভাবে ইনস্টল করবেন, সেসব বিস্তারিত লিখবো অন্য একটি লিখায়। ভালো থাকুন। Happy Computing!

    ডেটা সায়েন্সে লিনাক্স কীভাবে কাজে লাগতে পারে জানতে চোখ রাখুন এখানে
    আরও পড়ুন
    ☛ লিনাক্স ও ডেটা সায়েন্স: tr কমান্ডের কারিশমা

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

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

    দেখা যাক, স্পেসকে ডট দিয়ে রিপ্লেস করা যায় কি না।
    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