Python āļŠāļģāļŦāļĢāļąāļš Data Analytics: Matplotlib, Seaborn āđāļĨāļ°āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™

āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ Python āļœāđˆāļēāļ™ Matplotlib āđāļĨāļ° Seaborn āļšāļ—āđ€āļĢāļĩāļĒāļ™āđ€āļŠāļīāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļāļĢāļēāļŸ āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļš subplot āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļŠāļģāļŦāļĢāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡ data analytics āļ›āļĩ 2026

āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ Python āļœāđˆāļēāļ™ Matplotlib āđāļĨāļ° Seaborn āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ data analytics

āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ Python āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ—āļąāļāļĐāļ°āļ—āļĩāđˆāļ–āļđāļāļ—āļ”āļŠāļ­āļšāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒ data analytics āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ„āļēāļ”āļŦāļ§āļąāļ‡āđƒāļŦāđ‰āļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāļ—āļĩāđˆāļŠāļ°āļ­āļēāļ”āđāļĨāļ°āļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒāļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āļīāļš āļĢāļ§āļĄāļ–āļķāļ‡āļ­āļ˜āļīāļšāļēāļĒāđ€āļŦāļ•āļļāļœāļĨāđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāļāļēāļĢāļ­āļ­āļāđāļšāļšāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļąāđˆāļ™āđƒāļˆ

āļšāļ—āđ€āļĢāļĩāļĒāļ™āļ™āļĩāđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Matplotlib 3.10 āđāļĨāļ° Seaborn 0.13 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāļ­āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ„āļĢāļ­āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļŠāļīāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļŠāļģāļŦāļĢāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ™āļąāļāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļĨāļ° data scientist āļ—āļļāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāļšāļ™ Python 3.12+

āđ€āļ„āļĨāđ‡āļ”āļĨāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ data analytics āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩāļĢāļ­āļš live coding āļ—āļĩāđˆāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ€āļ§āļĨāļēāđ„āļĄāđˆāđ€āļāļīāļ™ 15 āļ™āļēāļ—āļĩ āļĢāļđāļ›āđāļšāļšāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡āļāļąāļšāđāļšāļšāļāļķāļāļŦāļąāļ”āđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™

āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ Python

āļāđˆāļ­āļ™āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āļāļĢāļēāļŸāđƒāļ”āđ† āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļāļēāļĢāļžāļąāļ’āļ™āļēāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩ dependency āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ Virtual environment āļ—āļĩāđˆāļŠāļ°āļ­āļēāļ”āļŠāđˆāļ§āļĒāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ›āļąāļāļŦāļēāļ„āļ§āļēāļĄāļ‚āļąāļ”āđāļĒāđ‰āļ‡āļ‚āļ­āļ‡āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Matplotlib, Seaborn āđāļĨāļ°āļžāļ·āđ‰āļ™āļāļēāļ™ NumPy/Pandas āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™

bash
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpy

āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđ€āļžāļ·āđˆāļ­āļĒāļ·āļ™āļĒāļąāļ™āļ§āđˆāļēāļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰:

python
# verify_install.py
import matplotlib
import seaborn as sns
import pandas as pd

print(f"Matplotlib: {matplotlib.__version__}")
print(f"Seaborn: {sns.__version__}")
print(f"Pandas: {pd.__version__}")

āđ€āļĄāļ·āđˆāļ­ dependency āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ–āļđāļāļĨāđ‡āļ­āļāđāļĨāđ‰āļ§ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āļˆāļ°āđ€āļ™āđ‰āļ™āļ—āļĩāđˆāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ Matplotlib āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļēāļāļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļāļĢāļēāļŸ Seaborn āļ—āļļāļāļŠāļ™āļīāļ”

āļžāļ·āđ‰āļ™āļāļēāļ™ Matplotlib: Figure, Axes āđāļĨāļ° API āđāļšāļš Object-Oriented

Matplotlib āļĄāļĩ API āļŠāļ­āļ‡āđāļšāļš: state machine āļ‚āļ­āļ‡ pyplot āđāļĨāļ°āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļŸāļ‹āđāļšāļš object-oriented (OO) API āđāļšāļš OO āđƒāļŦāđ‰āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™āļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļš āđāļĨāļ°āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāļ„āļēāļ”āļŦāļ§āļąāļ‡āđƒāļ™āđ‚āļ„āđ‰āļ”āļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāđāļĨāļ°āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

python
# bar_chart_oo.py
import matplotlib.pyplot as plt
import numpy as np

# Sample quarterly revenue data
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue = [42_000, 58_000, 51_000, 67_000]

# Create figure and axes explicitly
fig, ax = plt.subplots(figsize=(8, 5))

# Draw bars with a specific color
ax.bar(quarters, revenue, color="#2563eb", width=0.5)

# Label axes clearly — interviewers check for this
ax.set_xlabel("Quarter")
ax.set_ylabel("Revenue (USD)")
ax.set_title("Quarterly Revenue — 2025")

# Format y-axis with dollar amounts
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))

# Remove top and right spines for a cleaner look
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("quarterly_revenue.png", dpi=150)
plt.show()

āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļŠāļąāļ‡āđ€āļāļ•: āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ fig, ax āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđāļ—āļ™āļāļēāļĢāđƒāļŠāđ‰ plt.plot() āļ›āđ‰āļēāļĒāļāļģāļāļąāļšāđāļāļ™āļ—āļĩāđˆāļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒ āļ„āđˆāļē tick āļ—āļĩāđˆāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāđāļĨāđ‰āļ§ āđāļĨāļ°āļāļēāļĢāļĨāļšāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļāļĢāļēāļŸāļ—āļĩāđˆāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™ (spines āļ—āļĩāđˆāđ€āļāļīāļ™āļĄāļē) āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ€āļĨāđ‡āļāđ† āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ–āļķāļ‡āđāļ™āļ§āļ„āļīāļ”āļĢāļ°āļ”āļąāļš production

āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Subplot āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđ€āļŠāļīāļ‡āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš

āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļĄāļąāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŦāļĨāļēāļĒāđ€āļĄāļ•āļĢāļīāļāđāļšāļšāđ€āļ„āļĩāļĒāļ‡āļ‚āđ‰āļēāļ‡āļāļąāļ™ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ subplots() āļˆāļąāļ”āļāļēāļĢāđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļ”āđ‰āļ§āļĒāđ€āļĨāļĒāđŒāđ€āļ­āļēāļ•āđŒāđāļšāļšāļāļĢāļīāļ”

python
# subplots_comparison.py
import matplotlib.pyplot as plt
import numpy as np

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
users = [1200, 1350, 1500, 1420, 1680, 1820]
revenue = [24_000, 27_000, 30_000, 28_400, 33_600, 36_400]

# Two side-by-side plots sharing the x-axis
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), sharey=False)

# Left panel: user growth as a line chart
ax1.plot(months, users, marker="o", color="#2563eb", linewidth=2)
ax1.set_title("Monthly Active Users")
ax1.set_ylabel("Users")
ax1.spines[["top", "right"]].set_visible(False)

# Right panel: revenue as a bar chart
ax2.bar(months, revenue, color="#16a34a", width=0.5)
ax2.set_title("Monthly Revenue")
ax2.set_ylabel("Revenue (USD)")
ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax2.spines[["top", "right"]].set_visible(False)

fig.suptitle("Product Metrics — H1 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("product_metrics.png", dpi=150)
plt.show()

āļāļēāļĢāđƒāļŠāđ‰ sharey=False āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđāļ•āđˆāļĨāļ° panel āļĄāļĩāļŠāđ€āļāļĨāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļēāļĒāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ”āļ­āļĨāļĨāļēāļĢāđŒāđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚āļ™āļąāļšāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ•āđˆāļēāļ‡āļāļąāļ™ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ suptitle āđ€āļžāļīāđˆāļĄāļŦāļąāļ§āļ‚āđ‰āļ­āļŦāļĨāļąāļāđ€āļŦāļ™āļ·āļ­ subplot āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡

āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļĄāļąāļāđƒāļŠāđ‰ plt.plot() āļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰ API āđāļšāļš object-oriented āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‚āļ­āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāđāļāļ™ y āļ—āļĩāđˆāļŠāļ­āļ‡āļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ subplot āđ€āļ”āļĩāļĒāļ§ āļ§āļīāļ˜āļĩ pyplot āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰ āļ„āļ§āļĢāđƒāļŠāđ‰ fig, ax = plt.subplots() āđ€āļ›āđ‡āļ™āļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļŠāļĄāļ­

āļāļĢāļēāļŸāļŠāļ–āļīāļ•āļīāļ‚āļ­āļ‡ Seaborn: āļˆāļēāļāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§āļ–āļķāļ‡āļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒ

Seaborn āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļšāļ™ Matplotlib āđāļĨāļ°āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ”āđ‰āļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŠāļīāļ‡āļŠāļ–āļīāļ•āļī āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ Matplotlib āļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡ Seaborn āļˆāļ°āļ­āļ™āļļāļĄāļēāļ™āļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī

āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ‡āļēāļ™āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļĩāļĒāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ€āļ”āļĩāļĒāļ§:

python
# distribution_analysis.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Simulate salary data for two departments
np.random.seed(42)
data = pd.DataFrame({
    "salary": np.concatenate([
        np.random.normal(75_000, 12_000, 200),  # Engineering
        np.random.normal(65_000, 10_000, 150),  # Marketing
    ]),
    "department": ["Engineering"] * 200 + ["Marketing"] * 150
})

# KDE plot comparing salary distributions
fig, ax = plt.subplots(figsize=(10, 5))
sns.kdeplot(
    data=data,
    x="salary",
    hue="department",        # Automatically splits by category
    fill=True,               # Shaded area under the curve
    alpha=0.4,
    palette=["#2563eb", "#dc2626"],
    ax=ax                    # Attach to our explicit axes
)

ax.set_title("Salary Distribution by Department")
ax.set_xlabel("Annual Salary (USD)")
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("salary_distribution.png", dpi=150)
plt.show()

āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ hue āđāļšāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđāļĨāļ° fill=True āļ—āļģāđƒāļŦāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ—āļąāļšāļ‹āđ‰āļ­āļ™āļāļąāļ™āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļŠāļąāļ”āđ€āļˆāļ™ āļĢāļđāļ›āđāļšāļšāļ™āļĩāđ‰ āļ„āļ·āļ­āļāļēāļĢāļˆāļąāļ”āļāļĨāļļāđˆāļĄāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§āļ•āļēāļĄāļŦāļĄāļ§āļ”āļŦāļĄāļđāđˆ āļ›āļĢāļēāļāļāđƒāļ™āđāļ—āļšāļ—āļļāļāļĢāļ­āļšāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ analytics

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Data Analytics āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

Heatmap āļ‚āļ­āļ‡ Seaborn āļŠāļģāļŦāļĢāļąāļšāđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒ

Heatmap āļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđ€āļœāļĒāđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļąāļ§āđāļ›āļĢāļ•āļąāļ§āđ€āļĨāļ‚āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđƒāļŠāđ‰āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļ§āđˆāļēāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļ multicollinearity āļŦāļĢāļ·āļ­āļ„āđ‰āļ™āļžāļšāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŸāļĩāđ€āļˆāļ­āļĢāđŒāļ—āļĩāđˆāđāļ‚āđ‡āļ‡āđāļāļĢāđˆāļ‡āđ„āļ”āđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆ

python
# correlation_heatmap.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Simulate e-commerce metrics
np.random.seed(42)
n = 500
page_views = np.random.poisson(15, n)
time_on_site = page_views * 2.5 + np.random.normal(0, 5, n)
cart_adds = np.random.binomial(page_views, 0.3)
purchases = np.random.binomial(cart_adds, 0.4)

df = pd.DataFrame({
    "page_views": page_views,
    "time_on_site": time_on_site,
    "cart_adds": cart_adds,
    "purchases": purchases
})

# Compute Pearson correlation
corr_matrix = df.corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
    corr_matrix,
    annot=True,              # Show correlation values in cells
    fmt=".2f",               # Two decimal places
    cmap="RdBu_r",           # Diverging colormap centered on 0
    vmin=-1, vmax=1,         # Fixed scale for consistency
    square=True,             # Square cells
    linewidths=0.5,
    ax=ax
)

ax.set_title("E-commerce Metrics Correlation")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()

Colormap āđāļšāļš diverging RdBu_r āļ—āļģāđƒāļŦāđ‰āļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđ€āļŠāļīāļ‡āļšāļ§āļāđ€āļ›āđ‡āļ™āļŠāļĩāļ™āđ‰āļģāđ€āļ‡āļīāļ™āđāļĨāļ°āļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđ€āļŠāļīāļ‡āļĨāļšāđ€āļ›āđ‡āļ™āļŠāļĩāđāļ”āļ‡ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļ—āļĩāđˆāļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ„āļēāļ”āļŦāļ§āļąāļ‡ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē vmin=-1 āđāļĨāļ° vmax=1 āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļŠāđ€āļāļĨāļŠāļĩāļŠāļēāļĄāļēāļĢāļ–āļ•āļĩāļ„āļ§āļēāļĄāđ„āļ”āđ‰āđ€āļŠāļĄāļ­āđ‚āļ”āļĒāđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļāļąāļšāļŠāđˆāļ§āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļĢāļīāļ‡

āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļž

āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļīāļšāļˆāļēāļ Matplotlib āļ”āļđāļĨāđ‰āļēāļŠāļĄāļąāļĒ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļžāļĩāļĒāļ‡āđ„āļĄāđˆāļāļĩāđˆāļšāļĢāļĢāļ—āļąāļ”āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļāļĢāļēāļŸāđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ āļēāļžāļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­ āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļ„āļ§āļēāļĄāđƒāļŠāđˆāđƒāļˆāđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

python
# professional_styling.py
import matplotlib.pyplot as plt
import seaborn as sns

# Apply Seaborn's built-in theme
sns.set_theme(
    style="whitegrid",       # Clean background with grid lines
    palette="muted",         # Professional color palette
    font_scale=1.1           # Slightly larger text
)

# Global Matplotlib overrides
plt.rcParams.update({
    "figure.facecolor": "white",
    "axes.facecolor": "white",
    "font.family": "sans-serif",
    "axes.titlesize": 14,
    "axes.labelsize": 12,
})

āļāļēāļĢāđƒāļŠāđ‰ sns.set_theme() āļ—āļĩāđˆāļŠāđˆāļ§āļ™āļšāļ™āļ‚āļ­āļ‡āļŠāļ„āļĢāļīāļ›āļ•āđŒāļˆāļ°āđ€āļœāļĒāđāļžāļĢāđˆāļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āđ„āļ›āļĒāļąāļ‡āļ—āļļāļāļāļĢāļēāļŸāļ–āļąāļ”āđ„āļ› āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļŠāđˆāļ§āļĒāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāđ€āļŠāļĩāļĒāđ€āļ§āļĨāļēāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāļĨāļ°āļāļĢāļēāļŸ

āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™

Seaborn 0.13 āđ„āļ”āđ‰āļĒāļāđ€āļĨāļīāļāļāļēāļĢāđƒāļŠāđ‰ set_style() āđāļĨāļ° set_palette() āđāļšāļšāđāļĒāļāļāļąāļ™ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ set_theme() āđāļšāļšāļĢāļ§āļĄāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļĄāļēāđāļ—āļ™āļ—āļĩāđˆāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡ āļ„āļģāļ•āļ­āļšāļšāļ™ Stack Overflow āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđ€āļāđˆāļēāļĒāļąāļ‡āļ„āļ‡āļ­āđ‰āļēāļ‡āļ­āļīāļ‡ API āļ—āļĩāđˆāļĨāđ‰āļēāļŠāļĄāļąāļĒāļ­āļĒāļđāđˆ āļ„āļ§āļĢāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ›āļĩ 2026

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ

āļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ” āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļĒāļąāļ‡āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ€āļŠāļīāļ‡āđāļ™āļ§āļ„āļīāļ”āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨ āļ„āļģāļ–āļēāļĄāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļ›āļĢāļēāļāļāļ­āļĒāđˆāļēāļ‡āļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļŠāļēāļĒ data analytics āđāļĨāļ° data science

āļ„āļ§āļĢāđƒāļŠāđ‰ bar chart āđāļ—āļ™ line chart āđ€āļĄāļ·āđˆāļ­āđƒāļ”? Bar chart āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŦāļĄāļ§āļ”āļŦāļĄāļđāđˆāđāļšāļšāđ„āļĄāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ (āđāļœāļ™āļ āļ›āļĢāļ°āđ€āļ āļ—āļŠāļīāļ™āļ„āđ‰āļē āļ āļđāļĄāļīāļ āļēāļ„) Line chart āđāļŠāļ”āļ‡āđāļ™āļ§āđ‚āļ™āđ‰āļĄāļ•āļēāļĄāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļ‡āļĨāļģāļ”āļąāļš (āļ­āļ™āļļāļāļĢāļĄāđ€āļ§āļĨāļē āļāļēāļĢāļ§āļąāļ”āļ•āļēāļĄāļĨāļģāļ”āļąāļš) āļāļēāļĢāđƒāļŠāđ‰ line chart āļŠāļģāļŦāļĢāļąāļšāļŦāļĄāļ§āļ”āļŦāļĄāļđāđˆāļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļĨāļģāļ”āļąāļšāļˆāļ°āļŠāļ·āđˆāļ­āļ–āļķāļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļˆāļĢāļīāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ—āđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āļīāļ”āļāļąāļ™

āļ­āļ°āđ„āļĢāļ—āļģāđƒāļŦāđ‰āļāļĢāļēāļŸāđ€āļāļīāļ”āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļœāļīāļ”? āđāļāļ™ y āļ—āļĩāđˆāļ–āļđāļāļ•āļąāļ” āđāļāļ™ y āļ„āļđāđˆāļ—āļĩāđˆāļĄāļĩāļŠāđ€āļāļĨāļ•āđˆāļēāļ‡āļāļąāļ™ āđ€āļ­āļŸāđ€āļŸāļāļ•āđŒ 3D āļšāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ 2D āđāļĨāļ°āļāļēāļĢāđ€āļĨāļ·āļ­āļāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ­āļĒāđˆāļēāļ‡āđ€āļˆāļēāļ°āļˆāļ‡ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ™āļĩāđ‰āļšāļīāļ”āđ€āļšāļ·āļ­āļ™āļāļēāļĢāļĢāļąāļšāļĢāļđāđ‰ āļ§āļīāļ˜āļĩāđāļāđ‰āđ„āļ‚: āđ€āļĢāļīāđˆāļĄāđāļāļ™ y āļ—āļĩāđˆāļĻāļđāļ™āļĒāđŒāļŠāļģāļŦāļĢāļąāļš bar chart āļāļģāļāļąāļšāđāļāļ™āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āđāļĨāļ°āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ•āļāđāļ•āđˆāļ‡āļ—āļĩāđˆāļšāļ”āļšāļąāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ

āļāļēāļĢāđ€āļĨāļ·āļ­āļāļŠāļļāļ”āļŠāļĩāļŠāđˆāļ‡āļœāļĨāļ•āđˆāļ­āļāļēāļĢāļ•āļĩāļ„āļ§āļēāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāđˆāļēāļ‡āđ„āļĢ? āļŠāļļāļ”āļŠāļĩāđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ (āļ­āđˆāļ­āļ™āđ„āļ›āđ€āļ‚āđ‰āļĄ) āđ€āļŦāļĄāļēāļ°āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļĨāļģāļ”āļąāļš āđ€āļŠāđˆāļ™ āļ­āļļāļ“āļŦāļ āļđāļĄāļīāļŦāļĢāļ·āļ­āļĢāļēāļĒāđ„āļ”āđ‰ āļŠāļļāļ”āļŠāļĩāđāļšāļš diverging (āļŠāļ­āļ‡āđ€āļ‰āļ”āļŠāļĩāļĄāļēāļšāļĢāļĢāļˆāļšāļ—āļĩāđˆāļˆāļļāļ”āļāļĨāļēāļ‡āđ€āļ›āđ‡āļ™āļāļĨāļēāļ‡) āđ€āļ™āđ‰āļ™āļāļēāļĢāđ€āļšāļĩāđˆāļĒāļ‡āđ€āļšāļ™āļˆāļēāļāļˆāļļāļ”āļāļķāđˆāļ‡āļāļĨāļēāļ‡ āđ€āļŠāđˆāļ™ āļāļģāđ„āļĢ/āļ‚āļēāļ”āļ—āļļāļ™ āļŦāļĢāļ·āļ­āļ„āđˆāļēāļŠāļąāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāđŒāļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒ āļŠāļļāļ”āļŠāļĩāđāļšāļšāļŦāļĄāļ§āļ”āļŦāļĄāļđāđˆāđƒāļŠāđ‰āđ€āļ‰āļ”āļŠāļĩāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļĨāļļāđˆāļĄāļ—āļĩāđˆāđ„āļĄāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļ™ āļŠāļļāļ”āļŠāļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĄāļīāļ•āļĢāļāļąāļšāļœāļđāđ‰āļ—āļĩāđˆāļ•āļēāļšāļ­āļ”āļŠāļĩ (āđ€āļŠāđˆāļ™ colorblind āļŦāļĢāļ·āļ­ muted āļ‚āļ­āļ‡ Seaborn) āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ—āļļāļāļ„āļ™ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāđāļĒāļāđāļĒāļ°āļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļĢāļ°āļ”āļąāļšāļ­āļēāļ§āļļāđ‚āļŠ

āļ­āļ˜āļīāļšāļēāļĒāļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ plt.show() āđāļĨāļ° plt.savefig() plt.show() āđāļŠāļ”āļ‡āļ āļēāļžāđ„āļ›āļĒāļąāļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļšāđāļĨāļ°āļĨāđ‰āļēāļ‡āļŠāļ–āļēāļ™āļ°āļ āļēāļžāļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ plt.savefig() āđ€āļ‚āļĩāļĒāļ™āļ āļēāļžāļĨāļ‡āđ„āļŸāļĨāđŒāđ‚āļ”āļĒāđ„āļĄāđˆāļĨāđ‰āļēāļ‡ āļāļēāļĢāđ€āļĢāļĩāļĒāļ savefig() āļŦāļĨāļąāļ‡ show() āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ€āļ›āļĨāđˆāļē āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļąāđŠāļāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āļĨāļģāļ”āļąāļšāļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡: āđ€āļĢāļĩāļĒāļ savefig() āļāđˆāļ­āļ™ āđāļĨāđ‰āļ§āļˆāļķāļ‡ show()

āļĢāļ§āļĄāļ—āļļāļāļ­āļĒāđˆāļēāļ‡āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™: āđāļšāļšāļāļķāļāļŦāļąāļ”āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļšāļš End-to-End

āđāļšāļšāļāļķāļāļŦāļąāļ” take-home āļŦāļĢāļ·āļ­ live coding āļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āļĢāļ§āļĄāļāļēāļĢāđ‚āļŦāļĨāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāļŠāļ°āļ­āļēāļ” āđāļĨāļ°āļāļĢāļēāļŸāļŦāļĨāļēāļĒāļ›āļĢāļ°āđ€āļ āļ—āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļŠāļ°āļ—āđ‰āļ­āļ™āđ‚āļˆāļ—āļĒāđŒāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļˆāļĢāļīāļ‡āļˆāļēāļāļ—āļĩāļĄ analytics

python
# interview_exercise.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.05)

# Simulate 12 months of product data
np.random.seed(42)
months = pd.date_range("2025-01", periods=12, freq="MS")
df = pd.DataFrame({
    "month": months,
    "revenue": np.cumsum(np.random.normal(5000, 2000, 12)) + 50_000,
    "customers": np.cumsum(np.random.poisson(50, 12)) + 500,
    "churn_rate": np.clip(np.random.normal(0.05, 0.015, 12), 0.01, 0.12)
})

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# Panel 1: Revenue trend
axes[0].plot(df["month"], df["revenue"], marker="o", color="#2563eb")
axes[0].set_title("Revenue Trend")
axes[0].set_ylabel("Revenue (USD)")
axes[0].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
axes[0].tick_params(axis="x", rotation=45)
axes[0].spines[["top", "right"]].set_visible(False)

# Panel 2: Customer growth
axes[1].bar(df["month"], df["customers"], color="#16a34a", width=20)
axes[1].set_title("Customer Growth")
axes[1].set_ylabel("Total Customers")
axes[1].tick_params(axis="x", rotation=45)
axes[1].spines[["top", "right"]].set_visible(False)

# Panel 3: Churn rate with threshold line
axes[2].plot(df["month"], df["churn_rate"], marker="s", color="#dc2626")
axes[2].axhline(y=0.05, color="gray", linestyle="--", label="Target: 5%")
axes[2].set_title("Monthly Churn Rate")
axes[2].set_ylabel("Churn Rate")
axes[2].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"{x:.1%}"))
axes[2].tick_params(axis="x", rotation=45)
axes[2].spines[["top", "right"]].set_visible(False)
axes[2].legend()

fig.suptitle("Product Dashboard — FY 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("interview_dashboard.png", dpi=150)
plt.show()

āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļŠāļēāļ˜āļīāļ•āļāļĢāļēāļŸāļŠāļēāļĄāļ›āļĢāļ°āđ€āļ āļ—āđƒāļ™āđ€āļĨāļĒāđŒāđ€āļ­āļēāļ•āđŒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāđāļāļ™āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡ āđ€āļŠāđ‰āļ™āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ churn āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­ āļ™āļĩāđˆāļ„āļ·āļ­āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđƒāļŦāđ‰āļ„āļ°āđāļ™āļ™āļ­āļĒāđˆāļēāļ‡āđāļĄāđˆāļ™āļĒāļģ

āļŠāļĢāļļāļ›

  • API āđāļšāļš object-oriented āļ‚āļ­āļ‡ Matplotlib (fig, ax = plt.subplots()) āđƒāļŦāđ‰āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļ—āļĩāđˆāđāļĨāļ°āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāļ„āļēāļ”āļŦāļ§āļąāļ‡āļ—āļąāđ‰āļ‡āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāđāļĨāļ°āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ
  • āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ hue āļ‚āļ­āļ‡ Seaborn āđāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļ–āļīāļ•āļīāđƒāļ™āļ•āļąāļ§ (KDE, heatmap) āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļšāļšāļˆāļąāļ”āļāļĨāļļāđˆāļĄāļ”āđ‰āļ§āļĒāđ‚āļ„āđ‰āļ”āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”
  • Heatmap āļŠāļŦāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ—āļĩāđˆāļĄāļĩ colormap āđāļšāļš diverging āđāļĨāļ°āļŠāđ€āļāļĨāļ„āļ‡āļ—āļĩāđˆ (vmin=-1, vmax=1) āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ‚āļēāļ”āđ„āļĄāđˆāđ„āļ”āđ‰āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ analytics
  • āđ€āļĢāļĩāļĒāļ savefig() āļāđˆāļ­āļ™ show() āđ€āļŠāļĄāļ­āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āđ„āļŸāļĨāđŒāđ€āļ­āļēāļ•āđŒāļžāļļāļ•āđ€āļ›āļĨāđˆāļē
  • āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļŠāļ°āļ­āļēāļ” āđ„āļ”āđ‰āđāļāđˆ āļāļēāļĢāļĨāļš spines āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļ›āđ‰āļēāļĒāļāļģāļāļąāļš tick āđāļĨāļ°āļŦāļąāļ§āļ‚āđ‰āļ­āļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™ āđāļŠāļ”āļ‡āļ–āļķāļ‡āđāļ™āļ§āļ„āļīāļ”āļ„āļļāļ“āļ āļēāļžāļĢāļ°āļ”āļąāļš production āļ•āđˆāļ­āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒ
  • āļ„āļ§āļĢāļāļķāļāļāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ dashboard āļŦāļĨāļēāļĒ panel āļ āļēāļĒāđƒāļ•āđ‰āđāļĢāļ‡āļāļ”āļ”āļąāļ™āļ”āđ‰āļēāļ™āđ€āļ§āļĨāļē āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ­āļš live coding āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļąāļ”āļŠāļĢāļĢāđ€āļ§āļĨāļē 10-15 āļ™āļēāļ—āļĩāļ•āđˆāļ­āļ‡āļēāļ™āļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļķāđˆāļ‡āļŠāļīāđ‰āļ™

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āđāļ—āđ‡āļ

#python
#matplotlib
#seaborn
#data-visualization
#data-analytics
#interview

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ SQL queries, Python scripts āđāļĨāļ°āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ Dashboard

25 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļ›āļĩ 2026

āļĢāļ§āļĄāļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļ–āļđāļāļ–āļēāļĄāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļ›āļĩ 2026 āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ SQL, Python, Power BI, āļŠāļ–āļīāļ•āļī āđāļĨāļ°āļ„āļģāļ–āļēāļĄāđ€āļŠāļīāļ‡āļžāļĪāļ•āļīāļāļĢāļĢāļĄ āļžāļĢāđ‰āļ­āļĄāļ„āļģāļ•āļ­āļšāđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”

SQL Window Functions, CTEs and Advanced Queries

SQL āļŠāļģāļŦāļĢāļąāļš Data Analyst: Window Functions, CTEs āđāļĨāļ° Advanced Queries āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

āļ„āļđāđˆāļĄāļ·āļ­ SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļš Data Analyst āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Window Functions, CTEs, Recursive CTEs āđāļĨāļ°āđ€āļ—āļ„āļ™āļīāļ„ Gaps-and-Islands āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđƒāļŠāđ‰āđ„āļ”āđ‰āļˆāļĢāļīāļ‡

āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš Power BI āļāļąāļš Tableau āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ›āļĩ 2026

Power BI vs Tableau āđƒāļ™āļ›āļĩ 2026: āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđ„āļŦāļ™āļ—āļĩāđˆāļ„āļļāļ“āļ„āļ§āļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰?

āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš Power BI āļāļąāļš Tableau āđƒāļ™āļ”āđ‰āļēāļ™āļĢāļēāļ„āļē āļŸāļĩāđ€āļˆāļ­āļĢāđŒ AI āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āđ‚āļ­āļāļēāļŠāļ—āļēāļ‡āļ­āļēāļŠāļĩāļžāđƒāļ™āļ›āļĩ 2026 āļ„āļđāđˆāļĄāļ·āļ­āļ—āļĩāđˆāļ­āļīāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļĢāļīāļ‡āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ€āļĨāļ·āļ­āļāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ BI