Discretization and Binning Continuos Data in Python

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.