12wk-1: 퀴즈7

Author

최규빈

Published

May 22, 2024

Caution
  • 전북대 학생들을 시험당일 학생증을 지참할 것. (출석체크 및 본인확인) 학생증 외에 신분증 여권등도 가능.
  • 부정행위 (카카오톡 채팅을 통한 코드공유, 생성형모델 사용, 대리시험 등) 적발시 F 처리함.
  • 퀴즈 중 지각할 경우 지각사실을 기록함. 하지만 별 다른 감점은 하지 않음.
  • .ipynb 파일 형태로 제출된 답안지만 채점하며 그 외의 형식 (.hwp, .py 등)은 채점하지 않음. 즉 0점 처리함.
import pandas as pd
import numpy as np

1. – 10점

아래의 자료를 불러오라.

df = 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.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’라는 열로 저장되어 있음)

(풀이)

np.mean([int(l.replace('cm','')) for l in df.Height])
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

  1. column의 이름은 X0,...,X99와 같이 되어야 한다.
  2. 표준정규분포에서 난수를 뽑는 코드는 np.random.randn 혹은 np.random.normal 을 이용한다.

(풀이)

df = pd.DataFrame(np.random.randn(1000).reshape(10,100))
df.columns = [f"X{l}" for l in 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점

아래의 데이터프레임을 관찰하라.

df = pd.read_csv('https://raw.githubusercontent.com/guebin/DV2022/master/posts/FIFA23_official_data.csv')
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점

np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,20)
rep = np.random.choice(np.arange(5,21)*5,20)
mid = np.random.choice(np.arange(0,21)*5,20)
fin = np.random.choice(np.arange(0,21)*5,20)
df = pd.DataFrame({'att':att,'rep':rep,'mid':mid,'fin':fin})
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에 할당하여 최종결과를 출력하라.

(풀이)

total = df.att*0.1 + df.rep*0.2 + df.mid*0.35 + df.fin*0.35 
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"
df.assign(grade = [make_grade(l) for l in total])
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를 관찰하자.

eng = ['apple', 'banana', 'carrot', 'dragonfly', 'elephant', 'forest', 'giraffe', 'honey', 'island', 'jungle']
kor = ['사과', '바나나', '당근', '잠자리', '코끼리', '숲', '기린', '꿀', '섬', '정글']

위의 list와 zip을 이용하여 아래와 같은 Dictionary를 만들어라.

dct = {'apple': '사과',
 'banana': '바나나',
 'carrot': '당근',
 'dragonfly': '잠자리',
 'elephant': '코끼리',
 'forest': '숲',
 'giraffe': '기린',
 'honey': '꿀',
 'island': '섬',
 'jungle': '정글'}

(풀이)

{e:k for e,k in zip(eng,kor)}
{'apple': '사과',
 'banana': '바나나',
 'carrot': '당근',
 'dragonfly': '잠자리',
 'elephant': '코끼리',
 'forest': '숲',
 'giraffe': '기린',
 'honey': '꿀',
 'island': '섬',
 'jungle': '정글'}

6. – 50점

각 문제당 10점

아래의 데이터프레임을 관찰하자.

df = pd.read_csv("https://raw.githubusercontent.com/guebin/DV2023/main/posts/titanic.csv").drop(['PassengerId','logFare','Cabin'],axis=1).dropna()
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에 대한 설명은 아래와 같다.

  1. Survived: 생존 여부 (0 = 사망, 1 = 생존)
  2. Pclass: 객실 등급 (1 = 일등석, 2 = 이등석, 3 = 삼등석)
  3. Name: 승객 이름
  4. Sex: 성별
  5. Age: 나이
  6. SibSp: 함께 탑승한 형제자매 또는 배우자 수
  7. Parch: 함께 탑승한 부모 또는 자녀 수
  8. Ticket: 티켓 번호
  9. Fare: 요금
  10. Embarked: 탑승한 항구 (C = Cherbourg, Q = Queenstown, S = Southampton)

예를들어 아래와 같은 첫번째 승객을 고려하면,

df.iloc[[0]]
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의 평균을 계산하라.

    (풀이)

    df[df.Pclass == 3].Fare.mean()
    13.229435211267605

    (4) 혼자 탄 승객은 모두 몇명인가?

    hint: SibSp=0 이고 Parch=0 인 승객을 조사하면된다.

    (풀이)

    sum((df.SibSp == 0) & (df.Parch==0))
    402

    (5) 혼자 탄 승객들이 각각 어떠한 항구에서 탔는지 조사하라.

    (풀이)

    lst = list(df[(df.SibSp == 0) & (df.Parch==0)].Embarked)
    {s:lst.count(s) for s in set(lst)}
    {'S': 325, 'Q': 19, 'C': 58}