背景
その2です。
今回はkaggle datasetsの「Avocado Prices」のデータを使ってみます。
https://www.kaggle.com/neuromusic/avocado-prices
含まれているデータは下記の通り
- Date - 観測日
- AveragePrice - 1つのアボカドの平均価格
- type - 従来型またはオーガニック
- year - 年
- Region - 観測の都市または地域
- Total Volume - 販売されたアボカドの総数
- 4046 - PLU 4046を販売しているアボカドの総数
- 4225 - PLU 4225を販売しているアボカドの総数
- 4770 - PLU 4770を販売しているアボカドの総数
この中で、TotalVolumeを計算していきたいと思います。
なお、アメリカの観測されている都市はたくさんありますが、今回はAlbanyのみ扱っていきます。また、アボカドのタイプは「conventional」「
organic」の2つがありましたが、今回は「conventional」を対象にします。
本題
import numpy as numpy
import pandas as pd
import pandas_profiling as pdp
import os
import sys
まずはインポートです。
EDAに便利というPandas_profilingを使ってみたかったので、インストールしてみました。
#ファイル読み込み
avc_csv_data = pd.read_csv("avocado.csv")
avc_csv_data.info()
profile = pdp.ProfileReport(avc_csv_data)
profile.to_file(outputfile="EDA.html")
avc_csv_data["region"].drop_duplicates()
ファイルを読み込み、pandas_profilingでEDAをしてみました。
結果は、、、一発でここまでできるのはすごいなと思いました。
参考:https://qiita.com/h_kobayashi1125/items/02039e57a656abe8c48f
avc_csv_data["region"].drop_duplicates()
をしているのは、どの領域のデータがあるか確認したかったからです。
結果は下記の通りです。
0 Albany
1 Atlanta
2 BaltimoreWashington
3 Boise
4 Boston
5 BuffaloRochester
6 California
7 Charlotte
8 Chicago
9 CincinnatiDayton
10 Columbus
11 DallasFtWorth
12 Denver
13 Detroit
14 GrandRapids
15 GreatLakes
16 HarrisburgScranton
17 HartfordSpringfield
18 Houston
19 Indianapolis
20 Jacksonville
21 LasVegas
22 LosAngeles
23 Louisville
24 MiamiFtLauderdale
25 Midsouth
26 Nashville
27 NewOrleansMobile
28 NewYork
29 Northeast
30 NorthernNewEngland
31 Orlando
32 Philadelphia
33 PhoenixTucson
34 Pittsburgh
35 Plains
36 Portland
37 RaleighGreensboro
38 RichmondNorfolk
39 Roanoke
40 Sacramento
41 SanDiego
42 SanFrancisco
43 Seattle
44 SouthCarolina
45 SouthCentral
46 Southeast
47 Spokane
48 StLouis
49 Syracuse
50 Tampa
51 TotalUS
52 West
53 WestTexNewMexico
都市のレベル感はばらばらだと思いました。
51行目はTotalUSですし。
#欠損値の有無
avc_csv_data.isnull().any(axis=0)
#年の確認
avc_csv_data.groupby(["year"]).mean()
#albanyだけ考える
alb_avo = avc_csv_data[avc_csv_data["region"]=='Albany']
#print(alb_avo)
#typeをconventionalとorganicに分ける
alb_avo_con = alb_avo[alb_avo["type"]=='conventional']
alb_avo_org = alb_avo[alb_avo["type"]=='organic']
#日付でソート
alb_avo_con.sort_values('date',ascending=True)
alb_avo_org.sort_values('date',ascending=True)
欠損値を確認し、Albany、type、日付でソートしています。
#trainとvalに分割
y_train = res.loc['2015':'2016',['Total Volume']]
y_train.info()
y_val = res.loc['2017',['Total Volume']]
X_train = res.loc['2015':'2016',['AveragePrice','4046','4225','4770','Total Bags']]
X_val = res.loc['2017',['AveragePrice','4046','4225','4770','Total Bags']]
trainとvalをわけています。
今回は2015、2016年をtrainとし、2017年を予想していきたいと思います。
特徴量は、基本的に全部使います。
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
#モデルを定義
RF_model = RandomForestRegressor(random_state=1)
#学習開始
RF_model.fit(X_train,y_train)
RF_val_pred = RF_model.predict(X_val)
print(y_val)
print(RF_val_pred)
RF_val_mae = mean_absolute_error(RF_val_pred,y_val)
print(RF_val_mae)
MAEは4181.937603773585でした。
あとがき
やはりpandasの使い方が慣れない。
それと、プロットしないと、結果がわかりにくい。可視化大事だなと思いました。