[Pandas-Crosstab] 파이썬으로 빈도표 쉽게 만드는 초간단 방법
[Pandas Crosstab ] 함수를 이용해서 빈도 테이블(Frequency Table) 을 만들어보자
먼저 데이터프레임을 준비해보자
import pandas as pd
import numpy as np
raw_data = {'name': ['수정', '수연', '민정', '우현', '재수', '우재', '수정', '수연', '지수', '유빈'], 
        'subject': ['math', 'math', 'math', 'english', 'english', 'english', 'english', 'english', 'chemistry', 'biology'], 
        'level': ['beginner', 'beginner', 'intermediate', 'intermediate', 'intermediate', 'intermediate', 'intermediate', 'intermediate','intermediate', 'intermediate'],
        'tutor': ['Ali', 'Ali', 'Ali', 'Ali', 'Ali', 'Ali', 'Jacob', 'Jacob', 'Jacob', 'Jacob'], 
        'pre_test_score': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3],
        'post_test_score': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['name', 'subject', 'level', 'tutor', 'pre_test_score', 'post_test_score'])
df
| name | subject | level | tutor | pre_test_score | post_test_score | |
|---|---|---|---|---|---|---|
| 0 | 수정 | math | beginner | Ali | 4 | 25 | 
| 1 | 수연 | math | beginner | Ali | 24 | 94 | 
| 2 | 민정 | math | intermediate | Ali | 31 | 57 | 
| 3 | 우현 | english | intermediate | Ali | 2 | 62 | 
| 4 | 재수 | english | intermediate | Ali | 3 | 70 | 
| 5 | 우재 | english | intermediate | Ali | 4 | 25 | 
| 6 | 수정 | english | intermediate | Jacob | 24 | 94 | 
| 7 | 수연 | english | intermediate | Jacob | 31 | 57 | 
| 8 | 지수 | chemistry | intermediate | Jacob | 2 | 62 | 
| 9 | 유빈 | biology | intermediate | Jacob | 3 | 70 | 
post_test_score 가 70점 이상이면 합격, 미만이면 불합격인 column 을 추가해주자
df['post_test_pass_fail'] = np.where(df['post_test_score'] >= 70, "Pass", "Fail")
df
| name | subject | level | tutor | pre_test_score | post_test_score | post_test_pass_fail | |
|---|---|---|---|---|---|---|---|
| 0 | 수정 | math | beginner | Ali | 4 | 25 | Fail | 
| 1 | 수연 | math | beginner | Ali | 24 | 94 | Pass | 
| 2 | 민정 | math | intermediate | Ali | 31 | 57 | Fail | 
| 3 | 우현 | english | intermediate | Ali | 2 | 62 | Fail | 
| 4 | 재수 | english | intermediate | Ali | 3 | 70 | Pass | 
| 5 | 우재 | english | intermediate | Ali | 4 | 25 | Fail | 
| 6 | 수정 | english | intermediate | Jacob | 24 | 94 | Pass | 
| 7 | 수연 | english | intermediate | Jacob | 31 | 57 | Fail | 
| 8 | 지수 | chemistry | intermediate | Jacob | 2 | 62 | Fail | 
| 9 | 유빈 | biology | intermediate | Jacob | 3 | 70 | Pass | 
Tutor 기준으로 post_test_pass_fail 의 빈도를 구해보자
- Ali 와 Jacob 이 가르치는 학생들의 시험 합격 여부를 볼 수 있다
pd.crosstab(df.tutor, df.post_test_pass_fail, margins=True)
| post_test_pass_fail | Fail | Pass | All | 
|---|---|---|---|
| tutor | |||
| Ali | 4 | 2 | 6 | 
| Jacob | 2 | 2 | 4 | 
| All | 6 | 4 | 10 | 
Tutor 기준으로 subject 과 post_test_pass_fail 빈도도 볼 수 있다
- 튜터 기준으로 시험과목과 시험 합격 여부를 빈도표로 표현
pd.crosstab(df.tutor, [df.subject, df.post_test_pass_fail], margins=True)
| subject | biology | chemistry | english | math | All | ||
|---|---|---|---|---|---|---|---|
| post_test_pass_fail | Pass | Fail | Fail | Pass | Fail | Pass | |
| tutor | |||||||
| Ali | 0 | 0 | 2 | 1 | 2 | 1 | 6 | 
| Jacob | 1 | 1 | 1 | 1 | 0 | 0 | 4 | 
| All | 1 | 1 | 3 | 2 | 2 | 1 | 10 | 
Subject 과 level 기준으로, post_test_pass_fail 빈도 확인해보자
- 시험 과목과 레벨을 기준으로, 시험 합격 여부를 보고 싶다면 아래와 같이 표현 할 수 있다
pd.crosstab([df.subject, df.level], df.post_test_pass_fail, margins=True)
| post_test_pass_fail | Fail | Pass | All | |
|---|---|---|---|---|
| subject | level | |||
| biology | intermediate | 0 | 1 | 1 | 
| chemistry | intermediate | 1 | 0 | 1 | 
| english | intermediate | 3 | 2 | 5 | 
| math | beginner | 1 | 1 | 2 | 
| intermediate | 1 | 0 | 1 | |
| All | 6 | 4 | 10 | 
crosstab 에 접근하기
- crosstab 으로 만들어진 객체는 데이터프레임이므로, loc으로 아래와 같이 위 테이블을 접근할 수 있다
pd.crosstab([df.subject, df.level], df.post_test_pass_fail, margins=True).loc[[('english', 'intermediate')]]
| post_test_pass_fail | Fail | Pass | All | |
|---|---|---|---|---|
| subject | level | |||
| english | intermediate | 3 | 2 | 5 | 
crosstab 을 엑셀 파일로 저장해보자
- pandas.to_excel 로 저장 가능!
pd.crosstab(df.tutor, [df.subject, df.post_test_pass_fail], margins=True).to_excel("crosstab_sample.xlsx")
댓글남기기