# 大數據分析
## 資料內容
### 原先的資料
- 資料筆數
    - 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則表示模型的預測能力越差。
### 結論

根據 MSE 和 R2,推論我們選定的 feature 和 target 之間關聯性很差
這個些模型都無法準確地預估騎車時長
## 改進
### 資料分布
猜測離群數值影響了訓練結果,導致 MSE 和 R2 表現糟糕
- 指數版本

- 一般版本

決定剔除租借 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 秒

結論 MSE 降低很多
但 r2 表現仍不是很好 (可以考慮不要放)