Analytics

Marketplace Analytics ve KPI Takibi

E-ticaret veri analizi, conversion rate optimization, cohort analysis, RFM segmentation. Dashboard, KPI metrikleri ve data-driven karar alma.

📊E-Ticaret KPI'ları

Marketplace Analytics, satış, kullanıcı davranışı ve operasyonel metrikleri takip eder. Data-driven kararlar %30-50 daha etkilidir.

Revenue Metrics

• GMV (Gross Merchandise Value)
• Revenue (Gelir)
• AOV (Average Order Value)
• Take Rate (Komisyon oranı)

User Metrics

• DAU/MAU (Daily/Monthly Active)
• Conversion Rate
• CAC (Customer Acquisition Cost)
• LTV (Lifetime Value)

Operational

• Fulfillment Time
• Return Rate
• NPS (Net Promoter Score)
• Seller Retention

SQL ile Temel Analizler

-- 1. GMV ve Conversion Rate (günlük)
SELECT
    DATE(created_at) as date,
    COUNT(DISTINCT user_id) as visitors,
    COUNT(DISTINCT CASE WHEN status = 'completed' THEN order_id END) as orders,
    SUM(CASE WHEN status = 'completed' THEN total_amount ELSE 0 END) as gmv,
    ROUND(COUNT(DISTINCT CASE WHEN status = 'completed' THEN order_id END) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_rate,
    ROUND(AVG(CASE WHEN status = 'completed' THEN total_amount END), 2) as aov
FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE(created_at)
ORDER BY date DESC;

-- 2. Top 10 satıcılar (aylık)
SELECT
    seller_id,
    seller_name,
    COUNT(DISTINCT order_id) as order_count,
    SUM(total_amount) as revenue,
    AVG(rating) as avg_rating,
    COUNT(DISTINCT product_id) as product_count
FROM orders o
JOIN sellers s ON o.seller_id = s.id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days'
  AND o.status = 'completed'
GROUP BY seller_id, seller_name
ORDER BY revenue DESC
LIMIT 10;

-- 3. Kategori performansı
SELECT
    category_name,
    COUNT(DISTINCT order_id) as orders,
    SUM(total_amount) as revenue,
    AVG(total_amount) as avg_order_value,
    ROUND(SUM(total_amount) * 100.0 / SUM(SUM(total_amount)) OVER (), 2) as revenue_share
FROM orders o
JOIN products p ON o.product_id = p.id
JOIN categories c ON p.category_id = c.id
WHERE o.status = 'completed'
  AND o.created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY category_name
ORDER BY revenue DESC;

-- 4. Cohort retention analysis
WITH user_cohorts AS (
    SELECT
        user_id,
        DATE_TRUNC('month', MIN(created_at)) as cohort_month
    FROM orders
    GROUP BY user_id
),
cohort_data AS (
    SELECT
        uc.cohort_month,
        DATE_TRUNC('month', o.created_at) as order_month,
        COUNT(DISTINCT o.user_id) as users
    FROM orders o
    JOIN user_cohorts uc ON o.user_id = uc.user_id
    GROUP BY uc.cohort_month, DATE_TRUNC('month', o.created_at)
)
SELECT
    cohort_month,
    order_month,
    users,
    EXTRACT(MONTH FROM AGE(order_month, cohort_month)) as month_number
FROM cohort_data
ORDER BY cohort_month, order_month;

Python ile RFM Analizi

# RFM (Recency, Frequency, Monetary) Segmentation
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# Veri yükle
df = pd.read_sql("""
    SELECT
        user_id,
        order_date,
        total_amount
    FROM orders
    WHERE status = 'completed'
""", connection)

# RFM hesaplama
snapshot_date = df['order_date'].max() + timedelta(days=1)

rfm = df.groupby('user_id').agg({
    'order_date': lambda x: (snapshot_date - x.max()).days,  # Recency
    'user_id': 'count',  # Frequency
    'total_amount': 'sum'  # Monetary
})

rfm.columns = ['recency', 'frequency', 'monetary']

# RFM skorları (1-5 arası, 5 = en iyi)
rfm['r_score'] = pd.qcut(rfm['recency'], q=5, labels=[5,4,3,2,1])  # Düşük recency = iyi
rfm['f_score'] = pd.qcut(rfm['frequency'].rank(method='first'), q=5, labels=[1,2,3,4,5])
rfm['m_score'] = pd.qcut(rfm['monetary'], q=5, labels=[1,2,3,4,5])

# RFM segment
rfm['rfm_score'] = rfm['r_score'].astype(str) + rfm['f_score'].astype(str) + rfm['m_score'].astype(str)

# Segment tanımları
def rfm_segment(row):
    r, f, m = int(row['r_score']), int(row['f_score']), int(row['m_score'])

    if r >= 4 and f >= 4 and m >= 4:
        return 'Champions'  # En değerli müşteriler
    elif r >= 3 and f >= 3:
        return 'Loyal Customers'
    elif r >= 4 and f <= 2:
        return 'Promising'  # Yeni, potansiyel
    elif r <= 2 and f >= 3:
        return 'At Risk'  # Kaybetme riski
    elif r <= 2 and f <= 2:
        return 'Hibernating'  # Uzun süredir alışveriş yok
    elif r <= 1:
        return 'Lost'  # Kayıp müşteriler
    else:
        return 'Need Attention'

rfm['segment'] = rfm.apply(rfm_segment, axis=1)

# Segment analizi
segment_summary = rfm.groupby('segment').agg({
    'recency': 'mean',
    'frequency': 'mean',
    'monetary': ['mean', 'sum', 'count']
}).round(2)

print(segment_summary)
#                   recency  frequency  monetary
#                                         mean     sum  count
# Champions            12       8.5    15000   1.5M    100
# Loyal Customers      25       5.2     8000   4.0M    500
# At Risk             180       6.8    12000   2.4M    200
# Lost                365       3.1     5000     500K    100

# Aksiyon planı
actions = {
    'Champions': 'VIP benefits, early access, exclusive offers',
    'Loyal Customers': 'Loyalty program, upsell/cross-sell',
    'Promising': 'Onboarding emails, product recommendations',
    'At Risk': 'Win-back campaigns, personalized offers',
    'Hibernating': 'Re-engagement emails, steep discounts',
    'Lost': 'Survey (why left?), last-chance offers'
}

for segment, action in actions.items():
    users = rfm[rfm['segment'] == segment].index.tolist()
    print(f"{segment} ({len(users)} users): {action}")

Dashboard (Plotly)

# Plotly Dash ile interaktif dashboard
import dash
from dash import dcc, html
import plotly.express as px
import plotly.graph_objects as go

app = dash.Dash(__name__)

# KPI Cards
def create_kpi_card(title, value, change):
    return html.Div([
        html.H4(title),
        html.H2(f"{value:,.0f}" if isinstance(value, (int, float)) else value),
        html.P(f"↑ {change}% vs last month", style={'color': 'green' if change > 0 else 'red'})
    ], style={'border': '1px solid #ddd', 'padding': '20px', 'borderRadius': '8px'})

# Layout
app.layout = html.Div([
    html.H1('Marketplace Analytics Dashboard'),

    # KPI Row
    html.Div([
        create_kpi_card('GMV', 5_200_000, 15.3),
        create_kpi_card('Orders', 12_450, 8.7),
        create_kpi_card('AOV', 418, 6.2),
        create_kpi_card('Conversion', '3.2%', -1.5)
    ], style={'display': 'flex', 'gap': '20px', 'marginBottom': '30px'}),

    # Charts Row 1
    html.Div([
        dcc.Graph(id='revenue-trend'),
        dcc.Graph(id='category-breakdown')
    ], style={'display': 'flex', 'gap': '20px'}),

    # Charts Row 2
    html.Div([
        dcc.Graph(id='cohort-heatmap'),
        dcc.Graph(id='rfm-scatter')
    ], style={'display': 'flex', 'gap': '20px'})
])

# Revenue trend
@app.callback(
    dash.dependencies.Output('revenue-trend', 'figure'),
    dash.dependencies.Input('revenue-trend', 'id')
)
def update_revenue_trend(_):
    df_revenue = pd.read_sql("""
        SELECT DATE(created_at) as date, SUM(total_amount) as revenue
        FROM orders WHERE created_at >= CURRENT_DATE - 90
        GROUP BY date ORDER BY date
    """, connection)

    fig = px.line(df_revenue, x='date', y='revenue',
                  title='Daily Revenue Trend (Last 90 Days)')
    return fig

# Category breakdown
@app.callback(
    dash.dependencies.Output('category-breakdown', 'figure'),
    dash.dependencies.Input('category-breakdown', 'id')
)
def update_category_breakdown(_):
    df_category = pd.read_sql("""
        SELECT c.name, SUM(o.total_amount) as revenue
        FROM orders o
        JOIN products p ON o.product_id = p.id
        JOIN categories c ON p.category_id = c.id
        WHERE o.created_at >= CURRENT_DATE - 30
        GROUP BY c.name
        ORDER BY revenue DESC
        LIMIT 10
    """, connection)

    fig = px.pie(df_category, names='name', values='revenue',
                 title='Revenue by Category (Last 30 Days)')
    return fig

if __name__ == '__main__':
    app.run_server(debug=True, port=8050)

Google Analytics 4 Entegrasyonu

// GA4 e-commerce tracking (Next.js)
import ReactGA from 'react-ga4';

// GA4 initialize
ReactGA.initialize('G-XXXXXXXXXX');

// Product view
export const trackProductView = (product) => {
  ReactGA.event('view_item', {
    currency: 'TRY',
    value: product.price,
    items: [{
      item_id: product.id,
      item_name: product.name,
      item_category: product.category,
      price: product.price
    }]
  });
};

// Add to cart
export const trackAddToCart = (product, quantity) => {
  ReactGA.event('add_to_cart', {
    currency: 'TRY',
    value: product.price * quantity,
    items: [{
      item_id: product.id,
      item_name: product.name,
      quantity: quantity,
      price: product.price
    }]
  });
};

// Purchase
export const trackPurchase = (order) => {
  ReactGA.event('purchase', {
    transaction_id: order.id,
    value: order.total,
    currency: 'TRY',
    tax: order.tax,
    shipping: order.shipping,
    items: order.items.map(item => ({
      item_id: item.product_id,
      item_name: item.product_name,
      quantity: item.quantity,
      price: item.price
    }))
  });
};

// Search
export const trackSearch = (searchTerm, resultCount) => {
  ReactGA.event('search', {
    search_term: searchTerm,
    result_count: resultCount
  });
};

İş Etkileri

Analytics ROI

+42%
Conversion Rate
+28%
AOV Artışı
-35%
Churn Rate

Örnek: RFM Segmentation ROI

Önce: Tüm müşterilere aynı kampanya = %2.5 dönüşüm
RFM sonrası: Segment bazlı kampanya = %6.8 dönüşüm
Champions segment: %15 dönüşüm (özel teklifler)
At Risk segment: %8 win-back oranı
Toplam etki: +%172 campaign ROI

Analytics Altyapınızı Kuralım

KPI tracking, cohort analysis, RFM segmentation ve interactive dashboards ile data-driven kararlar alın.

Demo İste