KAIST Junior · 2026년 1학기 · 데이터 2차시
데이터 2차시 과제 제출 준비
까다로운 데이터 요리하기 — groupby · loc · sort_values · 히스토그램 · 제출 마감: 2026년 5월 3일(일) 23:59
📌 이 문서의 용도
이번 차시 데이터 과제는 서울시 자치구별 버스 승객수 데이터(bus_merged) 를 활용하는 3가지.
이 문서는 실제 데이터를 기반으로 예상 정답 값 을 미리 계산해 정리한 준비용 자료입니다.
노트북에서 결과 숫자를 확인할 때 여기 값과 일치하면 OK.
1. 과제 파일 체크리스트
bus.csv, master.csv 파일 2개 확보 (과제 공지에서 다운로드)
- Colab 에서
2차시_한정연.ipynb 열기 → 두 CSV 업로드 후 전 셀 실행
- 각 과제별 출력 결과 스크린샷
- 과제 3 히스토그램 이미지 저장
- docx/hwp 보고서에 결과 + 분포 특징 서술 작성
- 노트북 + 보고서를
한정연_데이터_2차시.zip 으로 압축 제출
2. 과제 1. 자치구별 평균 / 최대 버스 승객 수
1-1. 자치구별 평균 + 강남구의 평균 승객 수
코드:
gu_mean = bus_merged.groupby('자치구_명칭')['버스_승객_수'].mean()
print(f'강남구 평균: {gu_mean["강남구"]:.2f}명')
예상 출력: 강남구 평균 ≈ 9,741.82명
참고 — 자치구 수: 서울 25개 자치구 전체 평균이 계산되며, 강남구 행정동 22개 기준 평균.
1-2. 자치구별 최대 + 가장 많았던 자치구
코드:
gu_max = bus_merged.groupby('자치구_명칭')['버스_승객_수'].max()
print(gu_max.sort_values(ascending=False).head())
print(f'최대 자치구: {gu_max.idxmax()} ({gu_max.max()}명)')
예상 출력 (Top 5):
| 순위 | 자치구 | 최대 승객수 | 대표 행정동 |
| 1 | 마포구 | 54,011명 | 서교동 |
| 2 | 종로구 | 46,764명 | 종로1·2·3·4가동 |
| 3 | 영등포구 | 33,656명 | 영등포동 |
| 4 | 서대문구 | 32,106명 | 신촌동 |
| 5 | 용산구 | 29,401명 | 이태원동 |
답: 마포구 (54,011명)
3. 과제 2. loc + sort_values 로 조건 추출
2-1. 강남구 OR 승객수 30,000 이상 행 추출 (loc 사용)
코드:
mask = (bus_merged['자치구_명칭'] == '강남구') | (bus_merged['버스_승객_수'] >= 30000)
result = bus_merged.loc[mask, ['행정동_명칭', '버스_승객_수']]
print(result)
⚠️ 흔한 실수: "이거나" = | (OR). &(AND) 를 쓰면 "강남구이면서 30,000 이상"으로 바뀌어 결과가 크게 달라진다. 그리고 각 조건은 반드시 괄호로 감싸야 한다.
예상 출력: 총 26개 행
- 강남구 행정동 22개 (원본 데이터 기준): 개포1·2·3·4동, 논현1·2동, 대치1·2·4동, 도곡1·2동, 삼성1·2동, 세곡동, 수서동, 신사동, 압구정동, 역삼1·2동, 일원1동, 일원본동, 청담동 — 대치3동은 원본 bus.csv 에 없음
- 승객수 30,000+ 4개 (강남구 외):
- 종로구 종로1·2·3·4가동 — 46,764명
- 서대문구 신촌동 — 32,106명
- 마포구 서교동 — 54,011명
- 영등포구 영등포동 — 33,656명
2-2. sort_values 다중 정렬 (자치구 가나다 → 행정동 가나다)
코드:
result = bus_merged.sort_values(by=['자치구_명칭', '행정동_명칭'])
print(result[['자치구_명칭', '행정동_명칭', '버스_승객_수']].head(3))
예상 출력 (첫 3행):
| 자치구 | 행정동 | 승객수 |
| 강남구 | 개포1동 | 3,461명 |
| 강남구 | 개포2동 | 5,977명 |
| 강남구 | 개포3동 | 2,353명 |
답: 개포1동 · 3,461명
가나다순에서 자치구는 '강'으로 시작하는 강남구, 그 안의 행정동은 개포1동 이 첫 번째.
4. 과제 3. 영등포구 히스토그램 + 분포 분석
3-1. 영등포구 분포의 특징 서술
기초 통계:
| 지표 | 값 |
| 행정동 수 | 18개 |
| 평균 (Mean) | 8,132명 |
| 중앙값 (Median) | 4,873명 |
| 표준편차 (Std) | 8,847명 |
| 최솟값 / 최댓값 | 2,604명 / 33,656명 |
분포의 특징 (서술 답안 예시):
① 극단적인 Right Skew (오른쪽 긴 꼬리) 분포
- 18개 행정동 중 16개가 약 2,600 ~ 12,000명 구간 에 몰려 있다.
- 반면 2개 행정동(여의동 29,803명, 영등포동 33,656명) 이 12,000 ~ 29,000 구간을 완전히 비워두고 훨씬 오른쪽에 떨어져 있다.
- 전형적인 Right skew 형태. 평균(8,132) > 중앙값(4,873) 관계가 성립.
② 극단값(Outlier) 영향
- 평균이 중앙값의 약 1.7배. 두 큰 값이 평균을 끌어올린 결과.
- 표준편차 8,847명은 평균(8,132)과 거의 같은 크기 → 분포가 매우 흩어져 있음.
- "영등포구 평균 버스 승객수 8,132명" 이라고만 하면 실제 대부분 행정동(5,000 명 내외)을 오해하게 만드는 숫자.
③ 왜 이런 분포가 나왔을까? (해석)
- 영등포구는 영등포역·여의도·문래 같은 상업/업무 지구(유동인구 많음)와 도림·양평·대림 같은 주거 지구(상대적 적음)가 공존.
- 광복절(2025-08-15) 데이터라 평일 출퇴근 수요는 낮지만 상업지구 나들이 수요가 특정 행정동에 집중.
- 결론: 중심값(평균·중앙값)과 흩어짐(표준편차)을 함께 봐야 분포 전체를 이해할 수 있다. Right skew 분포에서는 중앙값이 대표성이 더 높다.
5. 제출 문서 구조 예시
📝 워크북 권장 구조
[표지]
- 과정명, 이름, 학교
[과제 1]
- 1-1 코드 캡처 + 출력 캡처 + 강남구 평균 답
- 1-2 코드 캡처 + Top 5 출력 캡처 + 최대 자치구 답
[과제 2]
- 2-1 코드 캡처 + 결과 일부 캡처 (26행 중 상위 10행)
- 2-2 코드 캡처 + 첫 행 결과 캡처 + 답 (개포1동)
[과제 3]
- 영등포구 추출 코드
- 평균/중앙값 숫자 출력
- 히스토그램 이미지 (mean=빨강 점선, median=주황 실선)
- 3-1 분포 특징 서술 (③ 문단 구조 참고)
6. 제출 전 최종 체크리스트
- 노트북 모든 셀이 오류 없이 실행됐는지 확인
- 과제 1-1, 1-2 코드와 결과 캡처 (강남구 평균, 마포구 최대)
- 과제 2-1, 2-2 코드와 결과 캡처 (26행, 개포1동)
- 과제 3 히스토그램 이미지 + 3-1 분포 특징 서술 (최소 3문단)
- 파일명:
2차시_한정연.ipynb, 한정연_데이터_2차시_답안.docx
- 두 파일을
한정연_데이터_2차시.zip 으로 압축
- 제출 마감 2026-05-03 (일) 23:59 이전 제출 (2차 제출 시 80% 감점)
Junior KAIST 2026 1학기 · 데이터 2차시 과제 제출 준비 자료