অধ্যায় 4 · ডেটার জন্য Python
Matplotlib দিয়ে চার্ট
- পৃষ্ঠা 15 / 20
- 3 মিনিট পড়া
সংখ্যার টেবিল যে প্যাটার্ন লুকিয়ে রাখে, একটা ছবি তা পরিষ্কার করে দেয়। মডেল বানানোর আগে ডেটা বুঝতে আপনি প্লট করবেন, আর মডেল আদৌ শিখছে কি না দেখতে প্লট করবেন তার ট্রেনিংয়ের অগ্রগতি। Matplotlib হলো Python-এর প্রচলিত প্লটিং লাইব্রেরি; pandas আর বেশিরভাগ লাইব্রেরি ভেতরে এটা দিয়েই আঁকে।
ইনস্টল করুন python -m pip install matplotlib দিয়ে। মূল মডিউলটা ইমপোর্ট করা হয় plt নামে।
ফিগার আর অ্যাক্সেস
প্রতিটা চার্ট একটা ফিগার (পুরো ছবিটা), যার ভেতরে থাকে এক বা একাধিক অ্যাক্সেস (আলাদা আলাদা প্লট)। fig, ax = plt.subplots() দুটোই বানায়; তারপর আঁকতে ax-এর মেথড ডাকেন। নোটবুকে চার্টটা সেলের নিচে আসে; স্ক্রিপ্টে plt.show() একটা উইন্ডো খোলে, আর fig.savefig() একটা ছবির ফাইল লেখে।
লাইন চার্ট: মডেলের শেখা দেখা
মডেল ট্রেনিংয়ের সময় ডেটার ওপর প্রতিবার পুরো একটা পাস (epoch) শেষে তাকে যাচাই করা হয় ট্রেনিং ডেটায় আর আলাদা ভ্যালিডেশন ডেটায়, যাতে সে কখনো ট্রেনিং পায় না। দুটোই প্লট করা মেশিন লার্নিংয়ের সবচেয়ে প্রচলিত চার্ট:
import matplotlib.pyplot as plt
epochs = list(range(1, 11))
train_loss = [2.30, 1.65, 1.21, 0.95, 0.80, 0.70, 0.63, 0.58, 0.55, 0.53]
val_loss = [2.35, 1.75, 1.36, 1.14, 1.03, 0.98, 0.97, 0.99, 1.04, 1.10]
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.plot(epochs, train_loss, marker="o", label="Training loss")
ax.plot(epochs, val_loss, marker="s", label="Validation loss")
ax.axvline(7, linestyle="--", color="gray")
ax.annotate("validation loss starts rising", xy=(7, 0.97), xytext=(7.3, 1.6),
arrowprops={"arrowstyle": "->"})
ax.set_title("Training a model: loss per epoch")
ax.set_xlabel("Epoch")
ax.set_ylabel("Loss (lower is better)")
ax.legend()
ax.grid(alpha=0.3)
fig.tight_layout()
fig.savefig("loss.png", dpi=100)
print("Saved loss.png")Saved loss.png
চার্টটা এমন একটা গল্প বলে যা সংখ্যাগুলো লুকিয়ে রাখে: epoch ৭-এর পর মডেল যে ডেটায় ট্রেনিং পায় সেখানে আরও ভালো করছে, কিন্তু নতুন ডেটায় খারাপ করছে। সে শেখার বদলে মুখস্থ করতে শুরু করেছে — একে বলে ওভারফিটিং। সমাধান হলো epoch ৭-এর কাছাকাছি ট্রেনিং থামানো।
বার চার্ট আর হিস্টোগ্রাম
ক্যাটাগরি তুলনা করতে বার চার্ট, আর মানগুলো কীভাবে ছড়িয়ে আছে দেখতে হিস্টোগ্রাম ব্যবহার করুন। plt.subplots(1, 2) দুটো অ্যাক্সেস পাশাপাশি বসায়:
import matplotlib.pyplot as plt
import numpy as np
channels = ["chat", "phone", "email"]
avg_minutes = [11.7, 27.5, 65.0]
rng = np.random.default_rng(7)
response_lengths = rng.normal(loc=120, scale=35, size=500) # words per AI answer
fig, (left, right) = plt.subplots(1, 2, figsize=(10, 4))
left.bar(channels, avg_minutes, color=["#4c72b0", "#dd8452", "#c44e52"])
left.set_title("Average minutes to resolve")
left.set_ylabel("Minutes")
right.hist(response_lengths, bins=25, color="#55a868", edgecolor="white")
right.set_title("Length of 500 AI answers")
right.set_xlabel("Words")
right.set_ylabel("How many answers")
fig.tight_layout()
fig.savefig("bar_hist.png", dpi=100)
print("Saved bar_hist.png")Saved bar_hist.png
সরাসরি pandas থেকে প্লট
pandas-এর Series বা DataFrame-এ একটা .plot() মেথড আছে, তাই আগের পাতার group-by ফলাফল এক ডাকেই চার্ট হয়ে যায়:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("tickets.csv")
ax = df.groupby("category")["satisfaction"].mean().sort_values().plot(
kind="barh", figsize=(7, 3), title="Average satisfaction by category", color="#8172b3"
)
ax.set_xlabel("Satisfaction (1–5)")
plt.tight_layout()
plt.savefig("satisfaction.png", dpi=100)
print("Saved satisfaction.png")Saved satisfaction.png
ঠিক চার্টটা বাছাই
| প্রশ্ন | চার্ট |
|---|---|
| সময় বা ধাপের সাথে কিছু কীভাবে বদলায়? | লাইন — ax.plot |
| ক্যাটাগরিগুলো কীভাবে তুলনা হয়? | বার — ax.bar / ax.barh |
| মানগুলো কীভাবে ছড়ানো? ব্যতিক্রমী কিছু আছে? | হিস্টোগ্রাম — ax.hist |
| দুটো সংখ্যার মধ্যে কি সম্পর্ক আছে? | স্ক্যাটার — ax.scatter |
যে চার্টই শেয়ার করুন, তাতে একটা শিরোনাম, এককসহ লেবেল দেওয়া অক্ষ, আর একাধিক ধারা থাকলে লেজেন্ড থাকতে হবে। যে চার্ট নিয়ে কাউকে প্রশ্ন করতে হয়, সে তার কাজ করেনি।
নিজে চেষ্টা করুন
- গত ৭ দিনের পড়ার ঘণ্টা লেবেলসহ অক্ষে একটা লাইন চার্টে আঁকুন।
tickets.csvথেকেminutes_to_resolveবনামsatisfaction-এর একটা স্ক্যাটার প্লট আঁকুন। কী দেখছেন?- লসের উদাহরণটা বদলে চার্টটা PNG-এর বদলে PDF হিসেবে সংরক্ষণ করুন।