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
程式碼說明
- 讀取資料: 使用
pandas
的read_csv
從指定的 URL 讀取 CSV 資料,編碼為big5
。 - 清理數據: 將
總人數
欄位中的逗號去除,並轉換為整數型態。 - 儲存處理後的資料: 將處理過的資料儲存為
study_abroad_statistics.csv
,並以big5
編碼保存。 - 顯示成功消息: 輸出一條消息,指示處理後的資料已成功儲存。
資料展示: 以下是從下載的資料中提取的部分內容
數據視覺化 (顯示指定年度的各國總人數長條圖)
在分析台灣學生赴主要國家留學的數據時,我們需要將數據以圖形化的方式呈現,以便更直觀地了解趨勢和分佈。以下是使用 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 年度的數據
程式碼說明
- 設定 Plotly 主題 設定 Plotly 的全域主題為 “plotly_dark”,以便圖表具有暗色背景。
- 定義
plot_yearly_data
函數- 參數
file_path
: CSV 檔案的路徑。year
: 要顯示的年度。
- 讀取數據: 使用
pandas
讀取 CSV 檔案 - 過濾數據: 根據指定年度過濾數據。
- 繪製長條圖: 使用
go.Bar
繪製長條圖,設定顏色、標籤和圖例。 - 更新佈局: 更新圖表的標題、X 軸和 Y 軸標題,並設置 X 軸標籤的角度以便更好地顯示。
- 顯示圖表: 使用
fig.show()
顯示圖表。
- 參數
- 使用範例
- 提供了顯示 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)
程式碼說明
- 讀取數據:使用
pd.read_csv
讀取指定路徑的 CSV 檔案,並以big5
編碼進行解碼。 - 數據處理:使用
groupby
方法按洲別
和年度
分組,並計算每個分組的總人數
總和。結果重設索引並存儲在continent_yearly_totals
變數中。 - 繪製折線圖:
- 創建一個
go.Figure()
物件。 - 所有洲別跑回圈,過濾出每個洲別的數據,並添加到圖表中作為折線圖(
go.Scatter
)。 - 每條折線圖代表一個洲別的歷年人數趨勢。
- 創建一個
- 更新圖表佈局:
- 設定圖表標題、X 軸和 Y 軸標題。
- 設定 X 軸為類別型,Y 軸顯示格式為千位分隔符。
- 顯示圖表:使用
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}")
程式碼說明
- 導入所需套件:使用
pandas
處理數據,plotly
創建圖表,xlwings
操作 Excel,os
處理路徑和資料夾。 - 設定資料和圖表儲存的路徑:定義 CSV 檔案、Excel 檔案以及圖表圖片儲存的資料夾路徑。
- 創建存放圖表圖片的資料夾:確保圖表圖片儲存的資料夾存在,如不存在則創建。
- 讀取資料:從指定的 CSV 檔案讀取數據,處理中文字符編碼為
big5
。 - 創建 Excel 文件:創建一個新的 Excel 工作簿,用於儲存數據和圖表。
- 定義生成圖表的函數
plot_yearly_data
:根據年度過濾數據,使用plotly
生成長條圖並儲存為 PNG 圖片,並返回圖片檔案名稱。 - 各年度跑回圈並儲存資料和圖表:為每個年度創建新的工作表,將數據寫入工作表,生成並儲存圖表,然後將圖表插入到對應的工作表中。
- 儲存 Excel 文件:將所有工作表和圖表儲存到指定的 Excel 文件中,並關閉工作簿。
這樣,就可以自動製作 Excel 文件,其中包含了每個年度的數據和對應的長條圖。圖表將顯示在每個工作表的指定位置,以便進行進一步分析和展示。
結論
在這篇文章中,我們不僅分析了台灣學生赴主要留學國家的數據,還展示了如何利用 Python 和 Plotly 工具進行資料清理、分析和視覺化。
以下是我們 Python 教學重點:
- Python 數據處理與分析:透過
pandas
和plotly
庫,我們有效地清理和分析了資料。這些工具幫助我們從繁雜的數據中提取出有價值的見解,並生成了清晰的視覺化圖表。 - 資料視覺化技巧:我們使用了
plotly
的視覺化圖形來展示留學人數的分布與趨勢。這些視覺化方法讓我們能夠直觀地理解數據,並發現年度變化和國別比例。 - Excel 數據報告自動化:利用
xlwings
,我們將分析結果和圖表自動化地儲存到 Excel 文件中。這不僅提高了工作效率,也使得數據報告更加整潔與專業。
本文中Python實戰範完整程式碼可以直接在這邊下載
參考資料
- 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
- Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
- Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
- xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站
課程推薦
- 全方位 Python 網路爬蟲實戰大師班:深入學習網路爬蟲技術,掌握從資料抓取到分析的全過程。了解如何利用Python爬取各種資料來源,並進行實際操作和應用。
- 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
- 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。
這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。
全方位 Python 課程
無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。