پردازش، تحلیل، گروهبندی و پیشپردازش دادهها | مقدمهای بر علم داده و هوش مصنوعی
این کتابخانه به شدت پرکاربرد است و یادگیری آن برای ورود به حوزه هوش مصنوعی کاملاً ضروری میباشد. Pandas به شما امکان میدهد دادههای جدولی (مانند Excel یا CSV) را به راحتی بارگذاری، پردازش و تحلیل کنید.
برای شروع کار با کتابخانه Pandas، ابتدا نیاز به یک داده (Data) داریم. هر داده از دو بخش تشکیل میشود:
اولین چیزی که باید یاد بگیریم، ذخیره دادهها است. یک پوشه میسازیم و درون آن یک فایل با نام مثلاً data.csv ایجاد میکنیم. پسوند .csv مخفف Comma Separated Values است و دادهها در آن با کاما از هم جدا میشوند.
Name,age,salary,smoker
Yasin,21,350000,No
میتوانیم به تعداد دلخواه نمونه به فایل اضافه کنیم. مثلاً:
Name,age,salary,smoker
Yasin,21,350000,No
Ali,20,32434,Yes
قبل از هر کاری باید Pandas را نصب کنید. روش نصب بستگی به محیط برنامهنویسی شما دارد:
pip install pandas
% اجرا کنید: %pip install pandasروش دوم ذخیره داده (غیر از فایل CSV) استفاده از دیکشنری در خود کد پایتون است. این روش برای دادههای کوچک و آزمایشی مناسب است.
import pandas as pd
data = {
"name": ["yasin", "ali"],
"age": [20, 21]
}
print(type(data))
type(data) نشان میدهد که داده از نوع dict (دیکشنری) است. اما در Pandas برای تحلیل داده به DataFrame نیاز داریم.برای تبدیل دیکشنری به DataFrame از کد زیر استفاده میکنیم:
import pandas as pd
data = {
"name": ["yasin", "ali"],
"age": [20, 21]
}
df = pd.DataFrame(data)
print(type(df))
print(df)
pd.DataFrame() میتوانیم انواع دادهها (دیکشنری، لیست لیستها، فایل CSV و ...) را تبدیل به DataFrame کنیم.در بیشتر پروژههای واقعی، دادهها به صورت فایل csv ذخیره میشوند. برای خواندن این فایلها از تابع pd.read_csv() استفاده میکنیم.
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
اگر فایل CSV در پوشه دیگری قرار دارد، باید آدرس کامل فایل را به همراه حرف r جلوی آن بنویسید:
import pandas as pd
df = pd.read_csv(r'C:\Users\YourName\Desktop\data.csv')
print(df)
r جلوی رشته به پایتون میگوید که این رشته یک «رشته خام» (raw string) است و کاراکترهای خاص مانند \ را نباید به عنوان فرار (escape) تفسیر کند. این کار مخصوصاً برای آدرسهای ویندوز مفید است.بعد از بارگذاری داده، معمولاً میخواهیم ساختار و وضعیت کلی آن را ببینیم. دستورات زیر پرکاربردترینها هستند:
head()df.head()
head() به طور پیشفرض ۵ سطر اول را نمایش میدهد. برای تعداد دلخواه میتوانید عدد داخل پرانتز قرار دهید، مثلاً df.head(10). این دستور برای دیدن ساختار داده بدون نمایش کل جدول بسیار مفید است.tail()df.tail()
tail() پنج سطر آخر داده را نشان میدهد. این دستور برای بررسی انتهای داده و مشاهده آخرین رکوردها کاربرد دارد.shapedf.shape
(تعداد سطر, تعداد ستون) است. سطرها همان نمونهها (افراد) و ستونها همان ویژگیها هستند.columnsdf.columns
describe()df.describe()
describe() برای ستونهای عددی، شاخصهایی مثل: تعداد (count)، میانگین (mean)، انحراف معیار (std)، حداقل (min)، صدکها (25%, 50%, 75%) و حداکثر (max) را محاسبه میکند. این دستور برای شناخت اولیه از توزیع داده بسیار مفید است.info()df.info()
info() تعداد کل رکوردها، تعداد ستونها، نوع داده هر ستون و مهمتر از همه تعداد مقادیر غیرناقص (Non-Null Count) را نشان میدهد. اگر تعداد Non-Null کمتر از تعداد کل ردیفها باشد، یعنی داده ناقص (Missing Value) داریم که باید پیشپردازش شود.گاهی فقط میخواهیم بخشی از DataFrame را ببینیم. مثلاً چند ردیف از یک ستون خاص.
df['age'][2:10]
df['age'] ستون سن را انتخاب میکند. سپس [2:10] ردیفهای با ایندکس ۲ تا ۹ را برمیگرداند (در پایتون، برش از ابتدا شامل و از انتها خارج است).با value_counts() میتوانیم ببینیم هر مقدار در یک ستون چند بار تکرار شده است. این دستور برای ستونهای دستهای (Category) بسیار مفید است.
df['age'].value_counts()
با استفاده از normalize=True درصد (نسبت) هر مقدار را به جای تعداد مطلق نشان میدهد:
df['smoker'].value_counts(normalize=True) * 100
pd.crosstab() یک جدول دو بعدی میسازد که فراوانی ترکیب دو ویژگی را نشان میدهد.
pd.crosstab(df.age, df.smoker)
برای نمایش ردیفهایی که یک شرط خاص را دارند، از فیلتر استفاده میکنیم.
up18 = df[df.age > 18]
up18
df.age > 18 یک آرایه بولی (True/False) میسازد. سپس با قرار دادن آن داخل df[...]، فقط ردیفهایی که شرط در آنها True است انتخاب میشود.برای جستجوی یک شخص خاص (مثلاً «yasin»):
df[df.name.str.contains('yasin')]
str.contains() یک متد رشتهای است که بررسی میکند آیا عبارت مورد نظر درون متن وجود دارد یا نه. این روش برای جستجوی متنی در ستونهای رشتهای عالی است.unique() مقادیری که در یک ستون وجود دارند را بدون تکرار برمیگرداند. این دستور برای شناسایی «دستههای» مختلف یک ویژگی کاربرد دارد.
df.smoker.unique()
unique() این سه مقدار را بدون تکرار برمیگرداند. این کار به ما میگوید که چند نوع داده در آن ویژگی وجود دارد.با استفاده از groupby() میتوانیم دادهها را بر اساس یک ستون گروهبندی کنیم و عملیات آماری روی هر گروه انجام دهیم.
df.groupby('age').count()
groupby('age') داده را بر اساس مقادیر مختلف سن دستهبندی میکند. سپس count() تعداد رکوردهای هر گروه را محاسبه میکند.df.groupby('age')[smoker].mean() زمانی کار میکند که ستون smoker مقادیر ۰ و ۱ داشته باشد (نه Yes/No). در ادامه در بخش پیشپردازش یاد میگیریم چگونه دادههای متنی را به عددی تبدیل کنیم.df.groupby('age')['smoker'].mean()
برای مرتبسازی داده بر اساس یک ویژگی خاص از sort_values() استفاده میکنیم. میتوان بر اساس کم به زیاد (صعودی) یا زیاد به کم (نزولی) مرتب کرد.
df.sort_values('age')
ascending=False استفاده کنید: df.sort_values('age', ascending=False)str (رشتهای) باشد. مثلاً جنسیت به جای عدد با «مرد/زن» نوشته شده باشد، یا گروه خونی به صورت کلمه باشد. سیستم (مدل هوش مصنوعی) از این دادهها درکی ندارد و ما باید آنها را پیشپردازش کرده و به عدد تبدیل کنیم.برای شروع پیشپردازش، طبق روال زیر عمل میکنیم:
import pandas as pd)read_csv میخوانیمdf.shape ابعاد داده را میبینیمdf.info() اطلاعات کلی و وجود دادههای ناقص را بررسی میکنیمdf.describe() آمار توصیفی میبینیمبرای اینکه سیستم ما فقط اعداد را بفهمد، باید ستونهایی که دادههایشان غیرعددی است (مثل ستون smoker با مقادیر Yes/No) را به عدد تبدیل کنیم. این کار را با دستور replace() انجام میدهیم.
df.replace({'smoker':{'yes':0, 'no':1}}, inplace=True)
replace() یک تابع برای جایگزینی مقادیر است.{'smoker':{'yes':0, 'no':1}} یعنی در ستون smoker هرجا مقدار yes بود به 0 و هرجا no بود به 1 تبدیل شود.inplace=True یعنی تغییرات را مستقیماً روی همان DataFrame اعمال کن (بدون نیاز به ساخت یک کپی جدید). اگر inplace=True را ننویسیم، تغییرات فقط به صورت موقت نمایش داده میشوند و در DataFrame اصلی ذخیره نمیشوند.برای تأیید تغییرات، دوباره df.head() را اجرا کنید تا ببینید ستون smoker به اعداد تبدیل شده است.
گاهی برخی ستونها (مثل name) برای تحلیل ما کاربردی ندارند. بهتر است آنها را حذف کنیم تا داده تمیزتر و پردازش سریعتر شود.
df = df.drop(columns=['name'])
df.head()
drop(columns=['name']) ستون name را حذف میکند. نتیجه را دوباره در df ذخیره میکنیم تا تغییرات دائمی شود. سپس با df.head() تأیید میکنیم که ستون name دیگر وجود ندارد.read_csv().head(), tail(), shape, columns, describe(), info().df['col'][start:end] و df[شرط].value_counts(), crosstab(), unique().groupby(), sort_values().replace() و حذف ستونهای اضافی با drop().