0Pricing
Pandas & NumPy Academy · บทเรียน

การวิเคราะห์และการคำนวณ KPI

คำนวณการรักษาผู้ใช้ตามรุ่นรายเดือน รายได้ระดับผลิตภัณฑ์ และผู้ใช้ที่ใช้งานในช่วง 30 วันแบบเลื่อน โดยใช้ groupby, pivot และ rolling

การวิเคราะห์และการคำนวณ KPI เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

การโหลดข้อมูลพร้อมสำหรับการวิเคราะห์

เมื่อทำความสะอาดและสร้างคุณลักษณะเสร็จแล้ว ให้โหลดจุดตรวจสอบ analysis_ready.parquet และเริ่มคำนวณ KPI ขั้นตอนนี้เป็นการวิเคราะห์ล้วน ๆ โดยไม่ต้องทำความสะอาดข้อมูลเพิ่มเติม การมีจุดตรวจสอบที่สะอาดและผ่านการตรวจสอบแล้วช่วยให้คุณปรับปรุงคำจำกัดความของ KPI ได้อย่างรวดเร็ว โดยไม่ต้องเรียกใช้ขั้นตอนการนำเข้าและการทำความสะอาดที่ใช้เวลานานซ้ำ KPI สามรายการที่จะคำนวณคือ การรักษาลูกค้าตามกลุ่มรายเดือน, รายได้ระดับผลิตภัณฑ์แยกตามหมวดหมู่ และผู้ใช้งานที่ใช้งานอยู่ในช่วง 30 วันแบบสะสม

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')
print(f'Loaded: {df.shape}')
print('KPIs to compute:')
print('  1. Monthly cohort retention matrix')
print('  2. Category revenue and margin ranking')
print('  3. Rolling 30-day active users per region')

KPI 1: รายได้รายเดือนแยกตามหมวดหมู่

KPI แรกคือรายได้รายเดือนแยกตามหมวดหมู่ จัดกลุ่มตามทั้ง year_month และ category รวมรายได้ แล้วทำ pivot เพื่อให้หมวดหมู่เป็นคอลัมน์และเดือนเป็นแถว ตาราง pivot นี้เป็นพื้นฐานของแผนภูมิเส้นแนวโน้มและแผนภูมิแท่งหมวดหมู่อันดับต้น ๆ ในรายงาน ใช้ค่าเฉลี่ยเคลื่อนที่ 3 เดือนเพื่อทำให้แนวโน้มเรียบขึ้นและเน้นให้เห็นรูปแบบตามฤดูกาล

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Monthly revenue by category
monthly_cat = (
    df.groupby(['year_month', 'category'])['revenue']
    .sum()
    .reset_index()
    .pivot(index='year_month', columns='category', values='revenue')
    .fillna(0)
    .sort_index()
)

# 3-month rolling average
monthly_cat_smooth = monthly_cat.rolling(3, min_periods=1).mean()

print('Monthly revenue by category (head):')
print(monthly_cat.round(0).head())
print('Shape:', monthly_cat.shape)

KPI 2: ภูมิภาคที่มีรายได้รวมสูงสุด

จัดอันดับภูมิภาคตามรายได้รวมตลอดช่วงเวลาทั้งหมด ใช้ groupby().agg() เพื่อคำนวณสถิติหลายรายการพร้อมกัน ได้แก่ รายได้รวม จำนวนคำสั่งซื้อ จำนวนลูกค้าที่ไม่ซ้ำกัน และมูลค่าคำสั่งซื้อเฉลี่ย เรียงตามรายได้รวมจากมากไปน้อยและเก็บ 10 อันดับแรก คำนวณสัดส่วนรายได้ของแต่ละภูมิภาคเทียบกับยอดรวมทั้งหมด วิธีนี้ช่วยเผยให้เห็นความเสี่ยงจากการกระจุกตัว (หากรายได้ 80% มาจากภูมิภาคเดียว ธุรกิจก็พึ่งพาพื้นที่ทางภูมิศาสตร์มากเกินไป)

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

region_kpi = (
    df.groupby('region')
    .agg(
        total_revenue=('revenue', 'sum'),
        order_count=('order_id', 'nunique'),
        unique_customers=('customer_id', 'nunique'),
        avg_order_value=('revenue', 'mean')
    )
    .reset_index()
    .sort_values('total_revenue', ascending=False)
)

total = region_kpi['total_revenue'].sum()
region_kpi['revenue_share'] = (region_kpi['total_revenue'] / total).round(3)

print(region_kpi.head(10).to_string(index=False))

KPI 3: เมทริกซ์การรักษาลูกค้าตามกลุ่ม

เมทริกซ์การรักษาลูกค้าตามกลุ่มแสดงเปอร์เซ็นต์ของลูกค้าจากแต่ละกลุ่มลูกค้าตามช่วงเวลาที่กลับมาซื้ออย่างน้อยหนึ่งครั้งในแต่ละช่วงเวลาถัดไป คำนวณด้วยสามขั้นตอน: (1) กำหนด 'หมายเลขช่วงเวลา' ให้แต่ละคำสั่งซื้อ โดยเท่ากับจำนวนเดือนนับจากเดือนของกลุ่มลูกค้า; (2) จัดกลุ่มตามกลุ่มลูกค้าและหมายเลขช่วงเวลา แล้วนับจำนวนลูกค้าที่ไม่ซ้ำกัน; (3) หารด้วยขนาดของกลุ่มลูกค้า (จำนวนในช่วงเวลา 0) เพื่อหาอัตราการรักษาลูกค้า จากนั้นทำ pivot ให้อยู่ในรูปแบบกลุ่มลูกค้า × ช่วงเวลา

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Compute months since cohort start
df['cohort_period'] = (
    (df['order_date'].dt.to_period('M') -
     pd.PeriodIndex(df['cohort_month'], freq='M'))
    .apply(lambda x: x.n)
)

cohort_data = (
    df.groupby(['cohort_month', 'cohort_period'])['customer_id']
    .nunique()
    .reset_index()
    .rename(columns={'customer_id': 'customers'})
)

# Pivot: rows=cohort, columns=period
cohort_pivot = cohort_data.pivot(
    index='cohort_month', columns='cohort_period', values='customers'
)

cohort_sizes = cohort_pivot[0]
retention = cohort_pivot.divide(cohort_sizes, axis=0).round(3)
print('Retention matrix (first 3 cohorts):')
print(retention.head(3))

KPI 4: ผู้ใช้งานที่ใช้งานอยู่ในช่วง 30 วันแบบสะสม

ผู้ใช้งานรายวัน (DAU) และรูปแบบหน้าต่างเวลาแบบสะสมเป็น KPI หลักของผลิตภัณฑ์ ให้คำนวณจำนวนลูกค้าที่ไม่ซ้ำกันซึ่งซื้อสินค้าในหน้าต่างเวลา 30 วันใด ๆ เริ่มจากคำนวณผู้ซื้อที่ไม่ซ้ำกันรายวัน กำหนดวันที่เป็นดัชนี แล้วใช้ rolling('30D').apply(lambda x: x.nunique()) แต่โปรดทราบว่า rolling บน DatetimeIndex ต้องใช้การรวมข้อมูลเฉพาะรูปแบบ อีกทางเลือกหนึ่งคือใช้การนับค่าที่ไม่ซ้ำกันแบบสะสมโดยอาศัยเซตผ่านฟังก์ชันหน้าต่างแบบกำหนดเอง

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Daily unique purchasers
daily = (
    df.groupby('order_date')['customer_id']
    .nunique()
    .reset_index()
    .rename(columns={'customer_id': 'daily_unique_customers'})
    .set_index('order_date')
    .sort_index()
)

# 30-day rolling sum (approximation: sum of daily unique purchasers)
# True rolling unique requires custom logic
daily['rolling_30d'] = daily['daily_unique_customers'].rolling('30D').sum()

print('Rolling 30-day active customers:')
print(daily.tail())

การจัดอันดับรายได้ระดับผลิตภัณฑ์

สำหรับการวิเคราะห์ระดับผลิตภัณฑ์ ให้จัดอันดับรหัสผลิตภัณฑ์ทั้งหมดตามรายได้รวม และคำนวณสัดส่วนรายได้สะสม วิธีนี้ช่วยให้เห็นว่ารายได้เป็นไปตามการกระจายแบบพาเรโตหรือไม่ (ข้อค้นพบทั่วไปคือ ผลิตภัณฑ์ประมาณ 20% สร้างรายได้ประมาณ 80%) คำนวณคอลัมน์รายได้สะสมด้วย .cumsum() และหาจำนวนผลิตภัณฑ์ที่เป็นจุดตัดเมื่อสัดส่วนสะสมเกิน 80% การวิเคราะห์นี้ช่วยชี้แนะแนวทางการจัดลำดับความสำคัญของกลุ่มผลิตภัณฑ์

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

product_rev = (
    df.groupby('product_id')['revenue']
    .sum()
    .sort_values(ascending=False)
    .reset_index()
)

total_rev = product_rev['revenue'].sum()
product_rev['rev_share'] = product_rev['revenue'] / total_rev
product_rev['cumulative_share'] = product_rev['rev_share'].cumsum()

pct80_cutoff = (product_rev['cumulative_share'] <= 0.80).sum()
total_products = len(product_rev)
print(f'Top {pct80_cutoff} of {total_products} products ({pct80_cutoff/total_products:.0%}) '
      f'generate 80% of revenue (Pareto)')
print(product_rev.head())

การบันทึกตาราง KPI ทั้งหมด

บันทึกตาราง KPI แต่ละรายการเป็นไฟล์ Parquet ที่มีชื่อตามกำหนดในไดเรกทอรีผลลัพธ์ รูปแบบการตั้งชื่อคือ kpi_{name}.parquet วิธีนี้ทำให้ขั้นตอนการแสดงภาพข้อมูลทำได้ง่าย เพราะจะอ่านตารางที่คำนวณไว้ล่วงหน้าตามต้องการโดยไม่ต้องคำนวณซ้ำ นอกจากนี้ ให้บันทึกสรุป KPI รวมเป็นไฟล์ CSV เพื่อให้แบ่งปันกับผู้มีส่วนได้ส่วนเสียที่ไม่ใช่ผู้เชี่ยวชาญด้านเทคนิคและอาจเปิดไฟล์ด้วย Excel ได้ง่าย

import pandas as pd

# Save all KPI tables
monthly_cat.to_parquet('output/kpi_monthly_category_revenue.parquet')
region_kpi.to_parquet('output/kpi_region_summary.parquet', index=False)
retention.to_parquet('output/kpi_cohort_retention.parquet')
daily.to_parquet('output/kpi_rolling_active_users.parquet')
product_rev.to_parquet('output/kpi_product_ranking.parquet', index=False)

# Also a CSV summary for sharing
region_kpi.to_csv('output/region_summary.csv', index=False)

print('All KPI tables saved:')
print('  kpi_monthly_category_revenue.parquet')
print('  kpi_region_summary.parquet')
print('  kpi_cohort_retention.parquet')
print('  kpi_rolling_active_users.parquet')
print('  kpi_product_ranking.parquet')

การตรวจสอบ KPI ทางสถิติ

ก่อนสรุป KPI ให้เรียกใช้การตรวจสอบทางสถิติ: ทดสอบว่าการเติบโตของรายได้รายเดือนมีนัยสำคัญทางสถิติหรือไม่ โดยใช้การทดสอบทีแบบกลุ่มตัวอย่างเดียวเทียบกับการเติบโตเป็นศูนย์ และตรวจสอบว่าความแตกต่างของรายได้ระหว่างภูมิภาคมีนัยสำคัญหรือไม่โดยใช้การวิเคราะห์ความแปรปรวนทางเดียว การรายงานว่า 'ภูมิภาคที่มีรายได้สูงสุด' จะมีความหมายมากขึ้นเมื่อคุณยืนยันได้ว่าความแตกต่างดังกล่าวไม่น่าจะเกิดจากความผันผวนแบบสุ่ม เพิ่มค่า p ลงในตาราง KPI เป็นคอลัมน์ข้อมูลกำกับ

import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_parquet('output/analysis_ready.parquet')

# Is revenue growth statistically significant?
monthly_total = df.groupby('year_month')['revenue'].sum().sort_index()
month_changes = monthly_total.diff().dropna()
stat, p = stats.ttest_1samp(month_changes, popmean=0)
print(f'Monthly growth test: mean={month_changes.mean():.0f}, p={p:.4f}')
print('Significant positive trend?', month_changes.mean() > 0 and p < 0.05)

# ANOVA: do regions differ significantly?
groups = [g['revenue'].values for _, g in df.groupby('region')]
f, p_anova = stats.f_oneway(*groups)
print(f'Region ANOVA: F={f:.3f}, p={p_anova:.4f}')

การคำนวณอัตราการเติบโตเมื่อเทียบกับเดือนก่อน

อัตราการเติบโตเมื่อเทียบกับเดือนก่อน (MoM)เป็น KPI ทางธุรกิจพื้นฐาน: growth = (current - previous) / previous × 100 ใช้ pct_change() เพื่อคำนวณอย่างเป็นระบบ ค่าเฉลี่ยเคลื่อนที่ 3 เดือนของการเติบโตแบบ MoM ช่วยเผยให้เห็นแนวโน้มพื้นฐานและลดความผันผวนรายเดือน อัตราการเติบโตติดลบมีความสำคัญพอ ๆ กับอัตราที่เป็นบวก เพราะบ่งชี้ช่วงเวลาที่จำเป็นต้องตรวจสอบ

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

monthly_total = (
    df.groupby('year_month')['revenue'].sum().sort_index()
)

growth = monthly_total.pct_change() * 100
trend = growth.rolling(3, min_periods=1).mean()

kpi_growth = pd.DataFrame({
    'revenue': monthly_total,
    'mom_growth_pct': growth.round(2),
    'trend_3m_avg': trend.round(2)
})

print(kpi_growth.tail(6))
print(f'\nBest month: {monthly_total.idxmax()} (${monthly_total.max():,.0f})')
print(f'Worst month: {monthly_total.idxmin()} (${monthly_total.min():,.0f})')

การตรวจจับความผิดปกติแบบอัตโนมัติ

ตรวจจับเดือนที่ผิดปกติโดยอัตโนมัติ ได้แก่ เดือนที่รายได้เบี่ยงเบนจากค่าเฉลี่ยย้อนหลัง 6 เดือนมากกว่า 2 ส่วนเบี่ยงเบนมาตรฐาน เดือนเหล่านี้ควรได้รับการตรวจสอบ เพราะอาจสะท้อนเหตุการณ์ทางธุรกิจที่เกิดขึ้นจริง เช่น แคมเปญที่ประสบความสำเร็จหรือระบบข้อมูลหยุดทำงาน หรืออาจเกิดจากปัญหาคุณภาพข้อมูล เช่น โหลดข้อมูลซ้ำสองครั้ง การตรวจจับความผิดปกติเป็นส่วนเสริมที่มีคุณค่าสำหรับแดชบอร์ดของ pipeline อัตโนมัติ และช่วยให้นักวิเคราะห์มุ่งเน้นการตรวจสอบช่วงเวลาที่สำคัญที่สุด

import pandas as pd
import numpy as np

df = pd.read_parquet('output/analysis_ready.parquet')
monthly = df.groupby('year_month')['revenue'].sum().sort_index()

rolling_mean = monthly.rolling(6, min_periods=3).mean()
rolling_std = monthly.rolling(6, min_periods=3).std()

anomalies = monthly[
    (monthly > rolling_mean + 2 * rolling_std) |
    (monthly < rolling_mean - 2 * rolling_std)
]
print('Anomalous months (>2 std from 6-month rolling mean):')
if len(anomalies) > 0:
    print(anomalies.round(0))
else:
    print('None detected')

ตารางสรุป KPI

จัดทำตารางสรุปสำหรับผู้บริหารเพียงตารางเดียว โดยรวมค่าระดับบนสุดจาก KPI ทั้งหมด ได้แก่ รายได้รวม จำนวนคำสั่งซื้อรวม จำนวนลูกค้าที่ไม่ซ้ำ มูลค่าคำสั่งซื้อเฉลี่ย ภูมิภาคที่ดีที่สุด หมวดหมู่ที่ดีที่สุด และอัตราการคงอยู่เฉลี่ยของกลุ่มลูกค้าในช่วง 30 วันที่เดือนที่ 3 สรุปในตารางเดียวนี้จะเป็นหน้าแรกของรายงาน ช่วยให้ผู้มีส่วนได้ส่วนเสียเห็นภาพรวมสำคัญได้ทันที ก่อนลงรายละเอียดในแผนภูมิและตารางต่าง ๆ

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')
retention = pd.read_parquet('output/kpi_cohort_retention.parquet')
region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')

summary = {
    'Total Revenue': f'${df["revenue"].sum():,.0f}',
    'Total Orders': f'{df["order_id"].nunique():,}',
    'Unique Customers': f'{df["customer_id"].nunique():,}',
    'Avg Order Value': f'${df["revenue"].mean():.2f}',
    'Best Region': region_kpi.iloc[0]["region"],
    'Best Category': df.groupby("category")["revenue"].sum().idxmax(),
    'Avg Month-3 Retention': f'{retention.get(3, pd.Series([0])).mean():.1%}'
}

for k, v in summary.items():
    print(f'{k:25s}: {v}')

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจแนวคิดด้านการวิเคราะห์ข้อมูลจากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า groupby + pivot ใช้สร้างเมทริกซ์รายได้รายเดือนตามหมวดหมู่และตารางการคงอยู่ของกลุ่มลูกค้า, rolling() ใช้คำนวณแนวโน้มที่ปรับให้ราบเรียบและค่าประมาณผู้ใช้ที่ใช้งานในช่วง 30 วัน และการตรวจสอบทางสถิติ (การทดสอบ t สำหรับการเติบโต และ ANOVA สำหรับความแตกต่างระหว่างภูมิภาค) ช่วยเพิ่มความน่าเชื่อถือให้กับเรื่องราวของ KPI ขั้นถัดไป เราจะสร้างภาพหลายแผงเพื่อแสดงผลลัพธ์ทั้งหมด และส่งออกรายงานฉบับสมบูรณ์

คำถามที่พบบ่อย

บทเรียน “การวิเคราะห์และการคำนวณ KPI” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การวิเคราะห์และการคำนวณ KPI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์และการคำนวณ KPI”

คำนวณการรักษาผู้ใช้ตามรุ่นรายเดือน รายได้ระดับผลิตภัณฑ์ และผู้ใช้ที่ใช้งานในช่วง 30 วันแบบเลื่อน โดยใช้ groupby, pivot และ rolling คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การวิเคราะห์และการคำนวณ KPI” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่าโครงการและการนำเข้าข้อมูล
  2. การทำความสะอาดข้อมูลและวิศวกรรมคุณลักษณะ
  3. การวิเคราะห์และการคำนวณ KPI
  4. การแสดงผลขั้นสุดท้ายและการส่งออกรายงาน
← กลับไปที่ Pandas & NumPy Academy