머신러닝과 규칙 기반 위험도 분석을 통한 소상공인 경영 위험 조기 탐지 시스템
- 매출 위험도: 월별 매출 변동, AOV(객단가), 취소율 분석
- 고객 위험도: 고객 수 변화, 충성도, 신규 고객 유입
- 시장 위험도: 업종/지역 폐업률, 경쟁 환경 분석
- XGBoost, LightGBM, Random Forest, Gradient Boosting
- TensorFlow 딥러닝 모델
- Platt Scaling 확률 보정
- 🟢 GREEN: 정상 (위험도 < 20%)
- 🟡 YELLOW: 주의 (20% ≤ 위험도 < 30%)
- 🟠 ORANGE: 경고 (30% ≤ 위험도 < 40%)
- 🔴 RED: 위험 (위험도 ≥ 40%)
- FastAPI 기반 RESTful API
- PostgreSQL + Redis 캐싱
- JWT 인증, Rate Limiting
- Prometheus 메트릭, Sentry 에러 추적
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Client │─────▶│ FastAPI │─────▶│ PostgreSQL │
│ (Web/App) │ │ (API) │ │ (DB) │
└─────────────┘ └──────────────┘ └─────────────┘
│
├─────▶ Redis (Cache)
│
└─────▶ ML Models (Ensemble)
- Python 3.11+
- Docker & Docker Compose (선택)
- PostgreSQL 15+ (Docker 사용 시 불필요)
# 1. 리포지토리 클론
git clone <repository-url>
cd model_test
# 2. 가상환경 생성 및 패키지 설치
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# 3. 데이터 파일 준비 (data/ 디렉토리에 배치)
# - big_data_set1_f.csv
# - ds2_monthly_usage.csv
# - ds3_monthly_customers.csv
# 4. 위험도 분석 실행
python run.py
# 출력: risk_output.csv (위험도 결과)# 1. 환경 변수 설정
cp .env.example .env
# .env 파일 편집 (DB 비밀번호, SECRET_KEY 등)
# 2. Docker 컨테이너 실행
docker-compose up -d
# 3. API 접근
# - API 문서: http://localhost:8000/api/docs
# - Health Check: http://localhost:8000/api/v1/health# Python 의존성 설치
pip install -r requirements.txt
# 개발용 추가 패키지 (선택)
pip install pytest black flake8 mypy# 개발 환경 (hot-reload)
docker-compose -f docker-compose.dev.yml up
# 프로덕션 환경
docker-compose up -d# 기본 실행
python run.py
# 커스텀 데이터 경로
python -m risk_model data/ds1.csv data/ds2.csv data/ds3.csv
# 예측 모델 포함 (preds.csv 필요)
python -m risk_model data/ds1.csv data/ds2.csv data/ds3.csv data/preds.csv출력 예시 (risk_output.csv):
ENCODED_MCT,TA_YM,Sales_Risk,Customer_Risk,Market_Risk,RiskScore,p_model,p_final,Alert
ABC123,2024-01,0.15,0.12,0.55,0.28,0.32,0.30,ORANGE# Jupyter 시작
jupyter notebook
# 노트북 실행
# - train_baseline_fixed.ipynb: 기본 모델 학습
# - train_full_ensemble.ipynb: 전체 앙상블 모델curl -X POST http://localhost:8000/api/v1/predict/quickscore \
-H "Content-Type: application/json" \
-H "X-API-Key: dev_key_12345" \
-d '{
"industry_code": "치킨",
"region_code": "강남구",
"sales_1m": 15000000,
"sales_3m_avg": 18000000,
"cust_1m": 450,
"cust_3m_avg": 500,
"delivery_share": 0.7
}'응답 예시:
{
"id": "pred_abc123",
"p_final": 0.35,
"alert": "ORANGE",
"risk_components": {
"Sales_Risk": 0.08,
"Customer_Risk": 0.05,
"Market_Risk": 0.56
},
"explanations": [
"최근 1→3개월 대비 매출 모멘텀 둔화",
"지역/업종 시장 위험도 상회"
],
"recommendations": [
"💰 매출 개선: 프로모션 이벤트나 신메뉴 출시를 고려하세요",
"📱 온라인 강화: 배달앱 외 자체 채널을 개발하세요"
]
}curl -X POST http://localhost:8000/api/v1/chat \
-H "Content-Type: application/json" \
-d '{
"message": "강남구에서 치킨집 하는데 지난달 매출 1500만원이야"
}'curl -X POST http://localhost:8000/api/v1/nlp/parse \
-H "Content-Type: application/json" \
-d '{
"utterance": "강남구 치킨집인데 배달 위주고 한 달 매출 1500만원, 고객 450명"
}'응답:
{
"industry_code": "치킨",
"region_code": "강남구",
"delivery_share": 0.8,
"sales_1m": 15000000.0,
"cust_1m": 450.0
}모든 API 요청에는 헤더 필요:
X-API-Key: your-api-key
| Method | Endpoint | 설명 |
|---|---|---|
GET |
/api/v1/health |
헬스체크 |
POST |
/api/v1/predict/quickscore |
즉시 위험도 분석 |
POST |
/api/v1/predict/model |
ML 모델 기반 예측 |
POST |
/api/v1/nlp/parse |
자연어 파싱 |
POST |
/api/v1/chat |
챗봇 대화 |
GET |
/api/v1/predict/history/{store_id} |
예측 이력 조회 |
GET |
/api/v1/admin/stats |
API 사용 통계 |
상세 문서: http://localhost:8000/api/docs (Swagger UI)
# 1. 환경 변수 설정
cat > .env <<EOF
ENVIRONMENT=production
SECRET_KEY=$(openssl rand -hex 32)
JWT_SECRET=$(openssl rand -hex 32)
DATABASE_URL=postgresql://user:password@postgres:5432/sme_warning
SENTRY_DSN=your-sentry-dsn
EOF
# 2. 빌드 및 실행
docker-compose build --no-cache
docker-compose up -d
# 3. DB 마이그레이션 (필요시)
docker-compose exec api alembic upgrade head
# 4. 헬스체크
curl http://localhost:8000/api/v1/healthnginx.conf 파일이 포함되어 있으며, docker-compose에서 자동 설정됩니다.
- Prometheus: http://localhost:9090 (설정 필요)
- Grafana: http://localhost:3000 (설정 필요)
- Sentry: 환경 변수에 DSN 설정
model_test/
├── api/ # FastAPI 애플리케이션
│ ├── routes/ # API 라우터
│ ├── service/ # 비즈니스 로직
│ ├── database.py # DB 모델
│ ├── cache.py # Redis 캐시
│ └── main.py # 앱 진입점
├── data/ # 데이터 파일
├── figures/ # 시각화 결과
├── config.py # 전역 설정
├── pipeline.py # 위험도 분석 파이프라인
├── risk_components.py # 위험도 계산 로직
├── ensemble.py # 앙상블 모델
├── preprocessing.py # 전처리
├── alerting.py # 경보 로직
├── utils.py # 유틸리티
├── run.py # CLI 실행
├── Dockerfile # Docker 이미지
├── docker-compose.yml # 컨테이너 오케스트레이션
└── requirements.txt # Python 의존성
# 개발 모드 (auto-reload)
uvicorn api.main:app --reload --host 0.0.0.0 --port 8000
# 또는 Docker 개발 환경
docker-compose -f docker-compose.dev.yml uppytest tests/ -vblack api/ *.py
flake8 api/ *.pyENCODED_MCT,HPSN_MCT_ZCD_NM,HPSN_MCT_BZN_CD_NM,MCT_ME_D,...ENCODED_MCT,TA_YM,RC_M1_SAA,RC_M1_TO_UE_CT,DLV_SAA_RAT,...ENCODED_MCT,TA_YM,M12_MAL_1020_RAT,MCT_UE_CLN_REU_RAT,...ENCODED_MCT,TA_YM,Sales_Risk,Customer_Risk,Market_Risk,RiskScore,p_model,p_final,Alert
ABC123,2024-01-01,0.15,0.12,0.55,0.28,0.32,0.30,ORANGE주요 환경 변수 (.env 파일):
# 환경 설정
ENVIRONMENT=production # development/staging/production
DEBUG=false
# 보안
SECRET_KEY=your-secret-key
JWT_SECRET=your-jwt-secret
API_KEY_HEADER=X-API-Key
# 데이터베이스
DATABASE_URL=postgresql://user:password@postgres:5432/sme_warning
# Redis
REDIS_URL=redis://redis:6379/0
CACHE_TTL=3600
# 인증
ENABLE_AUTH=true
# Rate Limiting
RATE_LIMIT_PER_MINUTE=60
RATE_LIMIT_PER_HOUR=1000
# 모니터링
SENTRY_DSN=https://your-sentry-dsn
ENABLE_METRICS=trueA: 데이터 파일이 data/ 디렉토리에 있는지 확인하고, UTF-8/CP949 인코딩을 시도합니다.
A: 포트 충돌 확인 (docker-compose down 후 재시작)
A: .env 파일의 ENABLE_AUTH=false로 설정하거나, 올바른 API 키 사용
A: risk_output_trained.csv가 최신인지 확인하고, 필요 시 재학습