Python 爬蟲實戰範例

用Python解析

台灣學生留學數據分析

Introduction

前言

在全球化的今天,越來越多的台灣學生選擇到國外留學,這不僅讓他們擴展了國際視野,也提升了他們的競爭力。了解台灣學生選擇去哪些主要留學國家,可以幫助學生和家長做出更明智的留學決定。在這篇文章中,我們將以「世界各主要國家之我國留學生人數統計」為主題,通過Python來分析和視覺化這些數據,揭示留學趨勢背後的一些有趣現象。

我們會利用台灣政府資料開放平臺上的數據,展示如何用Python進行數據的下載、整理和分析。這不僅是對爬蟲技術和數據分析的一次實踐,也是學習如何用Python處理和展示資料的好機會。希望通過這篇文章,大家能夠掌握基本的數據處理和分析方法,並能將這些技巧應用到其他類似的數據分析工作中。

本文中Python實戰範完整程式碼可以直接在這邊下載

爬蟲準備

在開始數據分析之前,我們需要進行一些爬蟲準備工作。首先,我們將從台灣政府資料開放平臺抓取各年度「世界各主要國家之我國留學生人數統計」資料。這些數據是我們分析的基礎,所以在抓取數據後,我們會進行基本的資料處理,以確保數據的完整性和準確性。

以下是使用 Python 來下載和處理這些資料的範例程式碼:

import pandas as pd

# 設定下載連結
url = 'https://ws.moe.edu.tw/Download.ashx?u=C099358C81D4876CC7586B178A6BD6D5062C39FB76BDE7ECCE014BC37E462658D42994BC906AEAF35D3BA49773E22DD56A78B36F4E483AD4B6CF048459964C26F44499E8B0E6A0EBEEC23EE22CFAF0E1&n=8FFFF71B2783273EC19E72B0E5678929C3D133B222DF6EFC4571983A83AF81B29FE24B66B393256449FBDF4173A19600791B547260760ADD8484609ED5321B6599D8316DE07A5CC0&icon=..csv'

# 讀取資料
data = pd.read_csv(url, encoding='big5')

# 清理 '總人數' 欄位數據
data['總人數'] = data['總人數'].str.replace(',', '').astype(int)

# 儲存處理後的資料
local_filename = 'study_abroad_statistics.csv'
data.to_csv(local_filename, index=False, encoding='big5')

print(f"處理後的資料已儲存為 {local_filename}")

data

程式碼說明

  1. 讀取資料: 使用 pandasread_csv 從指定的 URL 讀取 CSV 資料,編碼為 big5
  2. 清理數據: 將 總人數 欄位中的逗號去除,並轉換為整數型態。
  3. 儲存處理後的資料: 將處理過的資料儲存為 study_abroad_statistics.csv,並以 big5 編碼保存。
  4. 顯示成功消息: 輸出一條消息,指示處理後的資料已成功儲存。

資料展示: 以下是從下載的資料中提取的部分內容

世界各主要國家之我國留學生人數統計數據

數據視覺化 (顯示指定年度的各國總人數長條圖)

在分析台灣學生赴主要國家留學的數據時,我們需要將數據以圖形化的方式呈現,以便更直觀地了解趨勢和分佈。以下是使用 Plotly 庫來顯示每年度各國留學生人數的長條圖的範例程式碼。

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.io as pio
import pandas as pd

# 設定 Plotly 的全域主題為 dark
pio.templates.default = "plotly_dark"

def plot_yearly_data(file_path, year):
    """
    根據指定的年度顯示長條圖,顯示該年度每個國家的總人數。

    :param file_path: CSV 檔案的路徑
    :param year: 要顯示的年度
    """
    # 讀取 CSV 檔案並處理數據
    data = pd.read_csv(file_path, encoding='big5')

    # 過濾出指定年度的數據
    yearly_data = data[data['年度'] == year]

    # 繪製長條圖
    fig = go.Figure()

    fig.add_trace(
        go.Bar(
            x=yearly_data['國別'],
            y=yearly_data['總人數'],
            name=f'{year} 年度',
            marker_color='skyblue'
        )
    )

    # 更新佈局
    fig.update_layout(
        title=f'{year} 年度 各國總人數',
        xaxis_title='國別',
        yaxis_title='總人數',
        xaxis_tickangle=-45
    )

    # 顯示圖表
    fig.show()

# 使用範例
file_path = 'study_abroad_statistics.csv'
plot_yearly_data(file_path, 105)  # 例如顯示 105 年度的數據

程式碼說明

  1. 設定 Plotly 主題 設定 Plotly 的全域主題為 “plotly_dark”,以便圖表具有暗色背景。
  2. 定義 plot_yearly_data 函數
    • 參數
      • file_path: CSV 檔案的路徑。
      • year: 要顯示的年度。
    • 讀取數據: 使用 pandas 讀取 CSV 檔案
    • 過濾數據: 根據指定年度過濾數據。
    • 繪製長條圖: 使用 go.Bar 繪製長條圖,設定顏色、標籤和圖例。
    • 更新佈局: 更新圖表的標題、X 軸和 Y 軸標題,並設置 X 軸標籤的角度以便更好地顯示。
    • 顯示圖表: 使用 fig.show() 顯示圖表。
  3. 使用範例
    • 提供了顯示 105 年度數據的範例。如果需要顯示其他年度的數據,只需修改 plot_yearly_data 函數中的 year 參數即可。
台灣學生留學105年度總人數

數據視覺化 (各洲別歷年學生人數趨勢圖)

在這個圖表中,我們可以觀察到不同洲別學生人數隨年度變化的趨勢。通過按洲別和年度進行數據加總,我們能夠清晰地了解每個洲別學生人數的增減情況。這有助於分析不同洲別的留學生流動趨勢,從而對未來的教育政策和留學規劃提供有價值的見解。

import pandas as pd
import plotly.graph_objects as go

def plot_continent_trend(file_path):
    """
    根據洲別顯示不同年度的人數趨勢圖,每個洲別的數據在年度內先進行加總。

    :param file_path: CSV 檔案的路徑
    """
    # 讀取 CSV 檔案並處理數據
    data = pd.read_csv(local_filename, encoding='big5')

    # 按洲別和年度加總總人數
    continent_yearly_totals = data.groupby(['洲別', '年度'])['總人數'].sum().reset_index()

    # 獲取所有洲別
    continents = continent_yearly_totals['洲別'].unique()

    # 繪製折線圖
    fig = go.Figure()

    for continent in continents:
        # 過濾出特定洲別的數據
        continent_data = continent_yearly_totals[continent_yearly_totals['洲別'] == continent]

        fig.add_trace(
            go.Scatter(
                x=continent_data['年度'],
                y=continent_data['總人數'],
                mode='lines+markers',
                name=continent
            )
        )

    # 更新佈局
    fig.update_layout(
        title='各洲別歷年人數趨勢圖',
        xaxis_title='年度',
        yaxis_title='總人數',
        xaxis=dict(type='category'),
        yaxis=dict(tickformat=',')
    )

    # 顯示圖表
    fig.show()

# 使用範例
file_path = 'study_abroad_statistics.csv'
plot_continent_trend(file_path)

程式碼說明

  1. 讀取數據:使用 pd.read_csv 讀取指定路徑的 CSV 檔案,並以 big5 編碼進行解碼。
  2. 數據處理:使用 groupby 方法按 洲別年度 分組,並計算每個分組的 總人數 總和。結果重設索引並存儲在 continent_yearly_totals 變數中。
  3. 繪製折線圖
    • 創建一個 go.Figure() 物件。
    • 所有洲別跑回圈,過濾出每個洲別的數據,並添加到圖表中作為折線圖(go.Scatter)。
    • 每條折線圖代表一個洲別的歷年人數趨勢。
  4. 更新圖表佈局
    • 設定圖表標題、X 軸和 Y 軸標題。
    • 設定 X 軸為類別型,Y 軸顯示格式為千位分隔符。
  5. 顯示圖表:使用 fig.show() 顯示圖表。

這段程式碼會生成一個顯示不同洲別歷年人數趨勢的折線圖,幫助觀察各洲別學生人數的變化趨勢。

各洲別歷年學生人數趨勢圖

根據年度數據生成長條圖並儲存至 Excel 工作表

這段程式碼的目的是根據指定的年度從 CSV 檔案中讀取數據,為每個年度生成長條圖,並將數據與圖表儲存到 Excel 工作表中。每個年度的數據和圖表會被寫入到對應的工作表中,圖表會顯示在每個工作表的指定位置。程式碼涵蓋了數據讀取、圖表生成、以及將圖表和數據寫入 Excel 的完整流程。

import pandas as pd
import plotly.graph_objects as go
import plotly.io as pio
import xlwings as xw
import os

# 設定資料和圖表儲存的路徑
data_file_path = 'study_abroad_statistics.csv'
excel_file_path = 'students_data_and_charts.xlsx'
image_folder = os.path.abspath('charts_images')

# 創建存放圖表圖片的資料夾
os.makedirs(image_folder, exist_ok=True)

# 讀取資料
data = pd.read_csv(data_file_path, encoding='big5')

# 創建 Excel 文件
wb = xw.Book()  # 創建新的 Excel 工作簿

def plot_yearly_data(year):
    """
    根據指定的年度顯示長條圖,並將其儲存為圖片。
    
    :param year: 要顯示的年度
    :return: 圖片檔案名稱
    """
    yearly_data = data[data['年度'] == year]
    
    # 設定 Plotly 的全域主題為 dark
    pio.templates.default = "plotly_dark"
    
    fig = go.Figure()
    fig.add_trace(
        go.Bar(
            x=yearly_data['國別'],
            y=yearly_data['總人數'],
            name=f'{year} 年度',
            marker_color='skyblue'
        )
    )
    
    fig.update_layout(
        title=f'{year} 年度 各國總人數',
        xaxis_title='國別',
        yaxis_title='總人數',
        xaxis_tickangle=-45
    )
    
    # 儲存圖表為圖片
    image_filename = os.path.join(image_folder, f'year_{year}_chart.png')
    fig.write_image(image_filename)
    
    return image_filename

# 透過迴圈跑各年度並儲存資料和圖表
for year in range(105, 113):  # 105 年度到 112 年度
    # 創建新工作表
    sheet = wb.sheets.add(name=str(year))
    
    # 過濾出指定年度的數據
    yearly_data = data[data['年度'] == year]
    
    # 將數據寫入工作表
    sheet.range('A1').options(index=False, header=True).value = yearly_data
    
    # 繪製和儲存圖表
    image_filename = plot_yearly_data(year)
    
    # 確保圖片檔案存在
    if os.path.exists(image_filename):
        # 插入圖表到工作表
        sheet.pictures.add(image_filename, left=sheet.range('G3').left, top=sheet.range('G3').top, width=600, height=400)
        print(f"已將 {year} 年度的資料和圖表儲存到工作表")
    else:
        print(f"圖片檔案 {image_filename} 不存在")
    

# 儲存 Excel 文件
wb.save(excel_file_path)
wb.close()

print(f"所有資料和圖表已儲存為 {excel_file_path}")

程式碼說明

  1. 導入所需套件:使用 pandas 處理數據,plotly 創建圖表,xlwings 操作 Excel,os 處理路徑和資料夾。
  2. 設定資料和圖表儲存的路徑:定義 CSV 檔案、Excel 檔案以及圖表圖片儲存的資料夾路徑。
  3. 創建存放圖表圖片的資料夾:確保圖表圖片儲存的資料夾存在,如不存在則創建。
  4. 讀取資料:從指定的 CSV 檔案讀取數據,處理中文字符編碼為 big5
  5. 創建 Excel 文件:創建一個新的 Excel 工作簿,用於儲存數據和圖表。
  6. 定義生成圖表的函數 plot_yearly_data:根據年度過濾數據,使用 plotly 生成長條圖並儲存為 PNG 圖片,並返回圖片檔案名稱。
  7. 各年度跑回圈並儲存資料和圖表:為每個年度創建新的工作表,將數據寫入工作表,生成並儲存圖表,然後將圖表插入到對應的工作表中。
  8. 儲存 Excel 文件:將所有工作表和圖表儲存到指定的 Excel 文件中,並關閉工作簿。

這樣,就可以自動製作 Excel 文件,其中包含了每個年度的數據和對應的長條圖。圖表將顯示在每個工作表的指定位置,以便進行進一步分析和展示。

各年度統計數據與圖表展示

結論

在這篇文章中,我們不僅分析了台灣學生赴主要留學國家的數據,還展示了如何利用 Python 和 Plotly 工具進行資料清理、分析和視覺化。

以下是我們 Python 教學重點:

  1. Python 數據處理與分析:透過 pandasplotly 庫,我們有效地清理和分析了資料。這些工具幫助我們從繁雜的數據中提取出有價值的見解,並生成了清晰的視覺化圖表。
  2. 資料視覺化技巧:我們使用了 plotly 的視覺化圖形來展示留學人數的分布與趨勢。這些視覺化方法讓我們能夠直觀地理解數據,並發現年度變化和國別比例。
  3. Excel 數據報告自動化:利用 xlwings,我們將分析結果和圖表自動化地儲存到 Excel 文件中。這不僅提高了工作效率,也使得數據報告更加整潔與專業。

本文中Python實戰範完整程式碼可以直接在這邊下載

 

參考資料

  1. 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
  2. Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
  3. Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
  4. xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站

課程推薦

  1. 全方位 Python 網路爬蟲實戰大師班:深入學習網路爬蟲技術,掌握從資料抓取到分析的全過程。了解如何利用Python爬取各種資料來源,並進行實際操作和應用。
  2. 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
  3. 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。

這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。

全方位 Python 課程

無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。