feat: 로또 자율학습 탭 — 성적표·캘리브레이션·당첨조합 분석

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-31 18:07:03 +09:00
parent ecc1ab0954
commit a57ac23064
6 changed files with 236 additions and 1 deletions

View File

@@ -0,0 +1,49 @@
import React from 'react';
import {
RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis,
Radar, ResponsiveContainer,
} from 'recharts';
export default function WinnerAnalysisCard({ analysis }) {
if (!analysis) return null;
const data = [
{ k: '빈도', v: analysis.score_frequency ?? 0 },
{ k: '지문', v: analysis.score_fingerprint ?? 0 },
{ k: '갭', v: analysis.score_gap ?? 0 },
{ k: '공동출현', v: analysis.score_cooccur ?? 0 },
{ k: '다양성', v: analysis.score_diversity ?? 0 },
];
const pct = analysis.percentile != null
? `${(analysis.percentile * 100).toFixed(0)}%`
: '—';
return (
<div className="evolver-card backtest-winner-analysis">
<h2>
이번 당첨조합 분석치
<span className="badge">무작위 상위 {pct}</span>
</h2>
<div className="winner-chart">
<ResponsiveContainer width="100%" height={240}>
<RadarChart data={data}>
<PolarGrid stroke="rgba(255,255,255,0.12)" />
<PolarAngleAxis dataKey="k" tick={{ fill: '#cbd5e1', fontSize: 12 }} />
<PolarRadiusAxis angle={90} domain={[0, 1]} tick={{ fill: '#64748b', fontSize: 10 }} />
<Radar
name="분석치"
dataKey="v"
stroke="#60a5fa"
fill="#60a5fa"
fillOpacity={0.4}
/>
</RadarChart>
</ResponsiveContainer>
</div>
<p className="backtest-note">
종합 점수: <strong>{(analysis.score_total ?? 0).toFixed(3)}</strong>
</p>
</div>
);
}