Python āļŠāļģāļŦāļĢāļąāļ Data Analytics: Matplotlib, Seaborn āđāļĨāļ°āļāļēāļĢāļŠāļĢāđāļēāļāļ āļēāļāļāđāļāļĄāļđāļĨāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ
āđāļāļĩāđāļĒāļ§āļāļēāļāļāļēāļĢāļŠāļĢāđāļēāļāļ āļēāļāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ Python āļāđāļēāļ Matplotlib āđāļĨāļ° Seaborn āļāļāđāļĢāļĩāļĒāļāđāļāļīāļāļāļāļīāļāļąāļāļīāļāļĢāļāļāļāļĨāļļāļĄāļāļĢāļēāļ āļāļēāļĢāļāļąāļāļĢāļđāļāđāļāļ subplot āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļāļāđāļāļĒāļŠāļģāļŦāļĢāļąāļāļāļģāđāļŦāļāđāļ data analytics āļāļĩ 2026

āļāļēāļĢāļŠāļĢāđāļēāļāļ āļēāļāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ 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 āļāļĩāđāđāļāđāļĢāđāļ§āļĄāļāļąāļ
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpyāļāļĢāļ§āļāļŠāļāļāļāļĒāđāļēāļāļĢāļ§āļāđāļĢāđāļ§āđāļāļ·āđāļāļĒāļ·āļāļĒāļąāļāļ§āđāļēāļāļļāļāļāļĒāđāļēāļāļāļģāļāļēāļāđāļāđ:
# 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 āđāļŦāđāļāļēāļĢāļāļ§āļāļāļļāļĄāļāļĩāđāļāļąāļāđāļāļāļŠāļģāļŦāļĢāļąāļāļāļļāļāļāļāļāđāļāļĢāļ°āļāļāļ āđāļĨāļ°āđāļāđāļāļĄāļēāļāļĢāļāļēāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļāđāļāđāļāđāļāļĢāļ°āļāļąāļāļĄāļ·āļāļāļēāļāļĩāļāđāļĨāļ°āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ
# 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() āļāļąāļāļāļēāļĢāđāļĢāļ·āđāļāļāļāļĩāđāļāđāļ§āļĒāđāļĨāļĒāđāđāļāļēāļāđāđāļāļāļāļĢāļīāļ
# 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 āļāļ°āļāļāļļāļĄāļēāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄāļāļēāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļāļĄāļđāļĨāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
āļāļēāļĢāļ§āļīāđāļāļĢāļēāļ°āļŦāđāļāļēāļĢāļāļĢāļ°āļāļēāļĒāļāļąāļ§ āļāļķāđāļāđāļāđāļāļŦāļāļķāđāļāđāļāļāļēāļāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļ āļāđāļāļāļāļēāļĢāđāļāļĩāļĒāļāļāļēāļĢāđāļĢāļĩāļĒāļāļāļąāļāļāđāļāļąāļāđāļāļĩāļĒāļ§:
# 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 āļŦāļĢāļ·āļāļāđāļāļāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļāļāļĩāđāļāļāļĢāđāļāļĩāđāđāļāđāļāđāļāļĢāđāļāđāļāđāļŦāļĢāļ·āļāđāļĄāđ
# 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 āļāļđāļĨāđāļēāļŠāļĄāļąāļĒ āļāļēāļĢāļāļąāđāļāļāđāļēāđāļāļĩāļĒāļāđāļĄāđāļāļĩāđāļāļĢāļĢāļāļąāļāļŠāļēāļĄāļēāļĢāļāđāļāļĨāļĩāđāļĒāļāļāļĢāļēāļāđāļŦāđāļāļĨāļēāļĒāđāļāđāļāļ āļēāļāļāļĩāđāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāđāļŠāļāļ āđāļŠāļāļāđāļŦāđāđāļŦāđāļāļāļķāļāļāļ§āļēāļĄāđāļŠāđāđāļāđāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ
# 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
# 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 āļāļēāļāļĩāļāđāļāļāļēāļāļŠāļĢāđāļēāļāļ āļēāļāļāđāļāļĄāļđāļĨāļŦāļāļķāđāļāļāļīāđāļ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

25 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Data Analytics āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļāļāļĩ 2026
āļĢāļ§āļĄāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Data Analytics āļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļāļāļĩ 2026 āļāļĢāļāļāļāļĨāļļāļĄ SQL, Python, Power BI, āļŠāļāļīāļāļī āđāļĨāļ°āļāļģāļāļēāļĄāđāļāļīāļāļāļĪāļāļīāļāļĢāļĢāļĄ āļāļĢāđāļāļĄāļāļģāļāļāļāđāļāļĒāļĨāļ°āđāļāļĩāļĒāļāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

SQL āļŠāļģāļŦāļĢāļąāļ Data Analyst: Window Functions, CTEs āđāļĨāļ° Advanced Queries āļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ
āļāļđāđāļĄāļ·āļ SQL āļāļąāđāļāļŠāļđāļāļŠāļģāļŦāļĢāļąāļ Data Analyst āļāļĢāļāļāļāļĨāļļāļĄ Window Functions, CTEs, Recursive CTEs āđāļĨāļ°āđāļāļāļāļīāļ Gaps-and-Islands āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļĩāđāđāļāđāđāļāđāļāļĢāļīāļ

Power BI vs Tableau āđāļāļāļĩ 2026: āđāļāļĢāļ·āđāļāļāļĄāļ·āļāđāļŦāļāļāļĩāđāļāļļāļāļāļ§āļĢāđāļĢāļĩāļĒāļāļĢāļđāđ?
āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļ Power BI āļāļąāļ Tableau āđāļāļāđāļēāļāļĢāļēāļāļē āļāļĩāđāļāļāļĢāđ AI āļāļēāļĢāļŠāļĢāđāļēāļāļ āļēāļāļāđāļāļĄāļđāļĨ āđāļĨāļ°āđāļāļāļēāļŠāļāļēāļāļāļēāļāļĩāļāđāļāļāļĩ 2026 āļāļđāđāļĄāļ·āļāļāļĩāđāļāļīāļāļāđāļāļĄāļđāļĨāļāļĢāļīāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđāļāļĩāđāļāļģāļĨāļąāļāđāļĨāļ·āļāļāđāļāļĨāļāļāļāļĢāđāļĄ BI