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

การตั้งค่าโครงการและการนำเข้าข้อมูล

กำหนดเป้าหมายโครงการ โหลดข้อมูลจาก CSV และฐานข้อมูล SQLite รวมแหล่งข้อมูล และตรวจสอบชุดข้อมูลที่รวมแล้วอย่างครบถ้วน

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

เป้าหมายของโครงงานสรุปยอด

ในโครงงานสรุปยอดนี้ คุณจะนำทักษะทุกอย่างจากหลักสูตรมารวมกัน — NumPy, Pandas, การแสดงข้อมูลเป็นภาพ, การทดสอบทางสถิติ, การเชื่อมต่อฐานข้อมูล และการออกแบบกระบวนการข้อมูล — ไว้ในเวิร์กโฟลว์เดียวตั้งแต่ต้นจนจบ โครงงานจำลองงานจริงของนักวิเคราะห์ ได้แก่ รับข้อมูลดิบจากสองแหล่ง (ไฟล์ CSV และตารางฐานข้อมูล) รวมข้อมูล ตรวจสอบคุณภาพข้อมูล คำนวณ KPI ขั้นสูง แสดงแนวโน้มเป็นภาพ และส่งออกรายงานที่จัดทำอย่างเรียบร้อย ซึ่งสะท้อนงานที่นักวิเคราะห์ข้อมูลมืออาชีพทำเป็นประจำในภาคอุตสาหกรรม

การกำหนดเป้าหมายโครงงานและ KPI

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

# Project configuration — define goals upfront
CONFIG = {
    'csv_path': 'data/orders_2024.csv',
    'db_url': 'sqlite:///customer_db.sqlite',
    'db_table': 'customers',
    'output_dir': 'output/',
    'report_path': 'output/report.md',
    'analysis_year': 2024,
    'top_n_regions': 5,
    'rolling_window_days': 30
}

print('Project config loaded.')
print('Target KPIs: monthly revenue, cohort retention, top regions by margin')

การโหลดข้อมูลจาก CSV

โหลด CSV โดยระบุอาร์กิวเมนต์ dtype และ parse_dates อย่างชัดเจน เพื่อหลีกเลี่ยงข้อผิดพลาดจากการอนุมาน ในโครงงานจริง CSV อาจถูกส่งออกโดยระบบอื่นที่ใช้รูปแบบแตกต่างกัน — ให้กำหนด encoding, sep และ thousands หากจำเป็น ตรวจสอบ shape, dtypes และ head() ทันที เพื่อยืนยันว่าการโหลดถูกต้องก่อนแปลงข้อมูล การตรวจสอบเบื้องต้นนี้มักเผยให้เห็นปัญหาการเข้ารหัส แถวหัวตารางส่วนเกิน หรือชื่อคอลัมน์ที่ไม่คาดคิด

import pandas as pd

df_orders = pd.read_csv(
    'data/orders_2024.csv',
    dtype={
        'order_id': 'int32',
        'customer_id': 'int32',
        'product_id': 'int32',
        'quantity': 'int16',
        'unit_price': 'float32',
        'region': 'category',
        'category': 'category'
    },
    parse_dates=['order_date'],
    encoding='utf-8'
)
print(f'Orders loaded: {df_orders.shape}')
print(df_orders.dtypes)
print(df_orders.head(3))

การโหลดข้อมูลจากฐานข้อมูล

แหล่งข้อมูลที่สองคือตารางลูกค้าในฐานข้อมูล SQLite ให้โหลดเฉพาะคอลัมน์ที่จำเป็นต่อการวิเคราะห์โดยใช้ SQL SELECT แทนการโหลดทั้งตาราง เชื่อมแหล่งข้อมูลทั้งสองด้วย customer_id เพื่อเติมข้อมูลประชากรของลูกค้าให้แต่ละคำสั่งซื้อ ก่อนรวมข้อมูล ให้ยืนยันว่าคีย์ customer_id ในทั้งสองแหล่งมีชนิดข้อมูลเดียวกัน — สาเหตุทั่วไปของการรวมข้อมูลล้มเหลวโดยไม่แสดงข้อผิดพลาดคือการนำคีย์ชนิด int32 ไปเปรียบเทียบกับคีย์ชนิดสตริง

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('sqlite:///customer_db.sqlite')

df_customers = pd.read_sql_query(
    '''
    SELECT customer_id, customer_name, country,
           acquisition_channel, signup_date
    FROM customers
    ''',
    con=engine,
    dtype={'customer_id': 'int32'},
    parse_dates=['signup_date']
)
print(f'Customers loaded: {df_customers.shape}')
print(df_customers.dtypes)
print(df_customers.head(3))

การรวมแหล่งข้อมูลสองแหล่ง

รวมคำสั่งซื้อกับข้อมูลลูกค้าด้วย customer_id โดยใช้ การเชื่อมแบบซ้าย เพื่อเก็บคำสั่งซื้อทั้งหมดไว้ แม้ไม่มีระเบียนลูกค้า หลังรวมข้อมูลแล้ว ให้ตรวจสอบว่ามีคำสั่งซื้อกี่รายการที่ไม่มีลูกค้าที่ตรงกัน (customer_name.isna().sum()) — นี่เป็นสัญญาณคุณภาพข้อมูลที่ควรตรวจสอบ ตรวจสอบขนาดของ DataFrame ที่ได้เพื่อยืนยันว่าการรวมข้อมูลไม่ได้ทำให้แถวซ้ำหรือลบแถวที่ไม่คาดคิด บันทึกตรรกะการรวมข้อมูลไว้ในข้อคิดเห็นสำหรับผู้ดูแลในอนาคต

import pandas as pd

# Left join: keep all orders, enrich with customer data where available
df = pd.merge(
    df_orders,
    df_customers,
    on='customer_id',
    how='left'
)

print(f'Orders: {len(df_orders)}, Customers: {len(df_customers)}')
print(f'Merged: {df.shape}')
unmatched = df['customer_name'].isna().sum()
print(f'Orders with no matching customer: {unmatched} ({unmatched/len(df):.1%})')

รายการตรวจสอบข้อมูลฉบับสมบูรณ์

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

import pandas as pd

def audit_dataframe(df, name='DataFrame'):
    print(f'=== Audit: {name} ===')
    print(f'Shape: {df.shape}')
    print(f'Date range: {df["order_date"].min()} to {df["order_date"].max()}')
    print(f'Duplicate order_ids: {df["order_id"].duplicated().sum()}')
    print('Missing values:')
    missing = df.isnull().sum()
    print(missing[missing > 0].to_string())
    print('Negative quantities:', (df['quantity'] < 0).sum())
    print('Negative prices:', (df['unit_price'] < 0).sum())
    print()

audit_dataframe(df, 'Merged Orders + Customers')

การแก้ไขความผิดปกติในการแยกวิเคราะห์วันที่

คอลัมน์วันที่จากไฟล์ CSV ที่ส่งออกมักมีกรณีพิเศษ เช่น วันที่ในอนาคตที่ไม่ควรมี วันที่อยู่ผิดปี (ข้อผิดพลาดจากการป้อนข้อมูลที่พบได้บ่อย) หรือวันที่หายไปสำหรับคำสั่งซื้อที่ยกเลิก หลังแยกวิเคราะห์วันที่แล้ว ให้ตรวจสอบช่วงวันที่ที่คาดหมายและแทนค่าที่อยู่นอกช่วงด้วย NaT นอกจากนี้ให้ตรวจสอบคำสั่งซื้อที่มี order_date < customer signup_date ด้วย — เหตุการณ์ที่เป็นไปไม่ได้นี้บ่งชี้ปัญหาคุณภาพข้อมูลที่ควรทำเครื่องหมายไว้ในรายงานการตรวจสอบ

import pandas as pd
from datetime import datetime

# Flag impossible dates
df['date_valid'] = (
    (df['order_date'] >= '2024-01-01') &
    (df['order_date'] <= datetime.now())
)
print('Invalid order dates:', (~df['date_valid']).sum())

# Flag orders before customer signup
df['signup_date'] = pd.to_datetime(df['signup_date'])
df['date_before_signup'] = df['order_date'] < df['signup_date']
print('Orders before customer signup:', df['date_before_signup'].sum())

# Set invalid dates to NaT
df.loc[~df['date_valid'], 'order_date'] = pd.NaT

การจัดการจำนวนติดลบและการคืนสินค้า

จำนวนติดลบในตารางคำสั่งซื้อมักหมายถึง การคืนสินค้าหรือการคืนเงิน แทนที่จะลบทิ้ง ให้แยกออกเป็น DataFrames สองชุด ได้แก่ คำสั่งซื้อที่เป็นบวกและการคืนสินค้า วิธีนี้ช่วยให้คุณคำนวณรายได้รวม (เฉพาะคำสั่งซื้อที่เป็นบวก) และรายได้สุทธิ (ค่าบวก + ค่าลบ) แยกกัน ทำให้เห็นภาพธุรกิจได้แม่นยำยิ่งขึ้น กำกับแต่ละแถวด้วยคอลัมน์บูลีน is_return และเก็บทั้งสองประเภทไว้ใน DataFrame ที่รวมแล้วเพื่อวัตถุประสงค์ด้านการตรวจสอบ

import pandas as pd

# Tag returns
df['is_return'] = df['quantity'] < 0

returns = df[df['is_return']]
orders = df[~df['is_return']]

print(f'Normal orders: {len(orders)}')
print(f'Returns/refunds: {len(returns)} ({len(returns)/len(df):.1%})')
print(f'Return rate by category:')
print(
    df.groupby('category')['is_return']
    .mean()
    .sort_values(ascending=False)
    .round(3)
)

การตรวจสอบความครบถ้วนของการเชื่อมข้อมูล

หลังการเชื่อมแบบซ้าย ให้ตรวจสอบว่าการเชื่อมข้อมูลครบถ้วนตามที่คาดไว้ นับจำนวนค่า customer_id ที่ไม่ซ้ำกันซึ่งปรากฏในคำสั่งซื้อแต่ไม่มีอยู่ในตารางลูกค้า ค่าเหล่านี้คือ ระเบียนกำพร้า — ลูกค้าที่สั่งซื้อแต่ไม่มีระเบียนลูกค้า อาจหมายถึงบัญชีที่ถูกลบ การชำระเงินโดยผู้เยี่ยมชม หรือช่องว่างในกระบวนการข้อมูล บันทึกจำนวนดังกล่าวและตัดสินใจว่าจะไม่นำไประบุในการวิเคราะห์การรักษาลูกค้าหรือไม่ แต่ให้รวมไว้ในยอดรายได้

import pandas as pd

order_customers = set(df_orders['customer_id'].unique())
customer_ids = set(df_customers['customer_id'].unique())

orphans = order_customers - customer_ids
print(f'Customer IDs in orders not in customer table: {len(orphans)}')
print(f'Coverage: {len(order_customers & customer_ids) / len(order_customers):.1%} of order customers have records')

# Revenue from unmatched customers
orphan_revenue = df[df['customer_id'].isin(orphans)]['unit_price'].sum()
print(f'Revenue from orphan customers: ${orphan_revenue:,.0f}')

การบันทึกชุดข้อมูลที่ผ่านการตรวจสอบ

หลังการตรวจสอบ ให้บันทึกชุดข้อมูลที่ทำความสะอาดและรวมแล้วเป็น Parquet เพื่อให้ขั้นตอนต่อ ๆ ไปของกระบวนการข้อมูล (การสร้างคุณลักษณะ การคำนวณ KPI และการแสดงข้อมูลเป็นภาพ) โหลดข้อมูลกลับมาได้ทันทีโดยไม่ต้องรวมและแยกวิเคราะห์ข้อมูลซ้ำ เขียนไฟล์แยกสำหรับคำสั่งซื้อที่สะอาดและ DataFrame การคืนสินค้า รูปแบบจุดตรวจนี้ทำให้กระบวนการข้อมูลสามารถทำต่อจากจุดเดิมได้ และช่วยให้แก้ไขข้อบกพร่องในขั้นตอนหลังได้โดยไม่ต้องเริ่มรับข้อมูลใหม่

import os
import pandas as pd

OS_DIR = 'output/'
os.makedirs(OS_DIR, exist_ok=True)

# Save clean orders (excluding returns and invalid dates)
clean_orders = df[
    (~df['is_return']) &
    df['order_date'].notna()
].copy()

clean_orders.to_parquet(OS_DIR + 'clean_orders.parquet', index=False)
df[df['is_return']].to_parquet(OS_DIR + 'returns.parquet', index=False)

print(f'Clean orders saved: {len(clean_orders):,} rows')
print(f'Returns saved: {len(df[df["is_return"]]):,} rows')
print(f'Files in {OS_DIR}: {os.listdir(OS_DIR)}')

รายงานสรุปการตรวจสอบ

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

import pandas as pd
from datetime import datetime

def write_audit_summary(df, path):
    lines = [
        '# Data Ingestion Audit',
        f'Generated: {datetime.now().strftime("%Y-%m-%d %H:%M")}',
        '',
        f'- Total records after merge: {len(df):,}',
        f'- Clean orders: {(~df["is_return"]).sum():,}',
        f'- Returns: {df["is_return"].sum():,}',
        f'- Date range: {df["order_date"].min().date()} to {df["order_date"].max().date()}',
        f'- Unique customers: {df["customer_id"].nunique():,}',
        f'- Unique categories: {df["category"].nunique()}',
        f'- Missing unit_price: {df["unit_price"].isna().sum()}'
    ]
    with open(path, 'w') as f:
        f.write('\n'.join(lines))

write_audit_summary(df, 'output/audit.md')
print('Audit summary written.')

ตรวจสอบความเข้าใจอย่างรวดเร็ว

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

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

ในบทเรียนนี้ คุณได้เรียนรู้ว่า การกำหนดเป้าหมายและการตั้งค่าล่วงหน้าช่วยให้ไปป์ไลน์มีจุดมุ่งหมายชัดเจนและดูแลรักษาได้ง่าย, อาร์กิวเมนต์ dtype และ parse_dates ที่ระบุอย่างชัดเจนใน read_csv ช่วยป้องกันข้อผิดพลาดของชนิดข้อมูลที่เกิดขึ้นโดยไม่รู้ตัว และรายการตรวจสอบข้อมูลอย่างเป็นระบบ (ข้อมูลซ้ำ ค่าที่หายไป วันที่เป็นไปไม่ได้ ปริมาณติดลบ) ช่วยตรวจพบปัญหาด้านคุณภาพก่อนที่จะทำให้การคำนวณ KPI ผิดพลาด ขั้นต่อไป เราจะทำความสะอาดข้อมูลและสร้างคุณลักษณะสำหรับการวิเคราะห์

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

บทเรียน “การตั้งค่าโครงการและการนำเข้าข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การตั้งค่าโครงการและการนำเข้าข้อมูล”

กำหนดเป้าหมายโครงการ โหลดข้อมูลจาก CSV และฐานข้อมูล SQLite รวมแหล่งข้อมูล และตรวจสอบชุดข้อมูลที่รวมแล้วอย่างครบถ้วน คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “การตั้งค่าโครงการและการนำเข้าข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

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