載入中…
載入中…
使用 pandas、NumPy 與 Matplotlib 進行資料清洗、分析與視覺化,學習資料科學的核心工作流程。
每章講義 PDF 可免費線上預覽;範例程式碼與打包下載請進入各章節頁。
講義教材整理中,敬請期待。
不使用迴圈,只用 NumPy 操作:建立一個 5×5 的隨機整數矩陣(0-100),計算每列平均、每欄最大值、標準化成 0-1 之間的值。
用 np.random.randint(),axis 參數控制方向,(x - x.min()) / (x.max() - x.min()) 標準化。
import numpy as np
# 固定亂數種子,方便重現結果(可移除)
np.random.seed(42)
# 建立 5x5、範圍 0~100 的隨機整數矩陣
matrix = np.random.randint(0, 101, size=(5, 5))
print("原始矩陣:")
print(matrix)
# 每「列」平均:axis=1 表示沿著欄方向計算(每一列得到一個值)
row_means = matrix.mean(axis=1)
print("\n每列平均:")
print(row_means)
# 每「欄」最大值:axis=0 表示沿著列方向計算(每一欄得到一個值)
col_max = matrix.max(axis=0)
print("\n每欄最大值:")
print(col_max)
# 標準化成 0~1 之間:(x - 最小值) / (最大值 - 最小值)
normalized = (matrix - matrix.min()) / (matrix.max() - matrix.min())
print("\n標準化結果:")
print(normalized)
給定一份包含缺失值與重複資料的學生成績 CSV,完成清洗:移除重複、填補缺失分數(用班級平均)、將文字型態的分數轉換成數字型態。
用 df.duplicated() 找重複,df.isnull() 找缺失,groupby + transform 計算分組平均。
import pandas as pd
# 讀取原始資料(假設欄位有 name, class, score,score 可能是字串或缺失值 NaN)
df = pd.read_csv("students_raw.csv")
# 1. 將分數欄位統一轉換成數字型態(無法轉換的值會變成 NaN,方便後續補值)
df["score"] = pd.to_numeric(df["score"], errors="coerce")
# 2. 移除完全重複的資料列
df = df.drop_duplicates()
# 3. 用「班級平均分數」填補缺失分數
# 先計算每個班級的平均分數,再對應填回缺失值
class_avg = df.groupby("class")["score"].transform("mean")
df["score"] = df["score"].fillna(class_avg)
# 4. 四捨五入到小數點後 1 位,讓資料乾淨
df["score"] = df["score"].round(1)
df.to_csv("students_cleaned.csv", index=False, encoding="utf-8-sig")
print("清洗完成,已輸出 students_cleaned.csv")
print(df)
載入範例銷售資料,繪製:(1) 各月份銷售額折線圖 (2) 各地區銷售佔比圓餅圖 (3) 各商品類別長條圖。所有圖表存成一個 PDF 報告。
用 matplotlib.backends.backend_pdf.PdfPages 將多張圖儲存成一個 PDF 檔案。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
# 讓中文字型正常顯示(Windows 可用「Microsoft JhengHei」,Mac 可用「PingFang TC」)
plt.rcParams["font.sans-serif"] = ["Microsoft JhengHei"]
plt.rcParams["axes.unicode_minus"] = False
# 讀取範例銷售資料,欄位假設為:month, region, category, amount
df = pd.read_csv("sales_data.csv")
with PdfPages("sales_report.pdf") as pdf:
# (1) 各月份銷售額折線圖
monthly = df.groupby("month")["amount"].sum().sort_index()
fig1, ax1 = plt.subplots(figsize=(8, 5))
ax1.plot(monthly.index, monthly.values, marker="o")
ax1.set_title("各月份銷售額趨勢")
ax1.set_xlabel("月份")
ax1.set_ylabel("銷售額")
pdf.savefig(fig1)
plt.close(fig1)
# (2) 各地區銷售佔比圓餅圖
region_sales = df.groupby("region")["amount"].sum()
fig2, ax2 = plt.subplots(figsize=(6, 6))
ax2.pie(region_sales.values, labels=region_sales.index, autopct="%1.1f%%")
ax2.set_title("各地區銷售佔比")
pdf.savefig(fig2)
plt.close(fig2)
# (3) 各商品類別長條圖
category_sales = df.groupby("category")["amount"].sum().sort_values(ascending=False)
fig3, ax3 = plt.subplots(figsize=(8, 5))
ax3.bar(category_sales.index, category_sales.values)
ax3.set_title("各商品類別銷售額")
ax3.set_xlabel("商品類別")
ax3.set_ylabel("銷售額")
pdf.savefig(fig3)
plt.close(fig3)
print("報告已產出:sales_report.pdf")