
Day1
머신러닝은 이제 보조의 영역이지만 종종 작은 모델을 만들어야할 때가 올 수 있으니, 그 때를 위한 라이트한 준비.
대학교 수업에서의 머신러닝 = 데이터마이닝 = 패턴인식
평균의 함정 → 중앙값은 높지 않음.
표본에서 얻은 기술 통계로 모집단의 특성과 정보를 추리하는 것이 추론통계
통계학은 설명이 가능해야한다.
statsmodels → 진짜 통계
scipy.stats →빠른 통계
numpy → 선형대수
type(np.array([1,2,3]))
numpy.ndarray
np.array([1,2,3])*5
array([ 5, 10, 15]) → 브로드캐스팅
numpy는 c로 이루어져있어서 C와는 속도 비슷할 수 있음.
파이썬이 무거워서 느린데도 사용하는 이유 → numpy
np.array([[1,2,3],[4,5,6]]) # matrix
np.array([[[1,2,3],[4,5,6]]]) #tensor
TPU
np.arange(16).ndim #1
이상치, 최빈값, 중앙값, 평균.
Categorical data ⇒ 질적 데이터
import pandas as pd
pd.DataFrame({'a':[1,2,3,4]}).describe()
| a | |
|---|---|
| count | 4.000000 |
| mean | 2.500000 |
| std | 1.290994 |
| min | 1.000000 |
| 25% | 1.750000 |
| 50% | 2.500000 |
| 75% | 3.250000 |
| max | 4.000000 |
ex) 평균이 60, 당신은 75점을 받았다.
이 때 표준편차가 12점일 때보다 8점일 때보다 언제가 더 좋은가? ⇒ 8점.
왜? 주로 그 편차 안에 70퍼 정도가 들어가 있으므로, 상위 20,30퍼 정도됨을 의미할 수 있다.
표준편차 +-2배보다 멀리 떨어진 데이터는 좌우 양쪽 합쳐서 5%밖에 없다 생각하면 대략 맞다.
import pandas as pd
pd.DataFrame({'a':[1,2,3,4],'b':['남','남','여','여']}).describe(include='all')
| a | b | |
|---|---|---|
| count | 4.000000 | 4 |
| unique | NaN | 2 |
| top | NaN | 남 |
| freq | NaN | 2 |
| mean | 2.500000 | NaN |
| std | 1.290994 | NaN |
| min | 1.000000 | NaN |
| 25% | 1.750000 | NaN |
| 50% | 2.500000 | NaN |
| 75% | 3.250000 | NaN |
| max | 4.000000 | NaN |
mean 평균
std : 표준편차
a : 양적 데이터
b : 질적 데이터
매번 컴퓨터를 켜서 실행할 수 없으므로, 스케쥴러를 사용함
그 스케쥴러가 airflow. 신입사원 우대.
네카라쿠배 안쓸 수 없음.
MLops 관리.
최종 프로젝트에는 airflow 사용하면 좋다.
kbo.shape ## 형상 보는거. (913,14)
913→ 관측 데이터, row
14 → 설명변수(통계), feature, colunms.
kbo.head(3)
kbo.info()
kbo.isnull().sum()
kbo.HEIGHT.dtype
dtype('int64') #8바이트. 8*8
비트 8개 모이면 바이트


type(np.nan) #float, 결측치가 float 형태임.
kbo.HEIGHT.mean() #np.float64(182.91347207009858)
kbo.HEIGHT.std() #4.949101049590222
print(kbo.HEIGHT.mean()-kbo.HEIGHT.std())
print(kbo.HEIGHT.mean()+kbo.HEIGHT.std())
177.96437102050837
187.8625731196888
-1.818e-12는 왼쪽 방향으로 소수점 12번 이동. 즉 0과 비슷한 값이라 볼 수 있음.
help(kbo.HEIGHT.std)
기본값 =1
ddof를 0으로 넣는다면. → 자유도
Delta Degrees of Freedom.

1,2,3,4분위값.


평균 → 뮤(𝜇, Mu)
표준편차 - 시그마(𝜎, Sigma)

⇒ 비모수적인건? 출신을 모르겠는 것이다.
정규분포
딥러닝에서 보는 분포 → 유니폼 분포, 베타 분포, 디리클레 분포(gpt 전에 자연어처리에서 사용했었음)
LDA??? 문서 정리 방법론
kbo.TEAM.value_counts()

kbo.sort_values(by='SALARY',ascending=False)
kbo.sort_values(by=['SALARY','HEIGHT'],ascending=[False,False])
kbo[kbo.TEAM =="KT 위즈"]
kbo.query("TEAM == 'KT 위즈' ")
kbo.drop(0) #그냥은 인덱스 기준
kbo.drop(["ID"],axis=1) #row와 컬럼 둘 다 지울 수 있다.
kbo.drop(["ID"],axis=1,inplace=True) #row와 컬럼 둘 다 지울 수 있다.
kbo.groupby(['TEAM','POSITION'])[['SALARY']].mean().index
MultiIndex([('KIA 타이거즈', '내야수(우투우타)'),
('KIA 타이거즈', '내야수(우투좌타)'),
('KIA 타이거즈', '내야수(좌투좌타)'),
('KIA 타이거즈', '외야수(우투우타)'),
('KIA 타이거즈', '외야수(우투좌타)'),
('KIA 타이거즈', '외야수(좌투좌타)'),
('KIA 타이거즈', '투수(우언우타)'),
('KIA 타이거즈', '투수(우투양타)'),
('KIA 타이거즈', '투수(우투우타)'),
kbo.groupby(['TEAM','POSITION'],as_index=False)[['SALARY']].mean().index
kbo.POSITION.unique()
#파생변수
kbo['POSITION_2'] = kbo['POSITION'].apply(lambda x : x.split("(")[0])
kbo['POSITION_2'].unique()
array(['내야수', '투수', '포수', '외야수'], dtype=object)
kbo['POSITION_2'].value_counts()
POSITION_2
투수 476
내야수 205
외야수 156
포수 76
kbo.groupby(['TEAM','POSITION_2'],as_index=False)[['SALARY']].mean()

kbo.sort_values(by=['HEIGHT'],ascending=False,inplace=True)
kbo.groupby('TEAM').first()

키로 정렬 후 first 뽑으면 각 팀 1등 출력 가능.
kbo.groupby('TEAM').nth(1)

kbo.sort_values(by=['WEIGHT']).groupby('TEAM').first()
functional programming : 배달사고가 안남
보통 통계 교수님들은 빈도주의 통계.
현재는 베이지안 통계가 각광받을 수 있다. 컴퓨터가 연산하기 때문에!
과거에는 연산량이 많으므로 무시받아왔다.
현재는 Gpt 등 언어모델이 베이지안 통계 기반이다.
Day2
데이터 전처리 → SQL, Pandas
R ⇒ dplyr
df2=df
df2.loc[1,'c2'] =99
df #바라보는 곳이 같아서 df가 수정됨.
print(id(df))
print(id(df2))
2104847279376
2104847279376
df3=df[['c0','c1']]
df3
df3['c0']=df3['c0']*10

차트에서도 얻을 수 있다.
import pandas as pd
import requests
url=\
"https://m.stock.naver.com/front-api/external/chart/domestic/info?symbol=005930&requestType=1&startTime=20250428&endTime=20260121&timeframe=day"
r=requests.get(url)
eval(r.text.strip())
df2 = pd.DataFrame(eval(r.text.strip())[1:],
columns=eval(r.text.strip())[0])
# eval(r.text.strip())
df2['MA20']=df2 ['종가'].rolling(20).mean()
df2.dropna()
# 열 이름 중, '나이'를 '연령'으로, '성별'을 '남녀'로, '학교'를 '소속'으로 바꾸기
df = df.rename(columns={'나이':'연령', '성별':'남녀', '학교':'소속'})
# df의 행 인덱스 중에서, '준서'를 '학생1'로, '예은'을 '학생2'로 바꾸기
df = df.rename(index={'준서':'학생1', '예은':'학생2' })
# df 출력(변경 후)
print(df)
# 데이터프레임 df를 복제하여 변수 df2에 저장. df2의 1개 행(row)을 삭제
df2 = df.copy()
df2 = df2.drop('우현')
print(df2)
# 데이터프레임 df를 복제하여 변수 df4에 저장. df4의 2개 행(row)을 삭제
df4 = df.copy()
df4 = df4.drop(['우현', '인아'], axis='index')
print(df4)
df.transpose()
np.dot(np.arange(6).reshape(2,3),np.arange(6).reshape(2,3).T)
import random
import numpy as np
import pandas as pd
np.random.randint(9)
data = [np.random.randint(100) for x in range(100000)]
tmp = pd.DataFrame({'a': data})
import time
start = time.time()
for idx, x in tmp.iterrows():
tmp.iloc[idx] = x.values[0] * 10
import time
start = time.time()
tmp['a'] = tmp['a'] * 10
print(time.time()-start)
pd.get_dummies(titanic['sex'])
pd.get_dummies(titanic['sex'],drop_first=True)
df.query(조건문)
Day3
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
'acceleration','model year','origin','name']
df.shape
df.shape[0]
→ 데이터 건 수만 추출, [1]도 마찬가지
→ len(배열)처럼 개수처럼 사용하기 좋음.
import numpy as np
df.loc[2,'cylinders']=np.nan
1 cylinders 397 non-null float64
+) 문자열은 결측치 있으면 object로 취급됨.
# 데이터프레임의 모든 열(숫자형, 문자열 등)을 포함
df.describe(include='all')
df.count().values
# array([398, 398, 398, 398, 398, 398, 398, 398, 398])
df.count()가 어떤 의미의 series이자 딕셔너리므로, values 찍으면 배열이 나오게 됨.
import seaborn as sns
titanic= sns.load_dataset('titanic')
unique_values_ratio = (titanic['sex'].value_counts(normalize=True) *100).round(1)
unique_values_ratio
print(df.mean(numeric_only=True)) # 수치값이 있을 때는 numeric_only를 넣어야 한다.
상관계수와 비슷한데 단위가 있는 것 ⇒ 공분산.
ai-hub
나라장터 → 데이터 바우처 사업을 하는지 확인해야할수 있다.
그 결과물이 ai-hub.
포트폴리오는 팜플렛으로 만들지 말고, 문제 해결 과정을 작성해야 한다.
눈누 ⇒ 폰트 다운로드
바이브코딩…. 프론트엔드의 절망(남의 이야기가 아니게 될 수 있으니 힘내야 한다.)
Tableau, Power BI → indeed .
# 그래프 객체 생성 (figure에 1개의 서브 플롯을 생성)
fig = plt.figure(figsize=(20, 5))
ax = fig.add_subplot(1, 1, 1)
# axe 객체에 plot 함수로 그래프 출력
ax.plot(col_years, df_3.loc['충청남도',:], marker='o', markerfacecolor='green',
markersize=10, color='olive', linewidth=2, label='서울 -> 충남')
ax.plot(col_years, df_3.loc['경상북도',:], marker='o', markerfacecolor='blue',
markersize=10, color='skyblue', linewidth=2, label='서울 -> 경북')
ax.plot(col_years, df_3.loc['강원도',:], marker='o', markerfacecolor='red',
markersize=10, color='magenta', linewidth=2, label='서울 -> 강원')
url = "https://api.stock.naver.com/chart/domestic/item/{}/day?startDateTime=20240101&endDateTime=20260122"
code = { 'SK하이닉스' : '000660', '삼성전자' : '005930'}
for key, val in code.items():
locals()[key]=pd.DataFrame(requests.get(url.format(val)).json())
→ 바로 데이터프레임을 키 값을 변수명으로 만들어서 사용하기.
a = 10
b = 20
print(locals())
#{'a': 10, 'b': 20}
key = 'SK하이닉스'
val = '000660'
SK하이닉스 = pd.DataFrame(...)
오전 수업 요약
→ 각 다른 값을 쓸 때는 축을 따로 지정해서 나눌 수 있음
col_years = 삼성전자.localDate
col_years2 = pd.date_range('2024-01-01', '2026-01-23', freq='ME')
# 축 눈금 위치 지정
ax.set_xticks(col_years2)
# 그래프 객체 생성 (figure에 1개의 서브 플롯을 생성)
fig = plt.figure(figsize=(70, 5))
ax = fig.add_subplot(1, 1, 1)
# axe 객체에 plot 함수로 그래프 출력
ax.plot(col_years , 삼성전자.closePrice, marker='o', markerfacecolor='green',
markersize=3, color='olive', linewidth=2, label='삼성전자')
# ax.plot( col_years, SK하이닉스.closePrice, marker='o', markerfacecolor='blue',
# markersize=3, color='skyblue', linewidth=2, label='SK하이닉스')
ax1 = ax.twinx()
ax1.plot( col_years, SK하이닉스.closePrice, marker='o', markerfacecolor='blue',
markersize=3, color='skyblue', linewidth=2, label='SK하이닉스')