ماشینحسابهای نموداری در درسهای ریاضی و علوم بسیار کاربردی هستند، اما برای دستگاهی که از زمان معرفیاش در سال ۱۹۸۵ تغییر زیادی نکرده، هزینه بالایی دارند. پایتون با استفاده از کتابخانههای مناسب به شما اجازه میدهد نمودارهای معادلات رایج و نمودارهای آماری را بهصورت رایگان رسم کنید.
نمودارهای پایه با NumPy و Matplotlib
رسم نمودارهای خطی و چندجملهای پایه با پایتون بسیار آسان است. یکی از مزایای استفاده از پایتون این است که برخلاف ماشینحسابهای معمولی که فقط صفحهنمایش سیاه و سفید دارند، نمودارهای رنگی و متنوعی میتوانید بسازید؛ چیزی که ماشینحسابهای نموداری در طول سالها تغییر زیادی نکردهاند، موضوعی که وبکمیک xkcd هم به آن اشاره کرده است. بهترین روش برای این کار اجرای پایتون در ترمینال یا نوتبوک Jupyter است. اگر از ترمینال استفاده میکنید، توصیه میکنم از IPython استفاده کنید که امکانات زیادی برای کار تعاملی دارد و اساس استفاده از پایتون در Jupyter هم هست.
برای وارد کردن کتابخانه NumPy در جلسه پایتون یا اسکریپت خود، کافی است این دستور را بنویسید:
import numpy as np
کوتاه کردن نام کتابخانه به np تایپ را آسانتر میکند.
همچنین باید کتابخانه رسم نمودار Matplotlib را وارد کنید. این هم کار سادهای است:
import matplotlib.pyplot as plt
اگر در نوتبوک Jupyter کار میکنید، نمودارهایی که رسم میکنید در پنجرهای جداگانه باز میشوند و نه داخل نوتبوک. برای اینکه نمودارها مستقیماً داخل نوتبوک نمایش داده شوند، میتوانید این دستور “جادویی” را اجرا کنید:
%matplotlib inline
بعد از این مقدمات، میتوانیم معادلاتی را که میخواهیم رسم کنیم تعریف کنیم.
برای رسم یک معادله خطی، باید به فرم شیب-عرض از مبدأ یعنی $y = mx + b$ توجه کنیم، که در آن $m$ شیب یا تندی خط و $b$ عرض از مبدأ یا نقطهای است که خط محور y را قطع میکند.
محور x را با دستور np.linspace تعریف میکنیم که آرایهای از مقادیر با فاصله برابر میسازد. این دستور ۵۰ نقطه داده را بین -۱۰ و ۱۰ ایجاد میکند:
x = np.linspace(-10,10)
شیب را در متغیری ذخیره میکنیم. میتوانستیم مقدار را مستقیم در فرمول بگذاریم، اما استفاده از متغیرها تغییر دادن مقادیر را آسانتر میکند. شیب را $m = 3.5$ میگذاریم:
m = 3.5
عرض از مبدأ را در $b$ ذخیره میکنیم:
b = 5
محور y را با ضرب هر مقدار x در شیب و افزودن عرض از مبدأ تعریف میکنیم:
y = m*x + b
حالا نمودار را رسم میکنیم:
plt.plot(x,y)
plt.grid()
این کد، نمودار خطی را همراه با شبکه پسزمینه نمایش میدهد.
دستور plt.plot() کتابخانه Matplotlib را فراخوانی میکند تا مقادیر x و y را رسم کند، و دستور plt.grid() یک شبکه پشت نمودار ایجاد میکند تا محورهای مختصات واضحتر دیده شوند.
میتوانید معادله درجه دوم (ربعالعیار) را نیز با روشی مشابه رسم کنید. یک معادله درجه دوم کلاسیک به شکل $ax^2 + bx + c$ است. میتوانیم متغیرهایی برای $a$، $b$ و $c$ تعریف کنیم و محور x را نیز بسازیم:
x = np.linspace(-10,10)
a = 1
b = 2
c = -3
y = a*x**2 + b*x + c
plt.plot(x,y)
plt.grid()
این کد نمودار یک معادله درجه دوم را همراه با شبکه پسزمینه رسم میکند.
در جبر، ضرب معمولاً به صورت ضمنی نوشته میشود، مانند “ax”، اما در پایتون باید ضرب را بهصورت صریح تعریف کنید. برای مثال:
a * x
همچنین در پایتون، علامت ** برای توان استفاده میشود، بنابراین $x^2$ را به صورت x**2 مینویسیم.
چندجملهایهای درجه بالاتر مثل مکعبی (توان سه) و درجه چهارم به همین شکل کار میکنند.
رسم نمودار به روش جبری با SymPy
یک جایگزین برای استفاده از NumPy، کتابخانه SymPy است که یک کتابخانه جبر رایانهای برای پایتون محسوب میشود. SymPy با نمادها کار میکند، درست مثل اینکه یک ماشینحساب عددی یا برنامه پایتون معمولی با اعداد کار میکند. برای رسم نمودار، NumPy روشی مختصرتر برای تعریف معادلات فراهم میکند که شبیه کار کردن با کاغذ و مداد است.
میتوانید SymPy را با pip نصب کنید:
pip install sympy
برای کار با SymPy باید آن را وارد کنید و متغیرهای نمادی تعریف کنید. SymPy یک اسکریپت به نام isympy دارد که میتوانید از ترمینال اجرا کنید، این اسکریپت SymPy را بارگذاری کرده، متغیرهای معمولی مثل $x$ و $y$ را تعریف میکند، چاپ زیبا را فعال میکند و یک جلسه تعاملی شروع میکند. همچنین میتوانید این تنظیمات را در نوتبوک Jupyter یا جلسه تعاملی معمولی پایتون انجام دهید:
from sympy import *
x = symbols('x')
init_printing()
این دستورات به پایتون میگویند SymPy را وارد فضای نام اصلی کند، یک متغیر نمادی به نام $x$ تعریف کند و چاپ زیبا (مثل کتابهای ریاضی) را فعال نماید. متغیرهای نمادی باید قبل از استفاده در SymPy تعریف شوند.
برای ضرایب میتوانیم مانند NumPy از متغیرهای معمولی استفاده کنیم. بیایید معادله خطی قبلی را با SymPy رسم کنیم:
m = 3.5
b = 5
plot(m*x + b, (x, -10, 10))
این دستور نمودار معادله $y = mx + b$ را در بازه $x$ از -۱۰ تا ۱۰ رسم میکند.
تابع plot یک نمودار دوبعدی از معادله به فرم شیب-عرض از مبدأ رسم میکند، و بخش (x, -10, 10) محدوده نمودار را مشخص میکند؛ یعنی محور x از مقدار -۱۰ تا ۱۰ خواهد بود. اگر این بخش را حذف کنید، این بازه به صورت پیشفرض در نظر گرفته میشود. دقت کنید که محورهای مختصات درست داخل نمودار قرار دارند.
یادتان باشد همه پرانتزها را ببندید. IPython و Jupyter به شما در این کار کمک میکنند و پرانتزها را هنگام تایپ کردن برجسته میکنند.
برای معادلات درجه دوم و چندجملهایهای دیگر هم همین روش استفاده میشود:
a = 1
b = 2
c = -3
plot(a*x**2 + b*x + c, (x, -10, 10))
این کد نمودار معادله درجه دوم $y = ax^2 + bx + c$ را در بازه $x$ از -۱۰ تا ۱۰ رسم میکند.
ساخت نمودارهای آماری
علاوه بر رسم خطوط و منحنیها، پایتون میتواند نمودارهای آماری هم بسازد. البته میتوانستید این کار را در برنامههایی مثل Excel، LibreOffice Calc یا Google Sheets انجام دهید، اما به نظر من خروجی این روش زیباتر و حرفهایتر از جدولمحور است.
در این بخش، از کتابخانه Seaborn استفاده میکنیم که قبلاً دربارهاش صحبت کردهام، تا دادههای آماری را با پایتون مثل استفاده از ماشینحساب نموداری در کلاس آمار، بهصورت گرافیکی نمایش دهیم.
میتوانید Seaborn را با pip نصب کنید:
pip install seaborn
سپس آن را در جلسه IPython یا نوتبوک Jupyter خود وارد کنید:
import seaborn as sns
همانند NumPy، این روش وارد کردن باعث میشود تایپ کردن نام کتابخانه کوتاهتر و راحتتر شود.
Seaborn چندین مجموعه داده (dataset) آماده دارد که میتوانید با آنها تمرین کنید. ما از مجموعه دادهای به نام «tips» که شامل انعامهای رستورانهای نیویورک است، استفاده خواهیم کرد:
tips = sns.load_dataset('tips')
برای مشاهده ستونهای این مجموعه داده که به شکل یک DataFrame از کتابخانه Pandas است (شبیه جدولهای صفحات گسترده)، میتوانیم از تابع head() استفاده کنیم تا چند ردیف اول دادهها را ببینیم:
tips.head()
این کد چند ردیف اول دادههای مربوط به انعامها را نمایش میدهد.
شما حتی میتوانید دادههای جدولمحور خود را از برنامههایی مثل Excel یا هر برنامه دیگری وارد کنید.
برای مثال، برای خواندن یک فایل CSV از این کد استفاده کنید:
import pandas as pd
data = pd.read_csv("/path/to/data.csv")
بعد از بارگذاری دادهها، میتوانیم شروع به تحلیل و مشاهده آنها کنیم.
برای رسم یک نمودار میلهای ساده از مجموع صورتحسابها (total bill) در روزهای مختلف هفته، میتوانید از تابع catplot استفاده کنید:
sns.catplot(x='day', y='total_bill', kind='bar', data=tips)
این دستور، نموداری میلهای رسم میکند که مجموع صورتحسابها را برای هر روز هفته نشان میدهد.
یک نمودار مفید دیگر، هیستوگرام است که توزیع دادهها را نشان میدهد.
برای دیدن پراکندگی و بیشترین مقادیر انعامها (tips)، میتوانید از تابع displot استفاده کنید:
sns.displot(x='tip', data=tips)
این دستور، هیستوگرامی رسم میکند که فراوانی مقادیر انعام را نمایش میدهد.
نمودار جعبهای، که بهدرستی به آن نمودار جعبه و خطکِش (box-and-whisker plot) گفته میشود، به شما کمک میکند بازه و پراکندگی دادهها را بهتر ببینید.
بیایید دوباره به مجموع صورتحسابها نگاه کنیم، اما این بار نوع نمودار را از میلهای به جعبهای تغییر دهیم:
sns.catplot(x='day', y='total_bill', kind='box', data=tips)
این دستور نمودار جعبهای را برای مجموع صورتحسابها در هر روز هفته رسم میکند و به شما نشان میدهد که دادهها چطور بین حداقل، حداکثر و میانه توزیع شدهاند.
بخش جعبهای نمودار، نشاندهنده ۵۰ درصد میانی دادهها یا میانه (median) هر دسته است که با خط وسط جعبه مشخص میشود، و خطوط بالا و پایین جعبه که «whiskers» یا خطکِشها نامیده میشوند، نشاندهنده بیشینه و کمینه مقادیر هستند.
یکی از روشهای قدرتمند برای بررسی دادهها، استفاده از نمودار پراکندگی (scatterplot) و رگرسیون است. نمودار پراکندگی رابطه بین یک متغیر مستقل در محور x و یک متغیر وابسته در محور y را نشان میدهد تا ببینیم آیا ارتباطی وجود دارد یا نه.
بیایید رابطه بین انعامهای رستوران و مجموع صورتحسابها را بررسی کنیم:
sns.relplot(x='total_bill', y='tip', data=tips)
این دستور یک نمودار پراکندگی رسم میکند که در آن مجموع صورتحسابها در محور x و میزان انعامها در محور y نمایش داده شده است تا ببینیم آیا ارتباطی بین این دو وجود دارد یا خیر.
متوجه میشوید که دادهها چگونه بهصورت تقریبی روی یک خط راست قرار گرفتهاند؟
میتوانیم این رابطه را با رسم خط رگرسیون بهتر نشان دهیم، که با استفاده از تابع regplot انجام میشود. این تابع تقریباً همان relplot است که فقط یک حرف تغییر کرده است:
sns.regplot(x='total_bill', y='tip', data=tips)
این دستور علاوه بر نقاط پراکندگی، یک خط رگرسیون هم رسم میکند که بهترین تناسب خطی بین متغیرهای مورد نظر را نشان میدهد.
خط رگرسیون را میبینید که روی نمودار پراکندگی اصلی قرار گرفته است. میتوانید تحلیل رگرسیون رسمیتر و دقیقتری انجام دهید تا میزان همبستگی بین دادهها را مشخص کنید، اما با نگاه کردن به این خط و نقاط داده، به نظر میرسد که همبستگی خوبی وجود دارد.
هرچند ممکن است هنوز هم برای امتحانات به ماشینحساب نموداریتان نیاز داشته باشید، اما وقتی مشغول حل تمرین، بررسی دادهها یا حتی فقط آزمایش و بازی با دادهها هستید، نمودارهای پایتون ظاهر بهتری دارند و رایگان هم هستند. برای قدردانی از این مزیت، لازم نیست حتماً یک علاقهمند به ریاضی باشید!




















