d8a80f6272
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해 끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은 과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업. 도구: Datacollect/scripts/link_reconcile_apply.mjs Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
263 lines
8.3 KiB
Markdown
263 lines
8.3 KiB
Markdown
---
|
|
id: wiki-2026-0508-e-commerce-optimization
|
|
title: E-commerce Optimization
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [CRO, conversion rate optimization, ecommerce growth, funnel optimization]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.95
|
|
verification_status: applied
|
|
tags: [ecommerce, conversion, optimization, growth-hacking, ab-testing, cro, ux]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: Python / TypeScript
|
|
framework: GA4 / Mixpanel / Optimizely / VWO
|
|
---
|
|
|
|
# E-commerce Optimization
|
|
|
|
## 매 한 줄
|
|
> **"매 funnel 의 매 step 의 conversion 의 increase"**. 매 visitor → cart → checkout → purchase → repeat 의 매 leakage 의 fix. 매 modern: 매 ML personalization + 매 A/B + 매 LLM (review summary, search). 매 metric: CVR, AOV, LTV.
|
|
|
|
## 매 핵심
|
|
|
|
### 매 funnel
|
|
1. **Acquisition**: 매 ad → land.
|
|
2. **Engagement**: 매 product browse.
|
|
3. **Conversion**: 매 add to cart → checkout.
|
|
4. **Retention**: 매 repeat purchase.
|
|
5. **Advocacy**: 매 review / referral.
|
|
|
|
### 매 key metric
|
|
- **CVR** (Conversion Rate): 매 purchase / visit.
|
|
- **AOV** (Average Order Value).
|
|
- **LTV** (Lifetime Value).
|
|
- **CAC** (Customer Acquisition Cost).
|
|
- **Cart abandonment rate**.
|
|
- **Repeat rate**.
|
|
|
|
### 매 lever
|
|
- **UX**: 매 PDP, search, navigation.
|
|
- **Pricing**: 매 dynamic + bundle.
|
|
- **Personalization**: 매 reco + DCO.
|
|
- **Trust**: 매 review + social proof.
|
|
- **Speed**: 매 Core Web Vitals.
|
|
- **Promotion**: 매 discount + urgency.
|
|
|
|
### 매 modern AI
|
|
- **Reco**: 매 sequence + transformer.
|
|
- **Visual search**: 매 CLIP-based.
|
|
- **Review summary**: 매 LLM.
|
|
- **Chat**: 매 product question.
|
|
- **Smart bundle**: 매 ML 의 affinity.
|
|
|
|
### 매 응용
|
|
1. **DTC brand**: 매 owned channel.
|
|
2. **Marketplace**: 매 search + reco.
|
|
3. **Subscription**: 매 churn + upsell.
|
|
4. **Luxury**: 매 service + AOV.
|
|
5. **B2B**: 매 quote + repeat.
|
|
|
|
## 💻 패턴
|
|
|
|
### Funnel analytics
|
|
```python
|
|
import pandas as pd
|
|
|
|
def funnel_drop(events_df):
|
|
steps = ['view_landing', 'view_product', 'add_to_cart', 'checkout', 'purchase']
|
|
counts = []
|
|
user_set = None
|
|
for step in steps:
|
|
users = set(events_df[events_df.event == step].user_id)
|
|
if user_set is None: user_set = users
|
|
else: user_set = user_set & users
|
|
counts.append((step, len(user_set)))
|
|
|
|
drops = []
|
|
for i in range(1, len(counts)):
|
|
drop = 1 - counts[i][1] / counts[i-1][1]
|
|
drops.append((counts[i-1][0], counts[i][0], drop))
|
|
return pd.DataFrame(drops, columns=['from', 'to', 'drop_rate'])
|
|
```
|
|
|
|
### A/B test (CUPED-adjusted)
|
|
```python
|
|
import numpy as np
|
|
from scipy import stats
|
|
|
|
def cuped_test(control, treatment, control_pre, treatment_pre):
|
|
"""매 pre-experiment covariate 의 variance 의 reduce."""
|
|
pre = np.concatenate([control_pre, treatment_pre])
|
|
post = np.concatenate([control, treatment])
|
|
theta = np.cov(pre, post)[0, 1] / np.var(pre)
|
|
|
|
c_adj = control - theta * (control_pre - pre.mean())
|
|
t_adj = treatment - theta * (treatment_pre - pre.mean())
|
|
return stats.ttest_ind(c_adj, t_adj)
|
|
```
|
|
|
|
### Cart abandonment recovery
|
|
```python
|
|
def abandoned_cart_email(user, cart, hours_since=2):
|
|
if cart.total < 50: return None # 매 ROI gate
|
|
|
|
discount = compute_personalized_discount(user, cart)
|
|
return {
|
|
'subject': f'Still thinking about your {cart.items[0].name}?',
|
|
'discount': discount,
|
|
'expires': now() + timedelta(hours=24),
|
|
'urgency': cart.items[0].inventory < 10,
|
|
}
|
|
```
|
|
|
|
### Recommender (collaborative filtering)
|
|
```python
|
|
import numpy as np
|
|
|
|
def item_item_cf(user_item, target_item, k=20):
|
|
"""매 cosine similarity 의 매 item 의 closest k."""
|
|
item_vec = user_item[:, target_item]
|
|
sims = []
|
|
for j in range(user_item.shape[1]):
|
|
if j == target_item: continue
|
|
sim = np.dot(item_vec, user_item[:, j]) / (
|
|
np.linalg.norm(item_vec) * np.linalg.norm(user_item[:, j]) + 1e-9
|
|
)
|
|
sims.append((j, sim))
|
|
return sorted(sims, key=lambda x: -x[1])[:k]
|
|
```
|
|
|
|
### Personalized search ranking
|
|
```python
|
|
def rerank(query_results, user):
|
|
scored = []
|
|
for item in query_results:
|
|
base = item.relevance_score
|
|
affinity = predict_affinity(user, item) # 매 ML
|
|
margin = item.margin
|
|
|
|
score = 0.6 * base + 0.3 * affinity + 0.1 * margin
|
|
scored.append((item, score))
|
|
return [i for i, _ in sorted(scored, key=lambda x: -x[1])]
|
|
```
|
|
|
|
### Review summarization (LLM)
|
|
```python
|
|
def summarize_reviews(reviews, n_pros=3, n_cons=3):
|
|
prompt = f"""Summarize the {len(reviews)} customer reviews below.
|
|
Output JSON with {n_pros} pros and {n_cons} cons (one short phrase each).
|
|
Reviews:
|
|
{format_reviews(reviews)}"""
|
|
return llm.generate(prompt)
|
|
```
|
|
|
|
### Bundle pricing (cross-sell)
|
|
```python
|
|
def bundle_recommend(cart, catalog, threshold=0.7):
|
|
# 매 affinity from co-purchase data
|
|
last_item = cart.items[-1]
|
|
candidates = [(c, affinity(last_item, c)) for c in catalog if c.id != last_item.id]
|
|
candidates.sort(key=lambda x: -x[1])
|
|
|
|
bundles = []
|
|
for c, score in candidates[:5]:
|
|
if score > threshold:
|
|
bundle_price = (last_item.price + c.price) * 0.9
|
|
bundles.append({'item': c, 'bundle_price': bundle_price, 'savings': last_item.price + c.price - bundle_price})
|
|
return bundles
|
|
```
|
|
|
|
### LTV prediction
|
|
```python
|
|
import xgboost as xgb
|
|
|
|
def predict_ltv(user_features):
|
|
"""매 first 30-day signal → 매 12-month LTV."""
|
|
model = xgb.XGBRegressor(n_estimators=300, max_depth=6).fit(X_train, y_train)
|
|
return model.predict(user_features.reshape(1, -1))[0]
|
|
```
|
|
|
|
### Cohort retention
|
|
```python
|
|
def retention_curve(orders_df):
|
|
orders_df['cohort_month'] = orders_df.groupby('user_id').order_date.transform('min').dt.to_period('M')
|
|
orders_df['order_month'] = orders_df.order_date.dt.to_period('M')
|
|
orders_df['period'] = (orders_df.order_month - orders_df.cohort_month).apply(lambda x: x.n)
|
|
|
|
cohort = orders_df.groupby(['cohort_month', 'period']).user_id.nunique().reset_index()
|
|
return cohort.pivot(index='cohort_month', columns='period', values='user_id')
|
|
```
|
|
|
|
### Page speed (Core Web Vitals)
|
|
```javascript
|
|
// 매 client-side measure
|
|
import { onLCP, onINP, onCLS } from 'web-vitals';
|
|
onLCP(({ value }) => analytics.track('LCP', { value }));
|
|
onINP(({ value }) => analytics.track('INP', { value }));
|
|
onCLS(({ value }) => analytics.track('CLS', { value }));
|
|
```
|
|
|
|
### Visual search (CLIP-style)
|
|
```python
|
|
from transformers import CLIPModel
|
|
model = CLIPModel.from_pretrained('openai/clip-vit-large-patch14')
|
|
|
|
def visual_search(query_image, catalog_embeds):
|
|
q_emb = model.get_image_features(preprocess(query_image))
|
|
sims = (q_emb @ catalog_embeds.T).softmax(-1)
|
|
return sims.topk(20).indices
|
|
```
|
|
|
|
### Smart upsell (post-purchase)
|
|
```python
|
|
def upsell(order, catalog):
|
|
bought_categories = {item.category for item in order.items}
|
|
candidates = [c for c in catalog if c.category in bought_categories]
|
|
return sorted(candidates, key=lambda c: c.cross_sell_score, reverse=True)[:3]
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 상황 | Lever |
|
|
|---|---|
|
|
| Low CVR | UX + trust |
|
|
| Low AOV | Bundle + upsell |
|
|
| High CAC | Retention + LTV |
|
|
| Cart abandon | Recovery email + urgency |
|
|
| Slow site | Core Web Vitals |
|
|
| Repeat low | Subscription + reco |
|
|
|
|
**기본값**: 매 funnel 진단 + 매 leak step 의 fix + 매 A/B 검증 + 매 reco / personalization for scale.
|
|
|
|
## 🔗 Graph
|
|
- 부모: [[E-commerce]]
|
|
- 변형: [[CRO]] · [[Funnel-Optimization]]
|
|
- 응용: [[Recommender-Systems]] · [[Dynamic Pricing & Offers]]
|
|
- Adjacent: [[Dynamic-Creative-Optimization]] · [[Core Web Vitals Optimization (INP, LCP, CLS)|Core-Web-Vitals]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: 매 e-commerce site. 매 marketplace. 매 DTC.
|
|
**언제 X**: 매 information-only. 매 niche / B2B-large-account.
|
|
|
|
## ❌ 안티패턴
|
|
- **Optimize without funnel data**: 매 wrong step.
|
|
- **AOV at expense of trust**: 매 dark pattern.
|
|
- **No A/B test**: 매 noise 의 confuse.
|
|
- **CAC ↑ chase**: 매 LTV 의 ignore.
|
|
- **Reco without diversity**: 매 echo bubble.
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (ConversionXL, Baymard, Booking.com Eng).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-04-20 | Auto-reinforced |
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — funnel + 매 A/B / cart / reco / LTV / cohort / CWV code |
|