dzakialthalsy/BufferOverFlow1-picoCTF

GitHub: dzakialthalsy/BufferOverFlow1-picoCTF

一个专为电信公司设计的客户流失分析项目,整合ETL、机器学习和可视化以支持业务决策。

Stars: 0 | Forks: 0

# KBA 电信公司流失分析 商业智能与分析项目,旨在帮助电信公司监控客户流失、细分客户群并确定保留优先级。该方案采用 Medallion 管道、DuckDB 作为分析型数据仓库、用于流失评分的机器学习模型以及用于商业仪表板的 Metabase。 ## 主要特性 - Medallion ETL:在 DuckDB 中实现 Bronze、Silver 和 Gold 三层。 - 电信客户数据清洗:缺失值填充、去重、数据类型校正、异常值截断、对数转换以及特征工程。 - 用于商业分析的 Gold 层:流失摘要、客户细分、流失风险,以及基于 ML 的流失预测(如果可用评分)。 - 为仪表板导出专用的 DuckDB,使 Metabase 仅读取 Gold schema。 - 自动设置 Metabase,包含数据库、角色、组和演示用户。 - 可选的 FastAPI 应用程序,用于预测单个客户的流失情况。 ## 数据架构 ``` data/raw/Telecom_customer.csv -> bronze.telecom_raw -> silver.telecom_cleaned -> gold.customer_segments -> gold.churn_risk -> gold.churn_summary -> gold.churn_prediction (jika ml/models/churn_scores.csv tersedia) -> data/gold/telco_warehouse_readonly.duckdb untuk Metabase ``` 主仓库文件位于 `data/gold/telco_warehouse.duckdb`。管道仍将在主仓库中保留所有层,然后创建单独的只读文件供仪表板使用。 ## 文件夹结构 ``` KBA-Telecommunication-Company-Churn-Analytics/ |-- dashboard/ # FastAPI predictor, template UI, builder inference bundle |-- data/ | |-- raw/ # Dataset CSV sumber | |-- bronze/ # Placeholder layer Bronze | |-- silver/ # Placeholder layer Silver | `-- gold/ # Output DuckDB warehouse dan export dashboard |-- docs/ # Dokumen PM, handoff, dan dokumentasi pendukung |-- etl/ | |-- layers/ | | |-- bronze.py # Ingest data mentah ke bronze.telecom_raw | | |-- silver.py # Cleaning dan feature engineering ke silver.telecom_cleaned | | `-- gold.py # Tabel bisnis di schema gold | |-- export_metabase.py # Export schema Gold untuk Metabase | `-- run_pipeline.py # Entry point pipeline ETL |-- ml/ | |-- colab/ # Notebook training dan eksperimen ML | |-- models/ # Model dan skor churn | `-- reports/ # Laporan evaluasi model |-- scripts/ # Health check, init catalog, setup Metabase RBAC |-- tests/ # Unit test pipeline |-- docker-compose.yml # catalog_db, etl, metabase, metabase_setup |-- Dockerfile # Image ETL |-- Dockerfile.inference # Image predictor FastAPI |-- Dockerfile.metabase # Image Metabase + plugin DuckDB |-- requirements.txt `-- .env.example ``` ## 前置条件 - Python 3.11 或兼容版本。 - Docker 和 Docker Compose,用于运行管道和 Metabase。 - Kaggle Telecom Customer Churn 数据集存储在 `data/raw/` 文件夹中。 - 基于 `.env.example` 创建的 `.env` 文件。 数据集注意事项:确保 `.env` 中的 `RAW_DATA_PATH` 值与 `data/raw/` 中 CSV 文件的名称完全一致。在 Docker/Linux 中,大小写是敏感的。如果文件名为 `Telecom_customer.csv`,请精确使用该路径。 ## 本地快速启动 ``` cd C:\Users\dzakialthalsyah\Downloads\KBA-Telecommunication-Company-Churn-Analytics copy .env.example .env python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt python scripts\health_check.py python etl\run_pipeline.py ``` 如果使用 Git Bash 或 WSL,请使用 `cp .env.example .env` 代替 `copy`。 ## 使用 Docker 和 Metabase 运行 ``` docker compose up --build ``` 运行的服务: | 服务 | 功能 | | --- | --- | | `catalog_db` | PostgreSQL catalog,用于存储元数据和 RBAC 需求。 | | `etl` | 运行 Bronze -> Silver -> Gold 管道。 | | `metabase` | BI 仪表板,位于 `http://localhost:3000`。 | | `metabase_setup` | 一次性设置,用于配置数据库、组、权限和演示用户。 | 本地 Metabase 访问: | 角色 | 电子邮件 | 密码 | | --- | --- | --- | | 管理员 | `admin@telco.com` | `Admin@1234` | | 高管 | `ceo@telco.com` | `Exec@1234` | | 运维 | `ops@telco.com` | `Ops@1234` | | 分析师 | `analyst@telco.com` | `Analyst@1234` | 上述凭证遵循项目的默认值,仅适用于本地演示。如果修改了 `.env`,请使用该文件中的凭证。 ## Gold 层输出 | 表 | 用途 | 主要消费者 | | --- | --- | --- | | `gold.churn_summary` | 聚合 KPI:总客户数、流失率、保留率、ARPU 和风险客户。 | 高管 | | `gold.customer_segments` | 客户细分:流失、高风险、关注、高价值、稳定。 | 运维 | | `gold.churn_risk` | 每个客户的流失风险评分、风险级别和支持信息。 | 运维 / 分析师 | | `gold.churn_prediction` | ML 预测结果,用于测试/评分客户数据(如果 `churn_scores.csv` 可用)。 | 高管 / 分析师 | | `gold.telecom_cleaned` | 从 Silver 层导出到 Gold schema 的完整清洗数据,专用于 Metabase 中的分析。 | 分析师 | ## 机器学习集成 Gold 管道将尝试从 `ml/models/churn_scores.csv` 读取 ML 评分。支持的列格式: | 列 | 说明 | | --- | --- | | `Customer_ID`, `customer_id`, 或 `CustomerID` | 客户 ID。 | | `ml_churn_score` | 模型输出的流失概率。 | | `ml_churn_label` | 流失预测标签。 | 如果 ML 评分文件不可用或格式不符,管道将使用基于 `fe_churn_risk_rule` 特征的回退规则继续运行。 从 notebook 导出评分的示例: ``` scores_df = pd.DataFrame({ "customer_id": test_ids, "ml_churn_score": model.predict_proba(X_test)[:, 1], "ml_churn_label": model.predict(X_test), }) scores_df.to_csv("ml/models/churn_scores.csv", index=False) ``` 评分文件准备好后,重新运行: ``` python etl\run_pipeline.py ``` ## 可选的 FastAPI 预测器 用于创建推理包并运行预测应用程序: ``` python dashboard\build_inference_bundle.py uvicorn dashboard.churn_app:app --host 0.0.0.0 --port 8000 ``` 主要端点: | 端点 | 功能 | | --- | --- | | `GET /` | 基于 HTML 模板的流失预测表单。 | | `GET /health` | 应用程序健康检查。 | | `POST /predict` | 根据客户特征的负载进行流失预测。 | Docker 替代方案: ``` docker build -f Dockerfile.inference -t telco-churn-inference . docker run --rm -p 8000:8000 telco-churn-inference ``` ## 重要环境变量 | 变量 | 功能 | | --- | --- | | `RAW_DATA_PATH` | 源 CSV 数据集的位置。 | | `DUCKDB_PATH` | 主 DuckDB 仓库的位置。 | | `ML_SCORES_PATH` | 用于 Gold 层的 ML 评分文件的位置。 | | `ETL_LOG_LEVEL` | ETL 日志记录级别。 | | `METABASE_URL` | 用于自动设置的 Metabase URL。 | | `METABASE_USER` | Metabase 管理员邮箱。 | | `METABASE_PASS` | Metabase 管理员密码。 | | `METABASE_DB_NAME` | 在 Metabase 中注册的数据库名称。 | | `CATALOG_URL` | PostgreSQL catalog 连接字符串。 | ## 验证与测试 ``` python scripts\health_check.py python -m pytest ``` `health_check.py` 验证数据集、各层文件夹、`.env`、Python 依赖、ETL 文件以及可用 ML 评分的存在。 ## 简易故障排除 | 问题 | 常见原因 | 解决方案 | | --- | --- | --- | | 未找到数据集 | `RAW_DATA_PATH` 与实际文件名不匹配。 | 调整 `.env` 中的路径或重命名 CSV 文件。 | | Metabase 未显示表 | 数据库同步未完成或 ETL 尚未成功运行。 | 稍等片刻,检查 `etl` 和 `metabase_setup` 的日志。 | | `gold.churn_prediction` 不存在 | `ml/models/churn_scores.csv` 尚未可用或读取失败。 | 导出 ML 评分,确保包含必需的列,然后重新运行 ETL。 | | 预测器启动失败 | `churn_inference_bundle.joblib` 尚未生成。 | 运行 `python dashboard\build_inference_bundle.py`。 |
标签:Apex, AV绕过, DuckDB, ETL管道, FastAPI, Metabase, Python编程, 代码示例, 仪表板, 分层存储, 商业智能, 客户保留, 客户细分, 数据仓库, 数据分析, 数据清洗, 数据管理, 机器学习, 测试用例, 特征工程, 电信流失分析, 营业智能, 营销分析, 请求拦截, 逆向工具, 风险预测