Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

12/7/2020 Chương 3.

Dự đoán lương

Bài toán: Sinh viên khi ra trường thường thắc mắc mình đề xuất mức lương bao nhiêu là hợp lý: Nếu cao quá thì
sẽ khó được nhà tuyển dụng chấp nhận và mất luôn cơ hội làm việc, nếu thấp quá thì sẽ thiệt thòi. Để giúp trả
lời câu hỏi này, chúng ta sẽ phân tích thông tin dựa trên dữ liệu khảo sát mức lương của nhân viên có kinh
nghiệm từ 0-10 năm của một số ngành. Các thông tin được thu thập bao gồm

SoNamKinhNghiem: Số năm kinh nghiệm


NganhNghe: ngành nghề
Luong: Lương (triệu)

Khai báo các thư viện: pandas: Làm việc với cấu trúc dữ liệu, hỗ trợ đọc ghi file dữ liệu với nhiều định dạng khác
nhau như csv, xls, sql, html... matplotlib: Thư viện hỗ trợ vẽ các đồ thị trong Python

In [1]: import pandas as pd


import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pickle # thư viện giúp lưu trữ mô hình

Đọc file dữ liệu "Chương 3 work_data.csv" khảo sát mức lương của nhân viên có kinh nghiệm từ 0-10 năm của
một số ngành vào Dataframes df của python. Dataframes được cấu tạo như một bảng gồm các cột và các dòng.

In [2]: df = pd.read_csv("Chương 3 work_data.csv")

Mô tả bộ dữ liệu: Số lượng mẫu và Số thuộc tính quan sát

In [3]: df.shape

Out[3]: (1426, 3)

In [4]: df.head() # trả về 5 dòng dữ liệu đầu tiên

Out[4]:
SoNamKinhNghiem NganhNghe Luong

0 7 KeToan 26.0

1 4 KeToan 13.8

2 8 KeToan 21.5

3 9 KeToan 24.0

4 1 KeToan 7.8

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 1/18


12/7/2020 Chương 3. Dự đoán lương

In [5]: df.head(10) # trả về 10 dòng dữ liệu đầu tiên

Out[5]:
SoNamKinhNghiem NganhNghe Luong

0 7 KeToan 26.0

1 4 KeToan 13.8

2 8 KeToan 21.5

3 9 KeToan 24.0

4 1 KeToan 7.8

5 2 KeToan 10.0

6 4 KeToan 13.5

7 5 KeToan 15.8

8 3 KeToan 12.2

9 2 KeToan 10.0

Trả về 5 dòng dữ liệu cuối cùng

In [19]: df.tail()

Out[19]:
SoNamKinhNghiem NganhNghe Luong

1421 8 Sale 22.8

1422 6 Sale 18.7

1423 0 Sale 7.3

1424 0 Sale 7.2

1425 10 Sale 27.0

Xem các thông tin thống kê đối với các dữ liệu định lượng:

count: tổng số các bản ghi trong dữ liệu min, max: giá trị lớn nhất nhỏ nhất của dữ liệu mean: giá trị trung bình
std: độ lệch chuẩn, giá trị STD lớn hay nhỏ phản ánh tập dữ liệu phân bố tập trung quanh điểm trung tâm hay rời
xa nó (ở đây là mean)

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 2/18


12/7/2020 Chương 3. Dự đoán lương

In [10]: df.describe()

Out[10]:
SoNamKinhNghiem Luong

count 1426.000000 1426.000000

mean 4.894109 16.316550

std 3.075541 6.548031

min 0.000000 5.400000

25% 2.000000 10.900000

50% 5.000000 16.200000

75% 7.000000 21.300000

max 10.000000 70.000000

Đổi tên các thuộc tính cần dùng về dạng đơn giản giúp dễ dàng truy cập sau này

In [20]: nam = df['SoNamKinhNghiem']


luong = df['Luong']
nghe = df['NganhNghe']

Biểu đồ cột/thanh dọc - Bar chart

Mối quan hệ giữa số năm kinh nghiệm và lương

In [21]: plt.bar(nam, luong)


plt.show()

Thêm nhãn cho biểu đồ

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 3/18


12/7/2020 Chương 3. Dự đoán lương

In [22]: plt.xlabel('Số năm kinh nghiệm')


plt.ylabel('Lương')
plt.suptitle('Mức lương theo số năm kinh nghiệm')

# Hiển thị nhãn của các năm


plt.xticks(rotation=45)
plt.xticks(nam)

plt.bar(nam, luong)
plt.show()

Biểu đồ ngang

In [26]: plt.xlabel('Số năm kinh nghiệm')


plt.ylabel('Lương')
plt.suptitle('Mức lương theo số năm kinh nghiệm')
plt.barh(nam, luong, color = 'blue')
plt.show()

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 4/18


12/7/2020 Chương 3. Dự đoán lương

Vẽ nhiều đồ thị trong cùng một ảnh

Ví dụ vẽ ba đồ thị về mối quan hệ giữa lương và số năm kinh nghiệm của từng ngành nghề Bước 1: Tách
bảng dữ liệu ban đầu thành các bảng con theo các tiêu chí
Ví dụ tách bảng dữ liệu thành ba bảng con theo 3 ngành nghề

In [28]: df_ketoan = df[df['NganhNghe'] == 'KeToan']


df_hcns = df[df['NganhNghe'] == 'HCNS']
df_sale = df[df['NganhNghe'] == 'Sale']

print ("Số lượng mẫu nhân viên Kế toán: " + str(df_ketoan.shape[0]))


print ("Số lượng mẫu nhân viên HCNS: " + str(df_hcns.shape[0]))
print ("Số lượng mẫu nhân viên SALE: " + str(df_sale.shape[0]))

print("Dữ liệu bảng kế toán")


print(df_ketoan)

Số lượng mẫu nhân viên Kế toán: 472


Số lượng mẫu nhân viên HCNS: 566
Số lượng mẫu nhân viên SALE: 388
Dữ liệu bảng kế toán
SoNamKinhNghiem NganhNghe Luong
0 7 KeToan 26.0
1 4 KeToan 13.8
2 8 KeToan 21.5
3 9 KeToan 24.0
4 1 KeToan 7.8
.. ... ... ...
467 2 KeToan 10.1
468 2 KeToan 9.7
469 10 KeToan 26.1
470 7 KeToan 20.4
471 5 KeToan 16.2

[472 rows x 3 columns]

Bước 2: Vẽ 3 đồ thị Trong Matplotlib, mỗi plt.plot() trả về một đối tượng Figure (là hình ảnh bên ngoài), trong
Figure lại có thể có nhiều các đối tượng Axes là các đồ thị con bên trong.

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 5/18


12/7/2020 Chương 3. Dự đoán lương

In [29]: # Tạo đồ thị gồm 1 hàng 3 cột


fig, (ax1, ax2, ax3)= plt.subplots(1,3, figsize=(10,4), sharey=True, dpi=80)
ax1.bar(df_ketoan['SoNamKinhNghiem'],df_ketoan['Luong'])
ax2.bar(df_hcns['SoNamKinhNghiem'],df_hcns['Luong'])
ax3.bar(df_sale['SoNamKinhNghiem'],df_sale['Luong'])
# Tiêu đề và nhãn của các đồ thị con
ax1.set_title('Kế toán')
ax2.set_title('Hành chính nhân sự')
ax3.set_title('Sale')
ax1.set_xlabel('Số năm kinh nghiệm')
ax2.set_xlabel('Số năm kinh nghiệm')
ax3.set_xlabel('Số năm kinh nghiệm')
ax1.set_ylabel('Lương')
ax2.set_ylabel('Lương')
ax3.set_ylabel('Lương')

plt.tight_layout()
plt.show()

Biểu đồ hộp Biểu đồ hộp (Box-plot) hay còn gọi là biểu đồ hộp-và-râu (box-and-whisker plot) là biểu đồ diễn tả 5
vị trí phân bố của dữ liệu, đó là: giá trị nhỏ nhất không ngoại lai (râu dưới) (L), tứ phân vị thứ nhất (Q1), trung vị
(median), tứ phân vị thứ 3 (Q3) và giá trị lớn nhất không ngoại lai (râu trên) (U).

Biểu đồ hộp cho biết phân bố của dữ liệu và xác định các giá trị ngoại lai:

Nếu đường trung vị chia chiếc hộp thành 2 nửa đều nhau, thì tập dữ liệu này đối xứng (symmetric). Nếu nửa
dưới nhỏ hơn nửa trên thì tập dữ liệu bị lệch phải (right-skewed), và ngược lại, nếu nửa dưới lớn hơn thì tập dữ
liệu bị lệch trái (left-skewed). Các giá trị ngoại lai (nếu có) sẽ xuất hiện bên ngoài phía dưới râu dưới và phía
trên râu trên

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 6/18


12/7/2020 Chương 3. Dự đoán lương

In [30]: # Biểu đồ hộp phân bố lương của nhân viên Kế toán


plt.boxplot(df_ketoan['Luong'])
plt.show()

Xây dựng model dự đoán tiền lương theo số năm kinh nghiệm

Xác định thuộc tính mô tả X và thuộc tính dự đoán y

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 7/18


12/7/2020 Chương 3. Dự đoán lương

In [6]: features = ['SoNamKinhNghiem']


target = ['Luong']
X = df[features]
y = df[target]
print(X)
print(y)

SoNamKinhNghiem
0 7
1 4
2 8
3 9
4 1
... ...
1421 8
1422 6
1423 0
1424 0
1425 10

[1426 rows x 1 columns]


Luong
0 26.0
1 13.8
2 21.5
3 24.0
4 7.8
... ...
1421 22.8
1422 18.7
1423 7.3
1424 7.2
1425 27.0

[1426 rows x 1 columns]

Chia bộ dữ liệu làm 2 tập train và test theo tỉ lệ 80% train,20% test

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 8/18


12/7/2020 Chương 3. Dự đoán lương

In [7]: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)


print(X_train)
print(y_train)
print(X_test)
print(y_test)

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 9/18


12/7/2020 Chương 3. Dự đoán lương

SoNamKinhNghiem
1125 5
1087 7
621 6
716 7
807 0
... ...
994 8
30 4
1325 0
1331 3
967 0

[1140 rows x 1 columns]


Luong
1125 16.9
1087 20.8
621 17.8
716 20.2
807 6.3
... ...
994 22.2
30 13.8
1325 6.4
1331 12.8
967 6.4

[1140 rows x 1 columns]


SoNamKinhNghiem
947 1
1363 8
900 4
669 1
405 5
... ...
1084 1
481 7
390 10
985 5
641 6

[286 rows x 1 columns]


Luong
947 8.7
1363 22.9
900 14.6
669 8.2
405 15.4
... ...
1084 9.2
481 20.9
390 25.4
985 16.8
641 18.2

[286 rows x 1 columns]

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 10/18


12/7/2020 Chương 3. Dự đoán lương

Khai báo mô hình hồi quy tuyến tính

In [8]: model = LinearRegression()

Huấn luyện mô hình

In [9]: model.fit(X_train, y_train)

Out[9]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=Fals


e)

In [10]: print( "Mô hình hồi quy sẽ có dạng: Lương = a + b * số năm kinh nghiệm \nvới c
ác hệ số a và b lần lượt là")
print(model.intercept_)
print(model.coef_)

Mô hình hồi quy sẽ có dạng: Lương = a + b * số năm kinh nghiệm


với các hệ số a và b lần lượt là
[6.36840237]
[[2.02610406]]

Kiểm thử mô hình

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 11/18


12/7/2020 Chương 3. Dự đoán lương

In [11]: y_pred = model.predict(X_test)


print(y_pred)

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 12/18


12/7/2020 Chương 3. Dự đoán lương

[[ 8.39450643]
[22.57723484]
[14.47281861]
[ 8.39450643]
[16.49892267]
[14.47281861]
[12.44671455]
[14.47281861]
[16.49892267]
[12.44671455]
[16.49892267]
[14.47281861]
[22.57723484]
[26.62944296]
[14.47281861]
[18.52502673]
[20.55113078]
[22.57723484]
[10.42061049]
[12.44671455]
[16.49892267]
[18.52502673]
[22.57723484]
[18.52502673]
[22.57723484]
[24.6033389 ]
[22.57723484]
[14.47281861]
[24.6033389 ]
[20.55113078]
[24.6033389 ]
[ 8.39450643]
[10.42061049]
[24.6033389 ]
[12.44671455]
[20.55113078]
[ 6.36840237]
[20.55113078]
[26.62944296]
[18.52502673]
[22.57723484]
[16.49892267]
[20.55113078]
[16.49892267]
[ 8.39450643]
[ 6.36840237]
[16.49892267]
[12.44671455]
[ 8.39450643]
[26.62944296]
[ 8.39450643]
[ 6.36840237]
[10.42061049]
[24.6033389 ]
[ 6.36840237]
[16.49892267]
[12.44671455]
localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 13/18
12/7/2020 Chương 3. Dự đoán lương

[14.47281861]
[12.44671455]
[20.55113078]
[18.52502673]
[26.62944296]
[20.55113078]
[ 8.39450643]
[ 8.39450643]
[10.42061049]
[14.47281861]
[14.47281861]
[12.44671455]
[ 6.36840237]
[ 8.39450643]
[18.52502673]
[16.49892267]
[26.62944296]
[26.62944296]
[16.49892267]
[18.52502673]
[18.52502673]
[24.6033389 ]
[14.47281861]
[18.52502673]
[10.42061049]
[10.42061049]
[10.42061049]
[14.47281861]
[ 6.36840237]
[ 6.36840237]
[ 6.36840237]
[18.52502673]
[16.49892267]
[ 8.39450643]
[12.44671455]
[26.62944296]
[10.42061049]
[ 8.39450643]
[14.47281861]
[18.52502673]
[ 6.36840237]
[12.44671455]
[18.52502673]
[24.6033389 ]
[18.52502673]
[20.55113078]
[20.55113078]
[ 6.36840237]
[24.6033389 ]
[24.6033389 ]
[22.57723484]
[12.44671455]
[18.52502673]
[18.52502673]
[ 6.36840237]
[22.57723484]
[22.57723484]

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 14/18


12/7/2020 Chương 3. Dự đoán lương

[24.6033389 ]
[ 8.39450643]
[16.49892267]
[16.49892267]
[14.47281861]
[16.49892267]
[14.47281861]
[12.44671455]
[ 6.36840237]
[10.42061049]
[24.6033389 ]
[20.55113078]
[24.6033389 ]
[ 6.36840237]
[20.55113078]
[12.44671455]
[10.42061049]
[16.49892267]
[20.55113078]
[14.47281861]
[12.44671455]
[ 6.36840237]
[24.6033389 ]
[14.47281861]
[26.62944296]
[14.47281861]
[12.44671455]
[24.6033389 ]
[ 6.36840237]
[14.47281861]
[22.57723484]
[16.49892267]
[14.47281861]
[18.52502673]
[22.57723484]
[20.55113078]
[10.42061049]
[16.49892267]
[12.44671455]
[24.6033389 ]
[16.49892267]
[10.42061049]
[18.52502673]
[10.42061049]
[ 8.39450643]
[16.49892267]
[ 8.39450643]
[24.6033389 ]
[ 6.36840237]
[10.42061049]
[22.57723484]
[16.49892267]
[18.52502673]
[24.6033389 ]
[ 8.39450643]
[14.47281861]
[14.47281861]

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 15/18


12/7/2020 Chương 3. Dự đoán lương

[10.42061049]
[14.47281861]
[20.55113078]
[20.55113078]
[16.49892267]
[16.49892267]
[14.47281861]
[22.57723484]
[24.6033389 ]
[24.6033389 ]
[16.49892267]
[18.52502673]
[22.57723484]
[18.52502673]
[24.6033389 ]
[16.49892267]
[24.6033389 ]
[ 8.39450643]
[ 6.36840237]
[20.55113078]
[12.44671455]
[20.55113078]
[16.49892267]
[20.55113078]
[20.55113078]
[24.6033389 ]
[12.44671455]
[18.52502673]
[22.57723484]
[14.47281861]
[12.44671455]
[26.62944296]
[18.52502673]
[ 6.36840237]
[ 8.39450643]
[20.55113078]
[ 8.39450643]
[20.55113078]
[ 8.39450643]
[24.6033389 ]
[24.6033389 ]
[20.55113078]
[24.6033389 ]
[18.52502673]
[24.6033389 ]
[18.52502673]
[10.42061049]
[12.44671455]
[12.44671455]
[20.55113078]
[14.47281861]
[ 8.39450643]
[ 8.39450643]
[ 8.39450643]
[12.44671455]
[10.42061049]
[12.44671455]

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 16/18


12/7/2020 Chương 3. Dự đoán lương

[ 6.36840237]
[14.47281861]
[10.42061049]
[24.6033389 ]
[12.44671455]
[18.52502673]
[12.44671455]
[20.55113078]
[26.62944296]
[18.52502673]
[14.47281861]
[22.57723484]
[18.52502673]
[18.52502673]
[24.6033389 ]
[20.55113078]
[22.57723484]
[ 8.39450643]
[16.49892267]
[20.55113078]
[18.52502673]
[10.42061049]
[22.57723484]
[16.49892267]
[26.62944296]
[24.6033389 ]
[ 8.39450643]
[22.57723484]
[ 8.39450643]
[18.52502673]
[26.62944296]
[10.42061049]
[26.62944296]
[26.62944296]
[ 8.39450643]
[ 8.39450643]
[ 8.39450643]
[ 8.39450643]
[16.49892267]
[20.55113078]
[20.55113078]
[24.6033389 ]
[ 6.36840237]
[18.52502673]
[20.55113078]
[14.47281861]
[ 6.36840237]
[24.6033389 ]
[14.47281861]
[ 8.39450643]
[14.47281861]
[10.42061049]
[22.57723484]
[ 8.39450643]
[20.55113078]
[26.62944296]

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 17/18


12/7/2020 Chương 3. Dự đoán lương

[16.49892267]
[18.52502673]]

Độ chính xác của mô hình

In [12]: f = model.score(X_test,y_test)
print("Độ chính xác của mô hình: ", f)

Độ chính xác của mô hình: 0.8528181131467042

Sử dụng mô hình dự đoán cho dữ liệu mới với Số năm kinh nghiệm 1.2 năm

In [13]: x=[[1.2]]
y = model.predict(x)
print(y)

[[8.79972724]]

Lưu trữ và sử dụng mô hình sau khi đã huấn luyện với ba số năm kinh nghiệm: 1 năm, 2 năm, 4 năm.

In [14]: filename = 'model1.sav'


pickle.dump(model,open(filename, 'wb'))

loaded_model = pickle.load(open(filename, 'rb'))

x = [[1],[2],[4]]
y_pred = loaded_model.predict(x)
y_pred

Out[14]: array([[ 8.39450643],


[10.42061049],
[14.47281861]])

localhost:8888/nbconvert/html/Chương 3. Dự đoán lương.ipynb?download=false 18/18

You might also like