Chuẩn hóa & Lọc Nhóm Dữ liệu Thuần thục với GroupBy Transform và Filter
Trong phân tích tăng trưởng (Cohort Analysis), hành vi người dùng thường được phân tích theo từng nhóm đăng ký hoặc phân khúc khách hàng (cohort_col). Để so sánh công bằng giữa các…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: groupby syntax, transform vs apply, filter method, boolean indexing.
Nội dung đề bài
Mục tiêu kiến thức
- Phân biệt bản chất giữa
groupby.agg(),groupby.transform()vàgroupby.filter(). - Sử dụng
filter()để loại bỏ các nhóm không đáp ứng điều kiện quy mô mà không cần lặp thủ công. - Sử dụng
transform()để broadcast kết quả thống kê (mean, std) của từng nhóm trở lại kích thước dòng ban đầu. - Xử lý các trường hợp đặc biệt: nhóm có độ lệch chuẩn bằng 0 hoặc nhóm chỉ có 1 phần tử.
Mô tả bài toán
Trong phân tích tăng trưởng (Cohort Analysis), hành vi người dùng thường được phân tích theo từng nhóm đăng ký hoặc phân khúc khách hàng (cohort_col). Để so sánh công bằng giữa các nhóm có quy mô và phân phối khác nhau, cần chuẩn hóa chỉ số đo lường (metric_col) về điểm Z-score nội nhóm.
Hãy viết hàm: standardize_cohort_metrics(df: pd.DataFrame, cohort_col: str, metric_col: str, min_size: int = 5, outlier_zscore_thresh: float = 3.0) -> pd.DataFrame
Yêu cầu thực hiện:
- Kiểm tra đầu vào:
- Cột
cohort_colvàmetric_colphải có trongdf.columns. Nếu không, némValueError("Columns not found in DataFrame"). - Cột
metric_colphải là kiểu số (is_numeric_dtype). Nếu không, némTypeError("metric_col must be numeric"). - Lọc nhóm theo quy mô (
filter): - Loại bỏ toàn bộ các dòng thuộc về những nhóm có tổng số bản ghi nhỏ hơn
min_size:
filtered_df = df.groupby(cohort_col).filter(lambda g: len(g) >= min_size)
- Nếu sau khi lọc không còn dòng nào, trả về một DataFrame rỗng với đầy đủ các cột của bảng gốc kèm cột mới
{metric_col}_zscore. - Chuẩn hóa Z-Score theo nhóm (
transform): - Tính kỳ vọng μ và độ lệch chuẩn mẫu σ (
ddof=1) cho từng cohort:
mu = filtered_df.groupby(cohort_col)[metric_col].transform('mean') sigma = filtered_df.groupby(cohort_col)[metric_col].transform('std')
- Tính Z-score: Z = x - μσ.
- Xử lý biên số học: Nếu σ == 0 hoặc σ bị
NaN(do tất cả các giá trị trong nhóm bằng nhau), gán điểm Z-score bằng0.0. - Gán giá trị vào cột mới:
f"{metric_col}_zscore". - Loại bỏ ngoại lai nội nhóm:
- Giữ lại các dòng thỏa mãn điều kiện: |Z| ≤ outlierzscorethresh.
- Đầu ra:
- Reset Index của DataFrame kết quả về dạng số tuần tự (
reset_index(drop=True)). - Trả về DataFrame đã chuẩn hóa.
Input
- Các tham số truyền vào hàm/lớp standardize_cohort_metrics hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp standardize_cohort_metrics hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số dòng dữ liệu: 1 ≤ N ≤ 105.
min_size≥ 1,outlier_zscore_thresh> 0.0.- Không làm thay đổi DataFrame
dfgốc.
Ví dụ 1
Input
standardize_cohort_metrics(data=[{'cohort': 'C1', 'score': 10.0}, {'cohort': 'C1', 'score': 12.0}, {'cohort': 'C1', 'score': 14.0}, {'cohort': 'C1', 'score': 16.0}, {'cohort': 'C1', 'score': 18.0}, {'cohort': 'C2', 'score': 90.0}, {'cohort': 'C2', 'score': 95.0}], cohort_col='cohort', metric_col='score', min_size=5, outlier_thresh=3.0)Output
5Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
standardize_cohort_metrics(data=[{'cohort': 'A', 'val': 10.0}, {'cohort': 'A', 'val': 10.1}, {'cohort': 'A', 'val': 9.9}, {'cohort': 'A', 'val': 10.0}, {'cohort': 'A', 'val': 10.05}, {'cohort': 'A', 'val': 500.0}], cohort_col='cohort', metric_col='val', min_size=5, outlier_thresh=2.0)Output
5Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
