橫空出世的職業?
從 2012 年哈佛商業評論拋出資料科學家(Data scientist)是 21 世紀最性感的職業那刻起,資料科學(Data science)從美國向世界捲起瘋狂的浪潮,一直延續到 2017 年 Deep Mind 團隊的 Alpha Go;資料科學、大數據、人工智慧、機器學習與深度學習等字彙從報章雜誌與社群媒體向我們大量放送。從新創團隊、軟體公司、金融業、顧問業與製造業開始重新思索資料驅動(Data-driven)的策略制定,進而期望招募更多同時具備軟體工程與統計學兩個領域專長的資料科學家,造成就業市場的需求量大增,進而驅動了資料科學家的年薪接近 14 萬美金,一躍而成矽谷最具吸引力的職缺。
資料科學家並不是一個橫空出世的職業,90 年代風靡全美的電視喜劇六人行(Friends),其中一個主角 Chandler Bing(由 Matthew Perry 飾演),在劇中有一個設定非常有趣,那就是他的好朋友們永遠都記不住他從事什麼樣的工作。有一天他告訴老婆 Monica Geller(由 Courtney Cox 飾演),為了家庭收入著想他要回去做他原本的工作,這時 Monica 跟他說:
I want you to do something you like, not statistical analysis and data reconfiguration.
如果 Chandler 晚 20 年從事他原本的工作,那麼職稱多半就是資料科學家,頂著這個最性感職業的光環,也許這位有點膚淺又憤世嫉俗的傢伙就不會這麼討厭他的工作了吧?
資料科學家的日常
那麼究竟資料科學家的工作職責是什麼?資料科學家面對的專案可能會包含下列這些工作內容:使用者的需求發想、與使用者討論需求規格,取得測試資料、載入環境、整理資料、使用圖形探索資料、利用模型預測、部署專案到正式環境最後是將專案的內容以淺顯易懂的方式與組織內部其他的團隊溝通及分享。
首先是載入資料,將常見資料格式,包含純文字檔案、試算表或關聯式資料庫管理系統中的資料表,透過各式模組、套件載入開發環境,完成資料科學的第一個里程碑;在順利取得資料之後,在掌控資料環節(Wrangle),透過對資料結構的認知將原型資料(Raw data)清理整併為緊實乾淨的形式(Tidy data),這樣一致且通用的資料樣式能夠讓資料科學團隊集中精力處理資料探索和資料預測相關的應用;一旦有了緊實整潔的資料,在探索資料環節,將透過利用視覺化模組和套件進行探索性資料分析,適當的探索性資料分析可以讓資料科學團隊挖掘潛藏的特徵,進而延展專案的範疇與洞見;在資料建模環節,引入統計分析與機器學習這個資料科學中最吸引人、加值程度最大的過程,在定義精確的問題下,演算法可以訓練已知資料來作為未知資料預測的依據;資料科學的最後一步是溝通,這是專案的關鍵部分,如果能夠有效地向合作部門(像是產品、行銷與管理團隊等)精準地傳達分析結果,將能顯著為資料科學專案的成果加值,提升資料科學團隊在組織內的價值。
資料科學專案的發起點
載入資料在資料科學專案中扮演發起點,如果這個資料科學專案目的是協助我們制定資料驅動的策略(Data-driven strategy),而非倚賴直覺,那麼為專案細心盤點資料來源與整理獲取方法,可以為將來的決策奠基穩固的基礎。資料常見來源包含:
純文字檔案
非結構化純文字檔案
結構化純文字檔案
CSV
JSON
HTML
試算表
關聯式資料庫管理系統中的資料表
使用 Python 載入純文字檔案
純文字檔案指的是只有文字所構成的電腦檔案,這代表其中不包含字型的樣式或段落標記等,這類型檔案最明顯的特性就是能夠使用最簡單的文字編輯器(例如 Windows 的「記事本」、macOS 的 TextEdit)直接開啟檢視。
純文字檔案涵蓋的範圍相當廣泛,能夠再區分為非結構化純文字檔案與結構化純文字檔案兩大類;而結構化純文字檔案亦能再細分出 JSON、CSV 與 HTML 等。
非結構化純文字檔案常用來儲存像是文章、劇本或系統日誌(System logs)等,例如儲存在工作目錄的經典電影「刺激 1995」簡介 the_shawshank_redemption_summaries.txt
,我們使用內建的 open()
函數開啟檔案,並將檔案內容一列一列載入到 list
之中,為了讓開檔、讀檔與關檔的流程能夠一氣呵成,使用 with
敘述建立資源管理器的程式區塊。
text_file_path = "the_shawshank_redemption_summaries.txt"
with open(text_file_path) as file:
the_shawshank_redemption_summaries = file.readlines()
print(the_shawshank_redemption_summaries)
結構化純文字檔案指的是透過特定符號讓資料能夠系統性地儲存、讀取及處理,例如 JSON(JavaScript Object Notation) 可以透過大括號 {}
儲存鍵值對應的資料、CSV(Comma Separated Values) 可以透過逗號 ,
分隔不同欄位、HTML(Hyper Text Markup Language) 可以透過標記 <></>
顯示不同外型與功能的資料。
JSON 是一種輕量的資料交換格式,對於人類而言是容易閱讀和寫作的格式,對於電腦而言是容易解析和建立的格式,簡言之,是一種對人類與電腦都友善的純文字格式,JSON 雖然源於 JavaScript,但卻是獨立於該程式語言之外,能夠被眾多程式語言輕鬆解析和建立的一種理想資料交換格式。JSON 可能由兩種資料結構組成:鍵值對應關係與有序列表,可以用 Python 的 dict
與 list
來理解。我們使用 open()
函數搭配 with
敘述開啟 teams_rowbased.json,
使用 json
模組的 load()
函數將檔案內容載入,因為 JSON 可能由兩種資料結構組成,輸出物件可能是 dict
或 list
類別的實例。
json_file_path = "teams_rowbased.json"
with open(json_file_path) as file:
teams_json = json.load(file)
print(type(teams_json))
print(len(teams_json))
print(type(teams_json[0]))
print(len(teams_json[0]))
CSV 是最廣泛被使用的一種結構化純文字檔案格式,因此還有特定的副檔名 .csv,我們
使用 pandas
模組的 read_csv()
函數載入。
movies_csv = pd.read_csv("movies.csv")
print(type(movies_csv))
movies_csv.head()
HTML 是一種用於建立網頁的標準標記語言,常與 CSS、JavaScript 一起被用於設計網頁、網頁應用程式以及行動應用程式的使用者介面,瀏覽器可以讀取 HTML 檔案,並將其渲染成視覺化網頁,HTML 描述了一個網站的結構語意隨著線索的呈現,使之成為一種標記語言而非程式語言。通常載入 HTML 時會使用 Requests 模組搭配 BeautifulSoup4 模組,前者用於對網頁伺服器發送請求、後者則用於解析 HTML 的內容。
headers = {
"accept-language": "en,en-US;q=1"
}
r = requests.get("https://www.imdb.com/chart/top", headers=headers)
soup = BeautifulSoup(r.text)
for elem in soup.select(".titleColumn a"):
print(elem.text)
for elem in soup.select(".titleColumn a"):
print(elem.get("href"))
使用 Python 載入試算表
試算表是類比紙本計算表格的電腦軟體,由許多列與欄所構成的儲存格,其中可以存放數值、算式或文字,常見的試算表軟體有 Microsoft Excel、macOS Numbers 與 Google Sheets。試算表的檔案為一個活頁簿(Workbook)、活頁簿中可以有多個試算表(Spreadsheets),我們使用 pandas
模組的 read_excel()
函數預設讀取第零張試算表(左邊數來第一張)。
excel_file_path = "imdb.xlsx"
movies_xlsx = pd.read_excel(excel_file_path)
print(type(movies_xlsx))
movies_xlsx.head()
由於活頁簿中可以有多個試算表的設計,載入之前建議先使用 pandas 模組的 ExcelFile
類別的 sheet_names
屬性檢視活頁簿中有幾個試算表。
excel_file = pd.ExcelFile(excel_file_path)
excel_file.sheet_names
在 pandas
模組的 read_excel()
函數指定參數 sheet_name
載入特定試算表,可以接受試算表名稱、亦能輸入整數(由左邊從零開始數來第幾張試算表)。
casting_xlsx = pd.read_excel(excel_file_path, sheet_name="casting")
actors_xlsx = pd.read_excel(excel_file_path, sheet_name=2)
casting_xlsx.head()
actors_xlsx.head()
使用 Python 載入關聯式資料庫管理系統中的資料表
關聯式資料庫(Relational database)是基於關聯模型所建構的資料庫,是儲存在電腦中的資料集合。一個資料庫中通常會有多個資料表(Table)能夠藉助集合運算(Set operation)等數學方法來處理資料表之間的操作和關聯,也能夠用來表示現實世界中的商業邏輯,並能夠接受結構化查詢語言 SQL 來進行檢索和操作。我們使用 sqlite3
模組的 connect()
函數建立與資料庫的連線,再運用結構化查詢語言 SQL 搭配 pandas 模組的 read_sql()
函數載入,資料庫使用完畢之後將連線關閉。
connection = sqlite3.connect("imdb.db")
query = """
SELECT *
FROM movies;
"""
movies_db = pd.read_sql(query, connection)
movies_db.head()
query = """
SELECT *
FROM casting;
"""
casting_db = pd.read_sql(query, connection)
casting_db.head()
query = """
SELECT *
FROM actors;
"""
actors_db = pd.read_sql(query, connection)
actors_db.head()
connection.close()
在認識了如何使用 Python 載入純文字檔案、試算表與關聯式資料庫中的資料表之後,第三十一週約維安計畫:使用 Python 載入資料來到尾聲,希望您也和我一樣期待下一篇文章。
對於這篇文章有什麼想法呢?喜歡😻、留言🙋♂️或者分享🙌