การวิเคราะห์และการคำนวณ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่าโครงการและการนำเข้าข้อมูล
- การทำความสะอาดข้อมูลและวิศวกรรมคุณลักษณะ
- การวิเคราะห์และการคำนวณ KPI
- การแสดงผลขั้นสุดท้ายและการส่งออกรายงาน