yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

svmで天気を分析してみる

2017-10-22

dockerでpython環境を整えた話の続き

■準備

特に何も分析したいものがないので、天気のデータを分析する
気象庁のページから情報を拝借、データの形を整える
csvデータはこちら

できたのは、こんな感じの中身のデータ
気温、降水量(mm)、日照時間(h)、降雪量(cm)、風速(m/s)などの情報から天気を当てさせようとしている

root@e283ad583064:/yoshi_work# head data.csv
temp,rain_mm,sun_h,snow_cm,wind_ms,cloud_percent,daytime,nighttime
21.9,0,10,0,3,2.3,sunny,sunny
18.2,0,4.9,0,3,7.5,cloudy,cloudy
16.7,0,0.1,0,2.1,10,cloudy,cloudy
18.1,0,4.8,0,2.4,9.8,cloudy,cloudy
14.9,0,9.8,0,2.4,2.5,sunny,sunny
14,1,2.4,0,2,6.3,cloudy,cloudy
19.1,0,9.6,0,1.7,5,sunny,cloudy
19,0,7.6,0,3.3,4.8,sunny,sunny
12.2,18,0,0,2.4,9.5,cloudy,rainy
root@e283ad583064:/yoshi_work# cat data.csv | wc -l
367
root@e283ad583064:/yoshi_work#

■中身

中身はこんな感じ

import pandas as pd
from sklearn import svm, metrics, cross_validation

csv = pd.read_csv('data.csv')

csv_data = csv[["temp","rain_mm","sun_h","snow_cm","wind_ms","cloud_percent"]]
csv_label = csv["daytime"]

train_data, test_data, train_label, test_label = cross_validation.train_test_split(csv_data, csv_label)

clf = svm.SVC()
clf.fit(train_data, train_label)
pre = clf.predict(test_data)

print(pre)

ac_score = metrics.accuracy_score(test_label, pre)
print('accuracy: ', ac_score)

■実行

リストで出ているのが、予測天候
テストデータとして使われたデータ(答え)はtest_labelに入っているので照らし合わせても良いが、一応一番下を見ると、80%くらい(0.804347826087)の割合で当たっていることがわかる

root@e283ad583064:/yoshi_work# python weather-train.py
['sunny' 'sunny' 'cloudy' 'cloudy' 'sunny' 'sunny' 'cloudy' 'sunny'
 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy'
 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'cloudy'
 'cloudy' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'sunny'
 'cloudy' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'cloudy'
 'sunny' 'sunny' 'cloudy' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy'
 'cloudy' 'sunny' 'cloudy' 'sunny' 'rainy' 'cloudy' 'cloudy' 'cloudy'
 'cloudy' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'cloudy'
 'sunny' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'cloudy'
 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'cloudy'
 'sunny' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'sunny' 'sunny' 'sunny'
 'cloudy' 'sunny' 'sunny']
accuracy:  0.804347826087
root@e283ad583064:/yoshi_work#

今は、cross_validationを使って学習データと、テストデータを作成してしまっているが、もう少し地道に学習データとテストデータの割合を調整すれば正答率も変わってきそう