Upload 14 files
Browse filesUploaded Full Course Data Science!
- Clean_data.py +32 -0
- Dataframe.py +23 -0
- Linear-Regression-Case.py +97 -0
- Linear-Regression.py +187 -0
- Linear_Functions.py +36 -0
- Plotting_Linear_Functions.py +55 -0
- Prepare_data.py +19 -0
- Regression-Table-Coefficients.py +25 -0
- Regression-Table-P-Values.py +53 -0
- Regression-Table-R-Squared.py +57 -0
- Regression-Table.py +53 -0
- Slope_and_Intercept.py +123 -0
- Statistics-data-science.py +258 -0
- data.csv +164 -0
Clean_data.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Remove Blank Rows
|
| 2 |
+
# - We can use .dropna() to remove blank depending on axis=0(rows), axis=1(columns)
|
| 3 |
+
import pandas as pd
|
| 4 |
+
health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 5 |
+
health_data.dropna(axis=0, inplace=True) # Chú thích: inplace=True => Xóa các ô lỗi theo hàng ; inplace=False => giữ nguyên các ô lỗi theo hàng
|
| 6 |
+
print(health_data)
|
| 7 |
+
|
| 8 |
+
# Data Types
|
| 9 |
+
# - We can use the info() function to list the data types within our dataset:
|
| 10 |
+
import pandas as pd
|
| 11 |
+
health_data = pd.read_csv("data.csv", header=0, sep=",")
|
| 12 |
+
print(health_data.info())
|
| 13 |
+
|
| 14 |
+
# - We can use the astype() function to convert the data into float64.
|
| 15 |
+
import pandas as pd
|
| 16 |
+
health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 17 |
+
health_data['Hours_Work'] = health_data['Hours_Work'].astype(float)
|
| 18 |
+
health_data['Hours_Sleep'] = health_data['Hours_Sleep'].astype(float)
|
| 19 |
+
print(health_data.info())
|
| 20 |
+
|
| 21 |
+
# Analyze the data
|
| 22 |
+
# - We can use the describe() function in Python to summarize data:
|
| 23 |
+
import pandas as pd
|
| 24 |
+
health_data = pd.read_csv('data.csv',header=0, sep=',')
|
| 25 |
+
pd.set_option('display.max_columns', None) # Có thể dùng thêm pd.set_option('display.max_rows', None)
|
| 26 |
+
print(health_data.describe())
|
| 27 |
+
# Count - Counts the number of observations
|
| 28 |
+
# Mean - The average value
|
| 29 |
+
# Std - Standard deviation (explained in the statistics chapter)
|
| 30 |
+
# Max - The highest value
|
| 31 |
+
# Min - The lowest value
|
| 32 |
+
# 25%, 50% and 75% are percentiles (explained in the statistics chapter)
|
Dataframe.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
d = {'col1': [1,2,3,4,7], 'col2':[4,5,6,9,8], 'col3':[11,14,16,15,10]}
|
| 3 |
+
df = pd.DataFrame(data=d)
|
| 4 |
+
|
| 5 |
+
count_column = df.shape[1] # Chú thích: 0 là số hàng, 1 là số cột
|
| 6 |
+
print('Number of columns: ')
|
| 7 |
+
print(df)
|
| 8 |
+
print(count_column)
|
| 9 |
+
|
| 10 |
+
# Tìm giá trị lớn nhất
|
| 11 |
+
Average_pulse_max = max(80, 85, 90, 95, 100, 105, 110, 115, 120, 125)
|
| 12 |
+
print(Average_pulse_max)
|
| 13 |
+
|
| 14 |
+
# Tìm giá trị nhỏ nhất
|
| 15 |
+
Average_pulse_min = min(80, 85, 90, 95, 100, 105, 110, 115, 120, 125)
|
| 16 |
+
print(Average_pulse_min)
|
| 17 |
+
|
| 18 |
+
# Tìm giá trị trung bình
|
| 19 |
+
import numpy as np
|
| 20 |
+
Calorie_burnage = [240, 250, 260, 270, 280, 290, 300, 310, 320, 330]
|
| 21 |
+
Average_calorie_burnage = np.mean(Calorie_burnage)
|
| 22 |
+
print(Average_calorie_burnage)
|
| 23 |
+
|
Linear-Regression-Case.py
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Trường hợp: Sử dụng Thời lượng + Nhịp tim trung bình để Dự đoán Lượng calo bị đốt cháy
|
| 2 |
+
# - Tạo bảng hồi quy tuyến tính với Average_Pulse và Duration làm biến giải thích.
|
| 3 |
+
# Ví dụ:
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import statsmodels.formula.api as smf
|
| 6 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 7 |
+
model = smf.ols('Calorie_Burnage ~ Average_Pulse + Duration', data=full_health_data) # Giải thích: dấu ~ nghĩa là dấu bằng(=)
|
| 8 |
+
'''
|
| 9 |
+
Giải thích: ols là Ordinary Least Squares(phương pháp bình phương tối thiểu)
|
| 10 |
+
👉Nghĩa là ta muốn tìm đường thẳng tốt nhất: Calorie_Burnage = a + b * Average_Pulse
|
| 11 |
+
trong đó:
|
| 12 |
+
a: hằng số (intercept)
|
| 13 |
+
b: hệ số góc (slope)
|
| 14 |
+
'''
|
| 15 |
+
results = model.fit()
|
| 16 |
+
print(results.summary())
|
| 17 |
+
'''
|
| 18 |
+
In ra bảng thống kê kết quả hồi quy tuyến tính, gồm:
|
| 19 |
+
coef: hệ số của từng biến.
|
| 20 |
+
std err: sai số chuẩn.
|
| 21 |
+
t, P>|t|: giá trị kiểm định thống kê.
|
| 22 |
+
R-squared: độ phù hợp của mô hình (giá trị càng gần 1 càng tốt).
|
| 23 |
+
F-statistic, Prob(F-statistic): độ tin cậy chung của mô hình.
|
| 24 |
+
Intercept: hệ số chặn 𝑎.
|
| 25 |
+
Average_Pulse: hệ số góc b.
|
| 26 |
+
'''
|
| 27 |
+
|
| 28 |
+
'''
|
| 29 |
+
Giải thích ví dụ:
|
| 30 |
+
Nhập thư viện statsmodels.formula.api dưới dạng smf. Statsmodels là một thư viện thống kê trong Python.
|
| 31 |
+
Sử dụng bộ dữ liệu full_health_data.
|
| 32 |
+
Tạo mô hình dựa trên phương pháp Bình phương tối thiểu thông thường với smf.ols(). Lưu ý rằng biến giải thích phải được viết trước trong dấu ngoặc đơn. Sử dụng tập dữ liệu full_health_data.
|
| 33 |
+
Bằng cách gọi .fit(), bạn sẽ nhận được biến results. Biến này chứa rất nhiều thông tin về mô hình hồi quy.
|
| 34 |
+
Gọi summary() để lấy bảng kết quả hồi quy tuyến tính.
|
| 35 |
+
'''
|
| 36 |
+
|
| 37 |
+
'''
|
| 38 |
+
+) Hàm hồi quy tuyến tính có thể được viết lại theo phương pháp toán học như sau:
|
| 39 |
+
Calorie_Burnage = Average_Pulse * 3.1695 + Duration * 5.8424 - 334.5194
|
| 40 |
+
|
| 41 |
+
+) Làm tròn đến hai chữ số thập phân:
|
| 42 |
+
Calorie_Burnage = Average_Pulse * 3.17 + Duration * 5.84 - 334.52
|
| 43 |
+
'''
|
| 44 |
+
|
| 45 |
+
# Định nghĩa hàm hồi quy tuyến tính trong Python
|
| 46 |
+
'''
|
| 47 |
+
Xác định hàm hồi quy tuyến tính trong Python để thực hiện dự đoán.
|
| 48 |
+
|
| 49 |
+
Calorie_Burnage là gì nếu:
|
| 50 |
+
Nhịp tim trung bình là 110 và thời gian tập luyện là 60 phút?
|
| 51 |
+
Nhịp tim trung bình là 140 và thời gian tập luyện là 45 phút?
|
| 52 |
+
Nhịp tim trung bình là 175 và thời gian tập luyện là 20 phút?
|
| 53 |
+
'''
|
| 54 |
+
# Ví dụ:
|
| 55 |
+
def Predict_Calorie_Burnage(Average_Pulse, Duration):
|
| 56 |
+
return(Average_Pulse * 3.165 + Duration * 5.8424 - 334.5194) # Công thức y = w1x1 + w2x2 + ...+ wnxn - b
|
| 57 |
+
|
| 58 |
+
print(Predict_Calorie_Burnage(110, 60))
|
| 59 |
+
print(Predict_Calorie_Burnage(140, 45))
|
| 60 |
+
print(Predict_Calorie_Burnage(175, 20))
|
| 61 |
+
'''
|
| 62 |
+
Câu trả lời:
|
| 63 |
+
Nhịp tim trung bình là 110 và thời lượng luyện tập là 60 phút = 364 Calo
|
| 64 |
+
Nhịp tim trung bình là 140 và thời lượng luyện tập là 45 phút = 371 Calo
|
| 65 |
+
Nhịp tim trung bình là 175 và thời lượng luyện tập là 20 phút = 336 Calo
|
| 66 |
+
'''
|
| 67 |
+
|
| 68 |
+
# Truy cập các hệ số
|
| 69 |
+
'''
|
| 70 |
+
Hãy xem các hệ số:
|
| 71 |
+
Calorie_Burnage tăng lên 3,17 nếu Average_Pulse tăng thêm một.
|
| 72 |
+
Calorie_Burnage tăng 5,84 nếu Duration tăng thêm một.
|
| 73 |
+
'''
|
| 74 |
+
|
| 75 |
+
# Truy cập Giá trị P (P-Valued)
|
| 76 |
+
'''
|
| 77 |
+
Hãy xem giá trị P cho từng hệ số.
|
| 78 |
+
Giá trị P là 0,00 đối với Average_Pulse, Duration và Intercept.
|
| 79 |
+
Giá trị P có ý nghĩa thống kê đối với tất cả các biến vì nó nhỏ hơn 0,05.
|
| 80 |
+
Vì vậy, ở đây chúng ta có thể kết luận rằng Average_Pulse và Duration có mối quan hệ với Calorie_Burnage.
|
| 81 |
+
|
| 82 |
+
'''
|
| 83 |
+
# R-Squared đã điều chỉnh
|
| 84 |
+
'''
|
| 85 |
+
Sẽ có vấn đề với R bình phương nếu chúng ta có nhiều hơn một biến giải thích.
|
| 86 |
+
R bình phương gần như luôn tăng nếu chúng ta thêm nhiều biến hơn và sẽ không bao giờ giảm.
|
| 87 |
+
Điều này là do chúng ta đang thêm nhiều điểm dữ liệu hơn xung quanh hàm hồi quy tuyến tính.
|
| 88 |
+
Nếu chúng ta thêm các biến ngẫu nhiên không ảnh hưởng đến lượng Calorie_Burnage, chúng ta có nguy cơ kết luận sai rằng hàm hồi quy tuyến tính là phù hợp. R-bình phương hiệu chỉnh sẽ điều chỉnh cho vấn đề này.
|
| 89 |
+
Do đó, tốt hơn là nên xem xét giá trị R bình phương đã điều chỉnh nếu chúng ta có nhiều hơn một biến giải thích.
|
| 90 |
+
R bình phương đã điều chỉnh là 0,814.
|
| 91 |
+
Giá trị của R-Squared luôn nằm trong khoảng từ 0 đến 1 (0% đến 100%).
|
| 92 |
+
Giá trị R-Squared cao có nghĩa là nhiều điểm dữ liệu gần với đường hồi quy tuyến tính.
|
| 93 |
+
Giá trị R-Squared thấp có nghĩa là đường hồi quy tuyến tính không phù hợp với dữ liệu.
|
| 94 |
+
🗸 Kết luận: Mô hình phù hợp với điểm dữ liệu!✅
|
| 95 |
+
|
| 96 |
+
✅Xin chúc mừng! Bạn đã hoàn thành mô-đun cuối cùng của thư viện khoa học dữ liệu!🎉🎉🎉
|
| 97 |
+
'''
|
Linear-Regression.py
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hồi quy tuyến tính
|
| 2 |
+
# - Thuật ngữ hồi quy được sử dụng khi bạn cố gắng tìm mối quan hệ giữa các biến.
|
| 3 |
+
# - Trong Học máy và mô hình thống kê, mối quan hệ đó được sử dụng để dự đoán kết quả của các sự kiện.
|
| 4 |
+
'''
|
| 5 |
+
Trong mô-đun này, chúng ta sẽ giải quyết các câu hỏi sau:
|
| 6 |
+
Chúng ta có thể kết luận rằng Average_Pulse và Duration có liên quan đến Calorie_Burnage không?
|
| 7 |
+
Chúng ta có thể sử dụng Average_Pulse và Duration để dự đoán Calorie_Burnage không?
|
| 8 |
+
'''
|
| 9 |
+
|
| 10 |
+
# Phương pháp bình phương nhỏ nhất(Least Square Method)
|
| 11 |
+
# - Hồi quy tuyến tính sử dụng phương pháp bình phương nhỏ nhất.
|
| 12 |
+
# - Khái niệm này là vẽ một đường thẳng đi qua tất cả các điểm dữ liệu đã được biểu diễn. Đường thẳng này được định vị sao cho khoảng cách đến tất cả các điểm dữ liệu là nhỏ nhất.
|
| 13 |
+
# - Khoảng cách này được gọi là "giá trị còn lại" hoặc "lỗi".
|
| 14 |
+
# - Các đường nét đứt màu đỏ biểu thị khoảng cách từ các điểm dữ liệu đến hàm toán học được vẽ.
|
| 15 |
+
|
| 16 |
+
# Hồi quy tuyến tính sử dụng một biến giải thích
|
| 17 |
+
'''
|
| 18 |
+
Trong ví dụ này, chúng ta sẽ thử dự đoán Calorie_Burnage với Average_Pulse bằng cách sử dụng Hồi quy tuyến tính:
|
| 19 |
+
'''
|
| 20 |
+
# Ví dụ:
|
| 21 |
+
# Three lines to make our compiler able to draw:
|
| 22 |
+
# import sys
|
| 23 |
+
# import matplotlib
|
| 24 |
+
# matplotlib.use('Agg')
|
| 25 |
+
|
| 26 |
+
import pandas as pd
|
| 27 |
+
import matplotlib.pyplot as plt
|
| 28 |
+
import numpy as np
|
| 29 |
+
from scipy import stats
|
| 30 |
+
# Load dữ liệu
|
| 31 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 32 |
+
# Chọn cột
|
| 33 |
+
x = full_health_data['Average_Pulse']
|
| 34 |
+
y = full_health_data['Calorie_Burnage']
|
| 35 |
+
# Hồi quy tuyến tính
|
| 36 |
+
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
|
| 37 |
+
# Tạo dự đoán theo mô hình
|
| 38 |
+
y_pred = slope * x + intercept
|
| 39 |
+
# Vẽ scatter plot + đường hồi quy tuyến tính
|
| 40 |
+
plt.scatter(x,y, color='blue', label='Data Points')
|
| 41 |
+
plt.plot(x,y_pred, color='red', label='Linear Regression Line')
|
| 42 |
+
plt.xlabel('Average_Pulse')
|
| 43 |
+
plt.ylabel('Calorie_Burnage')
|
| 44 |
+
plt.title('Linear Regression of Calorie Burnage and Average Pulse ')
|
| 45 |
+
plt.legend(loc='upper right')
|
| 46 |
+
plt.show()
|
| 47 |
+
|
| 48 |
+
# Two lines to make our compiler able to draw:
|
| 49 |
+
# plt.savefig(sys.stdout.buffer)
|
| 50 |
+
# sys.stdout.flush()
|
| 51 |
+
'''
|
| 52 |
+
Giải thích ví dụ:
|
| 53 |
+
Nhập các mô-đun bạn cần: Pandas, matplotlib và Scipy
|
| 54 |
+
Cô lập Average_Pulse là x. Cô lập Calorie_burnage là y
|
| 55 |
+
Lấy các giá trị khóa quan trọng với: slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
|
| 56 |
+
Tạo một hàm sử dụng giá trị độ dốc và giá trị chặn để trả về một giá trị mới. Giá trị mới này biểu thị vị trí trên trục y của giá trị x tương ứng.
|
| 57 |
+
Chạy từng giá trị của mảng x thông qua hàm. Điều này sẽ tạo ra một mảng mới với các giá trị mới cho trục y: mymodel = list(map(myfunc, x))
|
| 58 |
+
Vẽ biểu đồ phân tán ban đầu: plt.scatter(x, y)
|
| 59 |
+
Vẽ đường hồi quy tuyến tính: plt.plot(x, mymodel)
|
| 60 |
+
Xác định giá trị lớn nhất và nhỏ nhất của trục
|
| 61 |
+
Gắn nhãn trục: "Average_Pulse" và "Calorie_Burnage"
|
| 62 |
+
'''
|
| 63 |
+
# Vẽ Linear Regression + Confidence Interval +- 1 std_err
|
| 64 |
+
import pandas as pd
|
| 65 |
+
import matplotlib.pyplot as plt
|
| 66 |
+
from scipy import stats
|
| 67 |
+
import numpy as np
|
| 68 |
+
|
| 69 |
+
# Load dữ liệu
|
| 70 |
+
full_health_data = pd.read_csv('data.csv')
|
| 71 |
+
|
| 72 |
+
# Chọn cột
|
| 73 |
+
x = full_health_data['Average_Pulse']
|
| 74 |
+
y = full_health_data['Calorie_Burnage']
|
| 75 |
+
|
| 76 |
+
# Hồi quy tuyến tính
|
| 77 |
+
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
|
| 78 |
+
|
| 79 |
+
# Dự đoán y theo mô hình
|
| 80 |
+
y_pred = slope * x + intercept
|
| 81 |
+
|
| 82 |
+
# Tạo vùng confidence interval (±1 std_err)
|
| 83 |
+
y_upper = y_pred + std_err
|
| 84 |
+
y_lower = y_pred - std_err
|
| 85 |
+
|
| 86 |
+
# Vẽ scatter plot
|
| 87 |
+
plt.figure(figsize=(8,6))
|
| 88 |
+
plt.scatter(x, y, label='Data Points', color='blue')
|
| 89 |
+
|
| 90 |
+
# Vẽ đường hồi quy
|
| 91 |
+
plt.plot(x, y_pred, color='red', label='Regression Line')
|
| 92 |
+
|
| 93 |
+
# Công thức std_err = s / căn n ; với s là độ lệch chuẩn của mẫu (sample standard deviation), n là kích thước mẫu (sample size)
|
| 94 |
+
# Vẽ vùng ±1 std_err # Giá trị std_err càng nhỏ → trung bình mẫu càng đáng tin cậy (ít dao động khi lấy mẫu lặp lại).
|
| 95 |
+
plt.fill_between(x, y_lower, y_upper, color='red', alpha=0.2, label='±1 Std. Err.')
|
| 96 |
+
|
| 97 |
+
# Labels, title, legend
|
| 98 |
+
plt.xlabel('Average_Pulse')
|
| 99 |
+
plt.ylabel('Calorie_Burnage')
|
| 100 |
+
plt.title('Linear Regression with ±1 Std. Error')
|
| 101 |
+
plt.legend()
|
| 102 |
+
plt.show()
|
| 103 |
+
|
| 104 |
+
# TỔNG HỢP FULL LINEAR REGRESSION CƠ BẢN --> NÂNG CAO
|
| 105 |
+
# =========================
|
| 106 |
+
# 1️⃣ Import thư viện cần thiết
|
| 107 |
+
# =========================
|
| 108 |
+
import pandas as pd
|
| 109 |
+
import matplotlib.pyplot as plt
|
| 110 |
+
from scipy import stats
|
| 111 |
+
import numpy as np
|
| 112 |
+
|
| 113 |
+
# =========================
|
| 114 |
+
# 2️⃣ Load dữ liệu từ CSV
|
| 115 |
+
# =========================
|
| 116 |
+
# CSV phải có cột: 'Average_Pulse', 'Calorie_Burnage'
|
| 117 |
+
full_health_data = pd.read_csv('data.csv')
|
| 118 |
+
|
| 119 |
+
# Kiểm tra số hàng và số cột
|
| 120 |
+
rows = full_health_data.shape[0]
|
| 121 |
+
columns = full_health_data.shape[1]
|
| 122 |
+
print(f"Số hàng: {rows}, Số cột: {columns}")
|
| 123 |
+
|
| 124 |
+
# =========================
|
| 125 |
+
# 3️⃣ Chọn dữ liệu x, y
|
| 126 |
+
# =========================
|
| 127 |
+
x = full_health_data['Average_Pulse']
|
| 128 |
+
y = full_health_data['Calorie_Burnage']
|
| 129 |
+
|
| 130 |
+
# =========================
|
| 131 |
+
# 4️⃣ Hồi quy tuyến tính
|
| 132 |
+
# =========================
|
| 133 |
+
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
|
| 134 |
+
|
| 135 |
+
# Dự đoán y theo mô hình
|
| 136 |
+
y_pred = slope * x + intercept
|
| 137 |
+
|
| 138 |
+
# =========================
|
| 139 |
+
# 5️⃣ Metrics đánh giá mô hình
|
| 140 |
+
# =========================
|
| 141 |
+
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
|
| 142 |
+
|
| 143 |
+
mse = mean_squared_error(y, y_pred)
|
| 144 |
+
rmse = np.sqrt(mse)
|
| 145 |
+
mae = mean_absolute_error(y, y_pred)
|
| 146 |
+
r2 = r2_score(y, y_pred)
|
| 147 |
+
|
| 148 |
+
print(f"MSE: {mse:.2f}, RMSE: {rmse:.2f}, MAE: {mae:.2f}, R²: {r2:.3f}")
|
| 149 |
+
|
| 150 |
+
# =========================
|
| 151 |
+
# 6️⃣ Vẽ scatter plot + regression line + confidence interval
|
| 152 |
+
# =========================
|
| 153 |
+
y_upper = y_pred + std_err
|
| 154 |
+
y_lower = y_pred - std_err
|
| 155 |
+
|
| 156 |
+
plt.figure(figsize=(10,6))
|
| 157 |
+
plt.scatter(x, y, label='Dữ liệu thực', color='blue')
|
| 158 |
+
plt.plot(x, y_pred, color='red', label='Đường hồi quy')
|
| 159 |
+
plt.fill_between(x, y_lower, y_upper, color='red', alpha=0.2, label='±1 Std. Err.')
|
| 160 |
+
|
| 161 |
+
plt.xlabel('Average_Pulse')
|
| 162 |
+
plt.ylabel('Calorie_Burnage')
|
| 163 |
+
plt.title('Linear Regression: Calorie Burnage vs Average Pulse')
|
| 164 |
+
plt.legend(title='Chú giải', fontsize=10, title_fontsize=12)
|
| 165 |
+
plt.xlim([0, x.max()*1.1])
|
| 166 |
+
plt.ylim([0, y.max()*1.1])
|
| 167 |
+
plt.grid(True)
|
| 168 |
+
plt.show()
|
| 169 |
+
|
| 170 |
+
# =========================
|
| 171 |
+
# 7️⃣ Dự đoán giá trị mới
|
| 172 |
+
# =========================
|
| 173 |
+
new_pulses = [80, 100, 120]
|
| 174 |
+
predicted_calories = [slope*p + intercept for p in new_pulses]
|
| 175 |
+
|
| 176 |
+
for p, c in zip(new_pulses, predicted_calories):
|
| 177 |
+
print(f"Average Pulse: {p} → Dự đoán Calorie Burnage: {c:.2f}")
|
| 178 |
+
|
| 179 |
+
'''
|
| 180 |
+
✅ Tính năng đầy đủ:
|
| 181 |
+
Tự động load dữ liệu và kiểm tra số hàng/cột.
|
| 182 |
+
Linear Regression + vector hóa dự đoán y_pred.
|
| 183 |
+
Metrics: MSE, RMSE, MAE, R².
|
| 184 |
+
Đồ thị: scatter, regression line, ±1 std_err, legend, title, grid.
|
| 185 |
+
Tự động scale xlim/ylim dựa trên dữ liệu.
|
| 186 |
+
Dự đoán giá trị mới với mô hình.
|
| 187 |
+
'''
|
Linear_Functions.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Linear Functions
|
| 2 |
+
'''
|
| 3 |
+
A linear function has one independent variable (x) and one dependent variable (y), and has the following form:
|
| 4 |
+
y = f(x) = ax + b
|
| 5 |
+
This function is used to calculate a value for the dependent variable when we choose a value for the independent variable.
|
| 6 |
+
|
| 7 |
+
Explanation:
|
| 8 |
+
f(x) = the output (the dependant variable)
|
| 9 |
+
x = the input (the independant variable)
|
| 10 |
+
a = slope = is the coefficient of the independent variable. It gives the rate of change of the dependent variable
|
| 11 |
+
b = intercept = is the value of the dependent variable when x = 0. It is also the point where the diagonal line crosses the vertical axis.
|
| 12 |
+
'''
|
| 13 |
+
|
| 14 |
+
# Linear Function With One Explanatory Variable
|
| 15 |
+
# - A function with one explanatory variable means that we use one variable for prediction.
|
| 16 |
+
# For example:
|
| 17 |
+
# Let us say we want to predict calorie burnage using average pulse. We have the following formula:
|
| 18 |
+
# f(x) = 2x + 80
|
| 19 |
+
'''
|
| 20 |
+
Here, the numbers and variables means:
|
| 21 |
+
f(x) = The output. This number is where we get the predicted value of Calorie_Burnage
|
| 22 |
+
x = The input, which is Average_Pulse
|
| 23 |
+
2 = Slope = Specifies how much Calorie_Burnage increases if Average_Pulse increases by one. It tells us how "steep" the diagonal line is
|
| 24 |
+
80 = Intercept = A fixed value. It is the value of the dependent variable when x = 0
|
| 25 |
+
|
| 26 |
+
'''
|
| 27 |
+
# Plotting a Linear Function
|
| 28 |
+
'''
|
| 29 |
+
Graph Explanations:
|
| 30 |
+
- The horizontal axis is generally called the x-axis. Here, it represents Average_Pulse.
|
| 31 |
+
- The vertical axis is generally called the y-axis. Here, it represents Calorie_Burnage.
|
| 32 |
+
- Calorie_Burnage is a function of Average_Pulse, because Calorie_Burnage is assumed to be dependent on Average_Pulse.
|
| 33 |
+
- In other words, we use Average_Pulse to predict Calorie_Burnage.
|
| 34 |
+
- The blue (diagonal) line represents the structure of the mathematical function that predicts calorie burnage.
|
| 35 |
+
|
| 36 |
+
'''
|
Plotting_Linear_Functions.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Plot the Existing Data in Python
|
| 2 |
+
'''
|
| 3 |
+
Now, we can first plot the values of Average_Pulse against Calorie_Burnage using the matplotlib library.
|
| 4 |
+
The plot() function is used to make a 2D hexagonal binning plot of points x,y:
|
| 5 |
+
|
| 6 |
+
'''
|
| 7 |
+
# # Three lines to make our compiler able to draw
|
| 8 |
+
# import sys
|
| 9 |
+
# import matplotlib
|
| 10 |
+
# matplotlib.use('Agg') # Giá trị AGG viết tắt của "Anti-Grain Geometry", được thiết kế trong môi trường ko có giao diện đồ họa => ko chạy được ra hình
|
| 11 |
+
|
| 12 |
+
#Three lines to make our compiler able to draw:
|
| 13 |
+
import pandas as pd
|
| 14 |
+
import matplotlib.pyplot as plt
|
| 15 |
+
|
| 16 |
+
# Đọc dữ liệu và làm sạch tên cột (xóa khoảng trắng dư)
|
| 17 |
+
health_data = pd.read_csv('data-linear-functions.csv', header=0, sep=',')
|
| 18 |
+
health_data.columns = health_data.columns.str.strip()
|
| 19 |
+
|
| 20 |
+
# Vẽ biểu đồ Average_Pulse vs Calorie_Burnage
|
| 21 |
+
health_data.plot(x='Average_Pulse', y='Calorie_Burnage', kind='line')
|
| 22 |
+
|
| 23 |
+
# Giới hạn trục
|
| 24 |
+
plt.xlim(xmin=0)
|
| 25 |
+
plt.ylim(ymin=0)
|
| 26 |
+
|
| 27 |
+
# Tiêu đề và nhãn trục
|
| 28 |
+
plt.title('Average Pulse vs Calorie Burnage')
|
| 29 |
+
plt.xlabel('Average Pulse')
|
| 30 |
+
plt.ylabel('Calorie Burnage')
|
| 31 |
+
|
| 32 |
+
# Hiển thị biểu đồ trong VS Code
|
| 33 |
+
plt.show()
|
| 34 |
+
|
| 35 |
+
# # Two lines to make our compiler able to draw(in ra nhị phân trong VScode):
|
| 36 |
+
# plt.savefig(sys.stdout.buffer)
|
| 37 |
+
# sys.stdout.flush()
|
| 38 |
+
'''
|
| 39 |
+
Example Explained
|
| 40 |
+
Import the pyplot module of the matplotlib library
|
| 41 |
+
Plot the data from Average_Pulse against Calorie_Burnage
|
| 42 |
+
kind='line' tells us which type of plot we want. Here, we want to have a straight line
|
| 43 |
+
plt.ylim() and plt.xlim() tells us what value we want the axis to start on. Here, we want the axis to begin from zero
|
| 44 |
+
plt.show() shows us the output
|
| 45 |
+
|
| 46 |
+
Why is The Line Not Fully Drawn Down to The y-axis?
|
| 47 |
+
==> The reason is that we do not have observations where Average_Pulse or Calorie_Burnage are equal to zero. 80 is the first observation of Average_Pulse and 240 is the first observation of Calorie_Burnage.
|
| 48 |
+
We can use the diagonal line to find the mathematical function to predict calorie burnage.
|
| 49 |
+
As it turns out:
|
| 50 |
+
If the average pulse is 80, the calorie burnage is 240
|
| 51 |
+
If the average pulse is 90, the calorie burnage is 260
|
| 52 |
+
If the average pulse is 100, the calorie burnage is 280
|
| 53 |
+
There is a pattern. If average pulse increases by 10, the calorie burnage increases by 20.
|
| 54 |
+
|
| 55 |
+
'''
|
Prepare_data.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Chuẩn bị dữ liệu sử dụng thư viện Pandas
|
| 2 |
+
# Đọc dữ liệu vào: .read_csv('tên_file.csv', header=0, sep=',')
|
| 3 |
+
import pandas as pd
|
| 4 |
+
health_data = pd.read_csv('data.csv', header=0, sep=",")
|
| 5 |
+
print(health_data) # ==> Nó sẽ hiển thị vài dòng rồi tự động cắt bớt và hiển thị chỉ vài dòng cuối
|
| 6 |
+
|
| 7 |
+
# Hiển thị tất cả các hàng và cột trong file data.csv
|
| 8 |
+
pd.set_option('display.max_rows', None) # Không giới hạn số hàng
|
| 9 |
+
pd.set_option('display.max_columns',None) # không giới hạn số cột
|
| 10 |
+
|
| 11 |
+
print(health_data)
|
| 12 |
+
|
| 13 |
+
# Xem một phần dữ liệu
|
| 14 |
+
print(health_data.head(10)) # xem 10 dòng đầu
|
| 15 |
+
print(health_data.tail(10)) # xem 10 dòng cuối
|
| 16 |
+
# ==> nếu dùng .head() ; .tail() => mặc định in ra 5 dòng đầu ; 5 dòng cuối
|
| 17 |
+
|
| 18 |
+
# Ghi ra file CSV để xem toàn bộ (đã sửa hoặc chưa sửa)
|
| 19 |
+
health_data.to_csv('output-full-data.csv', index=False) # index=False nghĩa là không ghi cột index (chỉ số dòng) của DataFrame vào file CSV.
|
Regression-Table-Coefficients.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# "Phần Hệ số" trong Bảng hồi quy
|
| 2 |
+
'''
|
| 3 |
+
- Coef là viết tắt của coefficient(hệ số). Đây là kết quả đầu ra của hàm hồi quy tuyến tính.
|
| 4 |
+
Hàm hồi quy tuyến tính có thể được viết lại theo phương pháp toán học như sau:
|
| 5 |
+
Calorie_Burnage = 0.3296 * Average_Pulse + 346.8662
|
| 6 |
+
Những con số này có nghĩa là:
|
| 7 |
+
Nếu Average_Pulse tăng thêm 1, Calorie_Burnage tăng thêm 0.3296(hoặc 0.3 làm tròn)
|
| 8 |
+
Nếu Average_Pulse = 0, Calorie_Burnage bằng 346.8662(hoặc 346.9 làm tròn)
|
| 9 |
+
Hãy nhớ rằng giá trị chặn(intercept) được sử dụng để điều chỉnh độ chính xác dự đoán của mô hình.
|
| 10 |
+
'''
|
| 11 |
+
|
| 12 |
+
# Định nghĩa hàm hồi quy tuyến tính trong Python
|
| 13 |
+
'''
|
| 14 |
+
Xác định hàm hồi quy tuyến tính trong Python để thực hiện dự đoán.
|
| 15 |
+
Calorie_Burnage là gì nếu Average_Pulse là: 120, 130, 150, 180?
|
| 16 |
+
'''
|
| 17 |
+
# Ví dụ:
|
| 18 |
+
def Predict_Calorie_Burnage(Average_Pulse):
|
| 19 |
+
return(0.3296 * Average_Pulse + 346.8662)
|
| 20 |
+
# Try some different Values: 120,130,150,180
|
| 21 |
+
print(Predict_Calorie_Burnage(120))
|
| 22 |
+
print(Predict_Calorie_Burnage(130))
|
| 23 |
+
print(Predict_Calorie_Burnage(150))
|
| 24 |
+
print(Predict_Calorie_Burnage(180))
|
| 25 |
+
|
Regression-Table-P-Values.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Bảng hồi quy: Giá trị P
|
| 2 |
+
# "Thống kê của phần hệ số" trong bảng hồi quy
|
| 3 |
+
'''
|
| 4 |
+
Bây giờ, chúng ta muốn kiểm tra xem các hệ số từ hàm hồi quy tuyến tính có tác động đáng kể đến biến phụ thuộc (Calorie_Burnage) hay không.
|
| 5 |
+
Điều này có nghĩa là chúng ta muốn chứng minh rằng tồn tại mối quan hệ giữa Average_Pulse và Calorie_Burnage, bằng cách sử dụng các bài kiểm tra thống kê.
|
| 6 |
+
|
| 7 |
+
Có bốn thành phần giải thích số liệu thống kê của các hệ số:
|
| 8 |
+
std err là viết tắt của Standard Error
|
| 9 |
+
t là "giá trị t" của các hệ số
|
| 10 |
+
P>|t| được gọi là "Giá trị P"
|
| 11 |
+
[0,025 0,975] biểu thị khoảng tin cậy của các hệ số
|
| 12 |
+
Chúng ta sẽ tập trung vào việc hiểu "Giá trị P" trong mô-đun này.
|
| 13 |
+
'''
|
| 14 |
+
|
| 15 |
+
# Giá trị P
|
| 16 |
+
'''
|
| 17 |
+
Giá trị P là một con số thống kê để kết luận xem có mối quan hệ nào giữa Average_Pulse và Calorie_Burnage hay không.
|
| 18 |
+
Chúng ta kiểm tra xem giá trị thực của hệ số có bằng 0 (không có mối quan hệ) hay không. Kiểm định thống kê cho trường hợp này được gọi là Kiểm định giả thuyết.
|
| 19 |
+
Giá trị P thấp (< 0,05) có nghĩa là hệ số có khả năng không bằng 0.
|
| 20 |
+
Giá trị P cao (> 0,05) có nghĩa là chúng ta không thể kết luận rằng biến giải thích ảnh hưởng đến biến phụ thuộc (ở đây: nếu Average_Pulse ảnh hưởng đến Calorie_Burnage).
|
| 21 |
+
Giá trị P cao cũng được gọi là giá trị P không đáng kể.
|
| 22 |
+
|
| 23 |
+
'''
|
| 24 |
+
|
| 25 |
+
# Kiểm định giả thuyết(Hypothesis Testing)
|
| 26 |
+
'''
|
| 27 |
+
Kiểm định giả thuyết là một thủ tục thống kê để kiểm tra xem kết quả của bạn có hợp lệ hay không.
|
| 28 |
+
Trong ví dụ của chúng tôi, chúng tôi đang kiểm tra xem hệ số thực của Average_Pulse và giá trị chặn có bằng 0 hay không.
|
| 29 |
+
Kiểm định giả thuyết có hai phát biểu: Giả thuyết không và giả thuyết thay thế.
|
| 30 |
+
Giả thuyết không có thể được viết ngắn gọn là H0
|
| 31 |
+
Giả thuyết thay thế có thể được viết ngắn gọn là HA
|
| 32 |
+
Viết theo dạng toán học:
|
| 33 |
+
H0: Average_Pulse = 0
|
| 34 |
+
HA: Average_Pulse ≠ 0
|
| 35 |
+
H0: Intercept = 0
|
| 36 |
+
HA: Intercept ≠ 0
|
| 37 |
+
|
| 38 |
+
Dấu ≠ có nghĩa là "không bằng"
|
| 39 |
+
'''
|
| 40 |
+
|
| 41 |
+
# Kiểm định giả thuyết và giá trị P
|
| 42 |
+
'''
|
| 43 |
+
Giả thuyết không có thể bị bác bỏ hoặc không.
|
| 44 |
+
Nếu bác bỏ giả thuyết vô hiệu, chúng ta kết luận rằng tồn tại mối quan hệ giữa Nhịp tim trung bình và Lượng calo tiêu thụ. Giá trị P được sử dụng cho kết luận này.
|
| 45 |
+
Ngưỡng chung của giá trị P là 0,05.
|
| 46 |
+
|
| 47 |
+
Lưu ý: Giá trị P bằng 0,05 có nghĩa là 5% trường hợp, chúng ta sẽ bác bỏ giả thuyết vô hiệu một cách sai lầm. Điều này có nghĩa là chúng ta chấp nhận rằng 5% trường hợp, chúng ta có thể đã kết luận sai về một mối quan hệ.
|
| 48 |
+
|
| 49 |
+
Nếu giá trị P thấp hơn 0,05, chúng ta có thể bác bỏ giả thuyết không và kết luận rằng tồn tại mối quan hệ giữa các biến.
|
| 50 |
+
Tuy nhiên, giá trị P của Average_Pulse là 0,824. Vì vậy, chúng ta không thể kết luận mối quan hệ giữa Average_Pulse và Calorie_Burnage.
|
| 51 |
+
Điều này có nghĩa là có 82,4% khả năng hệ số thực của Average_Pulse bằng 0.
|
| 52 |
+
Giá trị cắt gốc được sử dụng để điều chỉnh khả năng dự đoán chính xác hơn của hàm hồi quy. Do đó, việc diễn giải giá trị P của giá trị cắt gốc là không phổ biến.
|
| 53 |
+
'''
|
Regression-Table-R-Squared.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# R - Bình phương
|
| 2 |
+
# - R-Squared và điều chỉnh R-Squared mô tả mức độ phù hợp của mô hình hồi quy tuyến tính với các điểm dữ liệu:
|
| 3 |
+
'''
|
| 4 |
+
Giá trị của R-Squared luôn nằm trong khoảng từ 0 đến 1 (0% đến 100%).
|
| 5 |
+
|
| 6 |
+
Giá trị R-Squared cao có nghĩa là nhiều điểm dữ liệu gần với đường hồi quy tuyến tính.
|
| 7 |
+
Giá trị R-Squared thấp có nghĩa là đường hồi quy tuyến tính không phù hợp với dữ liệu.
|
| 8 |
+
'''
|
| 9 |
+
|
| 10 |
+
# Ví dụ trực quan về giá trị R bình phương thấp (0,00)
|
| 11 |
+
'''
|
| 12 |
+
Mô hình hồi quy của chúng tôi cho thấy giá trị R-Squared bằng 0, điều này có nghĩa là đường hồi quy tuyến tính không phù hợp với dữ liệu.
|
| 13 |
+
Điều này có thể được hình dung khi chúng ta vẽ đồ thị hàm hồi quy tuyến tính thông qua các điểm dữ liệu của Average_Pulse và Calorie_Burnage.
|
| 14 |
+
'''
|
| 15 |
+
|
| 16 |
+
# Ví dụ trực quan về giá trị R bình phương cao (0,79)
|
| 17 |
+
# - Tuy nhiên, nếu chúng ta vẽ đồ thị Duration và Calorie_Burnage , R-Squared sẽ tăng lên. Ở đây, chúng ta thấy các điểm dữ liệu gần với đường hồi quy tuyến tính:
|
| 18 |
+
# - Sau đây là mã bằng Python:
|
| 19 |
+
# Ví dụ:
|
| 20 |
+
# Three lines to make our compiler able to draw:
|
| 21 |
+
# import sys
|
| 22 |
+
# import matplotlib
|
| 23 |
+
# matplotlib.use('Agg')
|
| 24 |
+
|
| 25 |
+
import pandas as pd
|
| 26 |
+
import matplotlib.pyplot as plt
|
| 27 |
+
from scipy import stats
|
| 28 |
+
|
| 29 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 30 |
+
x = full_health_data['Duration']
|
| 31 |
+
y = full_health_data['Calorie_Burnage']
|
| 32 |
+
slope, intercept, r, p, std_err = stats.linregress(x,y)
|
| 33 |
+
def my_function(x):
|
| 34 |
+
return slope * x + intercept
|
| 35 |
+
mymodel = list(map(my_function,x))
|
| 36 |
+
print(mymodel)
|
| 37 |
+
plt.scatter(x,y)
|
| 38 |
+
plt.plot(x,mymodel)
|
| 39 |
+
plt.xlim(xmin=0, xmax=200)
|
| 40 |
+
plt.ylim(ymin=0, ymax=2000)
|
| 41 |
+
plt.xlabel('Duration')
|
| 42 |
+
plt.ylabel('Calorie_Burnage')
|
| 43 |
+
plt.title('Regression Table With R-Squared')
|
| 44 |
+
plt.show()
|
| 45 |
+
# Two lines to make our compiler able to draw:
|
| 46 |
+
# plt.savefig(sys.stdout.buffer)
|
| 47 |
+
# sys.stdout.flush()
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
# Tóm tắt - Dự đoán lượng calo bị đốt cháy bằng Average_Pulse
|
| 51 |
+
'''
|
| 52 |
+
Làm thế nào chúng ta có thể tóm tắt hàm hồi quy tuyến tính với Average_Pulse là biến giải thích?
|
| 53 |
+
|
| 54 |
+
Hệ số 0,3296, nghĩa là Average_Pulse có tác động rất nhỏ đến Calorie_Burnage.
|
| 55 |
+
Giá trị P cao (0,824), nghĩa là chúng ta không thể kết luận mối quan hệ giữa Nhịp tim trung bình và Lượng calo đốt cháy.
|
| 56 |
+
Giá trị R-Squared bằng 0, nghĩa là đường hồi quy tuyến tính không phù hợp với dữ liệu.
|
| 57 |
+
'''
|
Regression-Table.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Bảng hồi quy
|
| 2 |
+
# - Kết quả đầu ra từ hồi quy tuyến tính có thể được tóm tắt trong bảng hồi quy.
|
| 3 |
+
'''
|
| 4 |
+
Nội dung của bảng bao gồm:
|
| 5 |
+
Thông tin về mô hình
|
| 6 |
+
Hệ số của hàm hồi quy tuyến tính
|
| 7 |
+
Thống kê hồi quy
|
| 8 |
+
Thống kê các hệ số từ hàm hồi quy tuyến tính
|
| 9 |
+
Những thông tin khác mà chúng tôi sẽ không đề cập trong mô-đun này
|
| 10 |
+
'''
|
| 11 |
+
|
| 12 |
+
# Bảng hồi quy với Average_Pulse là biến giải thích
|
| 13 |
+
# => Bây giờ bạn có thể bắt đầu hành trình phân tích đầu ra nâng cao!
|
| 14 |
+
|
| 15 |
+
# Tạo bảng hồi quy tuyến tính trong Python
|
| 16 |
+
# - Sau đây là cách tạo bảng hồi quy tuyến tính trong Python:
|
| 17 |
+
import pandas as pd
|
| 18 |
+
import statsmodels.formula.api as smf
|
| 19 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 20 |
+
model = smf.ols('Calorie_Burnage ~ Average_Pulse', data=full_health_data)
|
| 21 |
+
'''
|
| 22 |
+
Giải thích: ols là Ordinary Least Squares(phương pháp bình phương tối thiểu)
|
| 23 |
+
👉Nghĩa là ta muốn tìm đường thẳng tốt nhất: Calorie_Burnage = a + b * Average_Pulse
|
| 24 |
+
trong đó:
|
| 25 |
+
a: hằng số (intercept)
|
| 26 |
+
b: hệ số góc (slope)
|
| 27 |
+
'''
|
| 28 |
+
results = model.fit() # Dòng này huấn luyện mô hình (fit model) trên dữ liệu. Tính toán giá trị a, b, sai số, R², p-value,...
|
| 29 |
+
print(results.summary())
|
| 30 |
+
'''
|
| 31 |
+
In ra bảng thống kê kết quả hồi quy tuyến tính, gồm:
|
| 32 |
+
coef: hệ số của từng biến.
|
| 33 |
+
std err: sai số chuẩn.
|
| 34 |
+
t, P>|t|: giá trị kiểm định thống kê.
|
| 35 |
+
R-squared: độ phù hợp của mô hình (giá trị càng gần 1 càng tốt).
|
| 36 |
+
F-statistic, Prob(F-statistic): độ tin cậy chung của mô hình.
|
| 37 |
+
Intercept: hệ số chặn 𝑎.
|
| 38 |
+
Average_Pulse: hệ số góc b.
|
| 39 |
+
'''
|
| 40 |
+
|
| 41 |
+
'''
|
| 42 |
+
Giải thích ví dụ:
|
| 43 |
+
Nhập thư viện statsmodels.formula.api dưới dạng smf. Statsmodels là một thư viện thống kê trong Python.
|
| 44 |
+
Sử dụng bộ dữ liệu full_health_data.
|
| 45 |
+
Tạo mô hình dựa trên phương pháp Bình phương tối thiểu thông thường với smf.ols(). Lưu ý rằng biến giải thích phải được viết trước trong dấu ngoặc đơn. Sử dụng tập dữ liệu full_health_data.
|
| 46 |
+
Bằng cách gọi .fit(), bạn sẽ nhận được biến results. Biến này chứa rất nhiều thông tin về mô hình hồi quy.
|
| 47 |
+
Gọi summary() để lấy bảng kết quả hồi quy tuyến tính.
|
| 48 |
+
'''
|
| 49 |
+
'''
|
| 50 |
+
Dep. Variable: is short for "Dependent Variable". Calorie_Burnage is here the dependent variable. The Dependent variable is here assumed to be explained by Average_Pulse.
|
| 51 |
+
Model: OLS is short for Ordinary Least Squares. This is a type of model that uses the Least Square method.
|
| 52 |
+
Date: and Time: shows the date and time the output was calculated in Python.
|
| 53 |
+
'''
|
Slope_and_Intercept.py
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Slope and Intercept
|
| 2 |
+
# Find The Slope
|
| 3 |
+
'''
|
| 4 |
+
The slope is defined as how much calorie burnage increases, if average pulse increases by one. It tells us how "steep" the diagonal line is.
|
| 5 |
+
We can find the slope by using the proportional difference of two points from the graph.
|
| 6 |
+
If the average pulse is 80, the calorie burnage is 240
|
| 7 |
+
If the average pulse is 90, the calorie burnage is 260
|
| 8 |
+
We see that if average pulse increases with 10, the calorie burnage increases by 20.
|
| 9 |
+
'''
|
| 10 |
+
# slope = 20/10 = 2 ==> The slope is 2.
|
| 11 |
+
# Mathematically, Slope is Defined as: Slope = f(x2) - f(x1) / x2-x1
|
| 12 |
+
'''
|
| 13 |
+
f(x2) = Second observation of Calorie_Burnage = 260
|
| 14 |
+
f(x1) = First observation of Calorie_Burnage = 240
|
| 15 |
+
x2 = Second observation of Average_Pulse = 90
|
| 16 |
+
x1 = First observation of Average_Pulse = 80
|
| 17 |
+
'''
|
| 18 |
+
# Slope = (260-240) / (90-80) = 2 => Be consistent to define the observations in the correct order! If not, the prediction will not be correct!
|
| 19 |
+
|
| 20 |
+
# Use Python to find the Slope
|
| 21 |
+
# - Calculate the slope with the following code:
|
| 22 |
+
# Ví dụ:
|
| 23 |
+
def slope(x1,y1, x2,y2):
|
| 24 |
+
s = (y2-y1)/(x2-x1)
|
| 25 |
+
return s
|
| 26 |
+
print(slope(80,240,90,260))
|
| 27 |
+
|
| 28 |
+
# Find the Intercept
|
| 29 |
+
# - The intercept is used to fine tune the functions ability to predict Calorie_Burnage.
|
| 30 |
+
# - The intercept is where the diagonal line crosses the y-axis, if it were fully drawn.
|
| 31 |
+
# - The intercept is the value of y, when x = 0.
|
| 32 |
+
'''
|
| 33 |
+
Does it make sense that average pulse is zero?
|
| 34 |
+
No, you would be dead and you certainly would not burn any calories.
|
| 35 |
+
However, we need to include the intercept in order to complete the mathematical function's ability to predict Calorie_Burnage correctly.
|
| 36 |
+
'''
|
| 37 |
+
'''
|
| 38 |
+
Other examples where the intercept of a mathematical function can have a practical meaning:
|
| 39 |
+
Predicting next years revenue by using marketing expenditure (How much revenue will we have next year, if marketing expenditure is zero?). It is likely to assume that a company will still have some revenue even though if it does not spend money on marketing.
|
| 40 |
+
Fuel usage with speed (How much fuel do we use if speed is equal to 0 mph?). A car that uses gasoline will still use fuel when it is idle.
|
| 41 |
+
'''
|
| 42 |
+
|
| 43 |
+
# Find the Slope and Intercept Using Python
|
| 44 |
+
# - The np.polyfit() function returns the slope and intercept.
|
| 45 |
+
import pandas as pd
|
| 46 |
+
import numpy as np
|
| 47 |
+
health_data = pd.read_csv('data-calculate-slope-and-intercept.csv', header=0, sep=',')
|
| 48 |
+
x = health_data['Average_Pulse']
|
| 49 |
+
y = health_data['Calorie_Burnage']
|
| 50 |
+
slope_intercept = np.polyfit(x,y,1) # 1 means the degree of the function
|
| 51 |
+
print(slope_intercept)
|
| 52 |
+
'''
|
| 53 |
+
Example Explained:
|
| 54 |
+
Isolate the variables Average_Pulse (x) and Calorie_Burnage (y) from health_data.
|
| 55 |
+
Call the np.polyfit() function.
|
| 56 |
+
The last parameter of the function specifies the degree of the function, which in this case is "1".
|
| 57 |
+
'''
|
| 58 |
+
|
| 59 |
+
'''
|
| 60 |
+
Tip: linear functions = 1.degree function. In our example, the function is linear, which is in the 1.degree. That means that all coefficients (the numbers) are in the power of one.
|
| 61 |
+
'''
|
| 62 |
+
|
| 63 |
+
'''
|
| 64 |
+
We have now calculated the slope (2) and the intercept (80). We can write the mathematical function as follow:
|
| 65 |
+
Predict Calorie_Burnage by using a mathematical expression:
|
| 66 |
+
'''
|
| 67 |
+
# f(x) = 2x + 80
|
| 68 |
+
'''
|
| 69 |
+
Task:
|
| 70 |
+
Now, we want to predict calorie burnage if average pulse is 135.
|
| 71 |
+
Remember that the intercept is a constant. A constant is a number that does not change.
|
| 72 |
+
We can now substitute the input x with 135:
|
| 73 |
+
'''
|
| 74 |
+
# f(135) = 2 * 135 + 80 = 350 => If average pulse is 135, the calorie burnage is 350.
|
| 75 |
+
|
| 76 |
+
# Define the Mathematical Function in Python
|
| 77 |
+
# Ví dụ:
|
| 78 |
+
def my_function(x):
|
| 79 |
+
return 2 *x + 80
|
| 80 |
+
print(my_function(135))
|
| 81 |
+
|
| 82 |
+
# Another Task: Try to replace x with 140 and 150.
|
| 83 |
+
def my_function(x):
|
| 84 |
+
return 2*x + 80
|
| 85 |
+
print(my_function(140))
|
| 86 |
+
|
| 87 |
+
def my_function(x):
|
| 88 |
+
return 2*x + 80
|
| 89 |
+
print(my_function(150))
|
| 90 |
+
|
| 91 |
+
# Plot a New Graph in Python
|
| 92 |
+
# - Here, we plot the same graph as earlier, but formatted the axis a little bit.
|
| 93 |
+
# Max value of the y-axis is now 400 and for x-axis is 150:
|
| 94 |
+
# Ví dụ:
|
| 95 |
+
# Three lines to make our compiler able to draw
|
| 96 |
+
# import sys
|
| 97 |
+
# import matplotlib
|
| 98 |
+
# matplotlib.use('Agg') # Giá trị AGG viết tắt của "Anti-Grain Geometry", được thiết kế trong môi trường ko có giao diện đồ họa => ko chạy được ra hình ảnh
|
| 99 |
+
|
| 100 |
+
import pandas as pd
|
| 101 |
+
import matplotlib.pyplot as plt
|
| 102 |
+
health_data = pd.read_csv('data-linear-functions.csv', header=0, sep=',')
|
| 103 |
+
health_data.plot(x ='Average_Pulse', y='Calorie_Burnage', kind='line')
|
| 104 |
+
|
| 105 |
+
# Tiêu đề và nhãn trục
|
| 106 |
+
plt.title('Average Pulse vs Calorie Burnage')
|
| 107 |
+
plt.xlabel('Average Pulse')
|
| 108 |
+
plt.ylabel('Calorie Burnage')
|
| 109 |
+
|
| 110 |
+
plt.xlim(xmin=0)
|
| 111 |
+
plt.ylim(ymin=0)
|
| 112 |
+
plt.show()
|
| 113 |
+
# Two lines to make our compiler able to draw(In ra nhị phân trong VScode)
|
| 114 |
+
# plt.savefig(sys.stdout.buffer)
|
| 115 |
+
# sys.stdout.flush()
|
| 116 |
+
'''
|
| 117 |
+
Example Explained
|
| 118 |
+
Import the pyplot module of the matplotlib library
|
| 119 |
+
Plot the data from Average_Pulse against Calorie_Burnage
|
| 120 |
+
kind='line' tells us which type of plot we want. Here, we want to have a straight line
|
| 121 |
+
plt.ylim() and plt.xlim() tells us what value we want the axis to start and stop on.
|
| 122 |
+
plt.show() shows us the output
|
| 123 |
+
'''
|
Statistics-data-science.py
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Statistics
|
| 2 |
+
# - Thống kê là khoa học phân tích dữ liệu.
|
| 3 |
+
# - Khi tạo ra 1 mô hình dự đoán => phải đánh giá độ tin cậy của dự đoán đó.
|
| 4 |
+
# - Suy cho cùng, một dự đoán có giá trị nếu chúng ta không thể tin cậy vào nó.
|
| 5 |
+
|
| 6 |
+
# Các phép tính quan trọng trong một data set:
|
| 7 |
+
'''
|
| 8 |
+
Count
|
| 9 |
+
Sum
|
| 10 |
+
Standard Deviation(std)
|
| 11 |
+
Percentile
|
| 12 |
+
Average
|
| 13 |
+
Etc...
|
| 14 |
+
(Đây là điểm khởi đầu quan trọng để làm quen với dữ liệu).
|
| 15 |
+
'''
|
| 16 |
+
|
| 17 |
+
# Sử dụng hàm describe() trong Python để tóm tắt dữ liệu:
|
| 18 |
+
import pandas as pd
|
| 19 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 20 |
+
pd.set_option('display.max_columns', None)
|
| 21 |
+
pd.set_option('display.max_rows', None)
|
| 22 |
+
print(full_health_data.describe())
|
| 23 |
+
|
| 24 |
+
# Thống kê phần trăm(Statistics Percentiles)
|
| 25 |
+
# - Có 3 loại phần trăm: 25%, 50%, 75%
|
| 26 |
+
'''
|
| 27 |
+
Chúng ta hãy thử giải thích bằng một số ví dụ, sử dụng Average_Pulse.
|
| 28 |
+
Phần trăm thứ 25 của Average_Pulse có nghĩa là 25% trong tổng số buổi tập có nhịp mạch trung bình là 100 nhịp mỗi phút hoặc thấp hơn.
|
| 29 |
+
Nếu đảo ngược câu lệnh, điều đó có nghĩa là 75% trong tổng số buổi tập có nhịp mạch trung bình là 100 nhịp mỗi phút hoặc cao hơn.
|
| 30 |
+
'''
|
| 31 |
+
# TASK: Tìm phần trăm thứ 10% cho Max_Pulse
|
| 32 |
+
import pandas as pd
|
| 33 |
+
import numpy as np
|
| 34 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 35 |
+
Max_Pulse = full_health_data['Max_Pulse']
|
| 36 |
+
percentile10 = np.percentile(Max_Pulse, 10)
|
| 37 |
+
print(percentile10)
|
| 38 |
+
'''Giải thích:
|
| 39 |
+
Max_Pulse = full_health_data["MaxPulse"] - Tách biến MaxPulse khỏi toàn bộ tập dữ liệu sức khỏe.
|
| 40 |
+
np.percentile() được sử dụng để xác định rằng chúng ta muốn phần trăm thứ 10% từ Max_Pulse.
|
| 41 |
+
Phần trăm thứ 10% của Max_Pulse là 119. Điều này có nghĩa là 10% trong số tất cả các buổi đào tạo có Max_Pulse là 119 hoặc thấp hơn.
|
| 42 |
+
'''
|
| 43 |
+
|
| 44 |
+
# Độ lệch chuẩn(Standard Deviation)
|
| 45 |
+
# - Độ lệch chuẩn là con số mô tả mức độ phân tán của các quan sát.
|
| 46 |
+
'''
|
| 47 |
+
Một hàm toán học sẽ gặp khó khăn trong việc dự đoán các giá trị chính xác nếu các quan sát "phân tán". Độ lệch chuẩn là thước đo mức độ không chắc chắn.
|
| 48 |
+
Độ lệch chuẩn thấp có nghĩa là hầu hết các con số đều gần với giá trị trung bình (trung bình cộng).
|
| 49 |
+
Độ lệch chuẩn cao có nghĩa là các giá trị được phân bổ trên một phạm vi rộng hơn.
|
| 50 |
+
'''
|
| 51 |
+
# Mẹo: Độ lệch chuẩn thường được biểu thị bằng ký hiệu Sigma: σ
|
| 52 |
+
|
| 53 |
+
# Chúng ta có thể sử dụng hàm std() từ Numpy để tìm độ lệch chuẩn của một biến
|
| 54 |
+
# Ví dụ:
|
| 55 |
+
import pandas as pd
|
| 56 |
+
import numpy as np
|
| 57 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 58 |
+
std = np.std(full_health_data)
|
| 59 |
+
print(std)
|
| 60 |
+
|
| 61 |
+
# Hệ số biến thiên(Coefficient of Variation)
|
| 62 |
+
# - Hệ số biến thiên được sử dụng để biết độ lệch chuẩn lớn đến mức nào.
|
| 63 |
+
# Về mặt toán học, hệ số biến thiên được định nghĩa như sau:
|
| 64 |
+
# Coefficient of Variation = Standard Deviation / Mean
|
| 65 |
+
# Ví dụ:
|
| 66 |
+
import pandas as pd
|
| 67 |
+
import numpy as np
|
| 68 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 69 |
+
coefficient_of_variation = np.std(full_health_data) / np.mean(full_health_data)
|
| 70 |
+
print(coefficient_of_variation)
|
| 71 |
+
'''
|
| 72 |
+
Chúng ta thấy rằng các biến Duration, Calorie_Burnage và Hours_Work có Độ lệch chuẩn cao so với Max_Pulse, Average_Pulse và Hours_Sleep.
|
| 73 |
+
'''
|
| 74 |
+
|
| 75 |
+
# Phương sai thống kê(Statistics Variance)
|
| 76 |
+
# - Phương sai là một con số khác cho biết mức độ phân tán của các giá trị.
|
| 77 |
+
'''
|
| 78 |
+
Trên thực tế, nếu lấy căn bậc hai của phương sai, bạn sẽ có độ lệch chuẩn. Hoặc ngược lại, nếu nhân độ lệch chuẩn với chính nó, bạn sẽ có phương sai!
|
| 79 |
+
'''
|
| 80 |
+
# Mẹo: Phương sai thường được biểu thị bằng ký hiệu Sigma Square: σ^2
|
| 81 |
+
'''
|
| 82 |
+
Bước 1 để tính phương sai: Tìm giá trị trung bình
|
| 83 |
+
Bước 2: Đối với mỗi giá trị - Tìm sự khác biệt so với giá trị trung bình
|
| 84 |
+
Bước 3: Đối với mỗi hiệu - Tìm giá trị bình phương
|
| 85 |
+
ưu ý: Chúng ta phải bình phương các giá trị để có được tổng mức chênh lệch.
|
| 86 |
+
Bước 4: Phương sai là số trung bình của các giá trị bình phương này
|
| 87 |
+
'''
|
| 88 |
+
# Sử dụng Python để tìm phương sai của health_data
|
| 89 |
+
# - Sử dụng hàm var() từ Numpy để tìm phương sai(hãy nhớ rằng bây giờ chúng ta sử dụng tập dữ liệu đầu tiên với 10 quan sát)
|
| 90 |
+
import pandas as pd
|
| 91 |
+
import numpy as np
|
| 92 |
+
health_data = pd.read_csv('calculate-var-statistics.csv', header=0, sep=',')
|
| 93 |
+
var = np.var(health_data)
|
| 94 |
+
print(var)
|
| 95 |
+
|
| 96 |
+
# Sử dụng Python để tìm phương sai của toàn bộ tập dữ liệu
|
| 97 |
+
import pandas as pd
|
| 98 |
+
import numpy as np
|
| 99 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 100 |
+
full_var = np.var(full_health_data)
|
| 101 |
+
print(full_var)
|
| 102 |
+
|
| 103 |
+
# Thống kê tương quan(Statistics Correlation)
|
| 104 |
+
# - Hệ số tương quan đo lường mối quan hệ giữa hai biến.
|
| 105 |
+
# - Hệ số tương quan không bao giờ được nhỏ hơn -1 hoặc lớn hơn 1.
|
| 106 |
+
'''
|
| 107 |
+
1 = có mối quan hệ tuyến tính hoàn hảo giữa các biến (như Average_Pulse so với Calorie_Burnage)
|
| 108 |
+
0 = không có mối quan hệ tuyến tính giữa các biến
|
| 109 |
+
-1 = có mối quan hệ tuyến tính âm hoàn hảo giữa các biến (ví dụ: Làm việc ít giờ hơn dẫn đến đốt cháy nhiều calo hơn trong một buổi tập luyện)
|
| 110 |
+
'''
|
| 111 |
+
|
| 112 |
+
# Ví dụ về mối quan hệ tuyến tính hoàn hảo (Hệ số tương quan = 1)
|
| 113 |
+
# Three lines to make our compiler able to draw:
|
| 114 |
+
# import sys
|
| 115 |
+
# import matplotlib
|
| 116 |
+
# matplotlib.use('Agg')
|
| 117 |
+
|
| 118 |
+
import pandas as pd
|
| 119 |
+
import matplotlib.pyplot as plt
|
| 120 |
+
|
| 121 |
+
health_data = pd.read_csv('data-correlation-coefficient.csv', header=0, sep=',')
|
| 122 |
+
health_data.plot(x='Average_Pulse', y='Calorie_Burnage', title='Correlation Coefficient = 1', kind='scatter')
|
| 123 |
+
plt.show()
|
| 124 |
+
|
| 125 |
+
# Two lines to make our compiler able to draw:
|
| 126 |
+
# plt.savefig(sys.stdout.buffer) # buffer là bộ nhớ đệm
|
| 127 |
+
# sys.stdout.flush() # Hàm này ép Python in ra màn hình ngay lập tức thay vì đợi
|
| 128 |
+
|
| 129 |
+
# Ví dụ về mối quan hệ tuyến tính âm hoàn hảo (Hệ số tương quan = -1)
|
| 130 |
+
# Three lines to make our compilers able to draw:
|
| 131 |
+
# import sys
|
| 132 |
+
# import matplotlib
|
| 133 |
+
# matplotlib.use('Agg')
|
| 134 |
+
|
| 135 |
+
import pandas as pd
|
| 136 |
+
import matplotlib.pyplot as plt
|
| 137 |
+
negative_corr = {'Hours_Work_Before_Training':[10,9,8,7,6,5,4,3,2,1], 'Calorie_Burnage':[220,240,260,280,300,320,340,360,380,400]}
|
| 138 |
+
negative_corr = pd.DataFrame(data=negative_corr)
|
| 139 |
+
negative_corr.plot(x='Hours_Work_Before_Training', y='Calorie_Burnage', title='Correlation Coefficient = -1', kind='scatter')
|
| 140 |
+
plt.show()
|
| 141 |
+
# Two lines to make our compiler able to draw:
|
| 142 |
+
# plt.savefig(sys.stdout.buffer) # buffer là bộ nhớ đệm
|
| 143 |
+
# sys.stdout.flush() # Hàm này ép Python in ra màn hình ngay lập tức thay vì đợi
|
| 144 |
+
|
| 145 |
+
# Ví dụ về Không có mối quan hệ tuyến tính (Hệ số tương quan = 0)
|
| 146 |
+
# Three lines to make our compiler able to draw:
|
| 147 |
+
# import sys
|
| 148 |
+
# import matplotlib
|
| 149 |
+
# matplotlib.use('Agg')
|
| 150 |
+
|
| 151 |
+
import pandas as pd
|
| 152 |
+
import matplotlib.pyplot as plt
|
| 153 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 154 |
+
full_health_data.plot(x='Duration', y='Max_Pulse', title='Correlation Coefficient = 0', kind='scatter')
|
| 155 |
+
plt.show()
|
| 156 |
+
# Two lines to make our compiler able to draw:
|
| 157 |
+
# plt.savefig(sys.stdout.buffer) # buffer là bộ nhớ đệm
|
| 158 |
+
# sys.stdout.flush() # Hàm này ép Python in ra màn hình ngay lập tức thay vì đợi
|
| 159 |
+
'''
|
| 160 |
+
Có thể thêm các tham số khác trong .plot : figsize, color, style, legend, grid, xlabel, ylabel, xlim, ylim, marker, alpha, linewidth, fontsize, rot, subplots, colormap, sharex, sharey
|
| 161 |
+
'''
|
| 162 |
+
|
| 163 |
+
# Ma trận tương quan thống kê(Statistics Correlation Matrix)
|
| 164 |
+
# - Ma trận là một mảng số được sắp xếp theo hàng và cột.
|
| 165 |
+
# - Ma trận tương quan đơn giản là một bảng hiển thị hệ số tương quan giữa các biến.
|
| 166 |
+
# Ma trận tương quan trong Python
|
| 167 |
+
# - Sử dụng hàm .corr() trong Python để tạo ma trận tương quan.
|
| 168 |
+
# - Sử dụng hàm round() để làm tròn kết quả đầu ra thành hai chữ số thập phân.
|
| 169 |
+
# Ví dụ:
|
| 170 |
+
import pandas as pd
|
| 171 |
+
full_health_data = pd.read_csv('data.csv', header=0, sep=',')
|
| 172 |
+
Corr_matrix = round(full_health_data.corr(),2)
|
| 173 |
+
print(Corr_matrix)
|
| 174 |
+
|
| 175 |
+
# Sử dụng Bản đồ nhiệt
|
| 176 |
+
# - Chúng ta có thể sử dụng Bản đồ nhiệt để trực quan hóa mối tương quan giữa các biến:
|
| 177 |
+
'''
|
| 178 |
+
Hệ số tương quan càng gần 1 thì hình vuông càng xanh.
|
| 179 |
+
Hệ số tương quan càng gần -1 thì hình vuông càng có màu nâu.
|
| 180 |
+
'''
|
| 181 |
+
# - Sử dụng Seaborn để tạo bản đồ nhiệt
|
| 182 |
+
import pandas as pd
|
| 183 |
+
import matplotlib.pyplot as plt
|
| 184 |
+
import seaborn as sns
|
| 185 |
+
full_health_data = pd.read_csv("data.csv", header=0, sep=",")
|
| 186 |
+
correlation_full_health = full_health_data.corr()
|
| 187 |
+
axis_corr = sns.heatmap(correlation_full_health, vmin=-1, vmax=1, center=0, cmap=sns.diverging_palette(50, 500, n=500), square=True)
|
| 188 |
+
plt.show()
|
| 189 |
+
'''
|
| 190 |
+
Giải thích ví dụ:
|
| 191 |
+
Nhập thư viện seaborn dưới dạng sns.
|
| 192 |
+
Sử dụng bộ dữ liệu full_health_data.
|
| 193 |
+
Sử dụng sns.heatmap() để cho Python biết rằng chúng ta muốn có bản đồ nhiệt để trực quan hóa ma trận tương quan.
|
| 194 |
+
Sử dụng ma trận tương quan. Xác định giá trị cực đại và cực tiểu của bản đồ nhiệt. Xác định 0 là tâm.
|
| 195 |
+
Xác định màu sắc bằng sns.diverging_palette. n=500 nghĩa là chúng ta muốn có 500 loại màu trong cùng một bảng màu.
|
| 196 |
+
square = True nghĩa là chúng ta muốn nhìn thấy hình vuông.
|
| 197 |
+
'''
|
| 198 |
+
|
| 199 |
+
# Thống kê tương quan so với nhân quả(Statistics Correlation vs Causality)
|
| 200 |
+
# - Hệ số tương quan đo lường mối quan hệ số giữa hai biến.
|
| 201 |
+
# - Hệ số tương quan cao (gần 1) không có nghĩa là chúng ta có thể chắc chắn kết luận được mối quan hệ thực sự giữa hai biến.
|
| 202 |
+
'''
|
| 203 |
+
Một ví dụ điển hình:
|
| 204 |
+
Vào mùa hè, doanh số bán kem ở bãi biển tăng lên
|
| 205 |
+
Đồng thời, tai nạn đuối nước cũng gia tăng
|
| 206 |
+
Liệu điều này có nghĩa là việc tăng doanh số bán kem là nguyên nhân trực tiếp dẫn đến gia tăng số vụ tai nạn đuối nước không?
|
| 207 |
+
'''
|
| 208 |
+
|
| 209 |
+
# Ví dụ về Bãi biển trong Python
|
| 210 |
+
# - Ở đây, chúng tôi xây dựng một tập dữ liệu hư cấu để bạn thử:
|
| 211 |
+
# Three lines to make our compiler able to draw:
|
| 212 |
+
# import sys
|
| 213 |
+
# import matplotlib
|
| 214 |
+
# matplotlib.use('Agg')
|
| 215 |
+
|
| 216 |
+
import pandas as pd
|
| 217 |
+
import matplotlib.pyplot as plt
|
| 218 |
+
Drowning_Accident = [20,40,60,80,100,120,140,160,180,200]
|
| 219 |
+
Ice_Cream_Sale = [20,40,60,80,100,120,140,160,180,200]
|
| 220 |
+
Drowning = {'Drowning_Accident': [20,40,60,80,100,120,140,160,180,200], "Ice_Cream_Sale": [20,40,60,80,100,120,140,160,180,200]}
|
| 221 |
+
Drowning = pd.DataFrame(data = Drowning)
|
| 222 |
+
Drowning.plot(x='Ice_Cream_Sale', y='Drowning_Accident', kind='scatter')
|
| 223 |
+
plt.show()
|
| 224 |
+
correlation_beach = Drowning.corr()
|
| 225 |
+
print(correlation_beach)
|
| 226 |
+
# Two lines to make our compiler able to draw:
|
| 227 |
+
# plt.savefig(sys.stdout.buffer)
|
| 228 |
+
# sys.stdout.flush()
|
| 229 |
+
|
| 230 |
+
# Tương quan so với nhân quả - Ví dụ về bãi biển
|
| 231 |
+
'''
|
| 232 |
+
Nói cách khác: chúng ta có thể sử dụng doanh số bán kem để dự đoán tai nạn đuối nước không?
|
| 233 |
+
|
| 234 |
+
Câu trả lời là - Có lẽ là không.
|
| 235 |
+
Có khả năng là hai biến này vô tình có mối tương quan với nhau.
|
| 236 |
+
Vậy nguyên nhân nào gây ra chết đuối?
|
| 237 |
+
|
| 238 |
+
Người bơi không có kỹ năng
|
| 239 |
+
Sóng
|
| 240 |
+
Chuột rút
|
| 241 |
+
Rối loạn co giật
|
| 242 |
+
Thiếu sự giám sát
|
| 243 |
+
Lạm dụng rượu
|
| 244 |
+
vân vân.
|
| 245 |
+
'''
|
| 246 |
+
'''
|
| 247 |
+
Chúng ta hãy đảo ngược lập luận:
|
| 248 |
+
Hệ số tương quan thấp (gần bằng 0) có nghĩa là sự thay đổi của x không ảnh hưởng đến y không?
|
| 249 |
+
Quay lại câu hỏi:
|
| 250 |
+
Chúng ta có thể kết luận rằng Average_Pulse không ảnh hưởng đến Calorie_Burnage vì hệ số tương quan thấp không?
|
| 251 |
+
Câu trả lời là không.
|
| 252 |
+
'''
|
| 253 |
+
'''
|
| 254 |
+
Có một sự khác biệt quan trọng giữa tương quan và quan hệ nhân quả:
|
| 255 |
+
- Hệ số tương quan là một con số đo lường mức độ liên quan chặt chẽ của dữ liệu
|
| 256 |
+
- Nguyên nhân là kết luận rằng x gây ra y.
|
| 257 |
+
'''
|
| 258 |
+
# Mẹo: Luôn suy nghĩ nghiêm túc về khái niệm nhân quả khi đưa ra dự đoán!
|
data.csv
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Duration,Average_Pulse,Max_Pulse,Calorie_Burnage,Hours_Work,Hours_Sleep
|
| 2 |
+
60,110,130,409,0.0,8.0
|
| 3 |
+
60,117,145,479,0.0,8.0
|
| 4 |
+
60,103,135,340,8.0,7.5
|
| 5 |
+
45,109,175,282,8.0,8.0
|
| 6 |
+
45,117,148,406,0.0,6.5
|
| 7 |
+
60,102,127,300,0.0,7.5
|
| 8 |
+
60,110,136,374,0.0,7.5
|
| 9 |
+
45,104,134,253,0.0,9.0
|
| 10 |
+
30,109,133,195,8.0,8.0
|
| 11 |
+
60,98,124,269,7.5,8.0
|
| 12 |
+
60,103,147,329,8.0,7.0
|
| 13 |
+
60,100,120,250,0.0,5.0
|
| 14 |
+
60,106,128,345,8.5,7.5
|
| 15 |
+
60,104,132,379,8.5,7.5
|
| 16 |
+
60,98,123,275,9.0,7.0
|
| 17 |
+
60,98,120,215,6.5,7.0
|
| 18 |
+
60,100,120,300,9.0,8.0
|
| 19 |
+
45,90,112,180,8.0,8.0
|
| 20 |
+
60,103,123,323,8.0,8.0
|
| 21 |
+
45,97,125,243,8.0,7.0
|
| 22 |
+
60,108,131,364,8.0,7.0
|
| 23 |
+
45,100,119,282,0.0,7.0
|
| 24 |
+
60,130,101,300,8.0,7.0
|
| 25 |
+
45,105,132,246,0.0,8.0
|
| 26 |
+
60,102,126,334,8.0,8.0
|
| 27 |
+
60,100,120,250,8.0,7.0
|
| 28 |
+
60,92,118,241,7.0,6.0
|
| 29 |
+
60,103,132,353,9.0,8.5
|
| 30 |
+
60,100,132,280,3.0,8.0
|
| 31 |
+
60,102,129,380,3.0,8.0
|
| 32 |
+
60,92,115,243,7.5,8.0
|
| 33 |
+
60,101,124,299,8.5,7.5
|
| 34 |
+
60,93,113,223,8.0,7.0
|
| 35 |
+
60,107,136,361,2.0,8.0
|
| 36 |
+
60,114,140,415,9.0,8.5
|
| 37 |
+
60,100,120,300,8.0,7.0
|
| 38 |
+
60,100,120,300,7.0,6.0
|
| 39 |
+
45,104,129,266,8.0,7.0
|
| 40 |
+
60,98,126,286,7.5,7.0
|
| 41 |
+
60,100,122,329,8.0,7.0
|
| 42 |
+
60,111,138,400,8.0,8.0
|
| 43 |
+
60,111,131,397,0.0,8.0
|
| 44 |
+
60,99,119,273,8.0,7.0
|
| 45 |
+
60,109,153,387,8.0,7.0
|
| 46 |
+
45,111,136,300,11.0,7.0
|
| 47 |
+
45,108,129,298,5.0,7.0
|
| 48 |
+
60,111,139,397,0.0,8.0
|
| 49 |
+
60,107,136,380,8.5,8.0
|
| 50 |
+
80,123,146,643,8.5,8.0
|
| 51 |
+
60,106,130,263,8.0,8.0
|
| 52 |
+
60,118,151,486,7.0,7.0
|
| 53 |
+
30,136,175,238,0.0,7.5
|
| 54 |
+
60,121,146,450,5.0,8.0
|
| 55 |
+
60,118,121,413,8.0,7.0
|
| 56 |
+
45,115,144,305,5.0,7.0
|
| 57 |
+
20,153,172,226,0.0,8.0
|
| 58 |
+
45,123,152,321,5.0,8.0
|
| 59 |
+
210,108,160,1376,8.0,8.0
|
| 60 |
+
160,110,137,1034,8.0,8.0
|
| 61 |
+
160,109,135,853,8.0,8.0
|
| 62 |
+
45,118,141,341,8.0,8.0
|
| 63 |
+
20,110,130,131,0.0,8.0
|
| 64 |
+
180,90,130,800,0.0,8.0
|
| 65 |
+
150,105,135,873,8.0,8.0
|
| 66 |
+
150,107,130,816,3.0,8.0
|
| 67 |
+
20,106,136,110,3.0,8.0
|
| 68 |
+
300,108,143,1500,0.0,8.0
|
| 69 |
+
150,97,129,1115,0.0,8.0
|
| 70 |
+
90,100,127,700,0.0,8.0
|
| 71 |
+
150,97,127,953,0.0,8.0
|
| 72 |
+
45,114,146,304,0.0,8.0
|
| 73 |
+
90,98,125,563,0.0,8.0
|
| 74 |
+
45,105,134,251,0.0,8.0
|
| 75 |
+
45,110,141,300,7.0,7.5
|
| 76 |
+
120,100,130,500,7.0,7.5
|
| 77 |
+
270,100,131,1729,0.0,7.0
|
| 78 |
+
30,159,182,319,5.0,7.5
|
| 79 |
+
45,149,169,344,0.0,8.0
|
| 80 |
+
30,103,139,151,4.0,8.0
|
| 81 |
+
120,100,130,500,0.0,8.0
|
| 82 |
+
45,100,120,225,8.5,8.0
|
| 83 |
+
30,151,170,300,0.0,7.0
|
| 84 |
+
45,102,136,234,6.5,8.0
|
| 85 |
+
120,100,157,1000,0.0,8.0
|
| 86 |
+
45,129,103,242,5.0,8.0
|
| 87 |
+
20,83,107,50,9.5,8.0
|
| 88 |
+
180,101,127,600,0.0,7.5
|
| 89 |
+
45,107,137,1200,8.0,8.0
|
| 90 |
+
30,90,107,105,7.0,8.0
|
| 91 |
+
15,80,100,50,9.0,8.0
|
| 92 |
+
20,150,171,127,0.0,7.5
|
| 93 |
+
20,151,168,229,0.0,7.0
|
| 94 |
+
30,95,128,128,8.0,7.5
|
| 95 |
+
25,152,168,244,0.0,8.0
|
| 96 |
+
30,109,131,188,8.0,7.5
|
| 97 |
+
90,93,124,604,8.0,8.0
|
| 98 |
+
20,95,112,77,8.0,8.0
|
| 99 |
+
90,90,110,500,8.0,8.0
|
| 100 |
+
90,90,100,500,0.0,8.0
|
| 101 |
+
90,90,100,500,5.0,8.0
|
| 102 |
+
30,92,108,92,8.0,8.0
|
| 103 |
+
30,93,128,124,8.0,8.0
|
| 104 |
+
180,90,120,800,8.0,8.0
|
| 105 |
+
30,90,120,86,7.0,8.0
|
| 106 |
+
90,90,120,500,8.0,8.0
|
| 107 |
+
210,137,184,1860,0.0,7.5
|
| 108 |
+
60,102,124,325,0.0,8.0
|
| 109 |
+
45,107,124,275,0.0,8.0
|
| 110 |
+
15,124,139,124,5.0,6.0
|
| 111 |
+
60,108,131,367,0.0,8.0
|
| 112 |
+
60,108,151,351,0.0,8.0
|
| 113 |
+
60,116,141,443,0.0,8.0
|
| 114 |
+
60,97,122,277,0.0,8.0
|
| 115 |
+
60,105,125,353,0.0,8.0
|
| 116 |
+
60,103,124,332,0.0,8.0
|
| 117 |
+
30,112,137,193,0.0,8.0
|
| 118 |
+
45,100,120,100,0.0,7.5
|
| 119 |
+
60,119,169,336,0.0,8.0
|
| 120 |
+
60,107,127,344,0.0,8.0
|
| 121 |
+
60,111,151,368,0.0,8.0
|
| 122 |
+
60,98,122,271,0.0,8.0
|
| 123 |
+
60,97,124,275,0.0,8.0
|
| 124 |
+
60,109,127,382,0.0,6.0
|
| 125 |
+
90,99,125,466,0.0,7.5
|
| 126 |
+
60,114,151,384,0.0,12.0
|
| 127 |
+
60,104,134,342,0.0,7.5
|
| 128 |
+
60,107,138,357,0.0,7.5
|
| 129 |
+
60,103,133,335,0.0,7.5
|
| 130 |
+
60,106,132,327,0.0,7.5
|
| 131 |
+
60,103,136,339,0.0,7.5
|
| 132 |
+
20,136,156,189,8.5,7.5
|
| 133 |
+
45,117,143,317,0.0,8.0
|
| 134 |
+
45,115,137,318,0.0,7.5
|
| 135 |
+
45,113,138,308,0.0,7.0
|
| 136 |
+
20,141,162,222,0.0,7.5
|
| 137 |
+
60,108,135,390,0.0,8.0
|
| 138 |
+
60,97,127,288,0.0,8.0
|
| 139 |
+
45,100,120,250,0.0,8.0
|
| 140 |
+
45,122,149,335,0.0,7.5
|
| 141 |
+
60,136,170,470,8.0,8.0
|
| 142 |
+
45,106,126,270,8.0,8.0
|
| 143 |
+
60,107,136,400,9.5,7.0
|
| 144 |
+
60,112,146,361,9.0,7.5
|
| 145 |
+
30,103,127,185,9.0,7.5
|
| 146 |
+
60,110,150,409,8.0,7.0
|
| 147 |
+
60,106,134,343,8.0,8.5
|
| 148 |
+
60,109,129,353,8.0,8.0
|
| 149 |
+
60,109,138,374,8.0,6.0
|
| 150 |
+
30,150,167,275,0.0,9.0
|
| 151 |
+
60,105,128,328,9.0,8.0
|
| 152 |
+
60,97,131,270,9.0,8.0
|
| 153 |
+
60,100,120,270,8.0,8.0
|
| 154 |
+
60,114,150,382,0.0,8.0
|
| 155 |
+
30,80,120,240,10.0,7.0
|
| 156 |
+
30,85,120,250,10.0,7.0
|
| 157 |
+
45,90,130,260,8.0,7.0
|
| 158 |
+
45,95,130,270,8.0,7.0
|
| 159 |
+
45,100,140,280,0.0,7.0
|
| 160 |
+
60,105,140,290,7.0,8.0
|
| 161 |
+
60,110,145,300,7.0,8.0
|
| 162 |
+
60,115,145,310,8.0,8.0
|
| 163 |
+
75,120,150,320,0.0,8.0
|
| 164 |
+
75,125,150,330,8.0,8.0
|