Exploratory Data Analysis (EDA) হলো ডেটা সেটগুলো বিশ্লেষণ করার একটি পদ্ধতি, যাতে তাদের প্রধান বৈশিষ্ট্যগুলো সংক্ষিপ্ত করা যায় এবং প্রায়শই ভিজ্যুয়াল পদ্ধতির সাহায্যে করা হয়। ডেটা ক্লিনিং, ফিচার ইঞ্জিনিয়ারিং এবং মডেলিংয়ের মতো আরও জটিল কাজ শুরু করার আগে ডেটার কাঠামো, নিদর্শন, অস্বাভাবিকতা এবং গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি আবিষ্কার করা EDA-এর লক্ষ্য। এটি ডেটাসেটের অন্তর্নিহিত ডেটা সম্পর্কে ধারণা পেতে এবং প্রাথমিক ডেটা বিশ্লেষণে সহায়তা করে।
কেন Exploratory Data Analysis (EDA) গুরুত্বপূর্ণ?
এক্সপ্লোরেটরি ডেটা অ্যানালাইসিস (EDA) গুরুত্বপূর্ণ কারণ এটি ডেটা বিজ্ঞানীদের ডেটাসেটের একটি গভীর উপলব্ধি লাভ করতে সাহায্য করে। এটি নিম্নলিখিত কারণে অত্যন্ত গুরুত্বপূর্ণ:
- প্যাটার্ন এবং সম্পর্ক সনাক্তকরণ: EDA ডেটার মধ্যে লুকানো প্যাটার্ন, প্রবণতা এবং সম্পর্ক উন্মোচন করতে সাহায্য করে যা প্রথম দর্শনে স্পষ্ট নাও হতে পারে।
- ভুল এবং অসঙ্গতি সনাক্তকরণ: এটি ডেটার গুণমান পরীক্ষা করতে, অনুপস্থিত মান, ভুল ডেটা এন্ট্রি বা অসঙ্গতি সনাক্ত করতে সাহায্য করে যা বিশ্লেষণের ফলাফলকে প্রভাবিত করতে পারে।
- ডেটা ক্লিনিং এবং প্রস্তুতির নির্দেশিকা: EDA-এর মাধ্যমে প্রাপ্ত ধারণাগুলি ডেটা ক্লিনিং, রূপান্তর এবং বৈশিষ্ট্য প্রকৌশলের জন্য পরবর্তী পদক্ষেপগুলিকে নির্দেশ করে, যা মডেলিংয়ের জন্য ডেটা প্রস্তুত করে।
- বৈশিষ্ট্য নির্বাচন: এটি সবচেয়ে প্রাসঙ্গিক বৈশিষ্ট্যগুলি চিহ্নিত করতে সাহায্য করে যা মডেলের পূর্বাভাস শক্তি বাড়াতে পারে।
- অনুমান যাচাইকরণ: ডেটা সম্পর্কে প্রাথমিক অনুমান যাচাই বা খণ্ডন করতে সাহায্য করে।
- কার্যকর ডেটা ভিজ্যুয়ালাইজেশন: EDA ডেটা ভিজ্যুয়ালাইজেশনের জন্য সঠিক পদ্ধতি এবং সরঞ্জাম নির্বাচন করতে সহায়তা করে, যা ফলাফলগুলিকে কার্যকরভাবে যোগাযোগ করতে সাহায্য করে।
Exploratory Data Analysis (EDA) প্রকারভেদ
EDA-কে প্রধানত ডেটা সেটের মধ্যে ভেরিয়েবলের সংখ্যার উপর ভিত্তি করে তিনটি প্রধান প্রকারে ভাগ করা যেতে পারে:
1. এক-চলক বিশ্লেষণ (Univariate Analysis)
এই বিশ্লেষণে একটি একক ভেরিয়েবলের ডেটা পরীক্ষা করা হয়। এর লক্ষ্য হলো একটি ভেরিয়েবলের বিতরণ, কেন্দ্রীয় প্রবণতা (যেমন গড়, মধ্যমা, মোড), বিস্তার (যেমন পরিসর, মান বিচ্যুতি) এবং আকৃতি (যেমন তির্যক, কার্টোসিস) বোঝা।
উদাহরণ: ধরা যাক আপনার কাছে একটি ডেটাসেট আছে যেখানে শিক্ষার্থীদের বয়স রয়েছে।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Sample Data data = {'Age': [20, 22, 21, 23, 20, 25, 22, 21, 24, 23, 20, 26, 22, 21, 25]} df = pd.DataFrame(data) # Descriptive Statistics print("Descriptive Statistics for Age:") print(df['Age'].describe()) # Histogram to visualize distribution plt.figure(figsize=(8, 5)) sns.histplot(df['Age'], kde=True, bins=5) plt.title('Distribution of Age') plt.xlabel('Age') plt.ylabel('Frequency') plt.show() # Box plot to identify outliers and spread plt.figure(figsize=(8, 5)) sns.boxplot(y=df['Age']) plt.title('Box Plot of Age') plt.ylabel('Age') plt.show() |
2. দ্বি-চলক বিশ্লেষণ (Bivariate Analysis)
এই বিশ্লেষণে দুটি ভেরিয়েবলের মধ্যে সম্পর্ক পরীক্ষা করা হয়। এর লক্ষ্য হলো দুটি ভেরিয়েবলের মধ্যে সম্পর্ক, পারস্পরিক নির্ভরশীলতা এবং নিদর্শন (যেমন সহসম্পর্ক, কার্যকারণ) বোঝা।
উদাহরণ: শিক্ষার্থীদের বয়স এবং তাদের পরীক্ষার স্কোর নিয়ে একটি ডেটাসেট বিবেচনা করুন।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Sample Data data = {'Age': [20, 22, 21, 23, 20, 25, 22, 21, 24, 23, 20, 26, 22, 21, 25], 'Score': [85, 90, 88, 92, 86, 95, 89, 87, 93, 91, 84, 96, 88, 86, 94]} df = pd.DataFrame(data) # Scatter plot to visualize relationship plt.figure(figsize=(8, 6)) sns.scatterplot(x='Age', y='Score', data=df) plt.title('Age vs. Score') plt.xlabel('Age') plt.ylabel('Score') plt.show() # Correlation coefficient print("\nCorrelation between Age and Score:") print(df['Age'].corr(df['Score'])) |
3. বহু-চলক বিশ্লেষণ (Multivariate Analysis)
এই বিশ্লেষণে তিন বা ততোধিক ভেরিয়েবলের মধ্যে সম্পর্ক পরীক্ষা করা হয়। এটি ডেটার মধ্যে আরও জটিল সম্পর্ক এবং প্যাটার্ন উন্মোচন করতে সাহায্য করে।
উদাহরণ: শিক্ষার্থীদের বয়স, পরীক্ষার স্কোর এবং অধ্যয়নের সময় নিয়ে একটি ডেটাসেট বিবেচনা করুন।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Sample Data data = {'Age': [20, 22, 21, 23, 20, 25, 22, 21, 24, 23, 20, 26, 22, 21, 25], 'Score': [85, 90, 88, 92, 86, 95, 89, 87, 93, 91, 84, 96, 88, 86, 94], 'Study_Hours': [3, 4, 3.5, 4.5, 3.2, 5, 4.2, 3.8, 4.8, 4.3, 3.1, 5.5, 4.1, 3.6, 4.7]} df = pd.DataFrame(data) # Pair plot to visualize relationships between multiple variables plt.figure(figsize=(10, 8)) sns.pairplot(df) plt.suptitle('Pair Plot of Age, Score, and Study Hours', y=1.02) plt.show() # Heatmap for correlation matrix plt.figure(figsize=(8, 6)) sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt=".2f") plt.title('Correlation Matrix') plt.show() |
Steps for Performing Exploratory Data Analysis
EDA একটি পুনরাবৃত্তিমূলক প্রক্রিয়া, যা ডেটা সম্পর্কে গভীর ধারণা অর্জনের জন্য বিভিন্ন ধাপ জড়িত।
Step 1: Understanding the Problem and the Data
এই ধাপে, ডেটাসেট ব্যবহার করে কোন প্রশ্নগুলি উত্তর দিতে হবে এবং কী সমস্যা সমাধান করতে হবে তা স্পষ্টভাবে বোঝা জড়িত। ডেটার উত্স, সংগ্রহ পদ্ধতি এবং প্রতিটি বৈশিষ্ট্যের অর্থ জানা অত্যন্ত গুরুত্বপূর্ণ।
আপনি যদি একটি হাউজিং ডেটাসেট নিয়ে কাজ করেন, তাহলে আপনাকে বুঝতে হবে আপনি বাড়ির দামের পূর্বাভাস দিচ্ছেন, নাকি জনপ্রিয় এলাকা চিহ্নিত করছেন। ডেটাসেটে বাড়ির আকার, কক্ষের সংখ্যা, অবস্থান ইত্যাদির মতো বৈশিষ্ট্য থাকতে পারে।
Step 2: Importing and Inspecting the Data
ডেটা বিশ্লেষণের জন্য পাইথনে ডেটা আমদানি করা এবং একটি প্রাথমিক পরিদর্শন করা প্রয়োজন। এটি আপনাকে ডেটাসেটের গঠন, আকার, কলামের নাম এবং ডেটার ধরন সম্পর্কে প্রাথমিক ধারণা দেয়।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pandas as pd # Load a sample dataset (e.g., from scikit-learn for demonstration) from sklearn.datasets import load_iris iris = load_iris() df = pd.DataFrame(data=iris.data, columns=iris.feature_names) df['target'] = iris.target df['target_names'] = iris.target_names[df['target']] print("First 5 rows of the dataset:") print(df.head()) print("\nInformation about the dataset (data types, non-null counts):") print(df.info()) print("\nShape of the dataset (rows, columns):") print(df.shape) print("\nColumn names:") print(df.columns) |
Step 3: Handling Missing Data
বাস্তব-বিশ্বের ডেটাসেটগুলিতে প্রায়শই অনুপস্থিত মান থাকে। এই অনুপস্থিত ডেটা সঠিকভাবে পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ কারণ এটি বিশ্লেষণের ফলাফলকে ভুল পথে চালিত করতে পারে। অনুপস্থিত ডেটা পূরণের জন্য বিভিন্ন কৌশল রয়েছে, যেমন:
- ড্রপিং (Dropping): অনুপস্থিত মান সহ সারি বা কলামগুলি সরিয়ে ফেলা।
- ইমপিউটেশন (Imputation): অনুপস্থিত মানগুলিকে গড়, মধ্যমা, মোড বা আরও উন্নত পদ্ধতি ব্যবহার করে পূরণ করা।
উদাহরণ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import numpy as np # Create a DataFrame with missing values data_with_nan = {'A': [1, 2, np.nan, 4, 5], 'B': [6, np.nan, 8, 9, 10], 'C': [11, 12, 13, 14, np.nan]} df_nan = pd.DataFrame(data_with_nan) print("DataFrame with missing values:") print(df_nan) # Check for missing values print("\nMissing values count per column:") print(df_nan.isnull().sum()) # Option 1: Drop rows with any missing values df_dropped = df_nan.dropna() print("\nDataFrame after dropping rows with missing values:") print(df_dropped) # Option 2: Fill missing values with the mean of the column df_filled_mean = df_nan.fillna(df_nan.mean()) print("\nDataFrame after filling missing values with mean:") print(df_filled_mean) # Option 3: Fill missing values with a specific value (e.g., 0) df_filled_zero = df_nan.fillna(0) print("\nDataFrame after filling missing values with 0:") print(df_filled_zero) |
Step 4: Exploring Data Characteristics
এই ধাপে, ডেটাসেটের প্রতিটি ভেরিয়েবলের বিতরণ, কেন্দ্রীয় প্রবণতা এবং প্রসারণ বোঝা জড়িত। এটি ডেটার ধরন এবং কাঠামোর গভীর ধারণা দেয়।
উদাহরণ: পূর্ববর্তী আইরিস ডেটাসেট ব্যবহার করে।
1 2 3 4 5 6 7 8 9 10 11 |
# Descriptive statistics print("\nDescriptive Statistics of numerical features:") print(df.describe()) # Check unique values for categorical columns (if any) print("\nUnique values in 'target_names' column:") print(df['target_names'].unique()) # Value counts for categorical columns print("\nValue counts for 'target_names':") print(df['target_names'].value_counts()) |
Step 5: Performing Data Transformation
ডেটা ট্রান্সফরমেশন (Data Transformation) হলো ডেটার স্কেল বা বিন্যাস পরিবর্তন করা, যা প্রায়শই মডেলিংয়ের জন্য ডেটা প্রস্তুত করতে ব্যবহৃত হয়। সাধারণ রূপান্তরগুলির মধ্যে রয়েছে:
- ফিচার স্কেলিং (Feature Scaling): নরমালাইজেশন (Normalization) বা স্ট্যান্ডার্ডাইজেশন (Standardization)।
- লগ ট্রান্সফরমেশন (Log Transformation): তির্যক ডেটা বিতরণকে আরও স্বাভাবিক করতে।
- ওয়ান-হট এনকোডিং (One-Hot Encoding): ক্যাটাগরিক্যাল ডেটাকে সংখ্যাসূচক বিন্যাসে রূপান্তর করা।
উদাহরণ: ফিচার স্কেলিংয়ের উদাহরণ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from sklearn.preprocessing import StandardScaler, MinMaxScaler # Using 'sepal length (cm)' for demonstration feature = df[['sepal length (cm)']] # Standardization (Z-score normalization) scaler_standard = StandardScaler() df['sepal_length_standardized'] = scaler_standard.fit_transform(feature) print("\nStandardized 'sepal length (cm)':") print(df[['sepal length (cm)', 'sepal_length_standardized']].head()) # Normalization (Min-Max scaling) scaler_minmax = MinMaxScaler() df['sepal_length_minmax'] = scaler_minmax.fit_transform(feature) print("\nMin-Max Normalized 'sepal length (cm)':") print(df[['sepal length (cm)', 'sepal_length_minmax']].head()) |
Step 6: Visualizing Relationship of Data
ডেটা ভিজ্যুয়ালাইজেশন (Data Visualization) ডেটার মধ্যে সম্পর্ক এবং প্যাটার্ন বোঝার একটি শক্তিশালী উপায়। বিভিন্ন ধরণের প্লট ব্যবহার করা যেতে পারে:
- হিস্টোগ্রাম (Histograms) এবং KDE প্লট (KDE Plots): একক ভেরিয়েবলের বিতরণ দেখতে।
- বক্স প্লট (Box Plots): বিতরণ, কেন্দ্রীয় প্রবণতা এবং আউটলায়ার দেখতে।
- স্কাটার প্লট (Scatter Plots): দুটি সংখ্যাসূচক ভেরিয়েবলের মধ্যে সম্পর্ক দেখতে।
- বার প্লট (Bar Plots): ক্যাটাগরিক্যাল ভেরিয়েবলের ফ্রিকোয়েন্সি বা সমষ্টি দেখতে।
- হিটম্যাপ (Heatmaps): একাধিক ভেরিয়েবলের মধ্যে সহসম্পর্ক দেখতে।
- পেয়ার প্লট (Pair Plots): ডেটাসেটের সমস্ত সংখ্যাসূচক ভেরিয়েবলের পেয়ারওয়াইজ সম্পর্ক দেখতে।
উদাহরণ: পূর্ববর্তী উদাহরণগুলিতে কিছু ভিজ্যুয়ালাইজেশন দেখানো হয়েছে। এখানে আরও কিছু:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import matplotlib.pyplot as plt import seaborn as sns # Correlation Heatmap for numerical features plt.figure(figsize=(10, 8)) sns.heatmap(df[iris.feature_names].corr(), annot=True, cmap='viridis', fmt=".2f") plt.title('Correlation Matrix of Iris Features') plt.show() # Violin plot to show distribution and density of sepal length by target plt.figure(figsize=(8, 6)) sns.violinplot(x='target_names', y='sepal length (cm)', data=df) plt.title('Sepal Length Distribution by Species') plt.xlabel('Species') plt.ylabel('Sepal Length (cm)') plt.show() |
Step 7: Handling Outliers
আউটলায়ার (Outliers) হলো ডেটা পয়েন্ট যা বাকি ডেটা থেকে উল্লেখযোগ্যভাবে দূরে থাকে। এগুলি ডেটা বিশ্লেষণের ফলাফলকে প্রভাবিত করতে পারে, তাই তাদের চিহ্নিত করা এবং সঠিকভাবে পরিচালনা করা গুরুত্বপূর্ণ। আউটলায়ারগুলি সনাক্ত করার জন্য বক্স প্লট বা Z-স্কোরের মতো পদ্ধতি ব্যবহার করা যেতে পারে। হ্যান্ডলিং কৌশলের মধ্যে রয়েছে:
- ড্রপিং (Dropping): আউটলায়ার ডেটা পয়েন্টগুলি সরিয়ে ফেলা।
- ট্রান্সফরমেশন (Transformation): ডেটা রূপান্তর করে আউটলায়ারের প্রভাব কমানো (যেমন লগ ট্রান্সফরমেশন)।
- ক্যাপিং (Capping) / উইনসোরাইজেশন (Winsorization): আউটলায়ারগুলিকে একটি নির্দিষ্ট সর্বোচ্চ বা সর্বনিম্ন মানের সাথে প্রতিস্থাপন করা।
উদাহরণ: আউটলায়ার সনাক্তকরণ এবং পরিচালনার একটি সরল উদাহরণ।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Create a sample series with an outlier data_outlier = pd.Series([10, 12, 11, 13, 100, 14, 12, 11]) df_outlier = pd.DataFrame({'Value': data_outlier}) print("Data with a potential outlier:") print(df_outlier) # Box plot to visualize outlier plt.figure(figsize=(6, 4)) sns.boxplot(y=df_outlier['Value']) plt.title('Box Plot with Outlier') plt.ylabel('Value') plt.show() # Identify outliers using IQR method Q1 = df_outlier['Value'].quantile(0.25) Q3 = df_outlier['Value'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR outliers = df_outlier[(df_outlier['Value'] < lower_bound) | (df_outlier['Value'] > upper_bound)] print("\nIdentified Outliers (IQR method):") print(outliers) # Handling outlier: capping (example - replace with upper bound) df_outlier_capped = df_outlier.copy() df_outlier_capped['Value'] = np.where(df_outlier_capped['Value'] > upper_bound, upper_bound, df_outlier_capped['Value']) print("\nData after capping outlier:") print(df_outlier_capped) |
Step 8: Communicate Findings and Insights
EDA-এর চূড়ান্ত ধাপ হলো প্রাপ্ত ধারণা এবং অন্তর্দৃষ্টিগুলি পরিষ্কার এবং সংক্ষিপ্তভাবে উপস্থাপন করা। এর মধ্যে রয়েছে:
- প্রতিবেদন (Reports): ডেটার প্রধান বৈশিষ্ট্য, নিদর্শন এবং পর্যবেক্ষণগুলির একটি লিখিত সারাংশ।
- ড্যাশবোর্ড (Dashboards): ইন্টারেক্টিভ ভিজ্যুয়ালাইজেশন যা ব্যবহারকারীদের ডেটা অন্বেষণ করতে দেয়।
- প্রেজেন্টেশন (Presentations): মূল ফলাফল এবং সুপারিশগুলি হাইলাইট করার জন্য ভিজ্যুয়াল এইড সহ একটি মৌখিক উপস্থাপনা।
এই ধাপে, ভিজ্যুয়ালাইজেশন, টেবিল এবং ব্যাখ্যামূলক পাঠ্য ব্যবহার করে আপনার অনুসন্ধানগুলি কার্যকরভাবে যোগাযোগ করা হয়।
উদাহরণস্বরূপ, যদি আপনি একটি ই-কমার্স ডেটাসেটে EDA করেন, তাহলে আপনি রিপোর্ট করতে পারেন যে পুরুষদের তুলনায় মহিলারা নির্দিষ্ট পণ্য বেশি কেনেন, অথবা সাপ্তাহিক ছুটির দিনে বিক্রি বাড়ে। এই ধারণাগুলি ব্যবসার সিদ্ধান্ত নিতে সাহায্য করতে পারে।
এই ধাপগুলি অনুসরণ করে, আপনি ডেটাসেট থেকে কার্যকরভাবে মূল্যবান অন্তর্দৃষ্টি বের করতে পারবেন, যা পরবর্তী ডেটা বিজ্ঞান কাজগুলির জন্য একটি শক্তিশালী ভিত্তি স্থাপন করবে।
Leave a Comment