(7주차) 10월25일
query를 이용하여 행을 선택하는 방법, fifa22자료 분석
-
(1/5) query를 이용한 행선택
-
(2/5) fifa22자료 설명
-
(3/5) fifa22자료 데이터변형 및 시각화 (1)
-
(4/5) fifa22자료 데이터변형 및 시각화 (2)
-
(5/5) 과제설명
import numpy as np
import pandas as pd
np.random.seed(1)
df=pd.DataFrame(np.random.normal(size=(15,4)),columns=list('ABCD'))
df
-
방법1
df.query('A>0 & B<0')
-
방법2
df.query('A>0 and B<0')
df.query('A<B<C')
-
방법1
df.A.mean()
df.query('A>-0.018839420539994597')
-
방법2
meanA=df.A.mean()
meanA
df.query('A> @meanA')
-
방법1
df.query(' A> @meanA and A<0.8')
-
방법2
df.query(' A> @meanA'
' and A<0.8')
-
참고사항: 아래는 에러가 발생한다.
df.query('A> @meanA'
'and A<0.8')
df
-
0, 3:5, 9:11 에 해당하는 row를 뽑고싶다. $\to$ 칼럼이름을 index
로 받아서 사용한다.
df.query('index==0 or 3<=index <=5 or 9<=index <=11')
-
응용사례1
df.query('index==0 or index ==[8,9,10]')
-
응용사례2
i1= np.arange(3)
i1
df.query('index in @i1 or index==5')
-
시계열자료에서 특히 유용함
df2=pd.DataFrame(np.random.normal(size=(10,4)), columns=list('ABCD'), index=pd.date_range('20201226',periods=10))
df2
df2.query(
' "2020-12-27"<= index <= "2021-01-03" ')
df2.query(
' "2020-12-27"<= index <= "2021-01-03" '
' and A+B < C')
-
FIFA22라는 축구게임이 있음 (굉장히 인기있음)
-
게임에 실제 선수들이 나오면서 선수들의 능력치가 세밀하게 구현되어 있음
-
이 능력치에 대한 데이터셋은 캐글에 공개되어 있음
fifa22=pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-10-25-FIFA22_official_data.csv')
-
Overall을 기준으로 정렬하여 보자.
fifa22=fifa22.sort_values(by='Overall',ascending=False).reset_index().rename(columns={'index':'index_old'})
fifa22.head()
from plotnine import *
ggplot(data=fifa22)+geom_point(aes(x='Overall', y='Potential'))
-
뭔가 Potential > Overall 인 관계가 성립하는것 같다. $\to$ Potetial2= Potential - Overall 인 변수를 새로 만들고 시각화해보자.
- 판다스: 새로운열 추가
fifa22['Potential2'] = fifa22['Potential'] - fifa22['Overall']
ggplot(data=fifa22)+geom_point(aes(x='Overall', y='Potential2'),alpha=0.1)
ggplot(data=fifa22)+geom_point(aes(x='Overall', y='Potential2'),alpha=0.1,position='jitter')
-
포텐셜2가 너무 0근처인 선수들이 있다. (아마 은퇴한 선수가 아닐까?) $\to$ 제외하고 그리자.
ggplot(data=fifa22.query('Potential2>0.1'))+geom_point(aes(x='Overall', y='Potential2'),alpha=0.1,position='jitter')
-
해석
- 음의 상관관계가 있다.
- 오버올이 클수록 포텐셜2의 분산이 작아진다. (오버올이 클수록 더 성장할 부분이 없으니까)
-
Overall을 구간별로 나누자: 어느정도가 적당한 구간일까?
fifa22.Overall.describe()
import matplotlib.pyplot as plt
fifa22.Overall.hist()
def f(x):
if x>72: y='Q1'
elif x>68: y='Q2'
elif x>63: y='Q3'
else: y='Q4'
return y
fifa22['Q']=list(map(f,fifa22.Overall))
fifa22[['Q','Overall']]
ggplot(data=fifa22.query('Potential2>0.1'))\
+geom_boxplot(aes(x='Q',y='Potential2'))
-
Q1으로 갈수록 분산이 작아짐! $\to$ 헷갈린다...
-
산점도와 박스플랏을 겹쳐서 그린다면 좀더 이해가 쉬울것 같다.
-
x축의 위치를 조정하면 될것 같다 $\to$ Q1, Q2, Q3, Q4 각 그룹별로 x축의 위치를 구하자.
fifa22.query('Q=="Q1"').Overall.mean()
- 이런식으로 해도 되지만
fifa22.groupby(by='Q').mean().Overall
l=fifa22.groupby(by='Q').mean().Overall.to_list()
l
-
이제 박스플랏이 들어갈 x축의 위치를 저장할 컬럼을 추가하고 그 이름을 Qx 라고 하자.
def g(x):
if x=='Q1': y=l[0]
elif x=='Q2': y=l[1]
elif x=='Q3': y=l[2]
else: y=l[3]
return y
fifa22['Qx']=list(map(g,fifa22.Q))
fifa22
ggplot(data=fifa22.query('Potential2>0.1'))\
+geom_point(aes(x='Overall', y='Potential2',color='Q'),alpha=0.1,size=0.1,position='jitter')\
+geom_boxplot(aes(x='Qx', y='Potential2',color='Q'))
fifa22 데이터셋에서 Q==Q1
이고, Potentail2>20
인 선수들의 이름을 출력하라.