# 大數據分析
## 資料內容
### 原先的資料
- 資料筆數
- 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 表現仍不是很好 (可以考慮不要放)