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 và code bạn nộp đượ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_col và metric_col phải có trong df.columns. Nếu không, ném ValueError("Columns not found in DataFrame").
- Cột metric_col phải là kiểu số (is_numeric_dtype). Nếu không, ném TypeError("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 mu và độ lệch chuẩn mẫu sigma (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 - musigma.
- Xử lý biên số học: Nếu sigma == 0 hoặc sigma bị NaN (do tất cả các giá trị trong nhóm bằng nhau), gán điểm Z-score bằng 0.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| ≤ outlier_zscore_thresh.
- Đầ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 df gố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
5
Giả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
5
Giả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.
