এক্সপ্লোরেটরি ডেটা এনালাইসিস

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

এক্সপ্লোরেটরি ডেটা এনালাইসিস এর প্রাথমিক উদ্দেশ্য

  • ডেটাসেট এবং বিভিন্ন ভ্যারিয়েবল সম্পর্কে অনুসন্ধান / ইনভেস্টিগেশন করা।

  • নাল ভ্যালু এবং অন্যান্য অনাকাংখিত ভ্যালু সম্পর্কে অনুসন্ধান করা।

  • ডেটা সেটের ডেসক্রিপটিভ স্ট্যাটিস্টিক্স সম্পর্কে জানা ।

  • বিভিন্ন ভ্যারিয়েবলের মধ্যকার সম্পর্ক সম্পর্কে জানা ।

  • বিভিন্ন হিডেন ইনফরমেশন এক্সট্রাক্ট করা ।

  • মেশিন লার্নিং মডেল সম্পর্কে সিদ্ধান্ত নেয়া ।

ডেটা এনালাইসিসের জন্য আমরা যে ডেটা সেটটি ব্যাবহার করবো সেটি ১৯৫৮ সাল থেকে ২০১৬ সাল পর্যন্ত ঢাকার আবহাওয়ার ডেটা । ডেটা সেটটি বাংলাদেশ আবহাওয়া অধিদপ্তর থেকে সংগ্রহ করা হয়েছে।

ডেটাসেটের ভ্যারিয়েবল গুলোর পরিচয় ,

  • YEAR- Observation year

  • Month- Month

  • MaxTemp- Mean Maximum temperature per month (Unit-Celsius)

  • MinTemp- Mean Minimum temperature per month (Unit-Celsius)

  • RelativeHumidity- Mean RelativeHumidity per month (Unit-%)

  • Rainfall- Total Rainfall per month (Unit-mm)

১। ডেটা লোড করাঃ ঢাকার আবহাওয়ার ডেটা এনালাইসিসের জন্য প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট করে নেব।আমাদের ডেটাসেটটি অনলাইনে রাখা আছে , তাই সেখান থেকেই আমরা সরাসরি লোড করে নেব। এরপর ডেটার প্রথম ৫ টি রো এর মাধ্যমে জেনে নেব আমাদের এই ডেটার চেহারা কেমন ।

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import seaborn as sns
import pandas as pd
import numpy as np

url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-dhaka-weather1953-2016.csv'
df = pd.read_csv(url)
df.head()

২। নাল ভ্যালু চেকিংঃ এরপর আমরা দেখবো আমাদের ডেটাসেটে কোন নাল ভ্যালু আছে কিনা। নাল ভ্যালু চেকিং এর মাধ্যমে আমরা জেনে নিলাম আমাদের ডেটাসেটে কোন নাল ভ্যালু নেই। অর্থাৎ আমরা পরবর্তী এনালাইসিসের জন্য প্রস্তুত।

df.isnull().values.any()

False

৩। বর্ণনামূলক পরিসংখ্যানঃ এরপর describe( ) ফাংশনের মাধ্যমে আমারা ডেটাসেটের বর্ণনামূলক পরিসংখ্যান সম্পর্কে জানবো। এর মাধ্যমে আমরা দেখতে পাই,

  • গড় বৃষ্টিপাতের পরিমান ১৬৮.৩৭ মিমি, কোন কোন মাসে একেবারেই কোন বৃষ্টি হয়নি আবার কোন মাসে ৮৫৬ মিমি পর্যন্ত বৃষ্টিপাত হয়েছে ।

  • আবহাওয়ার গড় আদ্রতা বা হিউমিডিটি ৭৫.২০ । আদ্রতার স্ট্যান্ডার্ড ডেভিয়েশন অপেক্ষাকৃত কম অর্থাৎ হিউমিডিটির ভ্যারিয়্যান্স বা উঠানামা কম।

  • বাতাসের সর্বনিম্ন তাপমাত্রার গড় ২১.৫১ ডিগ্রী সেলসিয়াস , এই মানের মিনিমাম ভ্যালু ৯.৫ এবং ম্যাক্সিমাম ভ্যালু ২৮.১ ডিগ্রী সেলসিয়াস।

  • বাতাসের সর্বোচ্চ তাপমাত্রার গড় ৩৩.৪৩ ডিগ্রী সেলসিয়াস।

    সর্বোচ্চ তাপমাত্রার স্ট্যান্ডার্ড ডেভিয়েশন সর্বনিম্ন তাপমাত্রার

    স্ট্যান্ডার্ড ডেভিয়েশন এর তুলনায় কম। অর্থাৎ উষ্ণতার ক্ষেত্রে পার্থক্য বা উঠানামা শৈত্যের তুলনায় কম।

df.describe()

৪। কোরিলেশন- কোরিলেশন ফাংশনের মাধ্যমে আমরা সহজেই দেখতে পাই বিভিন্ন ভ্যারিয়্যাবেলের মাঝে পরস্পরের লিনিয়ার কোরিলেশন কেমন। এর মাধ্যমে আমরা অপেক্ষাকৃত শক্তিশালী কোরিলেশন থেকে বিভিন্ন ভ্যারিয়্যাবেলের মাঝে সম্পর্ক খুঁজে পাই।

আমরা দেখতে পাই বৃষ্টিপাতের সাথে সবথেকে উল্লেখযোগ্য শক্তিশালী সম্পর্ক রয়েছে হিউমিডিটির এবং পরবর্তী শক্তিশালী সম্পর্ক রয়েছে বাতাসের সর্বনিম্ন তাপমাত্রার।

df.corr()

৫। হিট্ম্যাপ-

correlation = df.corr()
plt.figure(figsize=(16, 8))
sns.heatmap(correlation, annot=True, linewidths=0, vmin=-1, cmap="RdBu_r")
plt.show()

৬। মাসভিত্তিক গড় বৃষ্টিপাত- গ্রুপবাই এবং মিন ফাংশনের মাধ্যমে আমরা প্রতি মাসের গড় বৃষ্টিপাত জানতে পারি। এর মাধ্যমে আমরা বুঝতে পারি বছরের মাঝামাঝি সময়ে বৃষ্টিপাত সাধারনত বেশী হয়। অপরদিকে বছরের শুরু এবং শেষে বৃষ্টিপাত অপেক্ষাকৃত কম হয়।

rain=df.groupby('Month')['Rainfall'].mean()
rain

৭। ডিস্ট্রিবিউশন প্লট - নিচের ফাংশনের মাধ্যমে আমরা কোন ভ্যারিয়্যাবেলের ডিস্ট্রিবিউশন প্লট আঁকতে পারি।

sns.distplot(rain)

৮। সবথেকে বৃষ্টিবহুল মাস- সর্টিং এর মাধ্যমে আমরা সহজেই জানতে পারি কোন মাসগুলোতে সবথেকে বেশী বৃষ্টিপাত হয় এবং কোন মাসগুলোতে সবথেকে কম বৃষ্টিপাত হয়।

df.groupby('Month')['Rainfall'].mean().sort_values(ascending=False)

৯। পুরো ডেটাসেটের বক্সপ্লট- নিচের ফাংশনের মাধ্যমে আমরা একসাথে পুরো ডেটাসেটের বক্সপ্লট তৈরি করতে পারি। বক্স প্লটের মাধ্যমে আমরা ডেটায় কোন এক্সট্রিম ভ্যালু থাকলে সহজেই বুঝতে পারি।

plt.figure(figsize=(16, 6))
ax = sns.boxplot(data=df, orient="h", palette="Set2")

১০। আলাদা আলাদা বক্সপ্লট- পুরো ডেটাসেটের বক্সপ্লট থেকে অনেক সময় এর অর্থ বুঝতে কষ্ট হতে পারে, কারন একসাথে অনেক ভ্যারিয়্যাবল এবং তাদের ভ্যালুর রেঞ্জের পার্থক্য বেশী থাকলে অনেক সময় বিষয়টি অনেকটা হিজিবিজি হয়ে যায়। এক্ষেত্রে আমরা চাইলে আলাদা আলাদা বক্স প্লট তৈরি করতে পারি। বৃষ্টিপাতের বক্সপ্লট থেকে আমরা দেখতে পাই বৃষ্টিপাতের মিনিমাম ভ্যালু শূন্য এবং ম্যাক্সিমাম ভ্যালু ৭০০ বা এর কাছাকাছি। এর পরের ভ্যালু গুলোকে এক্সট্রিম ভ্যালু বা আউটলায়ার হিসাবে দেখানো হয়েছে। অর্থাৎ এগুলো ব্যাতিক্রমি। হয়তো এগুলো অতিবৃষ্টি কালীন ভ্যালু। অপরদিকে বেশিরভাগ বৃষ্টিপাতের রেঞ্জ শূন্য থেকে ৩০০ এর ভেতরে থাকে।

ax = sns.boxplot(x=df["Rainfall"])

১১। একসাথে দুটি ভ্যারিয়েবলের বক্সপ্লট- আমরা চাইলে একসাথে দুটি ভ্যারিয়েবলের বক্সপ্লট করতে পারি। বৃষ্টিপাত এবং হিউমিডিটির বক্সপ্লট থেকে আমরা দেখতে পাই হিউমিডিটির বৃদ্ধির সাথে সাথে বৃষ্টিপাতও বৃদ্ধি পেয়েছে।

plt.figure(figsize=(16, 6))
ax = sns.boxplot(x="RelativeHumidity", y="Rainfall", data=df)

১২। ক্যাটেগরি বক্সপ্লট- ক্যাটেগরি বক্সপ্লট এর মাধ্যমে আমরা ক্যাটেগরিক্যাল ভ্যারিয়েবলের সাথে অন্য কোন ভ্যারিয়েবলের বক্সপ্লট করতে পারি। মাসের সাথে বৃষ্টিপাতের ক্যাটেগরি বক্সপ্লট করলে আমরা দেখতে পাই বছরের মাঝের মাসগুলোতে বৃষ্টিপাতের পরিমান বেশী , এই মাসগুলোর ডেটার বিস্তৃতিও বেশী । আবার যে মাসগুলোতে বৃষ্টিপাত কম হয় সেই মাসগুলোর ডেটার বিস্তৃতি কম।

plt.figure(figsize=(16, 6))
ax=sns.catplot(x="Month", y="Rainfall", kind="box", data=df);

১৩। হিস্টোগ্রাম- নিচের ফাংশনের মাধ্যমে আমরা পুরো ডেটাসেটের হিস্টোগ্রাম একসাথে আঁকতে পারি।

df.hist()

১৪। পেয়ারপ্লট- পেয়ার প্লট হচ্ছে ডেটাসেটের প্রতিটি ভ্যারিয়েবলের সাথে প্রতিটি ভ্যারিয়েবলের স্কাটার প্লট এবং প্রতিটি ভ্যারিয়েবলের ডিস্ট্রিবিউশন প্লট একসাথে আঁকার পদ্ধতি।

sns.pairplot(df);

১৫। স্কাটার প্লট- আমরা চাইলে যেকোন দুটি ভ্যারিয়েবলের মধ্যকার সম্পর্ককে আলাদা ভাবে স্কটার প্লটেও আঁকতে পারি। বৃষ্টিপাত এবং হিউমিডিটির ভেতরের স্কটার প্লটের থেকে আমরা পরিষ্কার বুঝতে পারি হিউমিডিটি বৃদ্ধির সাথে সাথে বৃষ্টিপাত বৃদ্ধি পায় । ভ্যারিয়েবলগুলোর মধ্যকার সম্পর্ক যত বেশী হবে স্কাটার প্লটে ডট গুলো লিনিয়ার লাইনের মত তত কাছাকাছি থাকবে।

plt.scatter(df.Rainfall,df.RelativeHumidity)

১৬। জয়েন্ট প্লট- এটি মূলত স্কাটার প্লট এবং ডিস্ট্রিবিউশন প্লটকে একসাথে ভিজুয়ালাইজ করতে ব্যাবহার করা হয়।

sns.jointplot(x="Rainfall", y="RelativeHumidity", data=df, kind="reg");

১৭। টাইম সিরিজ প্লট- আমরা লাইন প্লট আঁকার মাধ্যমে সময়ের সাথে পুরো ডেটা সেটের টাইম সিরিজ প্লট আঁকতে পারি। এর মাধ্যমে দেখতে পাই সময়ের সাথে বিভিন্ন ভ্যারিয়েবলের মান কিভাবে পরিবর্তিত হয়েছে (ঊর্ধ্বমুখী বা নিম্নমুখী)

import matplotlib.pyplot as plt

df.plot(figsize=(20,10))
plt.title("Time series plot of Dhaka weather")
plt.show()

১৮। নিম্ন তাপমাত্রা পরিবর্তনের টাইম সিরিজ -নিচের ছোট কোডের মাধ্যমে আমরা দেখতে পাই ১৯৫৩ সাল থেকে শুরু করে ২০১৬ সাল পর্যন্ত বাতাসের নিম্ন তাপমাত্রা ক্রমান্বয়ে বৃদ্ধি পেয়েছে।

plt.figure(figsize=(16, 6))
plt.title('Time series plot of MinTemp')
ax = sns.lineplot(x="YEAR", y="MinTemp",ci=10,color="blue", label="MinTemp",data=df)

১৯। গড় আদ্রতার টাইম সিরিজ- ১৯৫৩ সাল থেকে শুরু করে ২০১৬ সাল পর্যন্ত বার্ষিক আদ্রতার গড় নিয়ে তাইম সিরিজ করলে আমরা দেখতে পাই বাতাসের আদ্রতা ক্রমান্বয়ে কমেছে।

rh=df.groupby('YEAR')['RelativeHumidity'].mean()
plt.figure(figsize=(16, 6))
ax = sns.lineplot( label="Yearly Mean Relative Humidity",data=rh)

এক্সপ্লোরেটরি ডেটা এনালাইসিসের ফলাফল

  • ডেটাসেটে কোন নাল বা গারবেজ ভ্যালু নেই।

  • বৃষ্টিপাতের ডেটায় অনেক এক্সট্রিম ভ্যালু রয়েছে।

  • জুন , জুলাই এবং আগস্ট মাসে সবথেকে বেশী বৃষ্টিপাত হয়।

  • জুন , জুলাই এবং আগস্ট মাসে বাতাসের আদ্রতা / হিউমিডিটিও সবথেকে বেশী থাকে।

  • জানুয়ারি , ফেব্রুয়ারি এবং ডিসেম্বরে বাতাসের নিম্ন তাপমাত্রা সবথেকে কম থাকে।

  • এপ্রিল, মে , জুন ও জুলাই মাসে বাতাসের উচ্চ তাপমাত্রা সবথেকে বেশী থাকে।

  • বৃষ্টিপাতের সাথে আদ্রতার সবথেকে বেশী কোরিলেশন রয়েছে । বৃষ্টিপাতের সাথে দ্বিতীয় সর্বোচ্চ বাতাসের নিম্ন তাপমাত্রার।

  • বৃষ্টিপাতের সিজনালিটি রয়েছে অর্থাৎ প্রতি বছর নির্দিষ্ট মাসগুলোতে অধিক বৃষ্টিপাত হয়।

  • বাতাসের নিম্ন তাপমাত্রা সময়ের সাথে বেড়েছে।

  • বাতাসের আদ্রতা সময়ের সাথে কমেছে।

Last updated