import pandas as pd
import numpy as np
12wk-1: 퀴즈7
- 전북대 학생들을 시험당일 학생증을 지참할 것. (출석체크 및 본인확인) 학생증 외에 신분증 여권등도 가능.
- 부정행위 (카카오톡 채팅을 통한 코드공유, 생성형모델 사용, 대리시험 등) 적발시 F 처리함.
- 퀴즈 중 지각할 경우 지각사실을 기록함. 하지만 별 다른 감점은 하지 않음.
.ipynb
파일 형태로 제출된 답안지만 채점하며 그 외의 형식 (.hwp
,.py
등)은 채점하지 않음. 즉 0점 처리함.
1. – 10점
아래의 자료를 불러오라.
= pd.read_csv('https://raw.githubusercontent.com/guebin/DV2022/master/posts/FIFA23_official_data.csv').drop(['Loaned From','Best Overall Rating'],axis=1).dropna().reset_index(drop=True)
df df.head()
ID | Name | Age | Photo | Nationality | Flag | Overall | Potential | Club | Club Logo | ... | Work Rate | Body Type | Real Face | Position | Joined | Contract Valid Until | Height | Weight | Release Clause | Kit Number | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 209658 | L. Goretzka | 27 | https://cdn.sofifa.net/players/209/658/23_60.png | Germany | https://cdn.sofifa.net/flags/de.png | 87 | 88 | FC Bayern München | https://cdn.sofifa.net/teams/21/30.png | ... | High/ Medium | Unique | Yes | <span class="pos pos28">SUB | Jul 1, 2018 | 2026 | 189cm | 82kg | €157M | 8.0 |
1 | 212198 | Bruno Fernandes | 27 | https://cdn.sofifa.net/players/212/198/23_60.png | Portugal | https://cdn.sofifa.net/flags/pt.png | 86 | 87 | Manchester United | https://cdn.sofifa.net/teams/11/30.png | ... | High/ High | Unique | Yes | <span class="pos pos15">LCM | Jan 30, 2020 | 2026 | 179cm | 69kg | €155M | 8.0 |
2 | 224334 | M. Acuña | 30 | https://cdn.sofifa.net/players/224/334/23_60.png | Argentina | https://cdn.sofifa.net/flags/ar.png | 85 | 85 | Sevilla FC | https://cdn.sofifa.net/teams/481/30.png | ... | High/ High | Stocky (170-185) | No | <span class="pos pos7">LB | Sep 14, 2020 | 2024 | 172cm | 69kg | €97.7M | 19.0 |
3 | 192985 | K. De Bruyne | 31 | https://cdn.sofifa.net/players/192/985/23_60.png | Belgium | https://cdn.sofifa.net/flags/be.png | 91 | 91 | Manchester City | https://cdn.sofifa.net/teams/10/30.png | ... | High/ High | Unique | Yes | <span class="pos pos13">RCM | Aug 30, 2015 | 2025 | 181cm | 70kg | €198.9M | 17.0 |
4 | 224232 | N. Barella | 25 | https://cdn.sofifa.net/players/224/232/23_60.png | Italy | https://cdn.sofifa.net/flags/it.png | 86 | 89 | Inter | https://cdn.sofifa.net/teams/44/30.png | ... | High/ High | Normal (170-) | Yes | <span class="pos pos13">RCM | Sep 1, 2020 | 2026 | 172cm | 68kg | €154.4M | 23.0 |
5 rows × 27 columns
선수들의 키의 평균을 구하여라. (선수들의키는 ’Height’라는 열로 저장되어 있음)
(풀이)
int(l.replace('cm','')) for l in df.Height]) np.mean([
180.85211439745783
2. – 10점
표준정규분포에서 1000개의 난수를 생성하여 아래와 같은 데이터프레임을 만들어라.
# 생성예시
X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | ... | X90 | X91 | X92 | X93 | X94 | X95 | X96 | X97 | X98 | X99 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.383420 | 1.084175 | 1.142778 | 0.307894 | 0.237787 | 0.355951 | -1.663075 | -1.382773 | -1.926845 | -1.486216 | ... | -0.993172 | 0.725927 | 0.365930 | 0.344201 | 0.554081 | 1.308688 | 0.405376 | -0.185070 | 1.055388 | 1.187014 |
1 | -0.250273 | -1.580452 | 0.112415 | -2.384201 | 0.785381 | 1.503459 | -0.540345 | -0.288569 | 0.653383 | 0.454134 | ... | -0.004055 | 1.266743 | 0.117038 | -0.350165 | 0.410882 | -0.763975 | 0.766821 | 1.032189 | 0.404380 | -0.134916 |
2 | -0.767637 | -0.642942 | -0.247824 | -1.457658 | -0.091060 | 0.323402 | -0.774021 | 0.659558 | -0.794595 | -2.605380 | ... | -0.905361 | 0.893707 | -1.521594 | 0.856883 | -0.401441 | -1.111551 | 0.958028 | -0.015302 | 0.891259 | -0.826834 |
3 | 1.822226 | -1.258543 | -0.705506 | -0.519831 | -0.593394 | -1.399224 | -1.616172 | -0.626952 | -0.083539 | 0.528519 | ... | -0.557674 | -0.114760 | -1.435302 | 0.017538 | -0.132572 | -0.300457 | -0.516030 | -1.617621 | -0.503742 | 1.212361 |
4 | 0.060574 | -0.565512 | -1.538121 | 1.758610 | 0.084860 | 0.412914 | -1.763512 | -1.859547 | -0.049909 | -1.847753 | ... | 1.026497 | 2.004166 | 0.048826 | -1.540996 | 0.512631 | 1.968778 | -1.593192 | 0.138268 | 1.101756 | -0.871777 |
5 | 0.607008 | -0.352237 | 1.186118 | 1.446668 | 0.762599 | -0.244244 | 0.304258 | 1.284617 | 0.110343 | -2.962656 | ... | -0.013544 | 0.807378 | 0.696742 | 1.674315 | 0.072385 | -0.908225 | -0.040520 | 0.468065 | 1.061927 | 0.424025 |
6 | 1.684726 | 0.787468 | -0.515706 | -1.345645 | 1.310011 | -2.072882 | -0.200044 | -2.488585 | -1.760744 | -0.790638 | ... | 0.567038 | -0.909974 | -0.514430 | 0.794560 | 2.100759 | -0.946753 | 0.718903 | 0.465566 | -2.334143 | 0.080626 |
7 | 0.147938 | -1.731017 | -0.432569 | 0.764183 | -1.550268 | -0.885863 | -0.480227 | -0.301026 | 0.569153 | 0.982708 | ... | -1.493670 | -0.915688 | 0.373344 | -0.390797 | -0.630293 | 0.102486 | -0.039481 | -1.336725 | 0.052716 | -0.412041 |
8 | -0.429898 | -0.803940 | -0.575407 | -0.105742 | 1.169761 | -0.028086 | 0.355928 | -0.887930 | -0.436832 | -0.059071 | ... | -0.074304 | 0.950444 | -0.195984 | -1.212342 | -0.545283 | 0.215465 | -0.758794 | -1.042145 | -0.909816 | 1.195194 |
9 | -0.255254 | -0.969684 | 0.405988 | 0.411374 | -0.793646 | 1.014501 | -0.812766 | 0.238440 | -0.265215 | 0.408764 | ... | -0.147446 | -0.992780 | 0.363403 | 0.017319 | 0.879830 | 0.041092 | -1.286358 | 0.710257 | -1.908729 | 0.650026 |
10 rows × 100 columns
Notes
- column의 이름은
X0,...,X99
와 같이 되어야 한다. - 표준정규분포에서 난수를 뽑는 코드는
np.random.randn
혹은np.random.normal
을 이용한다.
(풀이)
= pd.DataFrame(np.random.randn(1000).reshape(10,100))
df = [f"X{l}" for l in df.columns]
df.columns df
X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | ... | X90 | X91 | X92 | X93 | X94 | X95 | X96 | X97 | X98 | X99 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1.154279 | -1.076839 | 0.461829 | -1.657709 | 0.337098 | -1.066188 | 0.863708 | 0.908695 | 1.002116 | -1.969111 | ... | 0.343229 | 1.409096 | 0.781730 | 1.004021 | 0.385890 | -0.263554 | 1.145646 | -1.317443 | -0.936349 | -0.872273 |
1 | 0.967545 | -0.599505 | 0.311318 | 0.445705 | -0.358476 | -0.955061 | -1.398404 | 0.344749 | 1.296573 | -0.643000 | ... | 2.050203 | 0.870737 | 1.329552 | 0.339286 | 1.685011 | -0.847316 | 0.052932 | 0.130593 | -0.558282 | 1.226135 |
2 | 0.254918 | -0.093590 | 0.024426 | 1.500279 | -1.322294 | 0.013167 | -0.240090 | -0.910340 | -0.046094 | 0.586833 | ... | -0.428111 | 0.154454 | 0.209600 | 0.334046 | 0.771702 | -0.023900 | -1.177482 | -1.941570 | -0.106852 | -0.417114 |
3 | -0.590731 | -1.005409 | -0.623825 | 0.613173 | 0.597909 | 0.380969 | 0.226733 | 0.587772 | -1.518766 | -0.280510 | ... | 0.335841 | -0.870318 | -0.952133 | -1.985928 | 0.109196 | -0.419957 | 1.087154 | -0.336847 | 1.656620 | 1.539690 |
4 | -0.099157 | 0.352339 | 0.911157 | -1.881233 | -0.256323 | 0.484511 | -0.440353 | 0.134911 | 2.879129 | -0.299404 | ... | -0.755338 | -0.790758 | 1.375327 | -0.822671 | 1.111417 | 0.418727 | -0.381257 | 1.051045 | 0.805947 | -1.027279 |
5 | 1.383427 | 0.876598 | -1.490912 | -0.500443 | -0.455737 | 0.352433 | 0.148228 | 2.366743 | 0.779486 | 0.310947 | ... | -1.252812 | -0.875156 | -0.877245 | 0.909194 | 0.197434 | -0.645160 | -0.591509 | -1.355754 | 0.776870 | -0.260169 |
6 | 0.518310 | -0.526449 | -1.250760 | 0.593439 | -0.642141 | 0.122488 | 0.764898 | -1.198715 | 0.686448 | 0.725643 | ... | 0.899694 | 1.373242 | -1.781869 | -0.096486 | -0.816270 | 0.959392 | 0.920707 | -0.236863 | 1.406082 | -0.092026 |
7 | 1.460629 | 0.195015 | -1.757572 | -0.430745 | -1.135580 | 0.050923 | 0.167272 | -1.958813 | -1.526207 | 0.133903 | ... | 0.408465 | -0.489587 | -0.029735 | -0.762391 | 0.257323 | -2.078152 | -1.539251 | 0.775559 | -1.211843 | 0.255121 |
8 | -0.892184 | 1.368760 | 1.636672 | 0.076691 | -1.390924 | -0.544879 | -0.373292 | -2.451802 | 1.659052 | -1.129343 | ... | -0.541981 | 1.076584 | 0.491549 | -0.991186 | -0.815661 | 0.410818 | -0.532781 | 0.796814 | 0.577215 | 0.800259 |
9 | -1.152711 | 0.475192 | -1.278233 | 0.427637 | -1.787645 | -0.964571 | 0.927063 | 0.397576 | -1.126033 | 0.471479 | ... | 0.862985 | 0.876735 | -0.516859 | 0.278134 | -0.492077 | -0.807814 | -0.094944 | 0.404810 | 0.432855 | -0.386882 |
10 rows × 100 columns
3. – 10점
아래의 데이터프레임을 관찰하라.
= pd.read_csv('https://raw.githubusercontent.com/guebin/DV2022/master/posts/FIFA23_official_data.csv')
df df.head()
ID | Name | Age | Photo | Nationality | Flag | Overall | Potential | Club | Club Logo | ... | Real Face | Position | Joined | Loaned From | Contract Valid Until | Height | Weight | Release Clause | Kit Number | Best Overall Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 209658 | L. Goretzka | 27 | https://cdn.sofifa.net/players/209/658/23_60.png | Germany | https://cdn.sofifa.net/flags/de.png | 87 | 88 | FC Bayern München | https://cdn.sofifa.net/teams/21/30.png | ... | Yes | <span class="pos pos28">SUB | Jul 1, 2018 | NaN | 2026 | 189cm | 82kg | €157M | 8.0 | NaN |
1 | 212198 | Bruno Fernandes | 27 | https://cdn.sofifa.net/players/212/198/23_60.png | Portugal | https://cdn.sofifa.net/flags/pt.png | 86 | 87 | Manchester United | https://cdn.sofifa.net/teams/11/30.png | ... | Yes | <span class="pos pos15">LCM | Jan 30, 2020 | NaN | 2026 | 179cm | 69kg | €155M | 8.0 | NaN |
2 | 224334 | M. Acuña | 30 | https://cdn.sofifa.net/players/224/334/23_60.png | Argentina | https://cdn.sofifa.net/flags/ar.png | 85 | 85 | Sevilla FC | https://cdn.sofifa.net/teams/481/30.png | ... | No | <span class="pos pos7">LB | Sep 14, 2020 | NaN | 2024 | 172cm | 69kg | €97.7M | 19.0 | NaN |
3 | 192985 | K. De Bruyne | 31 | https://cdn.sofifa.net/players/192/985/23_60.png | Belgium | https://cdn.sofifa.net/flags/be.png | 91 | 91 | Manchester City | https://cdn.sofifa.net/teams/10/30.png | ... | Yes | <span class="pos pos13">RCM | Aug 30, 2015 | NaN | 2025 | 181cm | 70kg | €198.9M | 17.0 | NaN |
4 | 224232 | N. Barella | 25 | https://cdn.sofifa.net/players/224/232/23_60.png | Italy | https://cdn.sofifa.net/flags/it.png | 86 | 89 | Inter | https://cdn.sofifa.net/teams/44/30.png | ... | Yes | <span class="pos pos13">RCM | Sep 1, 2020 | NaN | 2026 | 172cm | 68kg | €154.4M | 23.0 | NaN |
5 rows × 29 columns
열의 이름에 공백 ' '
이 포함된 열은 모두 몇개인가?
확장가능하지 않은 코드는 정답인정하지 않음 (예를들어 직접세는 경우)
(풀이)
sum([' ' in l for l in df.columns])
13
4. – 10점
43052)
np.random.seed(= np.random.choice(np.arange(10,21)*5,20)
att = np.random.choice(np.arange(5,21)*5,20)
rep = np.random.choice(np.arange(0,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin})
df df
att | rep | mid | fin | |
---|---|---|---|---|
0 | 65 | 55 | 50 | 40 |
1 | 95 | 100 | 50 | 80 |
2 | 65 | 90 | 60 | 30 |
3 | 55 | 80 | 75 | 80 |
4 | 80 | 30 | 30 | 100 |
5 | 75 | 40 | 100 | 15 |
6 | 65 | 45 | 45 | 90 |
7 | 60 | 60 | 25 | 0 |
8 | 95 | 65 | 20 | 10 |
9 | 90 | 80 | 80 | 20 |
10 | 55 | 75 | 35 | 25 |
11 | 95 | 95 | 45 | 0 |
12 | 95 | 55 | 15 | 35 |
13 | 50 | 80 | 40 | 30 |
14 | 50 | 55 | 15 | 85 |
15 | 95 | 30 | 30 | 95 |
16 | 50 | 50 | 45 | 10 |
17 | 65 | 55 | 15 | 45 |
18 | 70 | 70 | 40 | 35 |
19 | 90 | 90 | 80 | 90 |
위의 데이터프레임에 아래의 공식을 적용하여 total
을 계산하라.
total = att*0.1 + rep*0.2 + mid*0.35 + fin*0.35
계산된 total
을 바탕으로 아래의 규칙을 적용하여 grade
를 정하라.
total
>= 70: A+- 40 <
total
< 70: B0 total
<= 40: F
grade
를 원래 df에 할당하여 최종결과를 출력하라.
(풀이)
= df.att*0.1 + df.rep*0.2 + df.mid*0.35 + df.fin*0.35
total total
0 49.00
1 75.00
2 56.00
3 75.75
4 59.50
5 55.75
6 62.75
7 26.75
8 33.00
9 60.00
10 41.50
11 44.25
12 38.00
13 45.50
14 51.00
15 59.25
16 34.25
17 38.50
18 47.25
19 86.50
dtype: float64
def make_grade(total):
if total >= 70:
return "A+"
elif 40 < total:
return "B0"
else:
return "F"
= [make_grade(l) for l in total]) df.assign(grade
att | rep | mid | fin | grade | |
---|---|---|---|---|---|
0 | 65 | 55 | 50 | 40 | B0 |
1 | 95 | 100 | 50 | 80 | A+ |
2 | 65 | 90 | 60 | 30 | B0 |
3 | 55 | 80 | 75 | 80 | A+ |
4 | 80 | 30 | 30 | 100 | B0 |
5 | 75 | 40 | 100 | 15 | B0 |
6 | 65 | 45 | 45 | 90 | B0 |
7 | 60 | 60 | 25 | 0 | F |
8 | 95 | 65 | 20 | 10 | F |
9 | 90 | 80 | 80 | 20 | B0 |
10 | 55 | 75 | 35 | 25 | B0 |
11 | 95 | 95 | 45 | 0 | B0 |
12 | 95 | 55 | 15 | 35 | F |
13 | 50 | 80 | 40 | 30 | B0 |
14 | 50 | 55 | 15 | 85 | B0 |
15 | 95 | 30 | 30 | 95 | B0 |
16 | 50 | 50 | 45 | 10 | F |
17 | 65 | 55 | 15 | 45 | F |
18 | 70 | 70 | 40 | 35 | B0 |
19 | 90 | 90 | 80 | 90 | A+ |
5. – 10점
아래의 2개의 list를 관찰하자.
= ['apple', 'banana', 'carrot', 'dragonfly', 'elephant', 'forest', 'giraffe', 'honey', 'island', 'jungle']
eng = ['사과', '바나나', '당근', '잠자리', '코끼리', '숲', '기린', '꿀', '섬', '정글'] kor
위의 list와 zip을 이용하여 아래와 같은 Dictionary를 만들어라.
= {'apple': '사과',
dct 'banana': '바나나',
'carrot': '당근',
'dragonfly': '잠자리',
'elephant': '코끼리',
'forest': '숲',
'giraffe': '기린',
'honey': '꿀',
'island': '섬',
'jungle': '정글'}
(풀이)
for e,k in zip(eng,kor)} {e:k
{'apple': '사과',
'banana': '바나나',
'carrot': '당근',
'dragonfly': '잠자리',
'elephant': '코끼리',
'forest': '숲',
'giraffe': '기린',
'honey': '꿀',
'island': '섬',
'jungle': '정글'}
6. – 50점
각 문제당 10점
아래의 데이터프레임을 관찰하자.
= pd.read_csv("https://raw.githubusercontent.com/guebin/DV2023/main/posts/titanic.csv").drop(['PassengerId','logFare','Cabin'],axis=1).dropna()
df df
Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | S |
1 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C |
2 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | S |
3 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | S |
4 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
885 | 0 | 3 | Rice, Mrs. William (Margaret Norton) | female | 39.0 | 0 | 5 | 382652 | 29.1250 | Q |
886 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | S |
887 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | S |
889 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C |
890 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | Q |
712 rows × 10 columns
이 데이터프레임은 타이타닉 데이터셋으로 1912년에 침몰한 타이타닉 호에 대한 자료이다. 자료의 row는 개별승객을 의미하고 자료의 column은 승객에 대한 정보를 의미한다. 각 column에 대한 설명은 아래와 같다.
- Survived: 생존 여부 (0 = 사망, 1 = 생존)
- Pclass: 객실 등급 (1 = 일등석, 2 = 이등석, 3 = 삼등석)
- Name: 승객 이름
- Sex: 성별
- Age: 나이
- SibSp: 함께 탑승한 형제자매 또는 배우자 수
- Parch: 함께 탑승한 부모 또는 자녀 수
- Ticket: 티켓 번호
- Fare: 요금
- Embarked: 탑승한 항구 (C = Cherbourg, Q = Queenstown, S = Southampton)
예를들어 아래와 같은 첫번째 승객을 고려하면,
0]] df.iloc[[
Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.25 | S |
이 승객은 사망한 승객이며1 3등석에 타고 있으며, 이름은 Braund, Mr. Owen Harris
성별은 남, 나이는 22, Southampton
에서 탑승했다는 것을 알 수 있다.
1 Survived = 0
(1)
남성승객과 여성승객은 각각 모두 몇명인가?
(풀이)
sum(df.Sex == 'male'),sum(df.Sex == 'female')
(453, 259)
(2)
남성승객중 몇명이 살아남았는가? 여성승객중 몇명이 살아남았는가? 남성과 여성중 어떠한 성별이 더 많이 생존했다고 생각하는가?
(풀이)
sum((df.Sex == 'male') & (df.Survived ==1)),sum((df.Sex == 'female') & (df.Survived ==1))
(93, 195)
93/453, 195/259
(0.2052980132450331, 0.752895752895753)
(3)
Pclass == 3
인 승객들에 한정하여 Fare
의 평균을 계산하라.
(풀이)
== 3].Fare.mean() df[df.Pclass
13.229435211267605
(4)
혼자 탄 승객은 모두 몇명인가?
hint: SibSp=0
이고 Parch=0
인 승객을 조사하면된다.
(풀이)
sum((df.SibSp == 0) & (df.Parch==0))
402
(5)
혼자 탄 승객들이 각각 어떠한 항구에서 탔는지 조사하라.
(풀이)
= list(df[(df.SibSp == 0) & (df.Parch==0)].Embarked)
lst for s in set(lst)} {s:lst.count(s)
{'S': 325, 'Q': 19, 'C': 58}