DB 공부하기
230426_DB복습
보랏
2023. 4. 26. 23:21
안녕하세요. 보랏입니다.
오늘은 KBO타자 예측과
docker volume, compose에 대해서 배웠습니다.
복습 시작하겠습니다.
1. KBO 타자 OPS예측
평가척도
- WRMSE(Weighted Root Mean Square Error)라는 평가척도를 사용
- 실제 값과 예측값의 차이를 계ㄴ산하되 특정한 방식으로 가중치를 부여
- 실제 값과 예측값의 차이를 기준으로 평가하므로 오차가 작을수록 우수한 성능을 보유
OPS
- On base Plus Slugging의 약자로 타자들의 여러 성적을 종합해 계산하는 척도
탐색적 데이터 분석
- 탐색적 데이터 분석을 통해 데이터의 분포 및 특성 등에 대한 정보를 파악하고 데이터 간의 관계를 확인
- 탐색적 데이터 분석에 양질의 정보를 얻어 이를 예측 모델링과 전처리에 활용
# 필요 라이브러리 로드
from matplotlib import font_manager, rc
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import platform
if platform.system() == 'Windows':
# 윈도우인 경우 맑은 고딕 폰트 이용
font_name = font_manager.FontProperties(fname="./malgun.ttf"
).get_name()
rc('font', family=font_name)
else:
# Mac 인 경우
rc('font', family='AppleGothic')
#그래프에서 마이너스 기호가 표시되게 하는 설정입니다.
matplotlib.rcParams['axes.unicode_minus'] = False
- 데이터 로드 (프리시즌, 정규시즌)
데이터 시각화
# 데이터 시각화
preseason_df.hist(figsize=(10,9))
plt.tight_layout() # 그래프 간격 설정
plt.show()
정규시즌 데이터와 비교
# 정규시즌 데이터에서 2002년 이후의 연도별 기록된 선수의 수
regular_count = regular_season_df.groupby('year')['batter_id'].count().rename('regular')
# 프리시즌 데이터에서 연도별 기록된 선수의 수
preseason_count = preseason_df.groupby('year')['batter_id'].count().rename('preseason')
pd.concat([regular_count,preseason_count, np.round(preseason_count/regular_count,2).rename(
'ratio')], axis = 1).transpose().loc[:,2002:] # 2002년부터 봅니다.
프리시즌과 정규시즌 성적의 상관관계
# 타자의 이름과 연도를 이용해 새로운 인덱스를 생성ㄴ
regular_season_df['new_idx'] = regular_season_df['batter_name'] + \
regular_season_df['year'].apply(str)
preseason_df['new_idx'] = preseason_df['batter_name'] + preseason_df['year'].apply(str)
# 새로운 인덱스의 교집합
intersection_idx = list(set(regular_season_df['new_idx']). \
intersection(preseason_df['new_idx']))
# 교집합에 존재하는 데이터만 불러오기
regular_season_new = regular_season_df.loc[
regular_season_df['new_idx'].apply(lambda x: x in intersection_idx)].copy()
regular_season_new = regular_season_new.sort_values(by = 'new_idx').reset_index(drop=True)
# 비교를 위해 인덱스로 정렬
preseason_new = preseason_df.loc[preseason_df['new_idx'].apply(
lambda x: x in intersection_idx)].copy()
preseason_new = preseason_new.sort_values(by = 'new_idx').reset_index(drop=True)
# 검정 코드
print(regular_season_new.shape, preseason_new.shape)
sum(regular_season_new['new_idx'] == preseason_new['new_idx'])
# 정규시즌과 프리시즌의 상관관계 계산
correlation = regular_season_new['OPS'].corr(preseason_new['OPS'])
sns.scatterplot(regular_season_new['OPS'], preseason_new['OPS'])
plt.title('correlation(상관계수): '+str(np.round(correlation,2)), fontsize=20)
plt.xlabel("정규시즌 OPS",fontsize=12)
plt.ylabel("프리시즌 OPS",fontsize=12)
plt.show()
- 정규시간과 프리시즌의 성적의 상관계수를 보면 더 시즌간의 상관성은 낮다는 것을 알 수 있습니다.
- 프리시즌 데이터의 경기 기록 수는 매우 적으므로 그 구성 역시 정규시즌 데이터와 차이가 있을 수 있다
- 프리시즌 데이터와 정규시즌 데이터 간 상관관계가 매우 낮음
- 예측 모델에 프리시즌 데이터는 사용하지 않는 것이 좋을 것 같음
OPS값 확인
plt.figure(figsize=(15,6)) # 그래프 크기 조정
plt.subplot(1,2,1) # 1행 2열의 첫 번째(1행, 1열) 그래프
g = sns.boxplot(x="year", y="OPS", data=regular_season_df, showfliers=False)
g.set_title('연도별 OPS 상자그림', size = 20)
g.set_xticklabels(g.get_xticklabels(),rotation=90)
plt.subplot(1,2,2)
plt.plot(regular_season_df.groupby('year')['OPS'].median())
plt.title('연도별 OPS 중앙값', size = 20)
plt.show()
팀별성적
- 선수들의 성적에 팀 성적이 영향을 미칠수도 있기 때문에 팀별 및 연도별 OPS의 값을 확인
키와 몸무게 변수를 이용해 성적과 연관성 확인
- height/weight 컬럼에서 키와 몸무게 변수를 생성하는 코드
- 몸무게를 키로 나눠 파생변수 생성
- 이 값이 크면 그만큼 키에 비해 몸무게가 많이 나간다고 볼 수 있음
- 일반적으로 키에 비해 몸무게가 크다면 힘이 세고 반대의 경우에는 스피드가 빠를 것이라고 추측해 볼 수 있다.
- 따라서 계산한 값이 크다면 힘과 연관성이 높은 장타율과 상관관계를 보고, 값이 작을 때는 스피드가 중시되는 출루율과의 상관관계를 확인
2. Docker Compose
개념
- 시스템 구축과 관련된 명령어를 하나의 텍스트파일(compose file)에 기재해 명령어 한 번에 시스템 전체를 실행하고 종료와 폐기까지 한 번에 하도록 도와주는 도구
- 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업환경을 제공하는 관리 도구
- docker compose는 docker run명령어를 여러 개 모아놓은 것과 같으며, 컨테이너와 주변 환경(네트워크, 볼륨 등)을 한 번에 생성 가능
사용이유
- 여러 개의 컨테이너가 하나의 어플리케이션으로 동작할 때 도커 컴포즈 파일을 생성하지 않으면 각 컨테이너를 하나씩 생성 필요
- 예) 웹 애플리케이션 = 웹 서버 컨테이너, DB컨테이너 두 개의 컨테이너를 각각 생성 필요
3. docker volume
개념
- docker 컨테이너는 데이터를 영속적으로 저장할 수 있도록 볼륨(volume), 바인드 마운트(bind mount)를 지원
- docker에서 각각 생성된 컨테이너는 지정된 하나의 docker volume를 바라보고 있어 volume을 수정 시 각 컨테이너도 수정됨
볼륨 생성 및 조회
docker volume create test_vol
docker volume inspect test-vol
-->
[
{
"CreatedAt": "2023-04-26T22:15:48Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
오늘은 이렇게 복습을 마무리하겠습니다.
감사합니다.