숙제 노트북 — 다음 수업 전까지 (Day 1 복습 문제집)¶
하루 한 섹션(20~30분)씩, 3일에 걸쳐 진행합니다.
| 순서 | 섹션 | 내용 |
|---|---|---|
| 1일째 | A | NumPy 복습 8문제 (심화 보너스 1 포함) |
| 2일째 | B | Pandas 복습 7문제 |
| 3일째 | C | 새 데이터 종합 도전 7문제 + 나만의 질문 |
진행 규칙
- 시작 전
파일 → Drive에 사본 저장(최초 1회) - 매일 시작할 때 [준비] 셀부터 실행 (건너뛰면 df가 없다는 에러가 납니다)
- 5분 고민해도 막히면 각 섹션 끝 "정답 보기"를 확인하고, 그 문제는 표시해 두었다가 다음 날 다시 풀기
In [ ]:
Copied!
# [준비] 매일 이 셀 먼저 실행! — 도구 불러오기 + 우리 반 데이터 만들기
import numpy as np
import pandas as pd
df = pd.DataFrame({
"이름": ["민준", "서연", "도윤", "하은", "시우", "지우", "주원", "서준", "지아", "예준",
"하린", "은우", "수아", "지호", "아린", "선우", "유나", "정우", "소율", "시윤"],
"반": ["1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반",
"2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반"],
"좋아하는과목": ["체육", "수학", "체육", "음악", "과학", "체육", "수학", "미술", "국어", "체육",
"음악", "과학", "체육", "수학", "음악", "체육", "국어", "과학", "미술", "체육"],
"국어": [85, 92, 70, 88, 76, 95, 64, 81, 90, 73,
78, 84, 66, 91, 87, 59, 94, 72, 80, 68],
"수학": [78, 95, 62, 84, 90, 71, 88, 55, 79, 92,
83, 96, 58, 89, 74, 67, 85, 91, 63, 77],
"게임시간": [10, 3, 14, 6, 4, 8, 5, 15, 7, 3,
6, 2, 13, 4, 9, 12, 3, 5, 11, 8],
})
print("준비 완료! 우리 반", len(df), "명 데이터가 만들어졌어요.")
df.head(3)
# [준비] 매일 이 셀 먼저 실행! — 도구 불러오기 + 우리 반 데이터 만들기
import numpy as np
import pandas as pd
df = pd.DataFrame({
"이름": ["민준", "서연", "도윤", "하은", "시우", "지우", "주원", "서준", "지아", "예준",
"하린", "은우", "수아", "지호", "아린", "선우", "유나", "정우", "소율", "시윤"],
"반": ["1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반", "1반",
"2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반", "2반"],
"좋아하는과목": ["체육", "수학", "체육", "음악", "과학", "체육", "수학", "미술", "국어", "체육",
"음악", "과학", "체육", "수학", "음악", "체육", "국어", "과학", "미술", "체육"],
"국어": [85, 92, 70, 88, 76, 95, 64, 81, 90, 73,
78, 84, 66, 91, 87, 59, 94, 72, 80, 68],
"수학": [78, 95, 62, 84, 90, 71, 88, 55, 79, 92,
83, 96, 58, 89, 74, 67, 85, 91, 63, 77],
"게임시간": [10, 3, 14, 6, 4, 8, 5, 15, 7, 3,
6, 2, 13, 4, 9, 12, 3, 5, 11, 8],
})
print("준비 완료! 우리 반", len(df), "명 데이터가 만들어졌어요.")
df.head(3)
A. NumPy 복습 (1일째)¶
소재: 나의 일주일 용돈 기록 (월~일, 원 단위)
In [ ]:
Copied!
# 일주일 용돈 데이터 (월~일) — 실행만 하세요
money = np.array([1000, 0, 3000, 500, 2000, 5000, 1500])
print(money)
# 일주일 용돈 데이터 (월~일) — 실행만 하세요
money = np.array([1000, 0, 3000, 500, 2000, 5000, 1500])
print(money)
In [ ]:
Copied!
# A-1: 일주일 용돈의 평균을 출력해 보세요.
# 힌트: money.mean()
# A-1: 일주일 용돈의 평균을 출력해 보세요.
# 힌트: money.mean()
In [ ]:
Copied!
# A-2: 다음 주에 용돈이 2배가 된다면? money를 2배 한 결과를 출력해 보세요.
# 힌트: money * ??
# A-2: 다음 주에 용돈이 2배가 된다면? money를 2배 한 결과를 출력해 보세요.
# 힌트: money * ??
In [ ]:
Copied!
# A-3: 가장 많이 받은 날의 금액과, 가장 적게 받은 날의 금액을 출력해 보세요.
# 힌트: money.max() 와 money.min()
# A-3: 가장 많이 받은 날의 금액과, 가장 적게 받은 날의 금액을 출력해 보세요.
# 힌트: money.max() 와 money.min()
In [ ]:
Copied!
# A-4: 주말(토·일) 이틀치만 잘라내 보세요. (money의 마지막 2개)
# 힌트: money[-2:] ← "뒤에서 2번째부터 끝까지"라는 뜻!
# A-4: 주말(토·일) 이틀치만 잘라내 보세요. (money의 마지막 2개)
# 힌트: money[-2:] ← "뒤에서 2번째부터 끝까지"라는 뜻!
In [ ]:
Copied!
# A-5: 2000원 이상 받은 날의 금액만 골라내 보세요.
# 힌트: money[money >= ??]
# A-5: 2000원 이상 받은 날의 금액만 골라내 보세요.
# 힌트: money[money >= ??]
In [ ]:
Copied!
# A-6: 2000원 이상 받은 날이 며칠인지 세어 보세요.
# 힌트: (money >= 2000).sum() 또는 len(money[money >= 2000])
# A-6: 2000원 이상 받은 날이 며칠인지 세어 보세요.
# 힌트: (money >= 2000).sum() 또는 len(money[money >= 2000])
In [ ]:
Copied!
# A-7 (조합!): 1000원 이상 받은 날들"만"의 평균을 구해 보세요.
# 힌트: 골라내기와 평균을 이어 붙이기 → money[money >= ??].mean()
# A-7 (조합!): 1000원 이상 받은 날들"만"의 평균을 구해 보세요.
# 힌트: 골라내기와 평균을 이어 붙이기 → money[money >= ??].mean()
In [ ]:
Copied!
# A-8 (심화 보너스): 2000원 이상 받은 날은 전체의 몇 %(비율)일까요?
# 트릭: True는 1, False는 0으로 계산됨 → "조건의 평균 = 비율"
# 힌트: (money >= 2000).mean() → 0.43 이 나오면 43%라는 뜻
# A-8 (심화 보너스): 2000원 이상 받은 날은 전체의 몇 %(비율)일까요?
# 트릭: True는 1, False는 0으로 계산됨 → "조건의 평균 = 비율"
# 힌트: (money >= 2000).mean() → 0.43 이 나오면 43%라는 뜻
A 정답 보기 (A-1 ~ A-8)
print(money.mean()) # A-1
print(money * 2) # A-2
print(money.max(), money.min()) # A-3
print(money[-2:]) # A-4
print(money[money >= 2000]) # A-5
print((money >= 2000).sum(), "일") # A-6
print(money[money >= 1000].mean()) # A-7
print((money >= 2000).mean()) # A-8 (약 0.43 = 43%)
A 섹션 끝. 다음은 B 섹션입니다.
B. Pandas 복습 (2일째)¶
소재: 우리 반 성적 데이터(df) — 시작 전에 [준비] 셀을 먼저 실행하세요.
In [ ]:
Copied!
# B-1: df의 앞에서 4행만 출력해 보세요.
# 힌트: df.head(??)
# B-1: df의 앞에서 4행만 출력해 보세요.
# 힌트: df.head(??)
In [ ]:
Copied!
# B-2: 우리 반 수학 최고 점수는 몇 점일까요? ("수학" 열의 최댓값)
# 힌트: df["수학"].max()
# B-2: 우리 반 수학 최고 점수는 몇 점일까요? ("수학" 열의 최댓값)
# 힌트: df["수학"].max()
In [ ]:
Copied!
# B-3: 게임시간이 10시간 이상인 학생만 골라 보세요.
# 힌트: df[df["??"] >= ??]
# B-3: 게임시간이 10시간 이상인 학생만 골라 보세요.
# 힌트: df[df["??"] >= ??]
In [ ]:
Copied!
# B-4: 좋아하는과목이 "체육"인 학생만 골라 보세요.
# 힌트: 비교 연산자는 == (= 는 대입, == 는 비교) → df[df["좋아하는과목"] == "??"]
# B-4: 좋아하는과목이 "체육"인 학생만 골라 보세요.
# 힌트: 비교 연산자는 == (= 는 대입, == 는 비교) → df[df["좋아하는과목"] == "??"]
In [ ]:
Copied!
# B-5: 게임시간이 "적은" 순으로 정렬해서 상위 3명을 보세요. (오름차순!)
# 힌트: 적은 순(작은→큰)이 기본값이라 ascending을 안 써도 돼요 → df.sort_values("??").head(3)
# B-5: 게임시간이 "적은" 순으로 정렬해서 상위 3명을 보세요. (오름차순!)
# 힌트: 적은 순(작은→큰)이 기본값이라 ascending을 안 써도 돼요 → df.sort_values("??").head(3)
In [ ]:
Copied!
# B-6: 새 열 "평균점수"를 만들어 보세요. 평균점수 = (국어 + 수학) / 2
# 힌트: df["평균점수"] = (df["국어"] + df["??"]) / 2 → 확인은 df.head(3)
# B-6: 새 열 "평균점수"를 만들어 보세요. 평균점수 = (국어 + 수학) / 2
# 힌트: df["평균점수"] = (df["국어"] + df["??"]) / 2 → 확인은 df.head(3)
In [ ]:
Copied!
# B-7 (조합!): 체육을 좋아하는 학생들"만"의 게임시간 평균을 구해 보세요.
# 힌트: 골라내기 → 열 뽑기 → 평균, 3단 콤보!
# df[df["좋아하는과목"] == "체육"]["게임시간"].mean() ← 구조를 소리 내어 읽어보세요
# B-7 (조합!): 체육을 좋아하는 학생들"만"의 게임시간 평균을 구해 보세요.
# 힌트: 골라내기 → 열 뽑기 → 평균, 3단 콤보!
# df[df["좋아하는과목"] == "체육"]["게임시간"].mean() ← 구조를 소리 내어 읽어보세요
B 정답 보기 (B-1 ~ B-7)
df.head(4) # B-1
print(df["수학"].max()) # B-2
df[df["게임시간"] >= 10] # B-3
df[df["좋아하는과목"] == "체육"] # B-4
df.sort_values("게임시간").head(3) # B-5
df["평균점수"] = (df["국어"] + df["수학"]) / 2 # B-6
print(df[df["좋아하는과목"] == "체육"]["게임시간"].mean()) # B-7
B 섹션 끝. 다음은 C 섹션(새 데이터 종합 도전)입니다.
C. 종합 도전 (3일째) — 게임 캐릭터 데이터 분석¶
처음 보는 데이터를 지금까지 배운 것만으로 혼자 힘으로 분석해 봅니다. (Day 2 미니 프로젝트의 예행연습입니다)
In [ ]:
Copied!
# 게임 캐릭터 데이터 — 실행만 하세요
chars = pd.DataFrame({
"캐릭터": ["불꽃기사", "얼음마녀", "바람궁수", "빛의힐러", "그림자검사",
"천둥법사", "강철방패", "독안개궁수", "달빛힐러", "폭풍전사"],
"직업": ["전사", "마법사", "궁수", "힐러", "전사",
"마법사", "전사", "궁수", "힐러", "전사"],
"레벨": [52, 48, 61, 35, 57, 44, 39, 66, 50, 58],
"공격력": [88, 95, 76, 42, 91, 99, 55, 83, 47, 90],
"방어력": [80, 45, 52, 60, 66, 38, 97, 49, 72, 75],
})
chars
# 게임 캐릭터 데이터 — 실행만 하세요
chars = pd.DataFrame({
"캐릭터": ["불꽃기사", "얼음마녀", "바람궁수", "빛의힐러", "그림자검사",
"천둥법사", "강철방패", "독안개궁수", "달빛힐러", "폭풍전사"],
"직업": ["전사", "마법사", "궁수", "힐러", "전사",
"마법사", "전사", "궁수", "힐러", "전사"],
"레벨": [52, 48, 61, 35, 57, 44, 39, 66, 50, 58],
"공격력": [88, 95, 76, 42, 91, 99, 55, 83, 47, 90],
"방어력": [80, 45, 52, 60, 66, 38, 97, 49, 72, 75],
})
chars
In [ ]:
Copied!
# C-1: 새 데이터를 받으면 제일 먼저 하는 일! 요약 통계(describe)를 확인해 보세요.
# 평균 레벨은 얼마인가요?
# 힌트: chars.describe()
# C-1: 새 데이터를 받으면 제일 먼저 하는 일! 요약 통계(describe)를 확인해 보세요.
# 평균 레벨은 얼마인가요?
# 힌트: chars.describe()
In [ ]:
Copied!
# C-2: 레벨 50 이상인 "고레벨" 캐릭터만 골라 보세요.
# 힌트: chars[chars["??"] >= ??]
# C-2: 레벨 50 이상인 "고레벨" 캐릭터만 골라 보세요.
# 힌트: chars[chars["??"] >= ??]
In [ ]:
Copied!
# C-3: 직업이 "마법사"인 캐릭터만 골라 보세요.
# 힌트: 문자열 비교는 == 연산자!
# C-3: 직업이 "마법사"인 캐릭터만 골라 보세요.
# 힌트: 문자열 비교는 == 연산자!
In [ ]:
Copied!
# C-4: 새 열 "전투력"을 만들어 보세요. 전투력 = 공격력 + 방어력
# 힌트: chars["전투력"] = chars["??"] + chars["??"]
# C-4: 새 열 "전투력"을 만들어 보세요. 전투력 = 공격력 + 방어력
# 힌트: chars["전투력"] = chars["??"] + chars["??"]
In [ ]:
Copied!
# C-5: 전투력이 가장 높은 캐릭터 1명은 누구인가요? (정렬 → 1명)
# 힌트: chars.sort_values("??", ascending=False).head(1)
# C-5: 전투력이 가장 높은 캐릭터 1명은 누구인가요? (정렬 → 1명)
# 힌트: chars.sort_values("??", ascending=False).head(1)
In [ ]:
Copied!
# C-6 (조합!): "전사" 직업 캐릭터들만의 평균 공격력을 구해 보세요.
# 힌트: B-7과 같은 3단 콤보 → chars[조건]["공격력"].mean()
# C-6 (조합!): "전사" 직업 캐릭터들만의 평균 공격력을 구해 보세요.
# 힌트: B-7과 같은 3단 콤보 → chars[조건]["공격력"].mean()
In [ ]:
Copied!
# C-6+ (심화 보너스): 직업이 "전사" 이면서(그리고) 레벨 50 이상인 캐릭터를 찾아보세요.
# 조건 두 개는 & 로 잇고, 각 조건을 반드시 괄호로 감쌉니다.
# 힌트: chars[(chars["직업"] == "??") & (chars["레벨"] >= ??)]
# C-6+ (심화 보너스): 직업이 "전사" 이면서(그리고) 레벨 50 이상인 캐릭터를 찾아보세요.
# 조건 두 개는 & 로 잇고, 각 조건을 반드시 괄호로 감쌉니다.
# 힌트: chars[(chars["직업"] == "??") & (chars["레벨"] >= ??)]
C-7 (자유 문제) — 나만의 질문 만들기¶
이 데이터에 대해 스스로 질문을 하나 만들고, 아래 셀에 코드로 답해 보세요. (예: "궁수 중 레벨이 더 높은 쪽은?", "방어력이 가장 낮은 캐릭터는?", "레벨 50 이상이면서 공격력 80 이상은?")
면접 참고: "스스로 질문을 만들어 데이터로 답해 본" 경험은 자기소개서·면접에서 그대로 쓸 수 있는 소재입니다.
In [ ]:
Copied!
# C-7: 나만의 질문 → 코드로 답하기 (자유!)
# 내 질문: (여기에 질문을 주석으로 적으세요)
# 코드:
# C-7: 나만의 질문 → 코드로 답하기 (자유!)
# 내 질문: (여기에 질문을 주석으로 적으세요)
# 코드:
C 정답 보기 (C-1 ~ C-6)
chars.describe() # C-1 (평균 레벨 51.0)
chars[chars["레벨"] >= 50] # C-2
chars[chars["직업"] == "마법사"] # C-3
chars["전투력"] = chars["공격력"] + chars["방어력"] # C-4
chars.sort_values("전투력", ascending=False).head(1) # C-5 (불꽃기사, 168)
print(chars[chars["직업"] == "전사"]["공격력"].mean()) # C-6 (81.0)
chars[(chars["직업"] == "전사") & (chars["레벨"] >= 50)] # C-6+ (3명)
C-7은 정답이 없습니다. 만든 질문과 코드는 다음 수업에서 함께 확인합니다.
숙제 완료 체크¶
- A. NumPy 8문제
- B. Pandas 7문제
- C. 종합 도전 7문제 + 나만의 질문
- 표시해 둔 문제 다시 풀기
- 나도코딩 영상 지정 구간 보기 (자습 안내 참고)
막힐 때: 에러 메시지의 맨 마지막 줄부터 읽어보고, 해결되지 않으면 화면을 캡처해 질문을 보내 주세요.
다음 수업에서는 이 데이터들을 그래프로 시각화하고, 미니 프로젝트로 분석 리포트를 완성합니다.