如何更加系統性地分析資料

以 Kaggle Survey 2020 為例

按下訂閱鈕透過電子郵件收到我的文章🎉


一鍵啟動專案環境:https://mybinder.org/v2/gh/datainpoint/project-kaggle-survey-2020/HEAD?filepath=project-kaggle-survey-2020.ipynb

前往 Kaggle Notebook 瀏覽:https://www.kaggle.com/yaojenkuo/notebook-kaggle-survey-2020

前言

Kaggle 從 2017 年起開始,每年年底都會寄送問卷給他們的使用者自由填寫,在一段填寫時間之後,會將問卷回應發佈為一個競賽。2020 年也不意外,填寫時間是 2020-10-07 至 2020-10-30,繳交時間截止至 2021-01-06。有興趣的讀者可以前往競賽網址檢視細節:https://www.kaggle.com/c/kaggle-survey-2020

痛點

Kaggle Survey 2020 競賽主要的資料集是 kaggle_survey_2020_responses.csv,這是一個具有 47 個問題、354 個欄位以及 20,036 個觀測值的資料集。47 個問題中混雜著單選題(Multiple choice)與複選題(Multiple selection),單選題的回答用一個欄位做紀錄,複選題則會用多個欄位(個數不定,視該題的選項數有幾個而定)做紀錄,這也是資料集有 354 個欄位的緣故。對於剛拿到資料,正要進行探索分析(Exploratory Data Analysis, EDA)階段的參賽者而言,這會是一個頗為棘手的問題,意味著每一個不同的問題都可能要手動撈取欄位、觀察分析並記錄結果。

在資料分析中添加物件導向風味

熱愛使用 Jupyter Notebook 的資料分析師長久以來容易被詬病「無法寫作可重複使用的程式碼」,這除了跟筆記本設計為順序型程式設計(Procedural programming)習慣有關,還跟多數的資料分析師為跨領域背景、撰寫程式時沒有寫作函式、類別的習慣有關。因此,這次所上傳的筆記本中我並沒有如一般地去做資料的探索分析並將洞見說成故事,而是希望在資料分析中添加物件導向的風味,幫助參賽者能更簡便地去暸解、探索資料;我寫了一個類別 KaggleSurvey2020 並定義了三個主要的方法:

  1. generate_unique_questions:這個方法能夠回傳讓參賽者對問題索引、問題內容與問題類型一目暸然的資料框。

  2. summarize_response(question_index):這個方法能夠讓參賽者輸入特定的問題索引,然後回傳該問題的摘要;更棒的一點是它能夠判斷出該問題屬於單選題或者複選題,如果是單選題,方法所回傳的摘要是比例;如果是複選題,方法所回傳的摘要是數值數值。

  3. plot_summary(question_index):這個方法能夠讓參賽者輸入特定的問題索引,然後畫出該問題摘要的水平長條圖;更棒的是它會將問題內容放置於圖表標題處、在類別過多的時候(超過 10 個)顯示最多的 10 個類別、並將前三多的長條用紅色標註。

from ks2020 import KaggleSurvey2020

ks = KaggleSurvey2020('kaggle_survey_2020_responses.csv')
unique_questions = ks.generate_unique_questions()
unique_questions.head()

透過這個資料框,能夠統計有幾個問題與問題類型的組成。

n_questions = unique_questions.shape[0]
question_summary = unique_questions['question_type'].value_counts()
n_multiple_choice = question_summary['multiple choice']
n_multiple_selection = question_summary['multiple selection']
print(question_summary)
print("There are {} multiple choices and {} multiple selections among {} questions.".format(n_multiple_choice, n_multiple_selection, n_questions))

單選題會以比例作為摘要結果。

ks.summarize_response('Q5') # 單選題

複選題會以數值做為摘要結果。

ks.summarize_response('Q7') # 複選題
ks.plot_summary('Q23')

超過 10 個類別時調整為顯示前十個。

ks.plot_summary('Q29A') # 超過 10 個類別

最後,在簡單示範了如何在資料分析中融入物件導向程式設計,藉此讓摘要或者作圖的程式碼也能夠具備「重複使用性」之後,這篇文章來到尾聲,希望讀者也和我一樣期待下一篇文章。如果讀者覺得這樣是有趣且方便的,是時候在你的下一個資料分析專案中撒上些物件導向的調味料!


透過多種方式與我互動,Like😻、留言🙋‍♂️或者分享🙌

Leave a comment