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 7crosstab() กับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- pivot_table: ตารางไขว้
- melt: จากรูปแบบกว้างเป็นรูปแบบยาว
- stack และ unstack กับ MultiIndex
- crosstab สำหรับตารางความถี่