import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
trong phân tích data, đôi khi cần chia những biến số liên tục ra các khoảng, tạo thành biến số rời rạc, đại diện cho các nhóm có giá trị tăng dần liên tiếp. Rồi tìm mối liên quan của biến số liên tục khác so với các nhóm vừa tạo ra. Ví dụ, age là một biến số liên tục, được chia ra thành các nhóm tuổi, chẳng hạn 0-20; 21 - 40; 41-60; và 61+. Từ đó tìm mối tương quan của glucose máu trong các nhóm tuổi này.
Ở đây tôi sẽ sử dụng lại dataset về tiền tip để mô tả kĩ thuật tạo nhóm này.
tips = sns.load_dataset('tips')
tips.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
Chia biến số total_bill thành các nhóm đều nhau, cụ thể là 4 nhóm
quantiles = pd.cut(tips.total_bill, 4)
quantiles[:5]
0 (15.005, 26.94]
1 (3.022, 15.005]
2 (15.005, 26.94]
3 (15.005, 26.94]
4 (15.005, 26.94]
Name: total_bill, dtype: category
Categories (4, interval[float64, right]): [(3.022, 15.005] < (15.005, 26.94] < (26.94, 38.875] < (38.875, 50.81]]
Tạo ra function để tính các thông số min, max, count và mean
def get_stats(group):
return {'min': group.min(), 'max': group.max(),
'count': group.count(), 'mean': group.mean()}
Tìm min, max, count và mean của tip trong các nhóm này
grouped = tips.tip.groupby(quantiles)
grouped.apply(get_stats).unstack()
min | max | count | mean | |
---|---|---|---|---|
total_bill | ||||
(3.022, 15.005] | 1.00 | 5.15 | 80.0 | 2.050250 |
(15.005, 26.94] | 1.01 | 6.50 | 119.0 | 3.096303 |
(26.94, 38.875] | 1.17 | 6.70 | 34.0 | 4.031176 |
(38.875, 50.81] | 2.50 | 10.00 | 11.0 | 5.640000 |
Tạo ra biến số có chia nhóm của total_bill trong dataset tips
tips['quantiles'] = pd.cut(tips.total_bill, 4)
tips.head()
total_bill | tip | sex | smoker | day | time | size | quantiles | |
---|---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 | (15.005, 26.94] |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 | (3.022, 15.005] |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 | (15.005, 26.94] |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 | (15.005, 26.94] |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 | (15.005, 26.94] |
Vẽ đồ thị barplot liên quan nhóm total_bill và tip
sns.barplot(data=tips, x="quantiles", y="tip")
plt.show(sns)
png
Đây là cách đơn giản để chia nhóm một biến số liên tục và tính các thông số của biến số liên tục khác trong mối liên hệ với các nhóm này.