一起玩Python程式:新手寫程式也可以這麼簡單!

Week 13: 檔案處理(下) - 資料分析小達人!

張傑帆

National Taiwan University

開啟Python神奇寶盒!

目錄

Alt1

🎯 學習目標

今天我們要成為資料分析魔法師,掌握數據的神奇力量!

✨ 今天你將學會:

  • 📄 讀取與處理 CSV 檔案
  • 🐼 使用 Pandas 進行資料操作
  • 🔍 篩選、排序與統計資料
  • 📊 製作專業的統計圖表
  • 💡 建立實用的成績管理系統

準備好探索資料的秘密了嗎?

Let's analyze! 🐍📊

📊 CSV檔案格式介紹

CSV (Comma-Separated Values)
逗號分隔值檔案

🎯 特點:

  • 純文字格式,用逗號分隔欄位
  • 每一行代表一筆資料記錄
  • 第一行通常是欄位名稱(標題列)
  • 可用 Excel、記事本開啟
  • 檔案小、開啟快
  • 跨平台、跨軟體通用
  • 適合儲存表格資料

CSV 檔案範例

成績資料 (grades.csv)

學號,姓名,國文,英文,數學
1001,小明,85,90,88
1002,小華,78,82,91
1003,小美,92,88,85
1004,小強,88,76,90
1005,小芳,95,93,89

📝 觀察重點:

  • 第一行:欄位名稱
  • 其他行:學生成績資料
  • 使用逗號分隔不同欄位

建立 CSV 檔案

方法一:用記事本建立

# 使用 Python 建立 CSV 檔案
content = """學號,姓名,國文,英文,數學
1001,小明,85,90,88
1002,小華,78,82,91
1003,小美,92,88,85
1004,小強,88,76,90
1005,小芳,95,93,89"""

with open('grades.csv', 'w', encoding='utf-8') as file:
    file.write(content)

print("✅ CSV 檔案建立成功!")

讀取 CSV 檔案(基本方法)

# 使用內建函式讀取 CSV
with open('grades.csv', 'r', encoding='utf-8') as file:
    lines = file.readlines()    
    # 讀取標題列
    header = lines[0].strip().split(',')
    print(f"欄位名稱:{header}")    
    # 讀取資料列
    for line in lines[1:]:
        data = line.strip().split(',')
        print(f"學號 {data[0]}: {data[1]} - "
              f"國文{data[2]}, 英文{data[3]}, 數學{data[4]}")

輸出:

欄位名稱:['學號', '姓名', '國文', '英文', '數學']
學號 1001: 小明 - 國文85, 英文90, 數學88
...

🐼 Pandas 基礎操作

Pandas 是Python的資料分析套件!

🌟 核心概念:

  • Series: 一維資料(像一個欄位)
  • DataFrame: 二維資料(像一張表格)

📦 安裝 Pandas:

pip install pandas

💡 為什麼用 Pandas?

  • 處理表格資料超方便
  • 內建強大的資料分析功能
  • 程式碼簡潔易讀

DataFrame

DataFrame 是 Pandas 套件中最重要的資料結構,類似於 Excel 的表格或資料庫的資料表。

  • 由「列」和「欄」組成的二維資料結構
  • 每一欄可以有不同的資料型態(數字、文字等)
  • 支援標籤(欄位名稱、索引)方便查詢與操作

DataFrame 範例

學號 姓名 國文 英文 數學
1001 小明 85 90 88
1002 小華 78 82 91
1003 小美 92 88 85
  • 每一列代表一位學生的資料
  • 每一欄代表一個科目的成績

常見操作:

  • 查詢、篩選、排序、加總、平均、統計等

DataFrame 讓你可以用簡單的程式碼,快速處理大量表格資料,是資料分析的核心工具!

DataFrame 基礎操作

import pandas as pd

# 讀取 CSV 檔案
df = pd.read_csv('grades.csv')

# 查看前幾筆資料
print("📊 前3筆資料:")
print(df.head(3))

# 查看資料結構
print("\n📋 資料資訊:")
print(df.info())

# 查看基本統計
print("\n📈 統計摘要:")
print(df.describe())

DataFrame 基本操作示範

import pandas as pd

# 讀取資料
df = pd.read_csv('grades.csv')

# 顯示欄位名稱
print("欄位名稱:", df.columns.tolist())

# 顯示資料形狀(幾行幾列)
print(f"資料大小:{df.shape[0]} 列 × {df.shape[1]} 欄")

# 選取特定欄位
print("\n📝 學生姓名:")
print(df['姓名'])

# 選取多個欄位
print("\n📚 國文與英文成績:")
print(df[['姓名', '國文', '英文']])

什麼是 Series?

Series 是 Pandas 中用來表示「一維資料」的資料結構,類似於一個欄位或一個清單。

  • 每個 Series 有「資料值」和「索引」兩部分
  • 可以存放數字、文字等各種型態的資料
  • 常用來表示表格中的單一欄位(例如:所有學生的國文成績)

範例:

import pandas as pd

# 建立一個 Series
chinese_scores = pd.Series([85, 78, 92, 88, 95], 
               index=['小明', '小華', '小美', '小強', '小芳'])

print(chinese_scores)

輸出:

小明    85
小華    78
小美    92
小強    88
小芳    95
dtype: int64
  • 左邊是索引(學生姓名),右邊是資料值(成績)

Series 是資料分析的基本單位,讓你可以方便地做加總、平均、篩選等各種運算!

Series 操作

# Series 是單一欄位的資料
math_scores = df['數學']

print("🔢 數學成績:")
print(math_scores)

# Series 的基本統計
print(f"\n數學平均:{math_scores.mean():.2f}")
print(f"數學最高:{math_scores.max()}")
print(f"數學最低:{math_scores.min()}")
print(f"數學中位數:{math_scores.median()}")

# Series 的運算
print("\n調整後成績(加5分):")
print(math_scores + 5)

🔍 資料分析入門

資料篩選(條件查詢)

import pandas as pd

df = pd.read_csv('grades.csv')

# 篩選國文成績 >= 90 的學生
high_chinese = df[df['國文'] >= 90]
print("🌟 國文高分學生:")
print(high_chinese[['姓名', '國文']])

# 多條件篩選:國文 >= 85 且 英文 >= 85
excellent = df[(df['國文'] >= 85) & (df['英文'] >= 85)]
print("\n⭐ 雙科優秀學生:")
print(excellent[['姓名', '國文', '英文']])

# 篩選姓名包含「小」的學生
name_filter = df[df['姓名'].str.contains('小')]
print("\n👥 名字有「小」的學生:")
print(name_filter['姓名'])

資料排序

# 按數學成績由高到低排序
sorted_math = df.sort_values('數學', ascending=False)
print("🏆 數學成績排行榜:")
print(sorted_math[['姓名', '數學']])

# 多欄位排序:先按國文,再按英文
sorted_multi = df.sort_values(['國文', '英文'], 
                               ascending=[False, False])
print("\n📚 國文+英文排序:")
print(sorted_multi[['姓名', '國文', '英文']])

# 重設索引
sorted_math_reset = sorted_math.reset_index(drop=True)
print("\n重設索引後:")
print(sorted_math_reset)

新增計算欄位

# 計算總分
df['總分'] = df['國文'] + df['英文'] + df['數學']

# 計算平均
df['平均'] = df['總分'] / 3

# 判斷是否及格(平均 >= 60)
df['是否及格'] = df['平均'] >= 60

# 顯示結果
print("📊 完整成績表:")
print(df)

# 計算等第
def get_grade(avg):
    if avg >= 90: return 'A'
    elif avg >= 80: return 'B'
    elif avg >= 70: return 'C'
    elif avg >= 60: return 'D'
    else: return 'F'

df['等第'] = df['平均'].apply(get_grade)
print("\n📜 含等第的成績:")
print(df[['姓名', '平均', '等第']])

小練習 1:資料篩選與排序

🎯 練習

請使用以下成績資料完成任務:

建立資料
建立包含5位學生的成績 CSV 檔案

資料查詢

  1. 找出數學成績最高的學生
  2. 找出平均成績 >= 85 的學生
  3. 列出所有科目都及格(>=60)的學生

小練習 1:資料篩選與排序 (續)

排名統計

  1. 計算每位學生的總分與平均
  2. 按總分排序並顯示排名
  3. 顯示各科的最高分與最低分

💡 練習解答

import pandas as pd

# 一:建立資料(使用前面的 grades.csv)
df = pd.read_csv('grades.csv')

# 二-1:數學最高分
max_math = df[df['數學'] == df['數學'].max()]
print("🥇 數學最高分:")
print(max_math[['姓名', '數學']])

# 二-2:平均 >= 85
df['平均'] = (df['國文'] + df['英文'] + df['數學']) / 3
high_avg = df[df['平均'] >= 85]
print("\n⭐ 平均 >= 85 的學生:")
print(high_avg[['姓名', '平均']])

# 二-3:全科及格
all_pass = df[(df['國文']>=60) & (df['英文']>=60) & (df['數學']>=60)]
print("\n✅ 全科及格學生:")
print(all_pass['姓名'])

💡 練習解答(續)

# 三-1:計算總分與平均
df['總分'] = df['國文'] + df['英文'] + df['數學']
df['平均'] = df['總分'] / 3

# 三-2:排序與排名
df_sorted = df.sort_values('總分', ascending=False)
df_sorted['排名'] = range(1, len(df_sorted) + 1)
print("\n🏆 總分排行榜:")
print(df_sorted[['排名', '姓名', '總分', '平均']])

# 三-3:各科統計
print("\n📊 各科統計:")
subjects = ['國文', '英文', '數學']
for subject in subjects:
    print(f"{subject} - 最高: {df[subject].max()}, "
          f"最低: {df[subject].min()}, "
          f"平均: {df[subject].mean():.2f}")

休息時間 ☕

讓我們喝杯咖啡/茶/水!
準備學習圖表繪製!

📈 統計與圖表繪製

Matplotlib 基礎介紹

Matplotlib 是 Python 最常用的繪圖套件

📦 安裝:

pip install matplotlib

🎨 基本概念:

  • Figure: 整個圖表視窗
  • Axes: 座標軸區域(可以有多個)
  • Plot: 實際的圖形
import matplotlib.pyplot as plt
import matplotlib

# 設定中文字型(避免中文顯示問題)
matplotlib.rc('font', family='Microsoft JhengHei')

繪製長條圖

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rc('font', family='Microsoft JhengHei')

# 讀取資料
df = pd.read_csv('grades.csv')

# 繪製國文成績長條圖
plt.figure(figsize=(10, 6))
plt.bar(df['姓名'], df['國文'], color='skyblue')
plt.xlabel('學生姓名', fontsize=12)
plt.ylabel('國文成績', fontsize=12)
plt.title('📊 國文成績長條圖', fontsize=14, fontweight='bold')
plt.ylim(0, 100)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('chinese_scores.png')
plt.show()

繪製折線圖

# 計算平均成績
df['平均'] = (df['國文'] + df['英文'] + df['數學']) / 3

# 按平均成績排序
df_sorted = df.sort_values('平均')

# 繪製折線圖
plt.figure(figsize=(10, 6))
plt.plot(df_sorted['姓名'], df_sorted['平均'], 
         marker='o', linewidth=2, markersize=8, color='green')
plt.xlabel('學生姓名', fontsize=12)
plt.ylabel('平均成績', fontsize=12)
plt.title('📈 學生平均成績趨勢圖', fontsize=14, fontweight='bold')
plt.ylim(0, 100)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('average_trend.png')
plt.show()

繪製群組長條圖

import numpy as np

# 設定資料
subjects = ['國文', '英文', '數學']
x = np.arange(len(df))
width = 0.25

# 繪製群組長條圖
fig, ax = plt.subplots(figsize=(12, 6))
ax.bar(x - width, df['國文'], width, label='國文', color='#FF6B6B')
ax.bar(x, df['英文'], width, label='英文', color='#4ECDC4')
ax.bar(x + width, df['數學'], width, label='數學', color='#45B7D1')

ax.set_xlabel('學生', fontsize=12)
ax.set_ylabel('成績', fontsize=12)
ax.set_title('📊 三科成績比較圖', fontsize=14, fontweight='bold')
ax.set_xticks(x)
ax.set_xticklabels(df['姓名'])
ax.legend()
ax.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('subject_comparison.png')
plt.show()

繪製圓餅圖

# 統計等第分布
df['平均'] = (df['國文'] + df['英文'] + df['數學']) / 3

def get_grade(avg):
    if avg >= 90: return 'A'
    elif avg >= 80: return 'B'
    elif avg >= 70: return 'C'
    else: return 'D'

df['等第'] = df['平均'].apply(get_grade)
grade_counts = df['等第'].value_counts()

# 繪製圓餅圖
plt.figure(figsize=(8, 8))
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A']
plt.pie(grade_counts, labels=grade_counts.index, autopct='%1.1f%%',
        colors=colors, startangle=90)
plt.title('🥧 成績等第分布圖', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('grade_distribution.png')
plt.show()

小練習 2:完整成績分析系統

🎯 進階練習題目

建立一個完整的成績管理與分析系統

功能需求:

  1. 讀取 CSV 成績檔案
  2. 計算各種統計數據(總分、平均、排名)
  3. 提供互動式查詢功能
  4. 自動生成多種統計圖表
  5. 將分析結果匯出為新的 CSV 檔案

進階挑戰:

  • 找出進步最多的學生(需要多次考試資料)
  • 分析各科目之間的相關性
  • 預測學生未來成績趨勢

💡 完整系統範例(1/3)

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rc('font', family='Microsoft JhengHei')

class GradeAnalyzer:
    def __init__(self, csv_file):
        """初始化成績分析系統"""
        self.df = pd.read_csv(csv_file)
        self.calculate_statistics()
    
    def calculate_statistics(self):
        """計算基本統計資料"""
        self.df['總分'] = (self.df['國文'] + 
                          self.df['英文'] + 
                          self.df['數學'])
        self.df['平均'] = self.df['總分'] / 3
        self.df['排名'] = self.df['總分'].rank(ascending=False)
        
        # 計算等第
        def get_grade(avg):
            if avg >= 90: return 'A'
            elif avg >= 80: return 'B'
            elif avg >= 70: return 'C'
            elif avg >= 60: return 'D'
            else: return 'F'
        
        self.df['等第'] = self.df['平均'].apply(get_grade)

💡 完整系統範例(2/3)

    def show_summary(self):
        """顯示統計摘要"""
        print("=" * 50)
        print("📊 成績統計摘要")
        print("=" * 50)
        
        for subject in ['國文', '英文', '數學']:
            print(f"\n【{subject}】")
            print(f"  平均: {self.df[subject].mean():.2f}")
            print(f"  最高: {self.df[subject].max()}")
            print(f"  最低: {self.df[subject].min()}")
            print(f"  標準差: {self.df[subject].std():.2f}")
    
    def find_student(self, name):
        """查詢特定學生成績"""
        student = self.df[self.df['姓名'] == name]
        if len(student) == 0:
            print(f"❌ 找不到學生:{name}")
            return
        
        print(f"\n👤 {name} 的成績報告")
        print("-" * 40)
        for col in ['國文', '英文', '數學', '總分', '平均', '排名', '等第']:
            print(f"{col}: {student[col].values[0]}")

💡 完整系統範例(3/3)

    def plot_all_charts(self):
        """繪製所有統計圖表"""
        fig, axes = plt.subplots(2, 2, figsize=(15, 12))
        
        # 1. 總分長條圖
        axes[0, 0].bar(self.df['姓名'], self.df['總分'], color='skyblue')
        axes[0, 0].set_title('總分排行榜')
        axes[0, 0].set_ylabel('總分')
        
        # 2. 平均成績折線圖
        sorted_df = self.df.sort_values('平均')
        axes[0, 1].plot(sorted_df['姓名'], sorted_df['平均'], 
                       marker='o', color='green')
        axes[0, 1].set_title('平均成績趨勢')
        axes[0, 1].set_ylabel('平均')
        
        # 3. 等第分布圓餅圖
        grade_counts = self.df['等第'].value_counts()
        axes[1, 0].pie(grade_counts, labels=grade_counts.index, 
                      autopct='%1.1f%%')
        axes[1, 0].set_title('等第分布')
        
        # 4. 各科成績盒鬚圖
        scores = [self.df['國文'], self.df['英文'], self.df['數學']]
        axes[1, 1].boxplot(scores, labels=['國文', '英文', '數學'])
        axes[1, 1].set_title('各科成績分布')
        axes[1, 1].set_ylabel('成績')
        
        plt.tight_layout()
        plt.savefig('complete_analysis.png')
        plt.show()

本週總結 🎉

🎓 本週學習回顧

今天我們學會了:

✅ CSV 檔案處理

  • 理解 CSV 格式與應用場景
  • 建立與讀取 CSV 檔案

✅ Pandas 資料操作

  • DataFrame 與 Series 的使用
  • 資料篩選、排序、計算

✅ 資料分析技巧

  • 統計量計算(平均、最值、標準差)
  • 資料清理與轉換

🎓 本週學習回顧(續)

✅ 資料視覺化

  • 使用 Matplotlib 繪製多種圖表
  • 長條圖、折線圖、圓餅圖、盒鬚圖

✅ 實務應用

  • 建立完整的成績管理系統
  • 整合資料分析與視覺化

💪 運算思維提升

  • 模式識別:發現資料中的規律
  • 抽象化:簡化複雜的分析流程
  • 演算法:設計有效的處理步驟

💡 學習總結

資料分析的核心價值:

🔍 發現問題 → 從資料中找出異常與趨勢
📊 量化分析 → 用數據支持決策
📈 預測未來 → 基於歷史資料做出預測

Python 資料分析三大神器:

  1. Pandas - 資料處理
  2. Matplotlib - 資料視覺化

作業:成績分析系統

📝 作業說明

作業主題:建立個人化成績分析系統

請選擇以下其中一個選項完成:

📝 選項一:基礎練習 (適合初學者) 基礎成績統計系統

  1. 建立一個包含 至少 8 位學生 的 CSV 檔案

    • 欄位:學號、姓名、國文、英文、數學、自然、社會
  2. 寫程式完成以下功能:

    • 計算每位學生的總分、平均、排名
    • 找出每科的最高分、最低分、平均分
    • 統計各等第(A/B/C/D/F)的人數
    • 將結果輸出為新的 CSV 檔案
  3. 繪製圖表:

    • 各科平均成績長條圖
    • 學生總分排行榜

🔧 選項二:進階應用 (有點挑戰性)

任務:多次考試成績追蹤系統

  1. 建立 兩次考試 的 CSV 檔案(期中考、期末考)

    • 同樣的學生,記錄兩次成績
  2. 程式功能:

    • 比較兩次考試的成績變化
    • 計算每位學生的進步幅度
    • 找出進步最多與退步最多的學生
    • 分析哪些科目整體有進步

🔧 選項二:進階應用 (續)

  1. 繪製進階圖表:
    • 兩次考試成績對比圖
    • 進步幅度排行榜
    • 各科進步趨勢圖

🚀 選項三:創意發揮 (自由度高)

任務:智慧學習建議系統

  1. 建立完整的學生學習檔案

    • 包含多科成績、出席率、作業繳交率等
  2. 設計智慧分析功能:

    • 根據成績給予學習建議
    • 預測學生可能的學習困難
    • 推薦適合的學習方法
    • 設定個人化學習目標

🚀 選項三:創意發揮 (續)

  1. 建立互動式系統:
    • 可以查詢任一學生的完整報告
    • 提供多種視覺化選項
    • 匯出精美的 PDF 報告(選用)

額外自由添加項目: 使用 GUI 介面(如 tkinter)

謝謝大家!

下週見!🐍📊

記得完成作業,練習讓你更強大! 💪

-----------------------------------------

圖片放大特效

table樣式

--- ## Week 13: 檔案處理(下) - 資料分析小達人! - **生活議題**: 建立成績管理系統,追蹤學習進度 - **課程內容**: - CSV檔案格式介紹與應用 - Pandas基礎操作 (DataFrame, Series) - 資料分析入門技巧 (篩選、排序、統計) - 讀取CSV成績資料與資料清理 - 計算平均、最值與排名統計 - 使用Matplotlib繪製統計圖表與趨勢分析 - **運算思維**: - **模式識別**: 識別資料中的統計模式與趨勢 - **抽象化**: 理解資料分析的基本概念與流程 - **演算法思維**: 設計資料處理與分析的演算法

- [🧠 運算思維總整理](#本週總結-🎉)

## 什麼是 CSV?

💡 **為什麼要用 CSV?**

## 認識 Pandas

## 什麼是 DataFrame?

--- ## 🧠 運算思維總整理 ![bg left:50%](image-10.png) --- ## 🔍 模式識別 **在資料分析中識別模式:** 1. **成績分布模式** - 觀察哪些科目普遍較高/較低 - 找出成績集中的區間 2. **學生表現模式** - 辨識優秀學生的共同特徵 - 發現需要加強的學習領域 3. **相關性模式** - 某科成績好,其他科是否也好? - 找出科目之間的關聯性 💡 **實例:** 透過盒鬚圖發現數學成績變異較大 --- ## 🎯 抽象化思維 **將複雜問題簡化為核心概念:** 1. **資料結構抽象化** - 表格 → DataFrame - 欄位 → Series - 統計 → 函數運算 2. **分析流程抽象化** ``` 原始資料 → 清理 → 計算 → 視覺化 → 結論 ``` 3. **功能模組化** - 讀取模組 - 計算模組 - 繪圖模組 - 查詢模組 💡 **實例:** 將成績管理系統封裝成 GradeAnalyzer 類別 --- ## 🧮 演算法思維 **設計資料處理的步驟:** 1. **排序演算法應用** ```python # 找出前三名的演算法 sorted_students = df.sort_values('總分', ascending=False) top3 = sorted_students.head(3) ``` 2. **篩選演算法設計** ```python # 多條件篩選的邏輯 excellent = df[(df['國文']>=85) & (df['英文']>=85) & (df['數學']>=85)] ``` 3. **統計演算法實作** ```python # 計算排名的演算法 df['排名'] = df['總分'].rank(ascending=False, method='min') ```

3. **NumPy** - 數值運算(下次課程)

🎯 **下週預告:** 進階資料分析與機器學習入門!

--- ## 📋 繳交格式 **繳交內容:** 1. 📄 Python 程式檔(.py) 2. 📊 CSV 資料檔案 3. 📈 生成的圖表檔案(.png) 4. 📝 簡短說明文件(說明程式功能與使用方法) **繳交期限:** 下週上課前 **評分標準:** - 程式正確性(40%) - 功能完整度(30%) - 程式碼品質(20%) - 創意與美觀(10%) 💪 加油!期待看到你的成績分析系統!