-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
780 lines (734 loc) · 50.5 KB
/
Copy pathindex.html
File metadata and controls
780 lines (734 loc) · 50.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VSP Vision — Frame Assortment Analysis</title>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=DM+Sans:wght@300;400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--ink: #0f1117;
--ink-muted: #3a3d47;
--ink-faint: #8c8f99;
--paper: #f8f6f1;
--paper-card: #ffffff;
--rule: #e2dfd7;
--accent: #c8402a;
--accent-warm: #e8915a;
--accent-blue: #2a5c8a;
--accent-green: #2a7a4a;
--accent-gold: #c4962a;
--nike: #c8402a;
--lacoste: #2a7a4a;
--ck: #2a5c8a;
}
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family:'DM Sans',sans-serif; background:var(--paper); color:var(--ink); font-size:15px; line-height:1.6; }
/* COVER */
.cover { background:var(--ink); color:var(--paper); padding:80px 72px 60px; position:relative; overflow:hidden; }
.cover::before { content:''; position:absolute; top:-80px; right:-80px; width:500px; height:500px; border-radius:50%; background:radial-gradient(circle,rgba(200,64,42,0.18) 0%,transparent 70%); }
.cover::after { content:''; position:absolute; bottom:-120px; left:-60px; width:400px; height:400px; border-radius:50%; background:radial-gradient(circle,rgba(42,92,138,0.12) 0%,transparent 70%); }
.cover-eyebrow { font-family:'DM Mono',monospace; font-size:11px; letter-spacing:3px; text-transform:uppercase; color:var(--accent-warm); margin-bottom:24px; }
.cover h1 { font-family:'Playfair Display',serif; font-size:54px; font-weight:900; line-height:1.08; margin-bottom:20px; letter-spacing:-1px; }
.cover h1 span { color:var(--accent-warm); }
.cover-sub { font-size:16px; color:rgba(248,246,241,0.65); max-width:580px; margin-bottom:48px; font-weight:300; }
.cover-meta { display:flex; gap:40px; flex-wrap:wrap; }
.cover-stat { border-top:1px solid rgba(255,255,255,0.2); padding-top:16px; min-width:100px; }
.cover-stat-val { font-family:'Playfair Display',serif; font-size:28px; font-weight:700; color:var(--accent-warm); }
.cover-stat-label { font-size:11px; letter-spacing:1.5px; text-transform:uppercase; color:rgba(255,255,255,0.5); margin-top:2px; }
/* LAYOUT */
.page { max-width:1100px; margin:0 auto; padding:0 40px; }
/* SECTION */
.section { padding:64px 0 0; }
.section-label { font-family:'DM Mono',monospace; font-size:10px; letter-spacing:3px; text-transform:uppercase; color:var(--accent); margin-bottom:8px; }
.section h2 { font-family:'Playfair Display',serif; font-size:32px; font-weight:700; line-height:1.2; margin-bottom:8px; color:var(--ink); }
.section-intro { font-size:14px; color:var(--ink-muted); margin-bottom:32px; max-width:700px; }
.section h3 { font-family:'Playfair Display',serif; font-size:20px; font-weight:700; margin:40px 0 16px; color:var(--ink); }
.divider { border:none; border-top:1px solid var(--rule); margin:64px 0 0; }
/* CARDS */
.card-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:16px; margin-bottom:32px; }
.card { background:var(--paper-card); border:1px solid var(--rule); border-radius:8px; padding:24px; }
.card-label { font-size:11px; letter-spacing:1.5px; text-transform:uppercase; color:var(--ink-faint); margin-bottom:8px; }
.card-val { font-family:'Playfair Display',serif; font-size:34px; font-weight:700; color:var(--ink); line-height:1; }
.card-sub { font-size:12px; color:var(--ink-faint); margin-top:6px; }
.card.highlight { background:var(--ink); color:var(--paper); border-color:var(--ink); }
.card.highlight .card-label { color:rgba(255,255,255,0.5); }
.card.highlight .card-val { color:var(--accent-warm); }
.card.highlight .card-sub { color:rgba(255,255,255,0.5); }
.card.accent-green { border-left:4px solid var(--accent-green); }
.card.accent-red { border-left:4px solid var(--accent); }
.card.accent-gold { border-left:4px solid var(--accent-gold); }
.card.accent-blue { border-left:4px solid var(--accent-blue); }
/* BAR CHARTS */
.bar-section { margin-bottom:32px; }
.bar-row { display:flex; align-items:center; gap:12px; margin-bottom:10px; }
.bar-label { width:160px; font-size:13px; color:var(--ink-muted); flex-shrink:0; text-align:right; }
.bar-track { flex:1; height:22px; background:var(--rule); border-radius:3px; overflow:hidden; }
.bar-fill { height:100%; border-radius:3px; display:flex; align-items:center; padding-left:8px; }
.bar-val { font-family:'DM Mono',monospace; font-size:11px; color:rgba(255,255,255,0.9); white-space:nowrap; }
.bar-meta { width:80px; font-size:12px; color:var(--ink-faint); flex-shrink:0; }
/* TWO-COL */
.two-col { display:grid; grid-template-columns:1fr 1fr; gap:32px; margin-bottom:32px; }
@media(max-width:720px){.two-col{grid-template-columns:1fr;}}
/* TABLE */
table { width:100%; border-collapse:collapse; font-size:13px; margin-bottom:24px; }
th { background:var(--ink); color:var(--paper); padding:10px 14px; text-align:left; font-size:11px; letter-spacing:1px; text-transform:uppercase; font-weight:500; }
td { padding:10px 14px; border-bottom:1px solid var(--rule); }
tr:last-child td { border-bottom:none; }
tr:nth-child(even) td { background:rgba(0,0,0,0.02); }
td:first-child { font-weight:500; }
/* BRAND CARDS */
.brand-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); gap:20px; margin-bottom:32px; }
.brand-card { background:var(--paper-card); border:1px solid var(--rule); border-radius:8px; overflow:hidden; }
.brand-card-header { padding:16px 20px; display:flex; justify-content:space-between; align-items:center; }
.brand-card-name { font-family:'Playfair Display',serif; font-size:17px; font-weight:700; }
.brand-card-badge { font-family:'DM Mono',monospace; font-size:11px; padding:4px 10px; border-radius:20px; }
.brand-card-body { padding:16px 20px; display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; border-top:1px solid var(--rule); }
.brand-stat-val { font-family:'Playfair Display',serif; font-size:20px; font-weight:700; }
.brand-stat-label { font-size:11px; color:var(--ink-faint); margin-top:2px; }
.brand-card-note { padding:12px 20px; background:rgba(0,0,0,0.02); border-top:1px solid var(--rule); font-size:12px; color:var(--ink-muted); }
/* MODEL */
.model-box { background:var(--ink); border-radius:12px; padding:40px; color:var(--paper); margin-bottom:32px; }
.model-metrics { display:grid; grid-template-columns:repeat(4,1fr); gap:24px; margin-bottom:32px; }
.model-metric-val { font-family:'Playfair Display',serif; font-size:36px; font-weight:700; color:var(--accent-warm); }
.model-metric-label { font-size:12px; color:rgba(255,255,255,0.5); margin-top:4px; }
.feat-row { display:flex; align-items:center; gap:12px; margin-bottom:10px; }
.feat-name { width:240px; font-size:13px; color:rgba(255,255,255,0.8); flex-shrink:0; }
.feat-bar-track { flex:1; height:16px; background:rgba(255,255,255,0.1); border-radius:3px; overflow:hidden; }
.feat-bar-fill { height:100%; background:var(--accent-warm); border-radius:3px; }
.feat-pct { width:36px; font-family:'DM Mono',monospace; font-size:12px; color:rgba(255,255,255,0.5); text-align:right; }
.model-compare { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin-top:28px; }
.model-compare-item { background:rgba(255,255,255,0.06); border-radius:6px; padding:16px; }
.model-compare-name { font-size:12px; color:rgba(255,255,255,0.5); margin-bottom:6px; }
.model-compare-val { font-family:'Playfair Display',serif; font-size:22px; font-weight:700; color:var(--accent-warm); }
.model-compare-item.winner { background:rgba(232,145,90,0.15); border:1px solid rgba(232,145,90,0.3); }
/* RECOMMENDATIONS */
.rec-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(340px,1fr)); gap:20px; margin-bottom:40px; }
.rec-card { background:var(--paper-card); border:1px solid var(--rule); border-radius:8px; padding:28px; }
.rec-num { font-family:'DM Mono',monospace; font-size:28px; font-weight:500; color:var(--rule); margin-bottom:12px; }
.rec-tag { display:inline-block; font-size:10px; letter-spacing:1.5px; text-transform:uppercase; padding:3px 10px; border-radius:20px; margin-bottom:14px; font-weight:600; }
.priority-high { background:rgba(200,64,42,0.1); color:var(--accent); }
.priority-med { background:rgba(196,150,42,0.1); color:var(--accent-gold); }
.priority-low { background:rgba(42,92,138,0.1); color:var(--accent-blue); }
.rec-title { font-family:'Playfair Display',serif; font-size:17px; font-weight:700; margin-bottom:12px; line-height:1.3; }
.rec-body { font-size:13px; color:var(--ink-muted); line-height:1.65; }
/* ACTION TABLE */
.action-table th { background:var(--ink); }
.action-high { color:var(--accent); font-weight:700; font-size:11px; letter-spacing:1px; }
.action-med { color:var(--accent-gold); font-weight:700; font-size:11px; letter-spacing:1px; }
.action-low { color:var(--accent-blue); font-weight:700; font-size:11px; letter-spacing:1px; }
/* BADGES */
.badge { display:inline-block; padding:2px 10px; border-radius:12px; font-size:12px; font-weight:700; }
.badge-green { background:rgba(42,122,74,0.12); color:var(--accent-green); }
.badge-gold { background:rgba(196,150,42,0.12); color:var(--accent-gold); }
.badge-red { background:rgba(200,64,42,0.12); color:var(--accent); }
.badge-blue { background:rgba(42,92,138,0.12); color:var(--accent-blue); }
/* INSIGHT BOX */
.insight { background:var(--paper-card); border-left:4px solid var(--accent-warm); border-radius:0 8px 8px 0; padding:16px 20px; margin:20px 0; font-size:13px; color:var(--ink-muted); }
.insight strong { color:var(--ink); }
/* SEASONAL */
.seasonal-grid { display:grid; grid-template-columns:repeat(12,1fr); gap:6px; margin:20px 0 8px; }
.month-bar-wrap { display:flex; flex-direction:column; align-items:center; gap:6px; }
.month-bar-outer { width:100%; background:var(--rule); border-radius:4px; position:relative; height:80px; display:flex; align-items:flex-end; }
.month-bar-inner { width:100%; border-radius:4px 4px 0 0; }
.month-label { font-size:10px; color:var(--ink-faint); text-align:center; font-family:'DM Mono',monospace; }
.month-val { font-size:9px; color:var(--ink-faint); text-align:center; }
/* FOOTER */
.footer { margin-top:64px; padding:32px 40px; background:var(--ink); color:rgba(255,255,255,0.4); font-size:12px; display:flex; justify-content:space-between; font-family:'DM Mono',monospace; letter-spacing:0.5px; }
/* REGION COMPARE */
.region-grid { display:grid; grid-template-columns:1fr 1fr; gap:24px; margin-bottom:32px; }
.region-card { background:var(--paper-card); border:1px solid var(--rule); border-radius:8px; overflow:hidden; }
.region-header { padding:14px 20px; font-weight:600; font-size:13px; letter-spacing:1px; text-transform:uppercase; }
.region-header.amer { background:var(--accent); color:white; }
.region-header.emea { background:var(--accent-blue); color:white; }
.region-body { padding:16px 20px; }
.region-row { display:flex; justify-content:space-between; padding:6px 0; border-bottom:1px solid var(--rule); font-size:13px; }
.region-row:last-child { border-bottom:none; }
.region-key { color:var(--ink-faint); }
.region-val { font-weight:600; }
</style>
</head>
<body>
<!-- ══════════ COVER ══════════ -->
<div class="cover">
<div class="page">
<div class="cover-eyebrow">VSP Vision · Visionworks · Frame Assortment Analysis</div>
<h1>Frame <span>Assortment</span><br>Intelligence Report</h1>
<div class="cover-sub">A full-cycle demand analysis spanning 12 months of sales data across 162 SKUs, 3 brands, and 2 regions — with an XGBoost forecasting model and product management recommendations.</div>
<div class="cover-meta">
<div class="cover-stat">
<div class="cover-stat-val">910,853</div>
<div class="cover-stat-label">Total Units Sold</div>
</div>
<div class="cover-stat">
<div class="cover-stat-val">162</div>
<div class="cover-stat-label">Unique SKUs</div>
</div>
<div class="cover-stat">
<div class="cover-stat-val">3</div>
<div class="cover-stat-label">Brands</div>
</div>
<div class="cover-stat">
<div class="cover-stat-val">2</div>
<div class="cover-stat-label">Regions</div>
</div>
<div class="cover-stat">
<div class="cover-stat-val">0.737
</div>
<div class="cover-stat-label">Model R² (Log)</div>
</div>
<div class="cover-stat">
<div class="cover-stat-val">Sep '23–Aug '24</div>
<div class="cover-stat-label">Data Period</div>
</div>
</div>
</div>
</div>
<div class="page">
<!-- ══════════ 1. EDA ══════════ -->
<div class="section">
<div class="section-label">Section 1 · Exploratory Data Analysis</div>
<h2>What the Data Looks Like</h2>
<p class="section-intro">After merging and cleaning both source files, 910,853 total units across 162 SKUs were analyzed over 12 months. Sales are heavily right-skewed — a handful of hero SKUs account for a disproportionate share of volume, while the majority of SKUs sit in a long tail.</p>
<div class="card-grid">
<div class="card highlight">
<div class="card-label">Total Units Sold</div>
<div class="card-val">910,853</div>
<div class="card-sub">Sep 2023 – Aug 2024</div>
</div>
<div class="card">
<div class="card-label">Avg Units / SKU</div>
<div class="card-val">735</div>
<div class="card-sub">Median: 462 · Skewness: 2.56</div>
</div>
<div class="card">
<div class="card-label">Peak Month</div>
<div class="card-val">93,980</div>
<div class="card-sub">March 2024 — insurance renewals</div>
</div>
<div class="card">
<div class="card-label">Trough Month</div>
<div class="card-val">52,084</div>
<div class="card-sub">December 2023 — holiday slowdown</div>
</div>
<div class="card accent-red">
<div class="card-label">Dead SKUs (<50 units)</div>
<div class="card-val">81</div>
<div class="card-sub">6.5% of all SKU-region combos</div>
</div>
<div class="card accent-green">
<div class="card-label">Hero SKUs (>1,000 units)</div>
<div class="card-val">307</div>
<div class="card-sub">24.8% of all SKU-region combos</div>
</div>
</div>
<!-- Seasonality bars -->
<h3>Monthly Sales Volume — Pronounced Seasonality</h3>
<p class="section-intro" style="margin-bottom:16px;">Jan–Mar insurance renewal drives a 73–80% jump from December. New styles must be floor-ready by December 15 to capture this peak.</p>
<div class="seasonal-grid">
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:74%; background:var(--accent-blue);"></div></div>
<div class="month-label">Sep</div><div class="month-val">69K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:78%; background:var(--accent-blue);"></div></div>
<div class="month-label">Oct</div><div class="month-val">73K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:69%; background:var(--accent-blue);"></div></div>
<div class="month-label">Nov</div><div class="month-val">65K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:55%; background:var(--ink-faint);"></div></div>
<div class="month-label">Dec</div><div class="month-val">52K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:82%; background:var(--accent-green);"></div></div>
<div class="month-label">Jan</div><div class="month-val">77K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:96%; background:var(--accent-green);"></div></div>
<div class="month-label">Feb</div><div class="month-val">90K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:100%; background:var(--accent-green);"></div></div>
<div class="month-label">Mar</div><div class="month-val">94K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:89%; background:var(--accent-warm);"></div></div>
<div class="month-label">Apr</div><div class="month-val">84K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:91%; background:var(--accent-warm);"></div></div>
<div class="month-label">May</div><div class="month-val">86K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:84%; background:var(--accent-blue);"></div></div>
<div class="month-label">Jun</div><div class="month-val">79K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:82%; background:var(--accent-blue);"></div></div>
<div class="month-label">Jul</div><div class="month-val">77K</div>
</div>
<div class="month-bar-wrap">
<div class="month-bar-outer"><div class="month-bar-inner" style="height:69%; background:var(--accent-blue);"></div></div>
<div class="month-label">Aug</div><div class="month-val">65K</div>
</div>
</div>
<div style="display:flex;gap:20px;font-size:12px;color:var(--ink-faint);margin-top:4px;">
<span style="display:flex;align-items:center;gap:6px;"><span style="width:12px;height:12px;background:var(--accent-green);border-radius:2px;display:inline-block;"></span>Insurance renewal peak</span>
<span style="display:flex;align-items:center;gap:6px;"><span style="width:12px;height:12px;background:var(--accent-warm);border-radius:2px;display:inline-block;"></span>Spring sustained</span>
<span style="display:flex;align-items:center;gap:6px;"><span style="width:12px;height:12px;background:var(--accent-blue);border-radius:2px;display:inline-block;"></span>Normal</span>
<span style="display:flex;align-items:center;gap:6px;"><span style="width:12px;height:12px;background:var(--ink-faint);border-radius:2px;display:inline-block;"></span>Trough</span>
</div>
</div>
<hr class="divider">
<!-- ══════════ 2. PRODUCT ══════════ -->
<div class="section">
<div class="section-label">Section 2 · Product Analysis</div>
<h2>Frame Attributes, Price Architecture & Brand Performance</h2>
<p class="section-intro">Demand is structured along four dominant dimensions: frame shape, price tier, material, and brand. Each reveals both what's working and where the assortment has gaps.</p>
<div class="two-col">
<!-- Shape -->
<div>
<h3>Frame Shape</h3>
<div class="bar-section">
<div class="bar-row">
<div class="bar-label">Rectangle</div>
<div class="bar-track"><div class="bar-fill" style="width:46%;background:var(--ink);"><span class="bar-val">417,943 · 45.9%</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Square</div>
<div class="bar-track"><div class="bar-fill" style="width:36%;background:var(--ink);"><span class="bar-val">331,981 · 36.4%</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Round</div>
<div class="bar-track"><div class="bar-fill" style="width:15%;background:var(--accent-blue);"><span class="bar-val">136,456</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Aviator</div>
<div class="bar-track"><div class="bar-fill" style="width:1.2%;background:var(--ink-faint);"></div></div>
<div class="bar-meta">10,841</div>
</div>
<div class="bar-row">
<div class="bar-label">Oval ⚡</div>
<div class="bar-track"><div class="bar-fill" style="width:1%;background:var(--accent-gold);"></div></div>
<div class="bar-meta">9,432 · 1 SKU</div>
</div>
<div class="bar-row">
<div class="bar-label">Cat Eye</div>
<div class="bar-track"><div class="bar-fill" style="width:0.5%;background:var(--accent);"></div></div>
<div class="bar-meta">4,200 · 2 SKUs</div>
</div>
</div>
<div class="insight"><strong>White space:</strong> Oval has 1 SKU and 9,432 units — the highest avg/SKU of any shape (9,432). Demand proven. Supply missing.</div>
</div>
<!-- Material -->
<div>
<h3>Material</h3>
<div class="bar-section">
<div class="bar-row">
<div class="bar-label">Bio Inj-G820</div>
<div class="bar-track"><div class="bar-fill" style="width:45%;background:var(--ink);"><span class="bar-val">407,603 · 44.7%</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Acetate</div>
<div class="bar-track"><div class="bar-fill" style="width:34%;background:var(--ink);"><span class="bar-val">306,545 · 33.7%</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Metal</div>
<div class="bar-track"><div class="bar-fill" style="width:16%;background:var(--accent-blue);"><span class="bar-val">147,445</span></div></div>
</div>
<div class="bar-row">
<div class="bar-label">Titanium ⚡</div>
<div class="bar-track"><div class="bar-fill" style="width:5.4%;background:var(--accent-gold);"><span class="bar-val" style="font-size:9px;">49,260</span></div></div>
</div>
</div>
<div class="card-grid" style="grid-template-columns:1fr 1fr;margin-top:16px;">
<div class="card accent-gold">
<div class="card-label">Titanium / SKU</div>
<div class="card-val" style="font-size:24px;">$9,852</div>
<div class="card-sub">Only 5 SKUs — 2× Acetate efficiency</div>
</div>
<div class="card">
<div class="card-label">Acetate / SKU</div>
<div class="card-val" style="font-size:24px;">$5,574</div>
<div class="card-sub">55 SKUs — solid mid-tier performer</div>
</div>
</div>
</div>
</div>
<!-- Price Tiers -->
<h3>Price Architecture</h3>
<table>
<tr>
<th>Price Band</th><th>Units</th><th>Share</th><th>SKU Count</th><th>Revenue / SKU</th><th>Assessment</th>
</tr>
<tr>
<td>≤$149</td><td>192,191</td><td>21.1%</td><td>24</td><td style="color:var(--accent-green);font-weight:700;">$8,008</td><td><span class="badge badge-green">Efficient</span></td>
</tr>
<tr>
<td>$150–$199</td><td>257,064</td><td>28.2%</td><td style="color:var(--accent);font-weight:700;">64</td><td style="color:var(--accent);font-weight:700;">$4,017</td><td><span class="badge badge-red">Over-assorted</span></td>
</tr>
<tr style="background:rgba(196,150,42,0.06);">
<td><strong>$200–$249 ★</strong></td><td><strong>303,642</strong></td><td><strong>33.3%</strong></td><td>48</td><td style="color:var(--accent-green);font-weight:700;">$6,326</td><td><span class="badge badge-green">Sweet Spot</span></td>
</tr>
<tr>
<td>$250–$299</td><td>143,820</td><td>15.8%</td><td>24</td><td>$5,992</td><td><span class="badge badge-gold">Strong</span></td>
</tr>
<tr>
<td>$300+</td><td>14,136</td><td>1.6%</td><td>2</td><td style="color:var(--accent-green);font-weight:700;">$7,068</td><td><span class="badge badge-blue">Untapped</span></td>
</tr>
</table>
<div class="insight"><strong>Core problem:</strong> The $150–$199 tier uses 64 SKUs (39% of all SKUs) to generate just 28.2% of volume at $4,017/SKU — 37% below the $200–$249 sweet spot. Rationalizing 10–15 of these SKUs is the single highest-ROI move available.</div>
<!-- Gender -->
<h3>Gender Distribution</h3>
<div class="card-grid">
<div class="card">
<div class="card-label">Unisex</div>
<div class="card-val">435,023</div>
<div class="card-sub">47.8% of volume · 63 SKUs · $6,905/SKU</div>
</div>
<div class="card">
<div class="card-label">Male</div>
<div class="card-val">332,341</div>
<div class="card-sub">36.5% of volume · 69 SKUs · $4,817/SKU</div>
</div>
<div class="card accent-red">
<div class="card-label">Female</div>
<div class="card-val">143,489</div>
<div class="card-sub">15.8% of volume · 30 SKUs · $4,783/SKU</div>
</div>
</div>
<div class="insight"><strong>Gender gap:</strong> Female patients represent ~50% of typical optical retail customers but only 15.8% of sales. Per-SKU productivity is nearly identical to Male ($4,783 vs $4,817) — the gap is supply, not demand. Nike female share is only 7% of Nike's total volume despite brand dominance.</div>
<!-- Brand cards -->
<h3>Brand Performance</h3>
<div class="brand-grid">
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(200,64,42,0.06);">
<div class="brand-card-name" style="color:var(--nike);">Nike Optical</div>
<div class="brand-card-badge" style="background:rgba(200,64,42,0.1);color:var(--nike);">51.7% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">470,921</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">63</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val">$7,475</div><div class="brand-stat-label">Per SKU</div></div>
</div>
<div class="brand-card-note">⚠ 37 dead SKUs (highest of any brand). AF-series Metal rectangles consistently underperform. Female share only 7% of Nike volume.</div>
</div>
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(42,122,74,0.06);">
<div class="brand-card-name" style="color:var(--lacoste);">Lacoste Optical</div>
<div class="brand-card-badge" style="background:rgba(42,122,74,0.1);color:var(--lacoste);">24.7% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">225,254</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">28</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val" style="color:var(--accent-green);">$8,045</div><div class="brand-stat-label">Per SKU ← Best</div></div>
</div>
<div class="brand-card-note">✓ Most efficient brand. $200–$249 tier generates $10,005/SKU — best brand×tier combo. EMEA anchor (67% of volume). AMER underweighted at only 33%.</div>
</div>
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(42,92,138,0.06);">
<div class="brand-card-name" style="color:var(--ck);">Calvin Klein Optical</div>
<div class="brand-card-badge" style="background:rgba(42,92,138,0.1);color:var(--ck);">13.4% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">121,892</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">32</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val" style="color:var(--accent);">$3,809</div><div class="brand-stat-label">Per SKU ← Lowest</div></div>
</div>
<div class="brand-card-note">⚠ Lowest productivity among optical brands. Only gender-balanced brand (37% F / 37% M / 25% U). Over-assorted — needs rationalization to 20–25 core SKUs in $180–$220.</div>
</div>
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(42,122,74,0.04);">
<div class="brand-card-name" style="color:var(--lacoste);">Lacoste Suns</div>
<div class="brand-card-badge" style="background:rgba(42,122,74,0.08);color:var(--lacoste);">6.6% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">60,097</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">18</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val" style="color:var(--accent);">$3,339</div><div class="brand-stat-label">Per SKU</div></div>
</div>
<div class="brand-card-note">⚠ 17 of 18 SKUs dead or slow. 84% of volume is EMEA — effectively a regional brand being stocked globally.</div>
</div>
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(42,92,138,0.04);">
<div class="brand-card-name" style="color:var(--ck);">Calvin Klein Sun</div>
<div class="brand-card-badge" style="background:rgba(200,64,42,0.1);color:var(--accent);">2.0% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">17,956</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">15</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val" style="color:var(--accent);">$1,197</div><div class="brand-stat-label">Per SKU ← Worst</div></div>
</div>
<div class="brand-card-note">🔴 80% dead or slow SKUs. Worst performing brand in the portfolio. Recommend cut from 15 to 5–6 core SKUs immediately.</div>
</div>
<div class="brand-card">
<div class="brand-card-header" style="background:rgba(200,64,42,0.04);">
<div class="brand-card-name" style="color:var(--nike);">Nike Sun</div>
<div class="brand-card-badge" style="background:rgba(42,122,74,0.1);color:var(--accent-green);">1.6% of volume</div>
</div>
<div class="brand-card-body">
<div><div class="brand-stat-val">14,733</div><div class="brand-stat-label">Total Units</div></div>
<div><div class="brand-stat-val">6</div><div class="brand-stat-label">SKUs</div></div>
<div><div class="brand-stat-val">$2,456</div><div class="brand-stat-label">Per SKU</div></div>
</div>
<div class="brand-card-note">✓ Only brand with zero dead SKUs. All 6 SKUs productive. Female SKU (Nike Rave) is #1 Sun performer. Tight, well-curated assortment.</div>
</div>
</div>
<!-- Top 10 SKUs -->
<h3>Top 10 SKUs by Total Annual Units</h3>
<table>
<tr><th>#</th><th>Style Code</th><th>Brand</th><th>Region</th><th>Shape</th><th>Material</th><th>Price</th><th>Units</th></tr>
<tr><td>1</td><td>L2707</td><td>Lacoste Optical</td><td>EMEA</td><td>Square</td><td>Acetate</td><td>$199.95</td><td><strong>20,417</strong></td></tr>
<tr><td>2</td><td>L2876</td><td>Lacoste Optical</td><td>EMEA</td><td>Square</td><td>Acetate</td><td>$220.00</td><td><strong>14,317</strong></td></tr>
<tr><td>3</td><td>NIKE 7125</td><td>Nike Optical</td><td>AMER</td><td>Rectangle</td><td>Bio Inj-G820</td><td>$249.00</td><td><strong>14,219</strong></td></tr>
<tr><td>4</td><td>NIKE 7246</td><td>Nike Optical</td><td>AMER</td><td>Rectangle</td><td>Acetate</td><td>$259.00</td><td><strong>14,096</strong></td></tr>
<tr><td>5</td><td>L2707N</td><td>Lacoste Optical</td><td>EMEA</td><td>Square</td><td>Acetate</td><td>$199.95</td><td><strong>13,443</strong></td></tr>
<tr><td>6</td><td>NIKE 8045</td><td>Nike Optical</td><td>AMER</td><td>Rectangle</td><td>Titanium</td><td>$295.00</td><td><strong>13,048</strong></td></tr>
<tr><td>7</td><td>L2271</td><td>Lacoste Optical</td><td>EMEA</td><td>Rectangle</td><td>Metal</td><td>$225.00</td><td><strong>12,086</strong></td></tr>
<tr><td>8</td><td>NIKE 8154</td><td>Nike Optical</td><td>AMER</td><td>Rectangle</td><td>Titanium</td><td>$295.00</td><td><strong>11,767</strong></td></tr>
<tr><td>9</td><td>NIKE 7090</td><td>Nike Optical</td><td>AMER</td><td>Square</td><td>Bio Inj-G820</td><td>$285.00</td><td><strong>11,583</strong></td></tr>
<tr><td>10</td><td>NIKE 5538</td><td>Nike Optical</td><td>AMER</td><td>Square</td><td>Bio Inj-G820</td><td>$135.00</td><td><strong>11,129</strong></td></tr>
</table>
</div>
<hr class="divider">
<!-- ══════════ 3. REGIONAL ══════════ -->
<div class="section">
<div class="section-label">Section 3 · Regional Analysis</div>
<h2>AMER and EMEA Are Not the Same Market</h2>
<p class="section-intro">AMER accounts for 56% of total demand (510,264 units) and EMEA 44% (400,589 units). Beyond the volume split, the two regions have meaningfully different brand preferences, size peaks, and price dynamics.</p>
<div class="region-grid">
<div class="region-card">
<div class="region-header amer">AMER · 56% of demand · 510,264 units</div>
<div class="region-body">
<div class="region-row"><span class="region-key">#1 Brand</span><span class="region-val">Nike Optical (64.6%)</span></div>
<div class="region-row"><span class="region-key">#2 Brand</span><span class="region-val">Calvin Klein Optical (16.2%)</span></div>
<div class="region-row"><span class="region-key">#3 Brand</span><span class="region-val">Lacoste Optical (14.6%)</span></div>
<div class="region-row"><span class="region-key">Top Size</span><span class="region-val">54mm</span></div>
<div class="region-row"><span class="region-key">Price Mix</span><span class="region-val">Heavy $150–$199 tier</span></div>
<div class="region-row"><span class="region-key">Category</span><span class="region-val">Prescription-first · Low sun</span></div>
<div class="region-row"><span class="region-key">Top SKU</span><span class="region-val">NIKE 7125 (14,219 units)</span></div>
</div>
</div>
<div class="region-card">
<div class="region-header emea">EMEA · 44% of demand · 400,589 units</div>
<div class="region-body">
<div class="region-row"><span class="region-key">#1 Brand</span><span class="region-val">Lacoste Optical (37.6%)</span></div>
<div class="region-row"><span class="region-key">#2 Brand</span><span class="region-val">Nike Optical (35.3%)</span></div>
<div class="region-row"><span class="region-key">#3 Brand</span><span class="region-val">Lacoste Suns (12.6%)</span></div>
<div class="region-row"><span class="region-key">Top Size</span><span class="region-val">53mm (fitted preference)</span></div>
<div class="region-row"><span class="region-key">Price Mix</span><span class="region-val">Stronger $200–$249 pull</span></div>
<div class="region-row"><span class="region-key">Category</span><span class="region-val">Fashion-driven · Higher sun</span></div>
<div class="region-row"><span class="region-key">Top SKU</span><span class="region-val">L2707 (20,417 units)</span></div>
</div>
</div>
</div>
<div class="insight"><strong>Implication:</strong> Lacoste is 37.6% of EMEA but only 14.6% of AMER despite proven cross-regional appeal (L2876 appears in both regions' top 5). Adding 4–6 Lacoste styles in AMER's core sizes (54–55mm) is the highest-confidence investment available.</div>
</div>
<hr class="divider">
<!-- ══════════ 4. MODEL ══════════ -->
<div class="section">
<div class="section-label">Section 4 · Demand Forecasting Model</div>
<h2>XGBoost Demand Forecasting — How We Built It</h2>
<p class="section-intro">A gradient-boosted tree model was trained on 12 months of SKU-level monthly sales data to predict forward demand. The model was evaluated on a strict time-based holdout (Jun–Aug 2024) — future months never seen during training.</p>
<div class="model-box">
<div style="font-size:11px;letter-spacing:2px;text-transform:uppercase;color:rgba(255,255,255,0.4);margin-bottom:20px;">Final Model Performance — XGBoost (Tuned)</div>
<div class="model-metrics">
<div class="model-metric">
<div class="model-metric-val">0.737</div>
<div class="model-metric-label">R² (Log Scale) ← Primary</div>
</div>
<div class="model-metric">
<div class="model-metric-val">0.542</div>
<div class="model-metric-label">R² (Raw Units)</div>
</div>
<div class="model-metric">
<div class="model-metric-val">26.4</div>
<div class="model-metric-label">MAE (Units/Month)</div>
</div>
<div class="model-metric">
<div class="model-metric-val">33</div>
<div class="model-metric-label">Input Features</div>
</div>
</div>
<div style="font-size:11px;letter-spacing:2px;text-transform:uppercase;color:rgba(255,255,255,0.4);margin-bottom:14px;">Top Feature Importances</div>
<div class="feat-row">
<div class="feat-name">Rolling 6-Month Avg Sales</div>
<div class="feat-bar-track"><div class="feat-bar-fill" style="width:100%"></div></div>
<div class="feat-pct">#1</div>
</div>
<div class="feat-row">
<div class="feat-name">SKU Historical Max Sales</div>
<div class="feat-bar-track"><div class="feat-bar-fill" style="width:65%"></div></div>
<div class="feat-pct">#2</div>
</div>
<div class="feat-row">
<div class="feat-name">SKU Average Sales (expanding)</div>
<div class="feat-bar-track"><div class="feat-bar-fill" style="width:48%"></div></div>
<div class="feat-pct">#3</div>
</div>
<div class="feat-row">
<div class="feat-name">Brand (Nike / Lacoste / CK)</div>
<div class="feat-bar-track"><div class="feat-bar-fill" style="width:36%;background:#5588BB"></div></div>
<div class="feat-pct">#4</div>
</div>
<div class="feat-row">
<div class="feat-name">Optical vs Sunglass</div>
<div class="feat-bar-track"><div class="feat-bar-fill" style="width:28%;background:#5588BB"></div></div>
<div class="feat-pct">#5</div>
</div>
<div style="margin-top:28px;font-size:11px;letter-spacing:2px;text-transform:uppercase;color:rgba(255,255,255,0.4);margin-bottom:14px;">Model Comparison</div>
<div class="model-compare">
<div class="model-compare-item">
<div class="model-compare-name">Linear Regression</div>
<div class="model-compare-val">0.310</div>
<div style="font-size:11px;color:rgba(255,255,255,0.3);margin-top:4px;">Baseline floor</div>
</div>
<div class="model-compare-item">
<div class="model-compare-name">Random Forest</div>
<div class="model-compare-val">0.520</div>
<div style="font-size:11px;color:rgba(255,255,255,0.3);margin-top:4px;">Strong benchmark</div>
</div>
<div class="model-compare-item">
<div class="model-compare-name">XGBoost (Baseline)</div>
<div class="model-compare-val">0.580</div>
<div style="font-size:11px;color:rgba(255,255,255,0.3);margin-top:4px;">Good out-of-box</div>
</div>
<div class="model-compare-item winner">
<div class="model-compare-name">XGBoost (Tuned) ★</div>
<div class="model-compare-val">0.737</div>
<div style="font-size:11px;color:rgba(255,255,255,0.5);margin-top:4px;">Selected model</div>
</div>
</div>
<div style="margin-top:20px;font-size:12px;color:rgba(255,255,255,0.35);font-style:italic;">
Key insight: Past sales trajectory explains demand better than any static product attribute. Brand matters more than shape, material, or size. MAE of 26.4 units/month provides an actionable planning buffer for initial order quantities.
</div>
</div>
<!-- 4mo forecast -->
<h3>4-Month Forward Forecast by Brand</h3>
<table>
<tr><th>Brand</th><th>Forecast Units (4mo)</th><th>Share</th><th>Avg / Mo / SKU</th></tr>
<tr><td><strong>Nike Optical</strong></td><td>160,615</td><td>54.6%</td><td>72.6</td></tr>
<tr><td>Lacoste Optical</td><td>67,844</td><td>23.1%</td><td>54.8</td></tr>
<tr><td>Calvin Klein Optical</td><td>38,437</td><td>13.1%</td><td>40.9</td></tr>
<tr><td>Lacoste Suns</td><td>18,145</td><td>6.2%</td><td>37.0</td></tr>
<tr><td>Calvin Klein Sun</td><td>4,701</td><td>1.6%</td><td>11.8</td></tr>
<tr><td>Nike Sun</td><td>4,525</td><td>1.5%</td><td>36.4</td></tr>
<tr style="background:var(--ink);color:var(--paper);"><td><strong>Total</strong></td><td><strong>294,268</strong></td><td>100%</td><td>—</td></tr>
</table>
</div>
<hr class="divider">
<!-- ══════════ 5. RECOMMENDATIONS ══════════ -->
<div class="section">
<div class="section-label">Section 5 · Strategic Recommendations</div>
<h2>Product Manager Action Plan</h2>
<p class="section-intro">14 prioritized actions derived directly from the data. Each is tied to the specific finding that justifies it.</p>
<div class="rec-grid">
<div class="rec-card">
<div class="rec-num">01</div>
<div class="rec-tag priority-high">HIGH · Assortment</div>
<div class="rec-title">Cut 10–15 SKUs from the Over-Assorted $150–$199 Tier</div>
<div class="rec-body">64 SKUs in this band generate only $4,017/SKU — 37% below the $200–$249 sweet spot. Target Nike AF-series Metal rectangles and CK overlapping styles. Criteria: under 200 units/year and not the sole representative of its size-shape-brand combination. Freed OTB shifts to $200–$249. <em>Deadline: Dec 15.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">02</div>
<div class="rec-tag priority-high">HIGH · AMER Growth</div>
<div class="rec-title">Add 4–6 Lacoste Optical Styles to AMER in the $200–$249 Band</div>
<div class="rec-body">Lacoste's $200–$249 tier generates $10,005/SKU — the best brand×tier combo in the entire portfolio. Yet Lacoste is only 14.6% of AMER vs 37.6% of EMEA. L2876 already appears in both regions' top performers, proving cross-regional appeal. Target: Square and Rectangle, 54–55mm, $199–$249. <em>Deadline: January buy.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">03</div>
<div class="rec-tag priority-high">HIGH · Seasonal</div>
<div class="rec-title">Floor All Hero SKUs by December 15</div>
<div class="rec-body">Sales jump 73–80% from December to March driven by insurance plan resets. Top 5 forecast SKUs predict 1,003–1,294 units/month. Any style arriving in February or later misses roughly 40% of its first-season potential. Implement December 15 as a hard floor-ready deadline for all new styles going forward. <em>Deadline: Dec 15.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">04</div>
<div class="rec-tag priority-high">HIGH · Innovation</div>
<div class="rec-title">Expand Titanium from 5 to 8–10 SKUs</div>
<div class="rec-body">Titanium generates $9,852/SKU — nearly 2× Acetate and the highest of any material. Nike's Titanium SKUs (NIKE 8045, NIKE 8154) are both top-10 performers at $295 retail. Add Titanium at $240–$260 to fill the gap between Bio-Inj and $285+ premium. Introduce a Lacoste Titanium option to broaden brand representation at the premium tier. <em>Deadline: Q1.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">05</div>
<div class="rec-tag priority-med">MEDIUM · Sunglass</div>
<div class="rec-title">Rationalize CK Sun: Cut from 15 to 5–6 SKUs</div>
<div class="rec-body">CK Sun generates $1,197/SKU — worst in the portfolio by a wide margin. 80% of its 15 SKUs are dead or slow. Keep only styles above 500 units/year. Freed floor space and OTB should shift to CK Optical's underserved $180–$220 band where demand is more consistent. <em>Deadline: Q1.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">06</div>
<div class="rec-tag priority-med">MEDIUM · Sunglass</div>
<div class="rec-title">Reduce Lacoste Suns from 18 to 8–10 SKUs; Reposition as EMEA-Only</div>
<div class="rec-body">17 of 18 Lacoste Sun SKUs are dead or slow. 84% of Lacoste Sun volume is EMEA — it's effectively a regional brand being carried globally. Keep the 8–10 highest-volume EMEA styles, eliminate AMER allocation. Freed OTB in AMER should fund the Lacoste Optical AMER expansion (Rec 02). <em>Deadline: Q1.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">07</div>
<div class="rec-tag priority-med">MEDIUM · Gender</div>
<div class="rec-title">Address the Female Assortment Gap — Nike & CK</div>
<div class="rec-body">Female patients are ~50% of the optical retail base but 15.8% of Visionworks sales. Per-SKU productivity is identical to male ($4,783 vs $4,817) — this is a supply problem, not demand. Nike female share is only 7% of Nike volume. Add 3–4 Nike female Round/Rectangle styles at $160–$210 in 54–55mm for AMER. Create a focused CK feminine capsule (Square + Round, $180–$220). <em>Deadline: Q1.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">08</div>
<div class="rec-tag priority-med">MEDIUM · EMEA</div>
<div class="rec-title">Build a Dedicated EMEA Buy List</div>
<div class="rec-body">The current top-10 forecast buy list is 9 of 10 Nike AMER styles. EMEA's #1 SKU is L2707 at 20,417 units — a Lacoste Square Acetate at $199.95. EMEA needs its own assortment plan anchored on Lacoste in 53mm, $200–$249, with higher sunglass allocation. A single global buy list systematically under-serves the EMEA market. <em>Deadline: January buy.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">09</div>
<div class="rec-tag priority-med">MEDIUM · Regional</div>
<div class="rec-title">Implement Separate Size Grids for AMER and EMEA</div>
<div class="rec-body">AMER peaks at 54mm; EMEA peaks at 53mm. Every new SKU decision should specify sizes by region separately. A style launched in 53mm and 55mm for EMEA but 54mm and 56mm for AMER will outperform a one-size-fits-all approach. Minor process change, measurable sell-through improvement. <em>Deadline: Q1.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">10</div>
<div class="rec-tag priority-med">MEDIUM · CK</div>
<div class="rec-title">Rationalize CK Optical from 32 to 20–25 Core SKUs</div>
<div class="rec-body">CK Optical generates $3,809/SKU — lowest among optical brands. With 32 SKUs and 6 dead, the brand is over-extended. Focus the assortment on $180–$220, the band where CK has natural brand equity. CK is the only gender-balanced brand (37% F / 37% M / 25% U) — use that distinction rather than fighting Nike and Lacoste on neutral territory. <em>Deadline: Q2.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">11</div>
<div class="rec-tag priority-low">LOW · White Space</div>
<div class="rec-title">Test 2–3 Oval Optical Styles</div>
<div class="rec-body">One Oval SKU generated 9,432 units — the highest avg/SKU of any shape, beating Rectangle (5,648), Square (6,264), and Round (4,705). Demand is proven; supply is a single style. Low risk test with 2–3 Oval optical frames in core sizes. Logical brand home: CK or Lacoste given both play in the fashion-forward optical space. <em>Deadline: Q2.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">12</div>
<div class="rec-tag priority-low">LOW · Trend</div>
<div class="rec-title">Test 2–3 Cat Eye Styles</div>
<div class="rec-body">Only 2 Cat Eye SKUs exist in the current assortment. The shape is growing nationally driven by Gen Z and Millennial consumers. Both existing Cat Eye SKUs have active buyers. CK or Lacoste brand home makes sense — keeps the trend positioning separate from Nike's performance identity. Low inventory risk given small initial test size. <em>Deadline: Q2.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">13</div>
<div class="rec-tag priority-low">LOW · Model</div>
<div class="rec-title">Extend Model Training Window to 24+ Months</div>
<div class="rec-body">The current model uses 12 months of history — Lag_6 has 873 null values as a result. A 24-month window would fully populate all lag features, unlock year-over-year seasonality signals, and is estimated to improve R² by 0.04–0.08. This is the single highest-value model improvement available without adding new data sources. <em>Deadline: Ongoing.</em></div>
</div>
<div class="rec-card">
<div class="rec-num">14</div>
<div class="rec-tag priority-low">LOW · Process</div>
<div class="rec-title">Implement a Seasonal Launch Calendar</div>
<div class="rec-body">Sales jump 73–80% between December and March. New styles arriving after February miss roughly 40% of their first-season peak. Embed December 15 as the standard floor-ready target in the annual planning calendar. Consider a "January Reset" merchandising campaign tied to insurance benefit renewal to actively drive traffic to the new assortment. <em>Deadline: Ongoing.</em></div>
</div>
</div>
<!-- Scorecard -->
<h3>Assortment Scorecard</h3>
<table>
<tr><th>Dimension</th><th>Current State</th><th>Grade</th><th>Priority Action</th></tr>
<tr><td>Price Architecture</td><td>Good $200–$249; over-crowded $150–$199 (64 SKUs, $4,017/SKU)</td><td><span class="badge badge-gold">B</span></td><td>Cut 10–15 mid-tier SKUs</td></tr>
<tr><td>Shape Coverage</td><td>Rectangle/Square 82%; Oval (1 SKU) and Cat Eye (2 SKUs) gaps</td><td><span class="badge badge-gold">B–</span></td><td>Add 4–6 Oval/Cat Eye styles</td></tr>
<tr><td>Material Mix</td><td>Bio-Inj/Acetate strong; Titanium only 5 SKUs despite $9,852/SKU</td><td><span class="badge badge-gold">B</span></td><td>Double Titanium SKU count</td></tr>
<tr><td>Gender Balance</td><td>Female only 15.8% of volume; Nike female share just 7%</td><td><span class="badge badge-red">C+</span></td><td>Add Nike/CK female-specific styles</td></tr>
<tr><td>Regional Fit</td><td>Same assortment AMER and EMEA despite different brand/size preferences</td><td><span class="badge badge-red">C</span></td><td>Separate size grids + EMEA buy list</td></tr>
<tr><td>Brand Mix</td><td>Lacoste underweighted in AMER (14.6% vs 37.6% EMEA)</td><td><span class="badge badge-gold">B–</span></td><td>Grow Lacoste in AMER</td></tr>
<tr><td>Sunglass Performance</td><td>10.2% of volume, 24% of SKUs; CK Sun $1,197/SKU</td><td><span class="badge badge-red">D+</span></td><td>Cut to 20–24 core Sun SKUs</td></tr>
<tr><td>SKU Productivity</td><td>81 dead SKU-region combos; Nike has 37 dead alone</td><td><span class="badge badge-gold">B–</span></td><td>Eliminate or replace dead SKUs</td></tr>
</table>
</div>
<div class="footer">
<div>VSP Vision · Visionworks · Frame Assortment Analysis · Sep 2023–Aug 2024</div>
<div>Model: XGBoost (Tuned) · R²=0.737 (log scale) · 162 SKUs · 3 Brands · 2 Regions</div>
</div>
</div><!-- /page -->
</body>
</html>