---
# System prepended metadata

title: COVID-19及其對學生教育、社交生活和心理健康的影響
tags: [Kaggle Case Research]

---

# COVID-19及其對學生教育、社交生活和心理健康的影響

### **摘要**

隨著台灣疫情日趨嚴峻，封城、遠距教學等措施開始於所有教育機構實施。為因應此情境，本組著手針對「COVID-19及其對學生教育、社交生活和心理健康的影響」議題進行深度探討，藉由資料預處理、資料視覺化、預測模型的建立(羅吉斯迴歸、高斯樸素貝氏分類器)等方式對資料作處理，以瞭解台灣的教育界能如何面對疫情的挑戰。

關鍵字：COVID-19、教育、資料挖礦、羅吉斯迴歸、高斯樸素貝氏分類器

### **一、前言**

透過前次論文報告針對所謂教育數據的資料挖礦相關主題（Educational Data Mining, EDM），我們著手對於與EDM有著極度相關的議題，COVID-19疫情對於學生的所在影響，尤其在封城之後，學生被迫於家中透過網路線上學習，無法外出自由活動，經過一段時間的資料蒐集，去分析出這次疫情如何影響學生的日常生活，包含了讀書習慣的改變，抑或是生理與心理的問題等。

透過此次的分析，我們研究目的除了想了解封城後何種屬性改變學生最多之外，想要得知各個屬性之間的相關性，推至如何間接影響學生的健康，也希望透過此研究為未來發生類似傳染病事件，能有好的參考依據。


### **二、資料探索**

本組從開放式資料網站Kaggle上找到COVID-19及其對學生教育、社交生活和心理健康影響之資料。此資料出自一項網路問卷之調查結果，該問卷共有19道問題，包含多選題、李克特量表以及簡答題，合計共1182人參與填寫。此筆資料之屬性如下表所示。

![](https://i.imgur.com/gYtaoKN.png)



### **三、分析架構及方法**

**3.1 分析架構**

![](https://i.imgur.com/Cq5MvUI.png)

3.1.1 資料預處理

在分析之前，我們針對所蒐集的資料進行整理，為了方便之後的分析，我們調整了一些受試者答案的形式，讓相同表達意思的回覆更換成一致性的資料，例如:在"Time spent on TV"這一欄中，我們將'No tv'、'n'、'N'這些回覆統一替換成'0'，抑或是將英文大小寫統一，例如'Whatsapp'統一換成'WhatsApp'。

接下來對於部分資料的缺失值部分，根據統計抽樣的概念，因為我是針對大規模母體進行分析，我們也約取了1000位受試者進行研究，所以遇到缺失值，我們會忽略此位受試者的回覆答案。

```
#data preprocessing

df['Time spent on TV'].replace('No tv', 0, inplace=True)
df['Time spent on TV'].replace('n', 0, inplace=True)
df['Time spent on TV'].replace('N', 0, inplace=True)
df['Time spent on TV'].replace(' ', 0, inplace=True)
df['Time spent on TV'] = df['Time spent on TV'].astype('float')
df['Prefered social media platform'] = df['Prefered social media platform'].replace('Whatsapp', 'WhatsApp')
df['Prefered social media platform'] = df['Prefered social media platform'].replace('None ', 'None')


df.isnull().sum()
df.dropna(axis = 0,inplace=True)
```

**3.2 分析方法**

3.2.1 羅吉斯迴歸分析(Logistic Regression)

羅吉斯迴歸分析之適用時機在於，資料集的反應變數(Response Variable)主要屬於類別型變數(Categorical Variable)，且僅分為兩類(如：是或否、有或無、同意或不同意...等)的變數尤佳。資料集的解釋變數(Explanatory Variable)則是類別型變數或連續型變數(Continuous Variable)皆可。

由於本組將資料集之Health Issue During Lockdown設為反應變數(該屬性為類別型變數)，其他屬性則設為解釋變數(類別型變數、連續型變數皆存在)，因此認為羅吉斯迴歸分析相當適合運用於本組所選定之資料集。	

選定分析方法後，本組便透過以下步驟，針對資料集做進一步的分析：

* Step 1：選擇資料屬性

    本組排除"ID"以及"Stress"、"Miss"兩項字串形式的變數，用剩餘共十六種變數(包含一個反應變數與十五個解釋變數)去進行後續分析。
    
* Step 2：對資料做編碼

    利用Python Pandas套件的get_dummies函數對資料進行編碼。其用意在於使資料更乾淨更好處理。

    ```
    data_encoded=pd.get_dummies(data=model_data,drop_first=True)
    ```

* Step 3：Scikit-Learn套件的運用

    利用StandardScaler函數來擬合和轉換解釋變數。

    ```
    from sklearn.preprocessing import StandardScaler
    sc=StandardScaler()
    x=sc.fit_transform(x)
    ```
    
    利用train_test_split函數將數據拆分為訓練集和測試集。

    ```
    from sklearn.model_selection import train_test_split, GridSearchCV
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30, random_state=100)
    ```

    對訓練集應用LogisticRegression函數以創建模型。
  
    ```
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import classification_report, confusion_matrix, plot_confusion_matrix
    model1 = LogisticRegression()
    model1.fit(x_train, y_train)
    ```

* Step 4：預測及結果

    將測試集套進模型以觀察模型表現。

    ```
    print(confusion_matrix(y_test, model1.predict(x_test)))
    plot_confusion_matrix(model1, x_test, y_test)
    print(classification_report(y_test, model1.predict(x_test)))
    ```

    顯示模型表現和混淆矩陣。
    
    ![](https://i.imgur.com/vvmPnD6.png)
    
    ![](https://i.imgur.com/RvXhINu.png)

    >     Precision = TP/(TP+FP)，即陽性的樣本中有幾個是預測正確的。
    >     Recall = TP/(TP+FN)，即事實為真的樣本中有幾個是預測正確的。
    >     F1-Score = 2/((1/Precision)+(1/Recall))，即精確率與召回率的調和平均數。
    >     Accuracy = (TP+TN)/(TP+FP+FN+TN)，即預測正確的比率。

3.2.2 高斯樸素貝氏分類器(Gaussian Naive Bayes Classifier)

樸素貝氏分類器之適用時機在於，資料集的反應變數主要屬於類別型變數，且僅分為兩類(如：是或否、有或無、同意或不同意...等)的變數尤佳。資料集的解釋變數則是類別型變數或連續型變數皆可。而高斯樸素貝葉斯分類器主要針對連續型的解釋變數進行應用。

樸素貝氏分類器的重要假設為「屬性資料互相獨立」，而本組之屬性資料確實近似相互獨立，且資料集之反應變數也屬類別型變數，因此認為樸素貝氏分類器適合運用於本組所選定之資料集。

選定分析方法後，本組便透過以下步驟，針對資料集做進一步的分析：

* Step 1：選擇資料屬性

    本組排除"ID"以及"Stress"、"Miss"兩項字串形式的變數，用剩餘共十六種變數(包含一個反應變數與十五個解釋變數)去進行後續分析。
 
* Step 2：對資料做編碼

    利用Python Pandas套件的get_dummies函數對資料進行編碼。其用意在於使資料更乾淨更好處理。

    ```
    data_encoded=pd.get_dummies(data=model_data,drop_first=True)
    ```    

* Step 3：Scikit-Learn套件的運用

    利用StandardScaler函數來擬合和轉換解釋變數，並利用train_test_split函數將數據拆分為訓練集和測試集。
    
    ```
    from sklearn.preprocessing import StandardScaler
    sc=StandardScaler()
    x=sc.fit_transform(x)
    from sklearn.model_selection import train_test_split, GridSearchCV
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30, random_state=100)
    ```
    
    對訓練集應用GaussianNB函數以創建模型並觀察表現。
    
    ```
    from sklearn.naive_bayes import GaussianNB
    model2 = GaussianNB()
    model2.fit(x_train, y_train)
    print(confusion_matrix(y_test, model2.predict(x_test)))
    print(classification_report(y_test, model2.predict(x_test)))
    ```
    
    使用GridSearchCV調整GaussianNB模型。
    
    ```
    nb_classifier = GaussianNB()
    params_NB = {'var_smoothing': np.logspace(0,-9, num=100)}
    gs_NB = GridSearchCV(estimator=nb_classifier, 
                 param_grid=params_NB, 
                 verbose=1, 
                 scoring='accuracy') 
    gs_NB.fit(x_train, y_train)
    gs_NB.best_params_
    ```

* Step 4：預測及結果

    將測試集套進模型以觀察模型表現。

    ```
    model3 = GaussianNB(var_smoothing=1)
    model3.fit(x_train, y_train)
    print(confusion_matrix(y_test, model3.predict(x_test)))
    plot_confusion_matrix(model3, x_test, y_test)
    print(classification_report(y_test, model3.predict(x_test)))
    ```

    顯示模型表現和混淆矩陣。

    ![](https://i.imgur.com/vd6CE8e.png)
    
    ![](https://i.imgur.com/2uUcSTn.png)



### **四、研究結果分析**

**4.1 圖表分析**

4.1.1 年齡分布

![](https://i.imgur.com/bHEkz90.png)

研究對象年齡層分布，大部分為學生。

4.1.2 紓壓方法

![](https://i.imgur.com/5U6s1oO.png)

此圖表說明在封城期間，人們面對壓力時對應對方法，可以看出因為封城，使用的方法大部份都是藉由網路資源。

4.1.3 最想念事物

![](https://i.imgur.com/l4LfmxT.png)

此圖表顯示說在封城這段期間，人們最想念哪些事物，結果顯示都偏向了社交生活和學校，接下來才是旅遊、外食等等。

4.1.4 體重與用餐數

![](https://i.imgur.com/RcgqfUV.png)

從上述圖表說明人們體重增加跟一天較多用餐次數的人有明顯的增加，尤其在封城期間。

4.1.5 Heatmap

接下來就是我們研究的重點，我們針對人們是否在封城這段期間身心健康是否有收到影響。

![](https://i.imgur.com/ZI7xmtr.png)

![](https://i.imgur.com/MJ6ldC6.png)
```
corr = df.corr()
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(10,10))
sns.heatmap(corr, mask=mask, center=0, annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

plt.show()
```
我們分析每個屬性間的相關係數，從熱度圖中，可以看出每個屬性係數都相當低，所以我們可以將兩兩屬性間視為獨立的，有利我們後續分析。

4.1.6 身心健康與各屬性

再來以下的小提琴圖是針對各個屬性對人們身心健康的情況。

![](https://i.imgur.com/KE42EA7.png)

![](https://i.imgur.com/YiQ9tjs.png)

![](https://i.imgur.com/w7aC45K.png)

**4.2 模型分析影響健康因素**

4.2.1 羅吉斯迴歸分析(Logistic Regression)

根據3.2.1羅吉斯迴歸模型之混淆矩陣結果，本組發現到該模型整體的準確率高達90%，表現相當優異。然而在深入研究混淆矩陣後，我們可以發現該模型將大部分的結果預測為0，這意味著該模型表現優異的原因在於將大多數人預測為在封城期間沒有健康問題，同時說明真正出現健康問題的人被預測準確的機率非常低。

4.2.2 高斯樸素貝氏分類器(Gaussian Naive Bayes Classifier)

根據3.2.2高斯樸素貝氏分類器模型之混淆矩陣結果，本組發現到該模型整體的準確率達86%，比羅吉斯迴歸模型的表現略差但依然是很出色的結果。而在深入研究混淆矩陣後，我們可以發現樸素貝氏分類器比邏輯回歸模型更準確地預測封城期間遭受健康問題的人。我們認為這種情況有點像「預測有健康問題和沒有健康問題之間」的準確性權衡。



### **五、結論與討論**

綜合以上所述，我們在1.資料的探索和預處理、2.將資料集視覺化、3.最後模型的建置和預測，這三個主要過程中，可以發現此份研究報告的預測Accuracy不錯(90%和86%)，可視為在COVID-19影響下學生健康因素判斷的良好模型預測工具。若未來需要更精進此份研究的預測方法，可以調整Data Cleaning的過程(汰除更多bias的資料)或是模型參數調整，以防止資料集裡的強勢data或離群值影響整個預測的走向，不只預測accuracy可能再提升，甚至可以針對疫情下弱勢族群做更特殊的預測，涵蓋更多疫情下身受健康因素影響的人們。總結來說，此份研究報告良好的預測了此份資料集，但若納入更多屬性和變因，未來相關的模型和視覺化圖表會更加多元和完整。

###### tags: `Kaggle Case Research`





