Giả sử bạn muốn tính ma trận hiệp phương sai cho từng nhóm (groupby) và hiệp phương sai giữa 2 cột cụ thể trong mỗi nhóm.
Giải pháp
- Tạo DataFrame có cột nhóm (subjects) và 2 cột số (mark1, mark2).
- Tính ma trận hiệp phương sai cho từng nhóm:
df.groupby('subjects').cov(). - Tính hiệp phương sai giữa mark1 và mark2 cho từng nhóm:
df.groupby('subjects').apply(lambda x: x['mark1'].cov(x['mark2'])).
Mã ví dụ
import pandas as pd
df = pd.DataFrame({
'subjects': ['maths', 'maths', 'maths', 'science', 'science', 'science'],
'mark1': [80, 90, 85, 95, 93, 85],
'mark2': [85, 90, 70, 75, 95, 65]
})
print("DataFrame:\n", df)
group_cov = df.groupby('subjects').cov()
print("\nMa trận hiệp phương sai theo nhóm:\n", group_cov)
cov_two_cols = df.groupby('subjects').apply(lambda x: x['mark1'].cov(x['mark2']))
print("\nHiệp phương sai mark1 & mark2 theo nhóm:\n", cov_two_cols)
Kết quả
DataFrame:
subjects mark1 mark2
0 maths 80 85
1 maths 90 90
2 maths 85 70
3 science 95 75
4 science 93 95
5 science 85 65
Ma trận hiệp phương sai theo nhóm:
mark1 mark2
subjects
maths mark1 25.000000 12.500000
mark2 12.500000 108.333333
science mark1 28.000000 50.000000
mark2 50.000000 233.333333
Hiệp phương sai mark1 & mark2 theo nhóm:
subjects
maths 12.5
science 50.0
dtype: float64
Giải thích:
.cov()trên GroupBy trả về ma trận hiệp phương sai MultiIndex cho mỗi nhóm.- Hiệp phương sai dương (maths=12.5, science=50) cho thấy mark1 và mark2 cùng biến thiên.
- Science có hiệp phương sai lớn hơn → mối liên hệ mạnh hơn.