# 大數據分析 ## 資料內容 ### 原先的資料 - 資料筆數 - 4925571 筆 - 資料欄位 - 租借時長 - 租車日期 - 租車時間 - 第幾個小時租車的 - 租車站點名稱 - 還車日期 - 還車時間 - 還車站點名稱 - --------- - 觀測時間(hour) - 測站氣壓(hPa) - 海平面氣壓(hPa) - 氣溫(℃) - 露點溫度(℃) - 相對溼度(%) - 風速(m/s) - 風向(360degree) - 最大陣風(m/s) - 最大陣風風向(360degree) - 降水量(mm) - 降水時數(h) - 日照時數(h) - 全天空日射量(MJ/㎡) - 能見度(km) - 紫外線指數 - 總雲量(0~10) ### 清洗後的資料 - 資料筆數 - 117822 筆 - 資料欄位 - 租借時長 - 租車日期 - 氣溫(℃) - 降水量(mm) - 紫外線指數 - 相對溼度(%) - 處理方式 - 取出以下租車站點 - 捷運公館站(2號出口) - 捷運科技大樓站 - 捷運公館站(3號出口) - 捷運中山國中站 - 捷運芝山站(2號出口) - 捷運永春站(2號出口) - 捷運六張犁站 - 松山車站 - 捷運行天宮站(3號出口) - 捷運東門站(5號出口) - 捷運信義安和站(4號出口) - 選出特定的時間區間 - 2021/9~2022/10 - 剔除沒有紫外線指數的資料 - 剔除沒有降水量(mm)的資料 ```python= import pandas as pd # 讀取CSV文件 df = pd.read_csv('output_filtered80_modified.csv') column_mapping = { 'sub_IN_MIN': 'rental_period', 'col_4': 'temperature', 'col_6': 'rh', 'col_11':'precp', 'col_16':'uvi' } # 重新命名欄位名稱 df = df.rename(columns=column_mapping) selected_columns = ['rental_period', 'temperature', 'rh', 'precp','uvi','newdate'] place = ['捷運公館站(2號出口)', '捷運科技大樓站', '捷運公館站(3號出口)', '捷運中山國中站', '捷運芝山站(2號出口)', '捷運永春站(2號出口)', '捷運六張犁站', '松山車站', '捷運行天宮站(3號出口)', '捷運東門站(5號出口)', '捷運信義安和站(4號出口)' ] condition = (df['borrow'].isin(place) | df['back'].isin(place)) filtered_df = df.loc[condition,selected_columns] filtered_df = filtered_df[filtered_df['uvi'] != '...'] filtered_df = filtered_df[filtered_df['precp'] != 'T'] # 將修改後的數據保存到新的CSV文件 filtered_df.to_csv('output_trim.csv', index=False) ``` ## 分析方式 ### 資料 - feature (輸入模型的資料) - 氣溫(℃) - 降水量(mm) - 紫外線指數 - 相對溼度(%) - target (模型預測的結果) - 租借時長 我們將資料以 8:2 的比例分成訓練資料及測試資料集 測試資料集的目的是用來驗證模型學習的好壞 ### 選用的機器學習演算法 選定三種機器學習演算法,分別為 svm, knn 及 linear regression 我們將資料送入模型進行訓練,並將訓練完的模型保存起來 #### SVM 資料數量: (117822, 5) -> 代表有 117822 筆資料,每筆資料 feature + target 數量等於 5 訓練集均方誤差: 696.0338094251304 訓練集決定係數: -0.048353252269998315 測試集均方誤差: 673.4159879339156 測試集決定係數: -0.048208325512227646 執行時間: 1077.435385942459 秒 #### KNN 資料數量: (117822, 5) 訓練集均方誤差: 767.8788588645937 訓練集決定係數: -0.1565649371327893 測試集均方誤差: 749.6541616804583 測試集決定係數: -0.1668771570737615 執行時間: 0.6420707702636719 秒 #### Linear Regression 資料數量: (117822, 5) 訓練集均方誤差: 663.6433406837687 訓練集決定係數: 0.00043267276373226693 測試集均方誤差: 641.7846268947011 測試集決定係數: 0.001027594903492357 執行時間: 0.07284665107727051 秒 ### 評量方式 - MSE (均方誤差) - 模型預測的結果與 Ground Truth 的差異取平方 eg. predict: 10 , gt : 15, mse: |10 - 15|^2 = 25 - R2 Score (決定係數) - R2 Score的範圍從0到1,越接近1表示模型的預測能力越好,而越接近0則表示模型的預測能力越差。 ### 結論 ![](https://hackmd.io/_uploads/HJYtNhWw2.png) 根據 MSE 和 R2,推論我們選定的 feature 和 target 之間關聯性很差 這個些模型都無法準確地預估騎車時長 ## 改進 ### 資料分布 猜測離群數值影響了訓練結果,導致 MSE 和 R2 表現糟糕 - 指數版本 ![](https://hackmd.io/_uploads/HyEIpj-D2.png) - 一般版本 ![](https://hackmd.io/_uploads/HkqTpj-D2.png) 決定剔除租借 50 分鐘以上的資料 - 資料數量 - 113544 筆 ### 重新進行實驗 #### SVM 資料數量: (113543, 5) 訓練集均方誤差: 19.85358104962295 訓練集決定係數: -0.05685092004902881 測試集均方誤差: 20.18769123097845 測試集決定係數: -0.05967403496688384 執行時間: 437.2216897010803 秒 #### KNN 資料數量: (113543, 5) 訓練集均方誤差: 21.7633890393465 訓練集決定係數: -0.15851430893647867 測試集均方誤差: 22.54635254744815 測試集決定係數: -0.18348275215730436 執行時間: 0.6538197994232178 秒 #### Linear Regression 資料數量: (113543, 5) 訓練集均方誤差: 18.7659251205485 訓練集決定係數: 0.0010474594154125105 測試集均方誤差: 19.039891009537513 測試集決定係數: 0.0005752564490546508 執行時間: 0.06607651710510254 秒 ![](https://hackmd.io/_uploads/SkGKEhWPn.png) 結論 MSE 降低很多 但 r2 表現仍不是很好 (可以考慮不要放)