Skip to content

Latest commit

 

History

History
186 lines (148 loc) · 5.24 KB

211012.md

File metadata and controls

186 lines (148 loc) · 5.24 KB

Day 11

파이썬을 이용한 머신러닝, 딥러닝 실전 앱 개발 (2일차)


머신러닝 입문

2006년 ~ 2016년 동안의 기상 데이터 분석

기상 데이터 예제 파일

예제 파일 데이터 전처리

in_file = './data/data.csv'
out_file = './data/tem10y.csv'

# csv 파일을 한 줄 씩 읽어 들이기
with open(in_file, 'rt', encoding = 'EUC_KR') as fr: # excel 등에서 출력한 csv 파일을 포함해 한국어가 들어가 있는 csv 파일은 EUC_KR인 경우가 많음
    lines = fr.readlines()
    
# 기존의 데이터를 분리해서 가공하기
lines = ['연,월,일,기온,품질,균질\n'] + lines[5:]
lines = map(lambda v: v.replace('/',','),lines)
result = ''.join(lines).strip()

# 결과를 파일에 출력
with open(out_file, 'wt', encoding = 'utf-8') as fw:
    fw.write(result)
    print('saved')

내가 한 날짜별 평균 기온

import pandas as pd

df = pd.read_csv('./data/tem10y.csv', encoding = 'utf-8')

mean_10y = df.pivot_table(values = '기온',
                          columns = '월',
                         index = '일',
                         aggfunc = 'mean')
mean_10y.head(31)

내가 한 월별 평균 기온

import pandas as pd

df = pd.read_csv('./data/tem10y.csv', encoding = 'utf-8')

mean_10y = df.pivot_table(values = '기온',
                         index = '월',
                         aggfunc = 'mean')
mean_10y.head(12)

책의 날짜별 평균

import pandas as pd

# pandas로 csv 파일 읽어 들이기
df = pd.read_csv('./data/tem10y.csv', encoding='utf-8')

# 날짜별 기온을 리스트에 넣기
md = {}
for i, row in df.iterrows(): # DataFrame 자료형의 데이터를 한 줄씩 처리하고 싶을 때는 for 반복문과 df.iterrows() 조합해서 사용
    m, d, v = (int(row['월']), int(row['일']), float(row['기온']))
    key = str(m) + '/' + str(d)
    
    if not(key in md): md[key] = []
    md[key] += [v]
    
# 날짜별 평균 구하기
avs = {}
for key in md:
    v = avs[key] = sum(md[key]) / len(md[key])
    print('{0} : {1}'.format(key, v))

책의 월별 평균

import matplotlib.pyplot as plt
import pandas as pd

#csv 파일 읽어 들이기
df = pd.read_csv('./data/tem10y.csv', encoding = 'utf-8')

# 월별 평균 구하기
g = df.groupby(['월'])['기온']
gg = g.sum() / g.count()

# 결과 출력하기
print(gg)
gg.plot()
plt.show()

기온이 30도 넘는 날 구하기

import matplotlib.pyplot as plt
import pandas as pd

# 파일 읽기
df = pd.read_csv('./data/tem10y.csv', encoding = 'utf-8')

# 온도가 30도를 넘는 데이터 확인
hot_bool = (df['기온'] > 30) # 이전에 써왔던 condition 변수와 같음

# 데이터 추출
hot = df[hot_bool]

# 연별로 세기
cnt = hot.groupby(['연'])['연'].count() # 연으로 그룹화하고 연 칼럼만 사용하겠다

# 출력하기
print(cnt)
cnt.plot()
plt.show()

회귀 분석으로 내일 기온 예측

from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 기온 데이터 읽기
df = pd.read_csv('./data/tem10y.csv', encoding = 'utf-8')

# 데이터를 학습 전용과 테스트 전용으로 분리
# 데이터에는 2016년까지 있음
train_year = (df['연'] <= 2015)
test_year = (df['연'] >= 2015)
interval = 6

# 과거 6일의 데이터를 기반으로 학습할 데이터 만들기
def make_data(data):
    x = [] # 학습 데이터, 설명 변수
    y = [] # 결과, 목적 변수
    temps = list(data['기온'])
    for i in range(len(temps)):
        if i < interval: continue
        y.append(temps[i])
        xa = []
        for p in range(interval):
            d = i + p - interval
            xa.append(temps[d])
        x.append(xa)
    return (x, y)
        
train_x, train_y = make_data(df[train_year])
test_x, test_y = make_data(df[test_year])

# 직선 회귀 분석하기
lr = LinearRegression(normalize = True)
lr.fit(train_x, train_y) # 학습하기
pre_y = lr.predict(test_x) # 예측하기

# 결과를 그래프로 그리기
plt.figure(figsize = (10,6), dpi=100)
plt.plot(test_y, c='r') # 실제 기온
plt.plot(pre_y, c='b') # 예측 기온
plt.show()

결과 평가

diff_y = abs(pre_y - test_y) # 예측 기온 - 실제 기온 => 오차
print('avergae = ', sum(diff_y) / len(diff_y)) # 오차의 평균
print('max = ', max(diff_y)) # 오차의 최댓값

map(함수, 리스트)

  • 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시키고, 그 결과를 새로운 리스트에 담는다.

lambda 인자 : 표현식

  • (lambda x,y : x + y)(10, 20) -> 결과는 30

선형 회귀 (Linear Regression)

  • 종속 변수 y와 한 개 이상의 독립 변수 x와의 선형 상관 관계를 모델링하는 회귀분석 기법

설명변수

  • 머신러닝의 교사 학습에 있어서 예측에 사용하는 정보
  • 동의어 : 독립 변수, 예측 변수, 원인 변수, 조작 변수, 통제 변수, 공변량 등등

목적 변수

  • 머신러닝의 교사 학습에 있어서 예측하고 싶은 정보
  • 동의어 : 종속 변수, 반응 변수, 결과 변수, 표적 변수