টাইম সিরিজ ডেটা প্রিপ্রসেসিং হল টাইম সিরিজ ডেটাকে বিশ্লেষণের জন্য প্রস্তুত করার প্রক্রিয়া। এটি গুরুত্বপূর্ণ, কারণ টাইম সিরিজ ডেটা প্রায়ই কিছু সমস্যা বা বৈশিষ্ট্য নিয়ে আসে, যেমন ট্রেন্ড, সিজনালিটি, মিসিং ভ্যালু (missing values), আউটলায়ার (outliers) ইত্যাদি, যা পূর্বাভাস বা বিশ্লেষণের ক্ষেত্রে প্রতিবন্ধকতা সৃষ্টি করতে পারে। তাই ডেটাকে প্রিপ্রসেসিং করার মাধ্যমে এই সমস্যা সমাধান করা হয়।
নিচে টাইম সিরিজ ডেটা প্রিপ্রসেসিংয়ের প্রধান ধাপগুলো আলোচনা করা হলো:
বর্ণনা: টাইম সিরিজ ডেটাতে মাঝে মাঝে কিছু ডেটা পয়েন্ট অনুপস্থিত থাকতে পারে। মিসিং ভ্যালু থাকলে বিশ্লেষণ বা মডেলিং প্রক্রিয়া ব্যাহত হতে পারে। তাই ডেটার মিসিং ভ্যালুগুলো সঠিকভাবে হ্যান্ডল করা গুরুত্বপূর্ণ।
পদ্ধতি:
উদাহরণ:
import pandas as pd
# Sample time series data with missing values
data = {'Date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05'],
'Value': [100, None, 120, None, 130]}
df = pd.DataFrame(data)
# Fill missing values using forward fill
df['Value'] = df['Value'].fillna(method='ffill')
বর্ণনা: আউটলায়ার হল এমন ডেটা পয়েন্ট যা অন্যান্য ডেটা পয়েন্টের তুলনায় অস্বাভাবিকভাবে বেশি বা কম। আউটলায়ার টাইম সিরিজ ডেটার বিশ্লেষণ এবং পূর্বাভাসে বিরূপ প্রভাব ফেলতে পারে। তাই আউটলায়ার চিহ্নিত করা এবং সেগুলোকে সঠিকভাবে হ্যান্ডল করা গুরুত্বপূর্ণ।
পদ্ধতি:
উদাহরণ:
import numpy as np
# Detect outliers using z-score (greater than 3 standard deviations)
from scipy import stats
data = np.random.normal(0, 1, 100)
outliers = np.where(np.abs(stats.zscore(data)) > 3)[0]
বর্ণনা: টাইম সিরিজ বিশ্লেষণের জন্য স্টেশনারিটি একটি গুরুত্বপূর্ণ উপাদান। স্টেশনারিটি নিশ্চিত করা না থাকলে টাইম সিরিজের মডেলিং সঠিকভাবে কাজ নাও করতে পারে। তাই ডেটাকে স্টেশনারি করার প্রক্রিয়া করা হয়, যেমন ট্রেন্ড বা সিজনালিটি সরানো।
পদ্ধতি:
উদাহরণ:
from statsmodels.tsa.stattools import adfuller
# Augmented Dickey-Fuller test
result = adfuller(df['Value'].dropna())
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
বর্ণনা: টাইম সিরিজে ট্রেন্ড এবং সিজনাল প্যাটার্ন থাকতে পারে, যা পূর্বাভাসে প্রভাব ফেলতে পারে। তাই এই প্যাটার্নগুলিকে সরানো প্রয়োজন। এটি স্টেশনারিটি অর্জন করার জন্য সহায়ক।
পদ্ধতি:
উদাহরণ:
df['Value_differenced'] = df['Value'] - df['Value'].shift(1)
বর্ণনা: কিছু ক্ষেত্রে, ডেটার স্কেলিং বা নর্মালাইজেশন প্রয়োজন, বিশেষত যদি টাইম সিরিজের মধ্যে বিভিন্ন ধরনের স্কেল থাকে। এটি মডেলিং এবং তুলনামূলক বিশ্লেষণে সহায়ক।
পদ্ধতি:
উদাহরণ:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['Scaled_Value'] = scaler.fit_transform(df[['Value']])
টাইম সিরিজ ডেটা প্রিপ্রসেসিং হল টাইম সিরিজ ডেটাকে বিশ্লেষণের জন্য প্রস্তুত করার প্রক্রিয়া। মিসিং ভ্যালু, আউটলায়ার, স্টেশনারিটি এবং সিজনাল প্যাটার্ন হ্যান্ডলিংসহ ডেটাকে সঠিকভাবে প্রিপ্রসেস করা হয়। প্রিপ্রসেসিং ডেটার গুণমান এবং মডেলিংয়ের কার্যকারিতা বাড়াতে সহায়ক।
টাইম সিরিজ ডেটায় মিসিং ডেটা একটি সাধারণ সমস্যা। মিসিং ডেটা থাকার কারণে ডেটার বিশ্লেষণ বা মডেলিং প্রক্রিয়া প্রভাবিত হতে পারে, তাই মিসিং ডেটা সঠিকভাবে হ্যান্ডল করা অত্যন্ত গুরুত্বপূর্ণ। মিসিং ডেটা হ্যান্ডলিংয়ের বিভিন্ন পদ্ধতি রয়েছে, যা নির্ভর করে ডেটার প্রকৃতি, মিসিং ভ্যালুর পরিমাণ এবং গবেষণার উদ্দেশ্যের উপর।
নিচে মিসিং ডেটা হ্যান্ডলিংয়ের কিছু সাধারণ পদ্ধতি আলোচনা করা হলো:
বর্ণনা: ফরওয়ার্ড ফিলিং হল এমন একটি পদ্ধতি যেখানে মিসিং ভ্যালু পূর্ণ করার জন্য পূর্ববর্তী পরিমাপ বা মানটি ব্যবহার করা হয়। অর্থাৎ, মিসিং ভ্যালু আগে থাকা ডেটা দিয়ে পূর্ণ করা হয়।
পদ্ধতি:
উদাহরণ:
import pandas as pd
# Sample data with missing values
data = {'Date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05'],
'Value': [100, None, 120, None, 130]}
df = pd.DataFrame(data)
# Forward fill to handle missing values
df['Value'] = df['Value'].fillna(method='ffill')
print(df)
বর্ণনা: ব্যাকওয়ার্ড ফিলিং হল একটি পদ্ধতি যেখানে মিসিং ভ্যালু পূর্ণ করার জন্য পরবর্তী পরিমাপ বা মানটি ব্যবহার করা হয়। অর্থাৎ, মিসিং ভ্যালুর জন্য পরবর্তী ডেটা দিয়ে পূর্ণ করা হয়।
পদ্ধতি:
উদাহরণ:
# Backward fill to handle missing values
df['Value'] = df['Value'].fillna(method='bfill')
print(df)
বর্ণনা: এই পদ্ধতিতে মিসিং ভ্যালু পূর্ণ করার জন্য ডেটার গড় (mean), মধ্যম (median), বা মোড (mode) মান ব্যবহার করা হয়। এটি সাধারণত তখন ব্যবহার করা হয় যখন মিসিং ভ্যালুর পরিমাণ কম এবং ডেটার মধ্যে কোনও বিশেষ ট্রেন্ড না থাকে।
পদ্ধতি:
উদাহরণ:
# Impute missing values with mean
df['Value'] = df['Value'].fillna(df['Value'].mean())
print(df)
বর্ণনা: ইন্টারপোলেশন হল একটি প্রক্রিয়া যেখানে মিসিং ভ্যালুর জন্য দুটি পরিচিত মানের মধ্যে একটি অনুমানিত মান নির্ধারণ করা হয়। এটি বিভিন্ন পদ্ধতির মাধ্যমে করা যেতে পারে, যেমন লিনিয়ার ইন্টারপোলেশন বা পলিনোমিয়াল ইন্টারপোলেশন।
পদ্ধতি:
উদাহরণ:
# Interpolation to handle missing values
df['Value'] = df['Value'].interpolate(method='linear')
print(df)
বর্ণনা: যখন মিসিং ভ্যালুর পরিমাণ অত্যধিক এবং তা ইম্পুটেশন বা ফিলিং পদ্ধতিতে পূর্ণ করা সম্ভব নয়, তখন এই ভ্যালুগুলো সরিয়ে ফেলা হয়। এটি সাধারণত তখন করা হয় যখন মিসিং ভ্যালুর কারণে ডেটার গুণমান প্রভাবিত হয়।
পদ্ধতি:
উদাহরণ:
# Remove rows with missing values
df = df.dropna()
print(df)
বর্ণনা: এই পদ্ধতিতে, একটি পরিসংখ্যানিক মডেল বা মেশিন লার্নিং মডেল ব্যবহার করে মিসিং ভ্যালু পূর্ণ করা হয়। মডেলটি ডেটার অন্যান্য বৈশিষ্ট্য ব্যবহার করে মিসিং ভ্যালুর জন্য অনুমান তৈরি করে।
পদ্ধতি:
মিসিং ডেটা হ্যান্ডলিং হল একটি গুরুত্বপূর্ণ ধাপ টাইম সিরিজ ডেটা বিশ্লেষণ এবং মডেলিংয়ের ক্ষেত্রে। বিভিন্ন পদ্ধতির মাধ্যমে মিসিং ডেটাকে সঠিকভাবে পূর্ণ করা যায়, যেমন ফরওয়ার্ড/ব্যাকওয়ার্ড ফিলিং, ইম্পুটেশন (গড়, মধ্যম), ইন্টারপোলেশন, বা মডেল ভিত্তিক ইম্পুটেশন। এটি ডেটার গুণমান এবং মডেলিংয়ের কার্যকারিতা বাড়াতে সহায়ক।
ডেটা ট্রান্সফরমেশন হল এমন একটি প্রক্রিয়া যা ডেটাকে বিশ্লেষণ এবং মডেলিংয়ের জন্য উপযুক্ত করতে সাহায্য করে। টাইম সিরিজ বিশ্লেষণের ক্ষেত্রে কিছু সাধারণ ট্রান্সফরমেশন টেকনিক ব্যবহার করা হয়, যার মধ্যে লগ ট্রান্সফরমেশন (Log Transformation) এবং ডিফারেন্সিং (Differencing) অন্যতম।
নিচে এই দুটি টেকনিক বিস্তারিতভাবে আলোচনা করা হলো:
বর্ণনা: লগ ট্রান্সফরমেশন হল একটি মেথড যেখানে ডেটার প্রতিটি মানের উপর লগ ফাংশন প্রয়োগ করা হয়। এটি ডেটার স্কেল বা পরিসীমা সংকুচিত করতে সহায়ক, এবং বিশেষত যখন ডেটাতে বৃহৎ মান থাকে, তখন লগ ট্রান্সফরমেশন তার পার্থক্য এবং ভ্যারিয়েন্সকে কমিয়ে আনতে সাহায্য করে। এটি অনেক সময় আউটলায়ার বা বড় পরিবর্তনগুলোর প্রভাব কমাতে ব্যবহৃত হয়।
কেন ব্যবহৃত হয়:
ফর্মুলা:
y′=log(y)
যেখানে y হল মূল ডেটা এবং y′ হল লগ ট্রান্সফর্মড ডেটা।
উদাহরণ:
import numpy as np
import matplotlib.pyplot as plt
# Sample data with large values
data = [10, 100, 1000, 10000, 100000]
# Apply log transformation
log_transformed_data = np.log(data)
# Plotting the original vs log-transformed data
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.plot(data)
plt.title('Original Data')
plt.subplot(1, 2, 2)
plt.plot(log_transformed_data)
plt.title('Log Transformed Data')
plt.show()
উদাহরণ ব্যাখ্যা: এখানে, বড় পরিসরের ডেটা (যেমন 100, 1000, 10000) লগ ট্রান্সফর্মেশনের মাধ্যমে ছোট পরিসরে রূপান্তরিত হয়। এটি ডেটার পার্থক্য বা বৈচিত্র্যকে সংকুচিত করে এবং বিশ্লেষণকে সহজ করে।
বর্ণনা: ডিফারেন্সিং হল একটি পদ্ধতি যা টাইম সিরিজের মধ্যে ট্রেন্ড বা সিজনালিটি সরানোর জন্য ব্যবহৃত হয়। এটি মূলত দুটি পরবর্তী সময় পয়েন্টের মধ্যে পার্থক্য বের করা। ডিফারেন্সিং টাইম সিরিজের স্টেশনারিটি অর্জনের জন্য একটি গুরুত্বপূর্ণ টেকনিক, কারণ স্টেশনারিটি নিশ্চিত করা না থাকলে মডেলিং সঠিকভাবে কাজ নাও করতে পারে।
কেন ব্যবহৃত হয়:
ধরন:
প্রথম পার্থক্য (First Differencing): পরবর্তী সময় পয়েন্টের মান থেকে পূর্ববর্তী সময় পয়েন্টের মান বিয়োগ করা।
y′t=yt−yt−1
দ্বিতীয় পার্থক্য (Second Differencing): প্রথম পার্থক্যের পরবর্তী পার্থক্য।
y′′t=y′t−y′t−2
উদাহরণ:
import pandas as pd
# Sample time series data
data = pd.Series([100, 120, 150, 130, 160])
# First differencing
first_diff = data.diff().dropna()
# Plotting original vs differenced data
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.plot(data)
plt.title('Original Data')
plt.subplot(1, 2, 2)
plt.plot(first_diff)
plt.title('Differenced Data')
plt.show()
উদাহরণ ব্যাখ্যা: এখানে, প্রথম পার্থক্য প্রয়োগ করার পর, ডেটার প্রতিটি মানের মধ্যে পার্থক্য বের করা হয়েছে, যা ট্রেন্ড সরাতে সাহায্য করেছে এবং স্টেশনারিটি অর্জন করা সহজ হয়েছে।
এই দুটি টেকনিক টাইম সিরিজ বিশ্লেষণের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং ডেটাকে মডেলিংয়ের জন্য উপযুক্ত করে তোলে।
টাইম সিরিজ ডেটা বিশ্লেষণ করার সময়, অনেক সময় ডেটার মধ্যে অস্থিরতা বা অস্থায়ী পরিবর্তন থাকে, যা মূল প্রবণতা বা প্যাটার্নের সাথে সম্পর্কিত নয়। এই ধরনের অস্থিরতা দূর করার জন্য ডেটা স্মুথিং (Data Smoothing) পদ্ধতি ব্যবহার করা হয়, যা ডেটার শোর বা র্যান্ডম ভ্যারিয়েশন কমাতে সাহায্য করে। এর ফলে ডেটার underlying ট্রেন্ড এবং সিজনাল প্যাটার্ন স্পষ্টভাবে দেখা যায়।
স্মুথিং টেকনিক দুটি প্রধান ধরনের:
বর্ণনা: মুভিং এভারেজ হল একটি সাধারণ পদ্ধতি যেখানে ডেটার একটি নির্দিষ্ট উইন্ডো (window) ব্যবহার করে ডেটার গড় হিসাব করা হয়। এটি একটি টাইম সিরিজের অস্থিরতা কমাতে সাহায্য করে এবং ডেটার ট্রেন্ড স্পষ্ট করে তোলে।
ধরন:
উদাহরণ: যদি আমরা 5 দিনের মুভিং এভারেজ ব্যবহার করি, তবে প্রতিটি দিনের গড় হবে গত 5 দিনের মানের গড়।
গাণিতিক সূত্র (SMA):
SMAt=Xt−1+Xt−2+⋯+Xt−kk
যেখানে, Xt হল টাইম সিরিজের মান এবং k হল উইন্ডোর আকার (যেমন, 5 দিন)।
Python কোড উদাহরণ (SMA):
import pandas as pd
import numpy as np
# Sample time series data
data = [10, 20, 30, 40, 50, 60, 70]
df = pd.DataFrame(data, columns=['Value'])
# Apply 3-day moving average
df['3-day MA'] = df['Value'].rolling(window=3).mean()
বর্ণনা: এক্সপোনেনশিয়াল স্মুথিং একটি উন্নত স্মুথিং পদ্ধতি, যেখানে সর্বশেষ পর্যবেক্ষণ বা ডেটা পয়েন্টকে আরও বেশি গুরুত্ব দেওয়া হয়। এটি একটি ওজনযুক্ত গড় পদ্ধতি যেখানে পুরানো ডেটার ওজন কমিয়ে নতুন ডেটার ওজন বাড়ানো হয়। এক্সপোনেনশিয়াল স্মুথিং পদ্ধতিতে, প্রতিটি পরবর্তী পরিমাপের জন্য গড় হিসাব করা হয় এবং সেই গড়ের উপর একটি ধীরে ধীরে কমতে থাকা এক্সপোনেনশিয়াল ফ্যাক্টর প্রয়োগ করা হয়।
ধরন:
গাণিতিক সূত্র (Simple Exponential Smoothing):
St=α⋅Xt+(1−α)⋅St−1
যেখানে:
Python কোড উদাহরণ (Exponential Smoothing):
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# Sample time series data
data = [10, 20, 30, 40, 50, 60, 70]
df = pd.DataFrame(data, columns=['Value'])
# Apply Exponential Smoothing
model = ExponentialSmoothing(df['Value'], trend='add', seasonal='add', seasonal_periods=3)
fit_model = model.fit()
df['Exponential Smoothing'] = fit_model.fittedvalues
বৈশিষ্ট্য | মুভিং এভারেজ (Moving Average) | এক্সপোনেনশিয়াল স্মুথিং (Exponential Smoothing) |
---|---|---|
গাণিতিক পদ্ধতি | গড় হিসাব করা | এক্সপোনেনশিয়াল ফ্যাক্টর ব্যবহার করা |
ওজন | সমানভাবে সব মানের ওজন দেওয়া | সাম্প্রতিক মানগুলোর ওজন বেশি |
ব্যবহার | সাধারণত ট্রেন্ড বা সিজনালিটি ছাড়া ডেটায় | ট্রেন্ড বা সিজনালিটির জন্য উপযুক্ত |
সরলতা | সহজ এবং কম্পিউটেশনালভাবে সস্তা | একটু জটিল এবং বেশি কম্পিউটেশনাল |
ডেটা প্রতি প্রতিক্রিয়া | ধীর | দ্রুত প্রতিক্রিয়া |
ডেটা স্মুথিং টেকনিকগুলো, যেমন মুভিং এভারেজ এবং এক্সপোনেনশিয়াল স্মুথিং, টাইম সিরিজ ডেটার মধ্যে অস্থিরতা কমানোর জন্য ব্যবহৃত হয়। মুভিং এভারেজ পদ্ধতি সাধারণত সহজ এবং কাস্টমাইজযোগ্য, তবে এক্সপোনেনশিয়াল স্মুথিং পদ্ধতি আরও গতিশীল এবং সাম্প্রতিক ডেটা পয়েন্টের জন্য বেশি গুরুত্ব দেয়। এক্সপোনেনশিয়াল স্মুথিং দীর্ঘমেয়াদী ট্রেন্ড এবং সিজনালিটি বিশ্লেষণের জন্য উপযুক্ত, যেখানে মুভিং এভারেজ সাধারণত স্বল্পমেয়াদী অস্থিরতা দূর করার জন্য ব্যবহৃত হয়।
টাইম সিরিজ বিশ্লেষণে শিফটিং এবং ল্যাগ ফিচার তৈরি করা খুবই গুরুত্বপূর্ণ। এগুলো টাইম সিরিজ মডেলিংয়ের জন্য অতিরিক্ত তথ্য তৈরি করতে সহায়ক, যেমন ভবিষ্যতের মান পূর্বের মানের উপর নির্ভর করে থাকে।
শিফটিং হল একটি পদ্ধতি, যার মাধ্যমে টাইম সিরিজের ডেটাকে এক বা একাধিক সময় পয়েন্ট পেছনে (lag) বা সামনে (lead) সরানো হয়। এটি টাইম সিরিজের অতীত ডেটা ভবিষ্যতের ডেটার সাথে সম্পর্কিত করতে ব্যবহৃত হয়। সাধারণত, শিফটিং এর মাধ্যমে পূর্ববর্তী সময়ের মানকে বর্তমান সময়ের সাথে সংযুক্ত করা হয়।
ধরা যাক, একটি কোম্পানির দৈনিক বিক্রয়ের ডেটা রয়েছে এবং আপনি পূর্ববর্তী দিনের বিক্রয় মানকে বর্তমান দিনে অন্তর্ভুক্ত করতে চান।
import pandas as pd
# Sample time series data
data = {'Date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05'],
'Sales': [100, 120, 150, 130, 160]}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
# Shifting data by 1 day
df['Sales_Shifted'] = df['Sales'].shift(1) # Shifts the sales data by 1 day
print(df)
আউটপুট:
Date Sales Sales_Shifted
0 2020-01-01 100 NaN
1 2020-01-02 120 100.0
2 2020-01-03 150 120.0
3 2020-01-04 130 150.0
4 2020-01-05 160 130.0
এখানে, shift(1)
ফাংশনটি বিক্রয়ের মানকে ১ দিন পিছিয়ে দিয়েছে। প্রথম সারির জন্য কোন আগের মান নেই, তাই সেটি NaN
।
ল্যাগ ফিচার তৈরি করা হল একটি সাধারণ কৌশল যা পূর্ববর্তী সময়ের মানকে (lag) বর্তমান সময়ের সাথে যুক্ত করতে ব্যবহৃত হয়। ল্যাগ ফিচার টাইম সিরিজ মডেলিংয়ে পূর্ববর্তী ডেটার থেকে বৈশিষ্ট্য তৈরি করার জন্য ব্যবহৃত হয়।
ল্যাগ ফিচার সাধারণত একটি বা একাধিক সময় পয়েন্ট পূর্বের মানকে বর্তমান সময়ে ব্যবহারের জন্য তৈরি করা হয়। যেমন 1 ল্যাগ (lag=1), 2 ল্যাগ (lag=2) ইত্যাদি।
ধরা যাক, আপনি গত ৩ দিনের বিক্রয়ের তথ্যের উপর ভিত্তি করে পরবর্তী দিনের বিক্রয় পূর্বাভাস করতে চান।
# Creating lag features
df['Sales_Lag_1'] = df['Sales'].shift(1) # Lag of 1 day
df['Sales_Lag_2'] = df['Sales'].shift(2) # Lag of 2 days
df['Sales_Lag_3'] = df['Sales'].shift(3) # Lag of 3 days
print(df)
আউটপুট:
Date Sales Sales_Lag_1 Sales_Lag_2 Sales_Lag_3
0 2020-01-01 100 NaN NaN NaN
1 2020-01-02 120 100.0 NaN NaN
2 2020-01-03 150 120.0 100.0 NaN
3 2020-01-04 130 150.0 120.0 100.0
4 2020-01-05 160 130.0 150.0 120.0
এখানে, Sales_Lag_1
, Sales_Lag_2
, এবং Sales_Lag_3
এর মাধ্যমে আমরা ১, ২, এবং ৩ দিনের পূর্ববর্তী বিক্রয়ের মানকে বর্তমান দিনের বিক্রয়ের সাথে যুক্ত করেছি।
টাইম সিরিজ ডেটাতে শিফটিং এবং ল্যাগ ফিচার তৈরি গুরুত্বপূর্ণ, কারণ এগুলো অতীতের তথ্য থেকে ভবিষ্যতের জন্য মূল্যবান বৈশিষ্ট্য তৈরি করতে সাহায্য করে। শিফটিং দ্বারা আপনি পূর্ববর্তী সময়ের ডেটাকে বর্তমানের সাথে সংযুক্ত করতে পারেন, এবং ল্যাগ ফিচার তৈরি করে অতীতের এক বা একাধিক মান ব্যবহার করে ভবিষ্যতের পূর্বাভাস করতে পারেন।
Read more