<jupyter_start><jupyter_text>2021년 2학기 데이터시각화 특강 중간고사 풀이- toc:flase- branch: master- badges: flase- comments: flase - author: 최규빈<jupyter_code># hide
import matplotlib.pyplot as plt 
import seaborn as sns 
from plotnine import * 
import cv2 
import numpy as np 
import pandas as pd<jupyter_output><empty_output><jupyter_text>`1`. 다음은 이미지와 대응하는 히스토그램을 나타낸것이다. 이미지와 히스토그램을 올바르게 짝지어라. (5점) - 예시 a-c, b-d ![](https://github.com/guebin/2021DV/blob/master/_notebooks/mid_FIG1.png?raw=true)  `2`. 주어진 자료를 바탕으로 예시와 같은 시각화를 구현하라. (5점) **자료** ```pythonx=[1,2,3,4]y=[1,2,4,3]``` **시각화예시** ![](https://github.com/guebin/2021DV/blob/master/_notebooks/mid_FIG2.png?raw=true)  `3`. 아래는 앤스콤의 플랏이다. 옳게 해석한 사람을 모두 고르라 (5점) ![](https://github.com/guebin/2021DV/blob/master/_notebooks/mid_FIG3.png?raw=true) (하니) 그림 (a)-(d)는 모두 양의 상관계수를 가진다. (나애리) 그림 (b)는 산점도가 직선이 아니라 곡선의 모양을 띄고 있으므로 상관계수는 0이다. (홍두깨) 그림 (c)에서 상단의 이상치를 제외하면 상관계수는 1이다. (고은애) 그림 (d)의 우측 이상치의 값을 적절하게 바꾸면 (d)의 상관계수를 음수로 만드는 것이 가능하다. (이창수) 그림 (c)역시 상단의 이상치 값을 적절하게 바꾸면 (c)의 상관계수를 음수로 만드는 것이 가능하다.   `4`. 다음은 아이스크림 소비량과 소아마비의 관계를 그린 산점도이다. 이때 색깔은 온도가 비슷한 관측치로 그룹핑되었다. 옳은 해석을 모두 골라라. (10점)  ![](https://github.com/guebin/2021DV/blob/master/_notebooks/mid_FIG4.png?raw=true) (하니) 아이스크림과 소아마비는 양의 상관관계에 있다. (나애리) 상관계수의 값이 1에 가까울수록 아이스크림과 소아마비의 인과성이 명확하다고 볼 수 있다. (홍두깨) 비슷한 온도를 가진 관측치에서는 아이스크림과 소아마비의 상관계수가 0에 가깝다. (고은애) 온도를 통제하였을 경우 아이스크림과 소아마비의 상관계수가 0이므로 둘 사이의 인과성이 있다고 보긴 어렵다. (단, 온도를 통제하였을 경우에는 아이스크림은 랜덤으로 먹었다고 가정한다.)  `5`. FIFA22 (100점)  아래의 코드를 활용하여 FIFA22의 자료를 불러온뒤 물음에 답하라.  ```pythondf=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-10-25-FIFA22_official_data.csv')```<jupyter_code>import pandas as pd
df=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-10-25-FIFA22_official_data.csv')<jupyter_output><empty_output><jupyter_text>(a) `Loaned From`,`Marking` 열을 선택하는 코드를 작성하고 값을 확인하라.<jupyter_code>df.loc[:,['Loaned From','Marking']]<jupyter_output><empty_output><jupyter_text>(b) 기존의 데이터프레임에서 `Loaned From`, `Marking`열을 제외하는 코드를 작성하라.<jupyter_code>df.iloc[:,map(lambda x: 'Loaned From' != x and 'Marking' != x ,df.columns )]<jupyter_output><empty_output><jupyter_text>(c) (b)의 결과에 `.dropna()`를 사용하여 결측치를 제거하는 코드를 작성하라. 몇개의 결측치가 제거되었는가?<jupyter_code>df.iloc[:,map(lambda x: 'Loaned From' != x and 'Marking' != x ,df.columns )].dropna()<jupyter_output><empty_output><jupyter_text>(d) (c)의 결과에 아래의 코드를 활용하여 `Wage`의 값을 적절하게 변환하라. ```python 코드1 def convert_currency(value):    floatvalue = 0.0    strvalue=""    if "M" in value:        strvalue=value.replace("M","").replace("€","")        floatvalue=float(float(strvalue)*1000000)    elif "K" in value:        strvalue=value.replace("K","").replace("€","")        floatvalue=float(float(strvalue)*1000)    else:        floatvalue=value.replace("€","")    return floatvalue```- 코드출처: https://www.kaggle.com/talhademirezen/cost-effective-youth-players-fifa22<jupyter_code>def convert_currency(value):
    floatvalue = 0.0
    strvalue=""
    if "M" in value:
        strvalue=value.replace("M","").replace("€","")
        floatvalue=float(float(strvalue)*1000000)
    elif "K" in value:
        strvalue=value.replace("K","").replace("€","")
        floatvalue=float(float(strvalue)*1000)
    else:
        floatvalue=value.replace("€","")
    return floatvalue
df=df.iloc[:,map(lambda x: 'Loaned From' != x and 'Marking' != x ,df.columns )].dropna()
df['Wage']=list(map(convert_currency,df.Wage))<jupyter_output><empty_output><jupyter_text>(e) 아래의 세부사항에 맞춰서 `Best Position`에 따른 시장가치(`Value`)의 평균을 barplot을 이용하여 시각화 하라.  - x축을 `Best Position`으로 하고 y축은 `Value`의 평균으로 할 것- `Value`가 가장 높은 3개의 포지션을 다른색으로 하이라이팅 할 것 ***시각화예시***<jupyter_code>df['Value']=list(map(convert_currency,df.Value))
import numpy as np
_df=df.groupby('Best Position').agg({'Value':np.mean})\
.rename(columns={'Value':'mean(Value)'})\
.sort_values('mean(Value)',ascending=False)\
.reset_index()
_df['Highlight']=_df['mean(Value)']>=_df['mean(Value)'][2]
_df
from plotnine import *
ggplot(_df)+geom_bar(aes(x='Best Position',y='mean(Value)',fill='Highlight'),stat='identity')<jupyter_output><empty_output><jupyter_text>(f) 아래의 세부사항에 맞추어 (`Dribbling`,`SlidingTackle`)의 산점도를 그려라.  ***세부사항***(i) `Best Position`의 값을 바탕으로 면분할을 하라. (ii) `Age`를 색으로 표현하라. (iii) 산점도의 투명도는 `alpha=0.5`로 `size=0.5`로 설정할 것.<jupyter_code>ggplot(df)\
+geom_point(aes(x='Dribbling',y='SlidingTackle',color='Age'),alpha=0.5,size=0.5)\
+facet_wrap('Best Position')<jupyter_output><empty_output><jupyter_text>(g) (f)의 그림을 올바르게 해석한 사람은?  (하니) 포지션 `GK`에 있는 선수는 `Dribbling`, `SlidingTackle` 값이 다른포지션대비 상대적으로 낮다. (나애리) 모든 포지션에서 `Dribbling`, `SlidingTackle`은 서로 독립이라 볼 수 있다. (홍두깨) 포지션 `CAM`은 나이와 `Dribbling` 사이에 양의 상관관계에 있다.  (고은애) 포지션 `CB`은 나이와 `Dribbling` 사이에 상관계수가 거의 0이다.   (h) `Best Position`이 "CAM" 혹은 "CB"인 플레이어만 골라서 (`Dribbling`,`SlidingTackle`)의 산점도를 그려라.  ***세부사항*** - x축: Dribbling, y축: SlidingTackle 로 설정- Value에 따라 점의 크기를 다르게 설정 - 나이에 따라 색깔을 다르게 설정  ***시각화예시***<jupyter_code>ggplot(df.loc[(df['Best Position']=='CAM') |(df['Best Position']=='CB')])\
+geom_point(aes(x='Dribbling',y='SlidingTackle',color='Age',size='Value'),alpha=0.5)\
+facet_wrap('Best Position')<jupyter_output><empty_output><jupyter_text>(i) 그림 (h)를 올바르게 해석한것을 모두 고르라.  (하니) `AGE`와 `Value`는 양의 상관관계에 있다. (나애리) 따라서 축구선수는 `AGE`가 증가함 따라 `Value`가 올라가는 것을 알 수 있다. 즉 `AGE`와 `Value`사이에는 인과성이 있다. (홍두깨) 포지션 `CAM`은 `Dribbiling` 능력과 `Value`가 양의 상관관계에 있어보인다. (고은애) 반면에 포지션 `CB`는 `Dribbling` 능력보다는 `SlidingTackle`이 `Value`와 양의 상관관계에 있다고 볼 수 있다.   `6`. 하니의 산책경로 (40점) 공원에서 뛰는것을 좋아하는 강아지 하니가 있다. 아래는 강아지 하니가 주인과 함께 공원을 산책한 경로이다. 산책코스는 아래와 같이 집에서 공원으로 가는 A코스와 공원에서 집으로 오는 B코스로 나누어진다.  `-` A코스: 집 $\to$ 카페 $\to$ 초등학교 정문  $\to$ 공원`-` B코스: 공원 $\to$ 초등학교 후문 $\to$ 동물병원 $\to$ 집 각 위치의 좌표는 아래와 같다. - 집: (0,0)- 카페: (1,2) - 초등학교 정문: (4,3)- 공원: (5,5)- 초등학교 후문: (4.1,3)- 동물병원: (1,0.5)집에서 출발시에 하니의 체력은 100이며, 각 중간지점에서 하니의 체력은 이동거리에 비례하여 감소한다고 하자. 예를들어 A코스-카페에서 하니의 체력은 아래와 같이 계산할 수 있다. - $100- \sqrt{1^2+2^2}$또한 하니는 공원정문에서 달리기를 시작하였고 이후에 70의 체력을 소진한뒤 공원후문에 도착하였다고 하자. (즉 공원정문에서하니의 체력이 $x$ 라면 공원후문에서 하니의 체력은 $x-60$ 이다.) 하니의 이동경로에 따른 체력의 변화를 시각화 하라.  (풀이)<jupyter_code>x=[0, 1, 4, 5,  5, 4.1, 1, 0] 
y=[0, 2, 3, 5,  5, 3, 0.5, 0] 
course=['A']*4 + ['B']*4 
_delta=[np.sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range(len(x))]
stamina = np.array([100,100,100,100, 40, 40, 40, 40]) - [sum(_delta[:(i+1)]) for i in range(8)]
ggplot(pd.DataFrame({'x':x, 'y':y, 'course':course, 'stamina':stamina}))+\
geom_point(aes(x='x',y='y'))+\
geom_line(aes(x='x',y='y',size='stamina',color='course'))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1839902602343631, 'fraction_numerical': 0.030893319129508445, 'mean_word_length': 5.045998160073597, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 42, 'https://': 7, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '413720', 'license': 'Apache-2.0', 'n_tokens_mistral': 4115, 'n_tokens_neox': 4861, 'n_words': 692, 'path': '_notebooks/2021-11-07-midsol.ipynb', 'repo_name': 'guebin/DV2021', 'size': '6571'}