এক্সপ্লোরেটরি ডাটা এনালাইসিস
Last updated
Last updated
আমরা অনেক বড় একটা কাজ সেরে ফেলেছি। জুপিটার নোটবুকে আমাদের "train" ডাটাসেটটিকে লোড করে ফেলেছি। এখন আমি আপনাদেরকে ছোট্ট একটা টাস্ক দিব। আপনি একিভাবে জুপিটার নোটবুকে টাইটানিক এর "test" ডাটাসেটটিও লোড করে নিন। আর সেইটা রেখে দিন "test" নামক ডাটাফ্রেমে।
কি সেরে ফেলেছেন তো টাস্ক টা। তো এখন আমাদের কাছে দুইটা ডাটাফ্রেম আছে। একটা হল "train" এবং আরেকটি হল"test"। আচ্ছা ডাটা তো আমরা পেয়েই গিয়েছি, তাহলে কি আমরা প্রস্তুত হয়ে গেলাম আমাদের প্রেডিকশন মডেল তৈরির জন্য? ধরুন, একটা বাচ্চা নতুন বর্ণমালা শিখছে। তার মা তাকে শেখানোর জন্য এক পৃষ্ঠা জুড়ে "A" লিখে তার হাতে দিয়ে বলে দিল এখানে সব "A" আছে। তারপর মা তার কাজে চলে গেলো। বাচ্চা টা খেলার ফাঁকে ফাঁকে নিজে নিজেই পৃষ্ঠাটা দেখছে আর "A" কেমন সেইটা শিখে নিচ্ছে। মা এক ঘণ্টা পর কাজ সেরে এসে বাচ্চা কে কয়েকটা বর্ণমালা দেখায় প্রশ্ন করল, বলত বাবু কোনটা "A"। মা অবাক হয়ে দেখল বাচ্চাটা "A" এবং "B" দুইটাকেই "A" বলছে। মা তখন তার লেখা পৃষ্ঠাটা নিয়ে দেখলো সে ভুল করে কয়েক যায়গায় "A" এর বদলে "B" লিখেছে। বুঝেছেন তো ব্যাপারটা। যন্ত্রও তো শেখে ওই ডাটা থেকে, তাই ডাটায় যদি কোন ফাঁকফোকর আর ভুল থাকে তাহলে যন্ত্রও ভুল শিখবে। আমরা রিয়েল ওয়ার্ল্ড এ যত ডাটাসেট পাই অধিকাংশই অসম্পূর্ণ এবং অনেক ভুলে ভরা। তাই শুরুর কাজটা হল ডাটাসেট কে ভালো করে চেনা। হৃদয় দিয়ে চিনতে হবে ডাটাসেটকে, বুঝতে হবে ভেতরের ডাটাগুলোর মধ্যকার সম্পর্ক, খুজে বের করতে হবে কোন মিসিং ডাটা আছে কিনা, খুজে বের করতে হবে কোন ভুল আছে কিনা ইত্যাদি। বয়সের একটা কলামে যদি কারোর বয়স "500" দেওয়া থাকে সেইটা ভুল নয় বৈকি! এইযে ডাটা নিয়ে এত পরিক্ষা নিরীক্ষা, একে ডাটা সাইন্স এর ভাষায় বলে এক্সপ্লোরেটরি ডাটা এনালাইসিস। নামেই বোঝা যায় জিনিষটা কি। এখন আমরাও এক্সপ্লোরেটরি ডাটা এনালাইসিসের মাধ্যমে আমাদের "train" আর "test" ডাটাসেটগুলোকে চিনব। আশা করা যায় এর ফলে এই ডাটাসেটগুলো সম্পর্কে আমরা কতকগুলি গুরুত্বপূর্ণ সিদ্ধান্তে উপনিত হতে পারব।
[নোটঃ "train" ডাটাসেটটি আমরা লোড করেছি "train" ডাটাফ্রেমে এবং "test" ডাটাসেটটি আমরা লোড করেছি "test" ডাটাফ্রেমে।]
১। প্রথমেই জুপিটার নোটবুকের সেলে নিচের কোডটি রান করি।
কি আসল আউটপুট? নিচের ছবির মতন আসছে তো।
দেখুন তো আউটপুট চেনা চেনা লাগে কিনা। হুম আমরা টাইটানিক কম্পিটিশন অধ্যায় "train" ডাটাসেট এর যে কলাম বা ফিচার বা ভেরিয়েবল গুলোর সাথে পরিচিত হয়েছিলাম সেইগুলোই দেখেতে পাচ্ছি। তাই হওয়ার কথা নয় কি? আপনারা "test" ডাটাসেটটিকেও টেস্ট করে দেখে নিন যে কলাম বা ফিচার বা ভেরিয়েবলগুলো ঠিক আছে কিনা।
২। আচ্ছা আমরা তো জানলাম যে আমাদের ডাটাসেটে কয়টা ফিচার আছে, কিন্তু টোটাল অবজারভেশন কয়টা সেইটা কিভাবে জানব আমরা? একটু চিন্তা করুন তো! আমরা ডাটাসেটকে যে ডাটাফ্রেমে রেখেছি তার রো সংখ্যাটাই কিন্তু টোটাল অবজারভেশন সংখ্যা। তাই না? নিচের কোডটি দিয়ে পেয়ে যাবেন ডাটাফ্রেম গুলোর রো সংখ্যা তথা ডাটাসেট এর অবজারভেশন সংখ্যা।
প্রথম সংখ্যাটি ডাটাফ্রেম এর রো সংখ্যা এবং দ্বিতীয়টি কলাম সংখ্যা। তাহলে আমরা দেখলাম যে "train" ডাটাসেট এ টোটাল ৮৯১ টি এবং "test" ডাটাসেট এ টোটাল ৪১৮ টি অবজারভেশন আছে।
ক। Survived, Pclass, Sex এবং Embarked এই কয়টি হল নমিনাল বা ক্যাটাগোরিকাল ভেরিয়েবল। Age এবং Fare এই দুইটি কন্টিনিউয়াস ভেরিয়েবল। SibSp এবং Parch এই দুইটি ডিসক্রিট ভেরিয়েবল। Ticket এবং Cabin হল আলফানিউমেরিক ভেরিয়েবল।
[নোটঃ ভেরিয়েবলের সংজ্ঞার সাথে তার প্রকারভেদ মিলিয়ে নিতে আর একবার টাইটানিক কম্পিটিশন অধ্যায় থেকে ঘুরে আসতে পারেন।]
খ। PassengerId, Survived, Pclass, SibSp, Parch এই কয়টি ভেরিয়েবলের ডাটাটাইপ হল "integer"। Age এবং Fare এই দুইটি ভেরিয়েবেলের ডাটাটাইপ "Float"। এবং বাকিগুলোর ডাটাটাইপ "string"।
গ। Age এবং Cabin ফিচার এর কয়েকটি ঘরে "NaN" আছে। "NaN" মানে হল "not a number"। এটা থাকার অর্থ হল এখানে ডাটা মিসিং আছে।
৪। ভেরিয়েবল গুলোর ডাটাটাইপ সম্পর্কে নিশ্চিত হতে এবং ডাটাসেটের মিসিং ডাটা সম্পর্কে স্বচ্ছ ধারনা পেতে নিচের কোড এবং তার আউটপুট দেখি।
আউটপুট থেকে দেখা যাচ্ছে ভেরিয়েবলগুলোর ডাটাটাইপ সম্পর্কে আমাদের ধারনা সঠিক ছিল। পাইথনে "string" মানে কিন্তু "object"। আরও দেখা যাচ্ছে Age, Cabin এবং Embarked ভেরিয়েবল গুলিতে কিছু ডাটা মিসিং আছে("null" মানে কিছুই নেই এবং "non-null" এর মানে এর বিপরীত )। বিশেষ করে Cabin ভেরিয়েবলে মাত্র ২০৪ টি ডাটা আছে এবং বাকি ৮৯১-২০৪= ৬৮৭ টি ডাটাই মিসিং। Embarked ভেরিয়েবলে মাত্র ২ টি ডাটা মিসিং।
৫। এবার আমরা ভেরিয়েবল গুলোর ডাটাগুলোকে ভালো মতন পর্যবেক্ষণ করব। তাদের ডিস্ট্রিবিউশন দেখব। নিচের কোডটি এবং তার আউটপুট দেখি।
অনেক কিছু দেখা যাচ্ছে টেবিলটাতে। কিন্তু খেয়াল করুন, সবগুলো ভেরিয়েবল কিন্তু দেখাচ্ছেনা। সমস্যা নেই। বাকি গুলো আমরা আলাদা ভাবে একটু পরেই দেখব। আশা করি স্টাটিস্টিক্স সম্পর্কে অল্পস্বল্প ধারনা আছে আপনাদের। অন্তত উপরের টেবিলের বাম দিকের ঘরের জিনিষগুলো আপনারা বুঝেন। ধরে নিলাম কিন্তু! যে আপনারা ওই টার্মগুলো বুঝেন। তাহলে ভালো মতন লক্ষ্য করুনতো টেবিলটাতে। passengerID সবার জন্যই আলাদা। Survived ভেরিয়েবল থেকে দেখা যাচ্ছে অধিকাংশ মানুষই মারা গিয়েছে। Pclass ভেরিয়েবল থেকে দেখা যাচ্ছে যে জাহাজের অধিকাংশ যাত্রীই ছিল ৩য় শ্রেণীর। Age ভেরিয়েবল থেকে বোঝা যাচ্ছে মাঝ বয়সী যাত্রীদের সংখ্যাই বেশি ছিল এবং বৃদ্ধ বয়সের যাত্রীর সংখ্যা খুবই কম ছিল। SibSp ভেরিয়েবল থেকে দেখা যায় অল্প সংখ্যক মানুষের সাথে তাদের Sibling অথবা Spouse ছিল। Parch ভেরিয়েবল থেকে বোঝা যায় যে অধিকাংশ মানুষের সাথেই parent বা Children ছিলোনা। আর সবশেষে Fare ভেরিয়েবল থেকে দেখা যাচ্ছে খুব অল্প সংখ্যক পাসেঞ্জার এর জন্য Fare খুব বেশি তাছাড়া বাকিদের জন্য এটা খুব বেশি ভ্যারি করেনা। এবার নিচের কোডটি ও তার আউটপুট লক্ষ্য করুন।
যাক, তাহলে বাকি ভেরিয়েবল গুলো থেকে কি কি তথ্য পাচ্ছি দেখে নেই। উপরের টেবিল থেকে এই টেবিল টা একটু আলাদা সেইটা খেয়াল করেছেন কি? আসলে উপরের টেবিলটা সব নিউমেরিক্যাল ভেরিয়েবল গুলোর ডাটা ডিস্ট্রিবিউশন দেখিয়েছিল। এবং এটা স্ট্রিং টাইপের ভেরিয়েবল গুলোর ডাটা ডিস্ট্রিবিউশন দেখাচ্ছে। তাই মেজারমেন্টের মেট্রিকস ও এখানে আলাদা। Name ভেরিয়েবল থেকে দেখা যাচ্ছে যে প্রত্যেকেটা যাত্রীর নামই আলাদা। Sex ভেরিয়েবেল থেকে দেখা যাচ্ছে ৮৯১ জনের মধ্যে ৫৭৭ জনই পুরুষ যাত্রী । Ticket এবং Cabin ভেরিয়েবল থেকে দেখা যায় যে এইগুলোর ডাটার মধ্যে বেশকিছু ডুপ্লিকেশন আছে। আর সবশেষে Embarked ভেরিয়েবল থেকে আমরা পাই যে "S" এর ফ্রিকুয়েন্সি সবথেকে বেশি মানে জাহাজের বেশিরভাগ যাত্রীই Southampton পোর্ট থেকে জাহাজে আরোহণ করেছিল।
তাহলে এখন দেখি উপরের এনালাইসিস থেকে আমরা কি কি সিদ্ধান্তে নিতে পারিঃ
সিদ্ধান্ত ১ঃ যেহেতু Cabin ভেরিয়েবলটির সিংহভাগ ডাটা মিসিং এবং অবশিষ্ট ডাটার মধ্যেও প্রচুর ডুপ্লিকেশনে আছে সেহেতু মডেল তৈরির সময় আমরা এই ভেরিয়েবলটি বিবেচনা করা থেকে বাদ দিতে পারি। কেন একটু ভাবুন তো? ডাটাই তো নেই, আবার অবশিষ্টাংশ ডাটার অধিকাংশই একি রকমের তাহলে মেশিন শিখবে কি দেখে আর পার্থক্য করবেই বা কি দেখে।
সিদ্ধান্ত ২ঃ Cabin ভেরিয়েবলের মতন Ticket ভেরিয়েবলটিও আমরা বাদ দিতে পারি অতিরিক্ত ডুপ্লিকেশন থাকার কারনে।
সিদ্ধান্ত ৩ঃ যেহেতু Age এবং Embarked ভেরিয়েবলগুলোর অল্প কিছু ডাটা মিসিং সেহেতু আমরা মিসিং ডাটা গুলো 'ফিল আপ' করার চেষ্টা করব।
সিদ্ধান্ত ৪ঃ Name এবং PassengerID এই দুইটি ভেরিয়েবল ও আমরা বাদ দিতে পারি। সূক্ষ্ম ভাবে যদি আমরা চিন্তা করি তাহলে এইটুকু আমরা উপলব্ধি করতে পারি যে এই দুইটা ভেরিয়েবল এর সাথে মানুষের বাঁচা কিম্বা মরার কোন সম্পর্ক থাকতে পারেনা।
সিদ্ধান্ত ৫ঃ এছাড়াও যেহেতু Sex এবং Embarked ভেরিয়েবল দুইটি ক্যাটাগরিকাল কিন্তু তাদের ডাটা টাইপ string সেহেতু আমরা এই দুইটি ভেরিয়েবলের ডাটা টাইপ কে string থেকে integer এ পরিবর্তন বা ম্যাপিং করতে পারি। প্রেডিকশন মডেল এলগোরিদমগুলোর দক্ষতা বৃদ্ধির জন্য এই কনভার্শন জরুরী।
উদাহরনের কোডটি pandas প্যাকেজের ডাটাফ্রেম ডাটা স্ট্রাকচারের describe() মেথডটি সম্পর্কে দেখাচ্ছে। আউটপুট কিন্তু আরও বড়, খুঁটিনাটি সবকিছু সম্পর্কে দেখায়। help() মেথডটা সম্পর্কে জানতে আপনাকে হেল্প করতে নিচে আরও কয়েকটা উদাহরন দিলাম, আউটপুট ছাড়া।
রান করে আউটপুট গুলো পড়ে দেখুন। আপনাকে একটা মূল্যবান পরামর্শ দিতে চাই। help() মেথড ব্যবহারের অভ্যাস গড়ে তুলুন। অ্যাট্রিবিউট বা মেথডটি যে ডাটা স্ট্রাকচার এর জন্য, help() এ সেই অ্যাট্রিবিউট বা মেথডের আগে ডট চিহ্ন দিয়ে সেই ডাটাস্ট্রাকচার এর নাম লিখতে হবে। এবং ডাটা স্ট্রাকচার টির আগে ডট চিহ্ন দিয়ে তার প্যাকেজের নাম লিখতে হবে। আর একটা কথা কিন্তু সব সময় মাথায় রাখতে হবে, পাইথন কিন্তু কেস সেনসিটিভ(মানে a কে A অথবা A কে a লিখলে কিন্তু ভুল হবে)।
আমাদের "train" ডাটাসেটের সবচেয়ে গুরুত্বপূর্ণ ভেরিয়েবল হল Survived ভেরিয়েবলটি। কারন এটিই আমাদের টার্গেট ভেরিয়েবল। আর তাই অন্যান্য ভেরিয়েবলগুলোর সাথে এই টার্গেট ভেইয়েবলের সম্পর্ক জানাটা খুবই জরুরি। যে ভেরিয়েবলটির উপর মানুষের বেঁচে যাওয়া বা মরা নির্ভর করছে সেই ভেরিয়েবলটি মডেল তৈরির সময় আমাদেরকে অবশ্যই বিবেচনা করতে হবে। অনুরুপভাবে যেটার উপর নির্ভর করছেনা সেটা আমরা বিবেচনা করবনা।
[নোটঃ আমরা ডাটাগুলোর ভেতরের সম্পর্ক কিছু ভিজ্যুয়ালাইজেশন এর মাধ্যমেও দেখব। আর পাইথনে ভিজ্যুয়ালাইজেশনের জন্য নিচের দুইটি প্যাকেজ রয়েছে। আমরা এই প্যাকেজ দুইটি আমাদের কোড এ ইমপোর্ট করে নেই। এবং help() মেথডের সাহায্যে এদের সম্পর্কে জেনে নেই।]
আচ্ছা একটা মানুষ সম্পর্কে সবার প্রথমেই আমরা কি জানি? জানি যে সে আসলে পুরুষ না মহিলা। আমরা আগেই দেখেছি যে টাইটানিক জাহাজে পুরুষের সংখ্যা মহিলাদের সংখ্যার তুলনায় বেশি ছিল। কিন্তু এই লিঙ্গ ভেদে তাদের বাঁচা বা মরার কোন সম্পর্ক দেখেনি। নিচের কোডটি দেখাচ্ছে আসলে শেষ পর্যন্ত কত শতাংশ মহিলা এবং কত শতাংশ পুরুষ বাঁচতে পেরেছিল।
দেখা যাচ্ছে প্রায় ৭৪ শতাংশ মহিলারাই বেঁচে ফিরে আসছিলেন। অন্যদিকে, মাত্র ১৮ শতাংশ পুরুষ বেঁচে ফিরে আসছিলেন।
আমরা আগেই দেখেছি যে জাহাজে মাঝবয়সি মানুষের সংখ্যাই বেশি ছিল এবং অল্প সংখ্যক বৃদ্ধ মানুষ ছিল। আরও নিশ্চিত হতে নিচের কোড এবং তার আউটপুট দেখি।
তাহলে কি দাঁড়ালো? ১৫-৩৫ বছরের যাত্রীর সংখ্যাই জাহাজে বেশি ছিল। আমরা যদি উপরের তিনটা হিস্টোগ্রাম পর্যবেক্ষণ করি তাহলে এটা বোঝা যায় যে ৪ বছরের নিচে যাদের বয়স তাদের বেঁচে যাওয়ার হার বেশি। বৃদ্ধরা সবাই বেঁচে গিয়েছিলেন। কিন্তু এর মাঝে যাদের বয়স তাদের বেশির ভাগই বাঁচতে পারেননি।
এর পর আমরা দেখি Pclass কে আমরা আমাদের মডেল তৈরির সময় বিবেচনা করব কি করবনা। মানে মানুষের বাঁচা ও মরার উপর এটার কোন হাত আছে কিনা সেইটা বের করতে হবে। প্রথমেই দেখি কোন শ্রেণীর কত শতাংশ যাত্রী বেঁচেছে।
দেখা যাচ্ছে ১ম শ্রেণীর ৬২ শতাংশ, ২য় শ্রেণীর ৪৭ শতাংশ এবং ৩য় শ্রেণীর মাত্র ২৪ শতাংশ যাত্রী বেঁচেছিলেন। আমরা কিন্তু আগেই দেখেছি যে টাইটানিকে অধিকাংশ যাত্রীই ছিল ৩য় শ্রেণীর। আমরা Pclass, Sex এবং Survived এই তিনটা ভেরিয়েবলের সংযোগে নিচের বারপ্লটটি লক্ষ্য করি।
কি দেখতে পাই আমরা? পুরুষ যাত্রীদের অবস্থা খুবি খারাপ। তবে ২য় এবং ৩য় শ্রেণীর তুলনায় ১ম শ্রেণীর পুরুষ যাত্রী কিছুটা সৌভাগ্যবান ছিলেন। অন্যদিকে ১ম এবং ২য় শ্রেণীর অধিকাংশ মহিলা যাত্রী বাঁচলেও, ৩য় শ্রেণীর অধিকাংশ মহিলা যাত্রীদেরও লাইফবোট ধরার সৌভাগ্য হয়নি।
আচ্ছা একটা মানুষ যখন জাহাজডুবির মতন বিপদে পড়বে তখন সবার প্রথমেই সে কি করবে? মা হলে সে তার বাচ্চাকে আগে খুঁজবে, স্বামী তার স্ত্রীকে খুঁজবে, ভাই তার বোনকে খুঁজবে। মোট কথা হল পরবিবারের সবাই সবাইকে খুঁজবে। একত্রিত হওয়ার চেষ্টা করবে এবং তারপর সবাই মিলে একসাথে বাঁচার চেষ্টা করবে। কিম্বা পরিবারের পুরুষগুলো তখন পরিবারের মহিলা আর শিশুদের লাইফবোট এ তুলে দাওয়ার চেষ্টা করবে, এবং নিজের ভাগ্যকে বিধাতার হাতে ছেড়ে দিবে। কিন্তু পরিবার যদি বড় হয়, তখন সেই পরিবারের প্রতিটা সদস্যের একত্রিত হতেও বেশ সময় চলে যায়। তাহলে আমাদের কমন সেন্স বা ইনটুইশন কি বলে? পরিবারের সদস্য সংখ্যার উপরও মানুষের বাঁচা বা মরার একটা সম্পর্ক থাকতে পারে। আমরা SibSp এবং Parch এই দুইটা ভেরিইয়েবলের যোগফলের মাধ্যমে একটি পরিবারের মোট সদস্য সংখ্যা পাই। তাহলে আমরা এখন SibSp এবং Parch এই দুইটি ভেরিয়েবের সাথে Survived ভেরিইয়েবলের সম্পর্ক টা নিচে দেখে নেই।
দেখা যাচ্ছে আমাদের ধারনা সঠিক ছিল। বড় পরিবারের সদস্যদের বাঁচার সম্ভাবনা শূন্য।
আরও দুইটা ভেরিয়েবল আমাদের হাতে আছে, যাদেরকে আমরা এনালাইসিস করিনি। একটি Embarked এবং আরেকটি Fare ভেরিয়েবল। নিচে দেখি একজনের জাহাজে আরোহণের পোর্ট তাকে বাঁচাতে পারে কিনা।
আমরা কিন্তু আগে দেখেছি যে Embarked ভেরিয়েবলে "S" এর ফ্রিকুয়েন্সি সবচেয়ে বেশি অর্থাৎ Southampton পোর্ট থেকে সবচেয়ে বেশি যাত্রী জাহাজে আরোহণ করেছিল। উপরের টেবিল কি বলে। মাত্র ৩৩ শতাংশ যাত্রী বাঁচতে পেরেছিল যারা কিনা Southampton পোর্ট থেকে জাহাজে উঠেছিল। সবচেয়ে বেশি বেঁচে গিয়েছে সেই সব যাত্রীরা যারা Cherbourg থেকে জাহাজে উঠেছিল (প্রায় ৫৫ শতাংশ)। তার মানে বাঁচা মরার সাথে এই Embarked ভেরিয়েবেল এর একটা যোগসুত্র আছে।
Fare ভেরিয়েবলটি একটি কন্টিনিউয়াস ভেরিয়েবেল। আমরা Age ভেরিইয়েবলের ক্ষেত্রে দেখেছিলাম কন্টিনিউয়াস ভেরিয়েবেলকে উপরের টেবিল আকারে এনালাইসিস করার সমস্যা কোথায়। আমরা বরং প্রথমে এই Fare ভেরিয়েবলটির ডিস্ট্রিবিউশন দেখি এবং তারপর এর সাথে আমাদের টার্গেট ভেরিয়েবলের সম্পর্ক দেখি।
উপরের হিস্টোগ্রাম থেকে পরিষ্কার বোঝা যাচ্ছে যে অধিকাংশ মানুষের টিকেটের দাম ৩০ এর মধ্যে ছিল। আবার সবগুলো হিস্টোগ্রাম পর্যবেক্ষণ করলে এটাও পরিষ্কার বোঝা যায় যে যারা একটু বেশি দামে টিকেট কিনেছিল, তাদের বাঁচার হার ছিল বেশি। তাহলে টিকেটের দামের সাথেও বাঁচা মরা নির্ভর করছে। তবে এখানেও, সুবিধা হত যদি ভেরিয়েবলটিকে আমরা কয়েকটা রেঞ্জে ভাগ করে ফেলতে পারতাম। যেমন, ৩০ এর নিচে যারা ভাড়া দিয়েছে তাদেরকে এক করে ফেলতাম, এভাবে। হিস্টোগ্রামই বলে দিচ্ছে, টিকেটের আলাদা আলাদা দামের চেয়ে দামের এক একটা রেঞ্জই কে বাঁচল না কে মরল তা নির্ধারণ করার জন্য যথেষ্ট।
তাহলে এখন দেখি আমরা কি কি সিদ্ধান্ত নিতে পারি।
সিদ্ধান্ত ৬ঃ Sex, Embarked, Pclass এই তিনটি ভেরিইয়েবলকে আমরা আমাদের মডেলিং তৈরির সময় ব্যবহার করব। যেহেতু এদের প্রত্যেকের সাথেই আমাদের টার্গেট ভেরিয়েবলের যোগসুত্র আছে।
সিদ্ধান্ত ৭ঃ Age এবং Fare এই দুইটি ভেরিইয়েবলকে আমরা কিছুটা পরিবর্তন করে (ছোট ছোট রেঞ্জে ভাগ করে) আমাদের মডেলে ব্যবহার করব। যেহেতু এদের সাথেও আমাদের টার্গেট ভেরিয়েবলের সম্পৃক্ততা আছে। তবে সুবিধার জন্য আমরা এদেরকে পরিবর্তন করে নিব।
সিদ্ধান্ত ৮ঃ পরিবারের মোট সদস্য সংখ্যা বের করার জন্য আমরা SibSp এবং Parch এই দুইটি ভেরিয়েবলের যোগফলের মাধ্যমে নতুন একটি ভেরিয়েবল তৈরি করব। এবং এই দুইটি ভেরিইয়েবলের পরিবর্তে নতুন ভেরিয়েবলটিকে আমরা আমাদের মডেল তৈরিতে ব্যবহার করব।
[নোটঃ আমরা কিন্তু সব এনালাইসিস "train" ডাটাসেটের উপর করলাম। কেন বলুন তো। কারন টার্গেট ভেরিইয়েবল টা এই ডাটাসেটেই আছে। আর আমাদের মুল লক্ষ্যই হল অন্যান্য ডাটাসেটের সাথে এই টার্গেট ভেরিয়েবলের সম্পর্ক বের করা। আর তারপর টার্গেট ভেরিয়েবলের সাথে সম্পর্কযুক্ত ভেরিয়েবল গুলোকে মেশিন লার্নিং এলগোরিদমে পাস করে দেওয়া।]
আমরা এই অধ্যায় "train" ডাটাসেটটিকে এনালাইসিস করার জন্য "train" ডাটাসেটের উপর যতগুলো পদ্ধতি প্রয়োগ করলাম কিম্বা যত যা কিছু করলাম এগুলোর মধ্যেই কেবল এক্সপ্লোরেটরি ডাটা এনালাইসিস সিমাবদ্ধ নয়। আরও হাজার রকম ভাবে, হাজার রকম পদ্ধতিতে আমরা এই এনালাইসিস করতে পারতাম। এবং আরও স্পেসিফিক সিদ্ধান্ত নিতে পারতাম। তবে আমরা শুরু করেছি এটাই বড় কথা। একবারেই, একদিনেই সব শিখে ফেলা যায়না। এই বইটা তো আপনাদের ব্যাসিক তৈরির জন্য। ব্যাসিকটুকু যত সহজে শিখবেন, সেইটা তত সহজে আপনার মনে গেঁথে যাবে। তাই এটা দরকার সবার শুরুতে। এটা শেষ করে আপনাকে পড়তে হবে, শিখতে হবে, জানতে হবে আরও হাজারো বই ঘেঁটে, আরও হাজারো জায়গা থেকে। আমিও থাকবো আপনাদের পাশে আপনাদের সহযোগিতায়। লেগে থাকতে হবে আপনাদের। তাহলেই না পৌছাবেন অনেক উপরে। শেষ করি একটা সুন্দর কোট দিয়ে। যার মাধ্যমেই বোঝা যায় এক্সপ্লোরেটরি ডাটা এনালাইসিস কতটা গুরুত্বপূর্ণ একটা জিনিষ।
If you torture the data long enough, it will confess.
-Ronald Coase, Economist
৩। এবার বরং আমরা ডাটাসেট গুলোকে একটু দেখি। কিন্তু ৮৯১ কিম্বা ৪১৮ রো সংখ্যার ডাটাসেট দেখা বড়ই কষ্টসাধ্য কাজ। তার চেয়ে বরং আমরা ডাটাসেট এর কিছু কিছু অংশ দেখি এবং সেখান থেকেই পুরা ডাটাসেটকে বোঝার চেষ্টা করি। নিচের কোডগুলি এবং তার আউটপুটগুলি লক্ষ্য করি। প্রথম কোডটি দিয়ে আমরা ডাটাসেট এর একদম উপরের ৫ টা অবজারভেশন এবং নিচের কোডটি দিয়ে ডাটাসেট এর একদম নিচের ৫ টা অবজারভেশন দেখতে পাচ্ছি। আপনি "head()" এবং "tail()" মেথড দুইটির প্যারেনথিসিস এর ভেতর আপনার ইচ্ছা মতন সংখ্যা দিয়ে আরও বেশি সংখ্যক অবজারভেশন দেখতে পারতেন। এখন আসুন দেখি কি কি উদ্ধার করতে পারি এগুলো থেকে।
এই পর্যায় পাইথন নিয়ে কিছু কথা না বললেই নয়। অনেকের কাছেই হয়ত উপরের কোডগুলো পুরোপুরি বোধগম্য নয়। এটাই স্বাভাবিক। তো উপরের কোড গুলোই আমরা ভেঙ্গে দেখি বরং। মনে আছে তো, আমরা "train" ডাটাসেটটাকে "train" ডাটাফ্রেম এ রেখেছিলাম। ডাটাফ্রেম কি তা আমরা আগের অধ্যায় শিখেছি। ডাটাসেটকে "train" ডাটাফ্রেম এ অ্যাসাইন করার পর যখনই আমরা আমাদের কোডের কোথাও "train" লিখি তার মানে আমরা আমাদের "train" ডাটাফ্রেমটিকে অ্যাকসেস করছি। উপরের প্রতিটা কোড আমরা শুরু করেছি "train" দিয়ে আর তারপর একটা ডট চিহ্ন দিয়েছি এবং আরও কিছু কোড লিখেছি তারপরে। এই ডট চিহ্ন এর পর আমরা যে শব্দ বা কোডগুলো লিখেছি সেগুলি আসলে না হয় অ্যাট্রিবিউট না হয় মেথড। এই দুইটার মধ্যে চোখে পড়ার মতন পার্থক্য হল, অ্যাট্রিবিউট এর পরে প্যারেনথিসিস থাকেনা এবং মেথড এর পরে থাকে। অ্যাট্রিবিউট দিয়ে আমরা ডাটাফ্রেমটির বিভিন্ন ফিচার সম্পর্কে দেখেতে পারি এবং জানতে পারি, কিন্তু ডাটাফ্রেমে কোন পরিবর্তন করতে পারিনা। অন্যদিকে মেথড দিয়ে আমরা ডাটাফ্রেমকে ম্যানিপুলেইট করতে পারি, ডাটাফ্রেমের অনেক ফিচার পরিবর্তন করতে পারি, এমনকি ডাটাফ্রেমের উপর বিভিন্ন ম্যাথমেটিক্যাল রুল অ্যাপ্লাইসহ আরও অনেক কিছু করতে পারি। আমরা সামনে বিভিন্ন প্যাকেজের অন্তর্ভুক্ত বেশকিছু অ্যাট্রিবিউট এবং মেথড দেখব আমাদের কাজের জন্য। মেথডের প্যারেনথিসিস এর মধ্যে আমরা বিভিন্ন প্যারামিটার ব্যবহার করতে পারি যার সাহায্যে আমরা এই মেথডে ভ্যালু বা আরগুমেন্ট পাস করি। প্রতিটা মেথডের ই কিছু নির্দিষ্ট প্যারামিটার থাকে। যেমন "train.head(10)" কোডের মাধ্যমে আমরা "train" ডাটাফ্রেমটিকে এর head() মেথড দিয়ে ম্যানিপুলেইট করছি। যেখানে আমরা মেথডটির প্যারামিটার n এর ভ্যালু হিসেবে ১০ পাস করছি মেথডে, ফলে মেথডটি আমাদেরকে ডাটাফ্রেমের প্রথম ১০ টি রো দেখাচ্ছে। প্যারামিটার সেট না করে দিলে ডিফল্টভাবে n=5 মানে ৫ টা রো দেখাবে। পাইথনের একটা বড় সুবিধা হল এর "help()" মেথড। এটি পাইথনের একটি বিল্ট-ইন প্যাকেজ মেথড। এই মেথডের প্যারেনথিসিস এর মধ্যে যে কোন প্যাকেজ বা এর যেকোন মেথড, অ্যাট্রিবিউট কিম্বা ডাটা স্ট্রাকচার এর নাম লিখে কোডটা রান করালে সেটার ডকুমেন্টেশন দেখায়, যেমন মেথডের ক্ষেত্রে তার কাজ কি, কি আউটপুট দেয়, কয়টা এবং কি কি প্যারামিটার নেয় ইত্যাদি। উদাহরন দেখি বরং।
আসলে যেকোন বিপদে এটাই হয়ে থাকে। আগে মহিলা এবং শিশুদের নিরাপদ নিশ্চিত করা হয়। তাহলে Sex ভেরিয়েবল এর পর পরই যে ভেরিয়েবল এর সাথে আমাদের টার্গেট ভেরিয়েবল এর নিবিড় সম্পর্ক থাকতে পারে সেইটা হল Age ভেরিয়েবল। তবে Sex ভেরিইয়েবল এর সাথে Survived ভেরিয়েবলের সম্পর্কটা আমরা উপরের টেবিল থেকে যত সহজেই বের করতে পারলাম, Age ভেরিইয়েবলের সাথে উপরের টেবিল থেকে তত সহজে আমরা এই সম্পর্ক বের করতে পারবোনা। কারনটা কি বলুন তো। কারন, Age একটা কন্টিনিউয়াস ভেরিয়েবল। এখানে এত গুলো ভ্যালু আছে যে আমরা উপরের টেবিল থেকে সম্পর্ক টা ঠিক ধরতে পারবোনা। আপনি টেবিল টা বানিয়ে দেখতে পারেন। সহজ হত যদি বয়স অনুযাই আমরা ভাগ করে ফেলতে পারতাম কে শিশু, কে মধ্য বয়সী আর কে বৃদ্ধ। যাই হোক একটা উপায় তো থাকবেই তাইনা। আমরা হিস্টোগ্রাম সম্পর্কে নিশচই জানি। এর মাধ্যমে বয়সকে আমরা কয়েকটা ছোট ছোট রেঞ্জে ভাগ করে নেই, এবং দেখি এই রেঞ্জের মধ্যে কতজন বাঁচল বা মরল। নিচের কোড এবং তার আউটপুট হিস্টোগ্রাম দেখি।