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

crosstab สำหรับตารางความถี่

คำนวณตารางไขว้ของความถี่หรือสัดส่วนระหว่างคอลัมน์หมวดหมู่สองคอลัมน์ด้วย pd.crosstab

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

ตารางไขว้คืออะไร

ตารางไขว้ (crosstab) ใช้นับว่าชุดค่าผสมแต่ละชุดจากตัวแปรประเภทหมวดหมู่สองตัวขึ้นไปปรากฏในชุดข้อมูลกี่ครั้ง ตารางนี้เป็นกรณีเฉพาะของตารางไพวอตที่ออกแบบมาเพื่อการนับโดยเฉพาะ Pandas มี pd.crosstab() เป็นวิธีกระชับสำหรับคำนวณตารางความถี่เหล่านี้ โดยไม่ต้องเรียกใช้ groupby() หรือ pivot_table() อย่างชัดเจน

การเรียกใช้ crosstab() พื้นฐาน

การเรียกใช้ pd.crosstab(index, columns) ขั้นต่ำจะรับข้อมูลนำเข้าที่มีลักษณะเหมือนอาร์เรย์สองชุด (โดยทั่วไปคือคอลัมน์ของ DataFrame) และส่งคืนตารางความถี่ แถวสอดคล้องกับค่าไม่ซ้ำกันในอาร์กิวเมนต์แรก ส่วนคอลัมน์สอดคล้องกับค่าไม่ซ้ำกันในอาร์กิวเมนต์ที่สอง แต่ละเซลล์เก็บจำนวนแถวที่ค่าทั้งสองปรากฏร่วมกันในข้อมูลเดิม

import pandas as pd

df = pd.DataFrame({
    'gender':  ['M', 'F', 'M', 'F', 'M', 'F', 'M'],
    'product': ['A', 'A', 'B', 'B', 'A', 'B', 'B']
})

ct = pd.crosstab(df['gender'], df['product'])
print(ct)
# product  A  B
# gender
# F        1  2
# M        2  2

การกำหนดชื่อแถวและคอลัมน์เอง

ใช้พารามิเตอร์ rownames และ colnames เพื่อตั้งชื่อที่สื่อความหมายให้แกนแถวและคอลัมน์ในผลลัพธ์ โดยแทนที่ชื่อ Series เริ่มต้น วิธีนี้มีประโยชน์เมื่อชื่อคอลัมน์ดิบใน DataFrame ไม่สามารถอธิบายตัวเองได้ชัดเจนในบริบทของตารางที่สร้างขึ้น

ct = pd.crosstab(
    df['gender'], df['product'],
    rownames=['Customer Gender'],
    colnames=['Purchased Product']
)
print(ct)
# Purchased Product  A  B
# Customer Gender
# F                  1  2
# M                  2  2

การเพิ่มผลรวม (ผลรวมแถวและคอลัมน์)

ส่ง margins=True เพื่อรวมแถวและคอลัมน์ที่คำนวณผลรวมของค่าทั้งหมด ป้ายกำกับผลรวมจะเป็น 'All' โดยค่าเริ่มต้น แต่สามารถปรับแต่งได้ด้วย margins_name แถวผลรวมจะแสดงจำนวนรวมของแต่ละคอลัมน์ คอลัมน์ผลรวมจะแสดงจำนวนรวมของแต่ละแถว และเซลล์มุมขวาล่างจะแสดงผลรวมทั้งหมด

ct = pd.crosstab(df['gender'], df['product'],
                 margins=True, margins_name='Total')
print(ct)
# product  A  B  Total
# gender
# F        1  2      3
# M        2  2      4
# Total    3  4      7

การปรับเป็นสัดส่วน

ส่งพารามิเตอร์ normalize เพื่อแปลงจำนวนให้เป็นสัดส่วน normalize=True หรือ normalize='all' จะหารด้วยผลรวมทั้งหมด normalize='index' จะคำนวณสัดส่วนของแถว (ผลรวมของแต่ละแถวเท่ากับ 1.0) normalize='columns' จะคำนวณสัดส่วนของคอลัมน์ (ผลรวมของแต่ละคอลัมน์เท่ากับ 1.0) สัดส่วนให้ข้อมูลที่มีประโยชน์มากกว่าจำนวนดิบเมื่อขนาดของกลุ่มแตกต่างกัน

# Row proportions: what fraction of each gender bought each product?
print(pd.crosstab(df['gender'], df['product'], normalize='index').round(2))
# product     A     B
# gender
# F        0.33  0.67
# M        0.50  0.50

# All proportions: each cell as fraction of grand total
print(pd.crosstab(df['gender'], df['product'], normalize=True).round(2))

การรวมค่าแทนการนับ

โดยค่าเริ่มต้น crosstab จะนับจำนวนแถว แต่คุณสามารถรวมค่าจากคอลัมน์ตัวเลขแทนได้ โดยส่งพารามิเตอร์ values และ aggfunc ซึ่งคล้ายกับ pivot_table() ตัวอย่างเช่น คำนวณรายได้รวมสำหรับชุดค่าผสมของเพศและผลิตภัณฑ์แต่ละชุด วิธีนี้ทำให้ crosstab มีความสามารถเกือบเทียบเท่า pivot_table แต่ใช้ไวยากรณ์ที่กระชับกว่าเล็กน้อยสำหรับกรณีใช้งานตารางความถี่

df['revenue'] = [100, 80, 150, 120, 200, 90, 130]

# Sum revenue by gender and product instead of counting
ct_rev = pd.crosstab(
    df['gender'], df['product'],
    values=df['revenue'],
    aggfunc='sum'
)
print(ct_rev)
# product    A    B
# gender
# F         80  210
# M        300  280

ตารางไขว้หลายระดับ

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

df['region'] = ['East', 'West', 'East', 'West', 'East', 'East', 'West']

ct_multi = pd.crosstab(
    [df['gender'], df['region']],
    df['product'],
    margins=True
)
print(ct_multi)
# product         A  B  All
# gender region
# F      East     0  1    1
#        West     1  1    2
# M      East     2  1    3
#        West     0  1    1
# All            3  4    7

crosstab() กับ pivot_table()

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

# crosstab (more concise for counting)
print(pd.crosstab(df['gender'], df['product']))

# Equivalent pivot_table
print(pd.pivot_table(df, index='gender', columns='product',
                     aggfunc='size', fill_value=0))
# Both produce the same result

การเตรียมข้อมูลสำหรับการทดสอบไคสแควร์

ตารางไขว้เป็นข้อมูลนำเข้ามาตรฐานสำหรับการทดสอบไคสแควร์เกี่ยวกับความเป็นอิสระ ซึ่งใช้ตรวจสอบว่าตัวแปรประเภทหมวดหมู่สองตัวมีความสัมพันธ์กันในเชิงสถิติหรือไม่ ฟังก์ชัน scipy.stats.chi2_contingency() รับอาร์เรย์จากตารางไขว้ได้โดยตรง นี่เป็นหนึ่งในการใช้งาน crosstab ที่พบบ่อยที่สุดในการวิเคราะห์ข้อมูลทางสถิติ โดยคำนวณตารางแล้วทดสอบต่อได้ในกระบวนการเดียวกัน

from scipy import stats

ct = pd.crosstab(df['gender'], df['product'])
# Convert to numpy array for scipy
chi2, p, dof, expected = stats.chi2_contingency(ct.values)
print(f'Chi2: {chi2:.2f}')
print(f'P-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
# p > 0.05 means no significant association

การแสดงตารางไขว้เป็นแผนที่ความร้อน

ตารางไขว้ที่มีหลายหมวดหมู่อาจตีความได้ยากเมื่อดูเป็นตัวเลขดิบ การแสดงเป็นแผนที่ความร้อนด้วย sns.heatmap() ทำให้มองเห็นรูปแบบได้ทันที โดยเซลล์ที่มีความถี่สูงจะแสดงเป็นสีสว่าง ส่งเวอร์ชันที่ปรับเป็นสัดส่วนเพื่อแสดงสัดส่วนแทนจำนวนดิบ และใช้ annot=True เพื่อแสดงค่าในแต่ละเซลล์

import seaborn as sns
import matplotlib.pyplot as plt

ct_norm = pd.crosstab(df['gender'], df['product'], normalize='index')

# sns.heatmap(ct_norm, annot=True, fmt='.0%', cmap='Blues')
# plt.title('Purchase Rate by Gender and Product')
# plt.tight_layout()
# plt.show()
print('Normalised crosstab ready for heatmap:')
print(ct_norm.round(2))

ตัวอย่างเชิงปฏิบัติ: การวิเคราะห์แบบสำรวจ

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

# Simulate a survey dataset
survey = pd.DataFrame({
    'age_group': ['18-25', '26-35', '18-25', '36-45', '26-35', '36-45'],
    'satisfaction': ['High', 'Low', 'High', 'Medium', 'High', 'Low']
})

ct = pd.crosstab(survey['age_group'], survey['satisfaction'],
                 margins=True, margins_name='Total')
print(ct)

rates = pd.crosstab(survey['age_group'], survey['satisfaction'],
                    normalize='index').round(2)
print(rates)

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ pd.crosstab สำหรับสร้างตารางความถี่จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า pd.crosstab() ใช้คำนวณ จำนวนความถี่ สำหรับชุดค่าผสมของตัวแปรเชิงหมวดหมู่สองตัว; normalize ใช้แปลงจำนวนเป็น สัดส่วนตามแถว คอลัมน์ หรือทั้งหมด; margins=True ใช้เพิ่ม ผลรวม ของแถวและคอลัมน์; และผลลัพธ์จาก crosstab สามารถใช้ร่วมกับ การทดสอบไคสแควร์ และการแสดงข้อมูลด้วยแผนที่ความร้อนได้โดยตรง บทถัดไป เราจะทำงานกับข้อมูลอนุกรมเวลาโดยใช้ DatetimeIndex และช่วงเวลา

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

บทเรียน “crosstab สำหรับตารางความถี่” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “crosstab สำหรับตารางความถี่”

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

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

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

บทเรียน “crosstab สำหรับตารางความถี่” ใช้เวลานานแค่ไหน

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

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

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

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

  1. pivot_table: ตารางไขว้
  2. melt: จากรูปแบบกว้างเป็นรูปแบบยาว
  3. stack และ unstack กับ MultiIndex
  4. crosstab สำหรับตารางความถี่
← กลับไปที่ Pandas & NumPy Academy