データサイエンス時代で活躍する人材になるために

データサイエンス時代で活躍できる人材になるために

純粋数学から応用数学までデータサイエンスに関わる様々なことについて取り上げます!

Wine Qualityを用いたデータ分析(R編)

 Wine Quality Data setを用いて,Rでデータ分析をしてみます.
本記事では,UCI Machine Learning Repository*1で提供されているWine Qualityデータを用います.Wine Qualityデータは,赤ワイン,白ワイン(合計約6500本)に含まれる11成分のデータとワインの味を10段階で評価したデータから成っています..
 余談ですが,筆者はワインが一切飲めず,ワインに関する知識は皆無です...
データの中身は下記のようになっています.

  • fixed acidity: 酒石酸濃度
  • volatile acidity: 酢酸濃度
  • citric acid: クエン酸濃度
  • residual sugar: 残糖濃度
  • chlorides: 塩化ナトリウム濃度
  • free sulfur dioxide: 遊離SO2(二酸化硫黄)濃度
  • total sulfur dioxide:総SO2(二酸化硫黄)濃度
  • density: 密度
  • pH: 水素イオン濃度
  • sulphates: 硫化カリウム濃度
  • alcohol: アルコール度数
  • quality: 評価

CSVファイルの読み込み

まずはcsvファイルの読み込みです.
Wine Qualityは,セミコロン区切りで保存されているので区切り文字に対応したread_delim関数を今回用います.
col_typesは読み込むデータの型を指定してます.今回は数値データなので,col_double()と指定.

#データの読み込み
winequality_red<-read_delim("winequality-red.csv",
delim=";",col_types=cols(.default=col_double())
)
winequality_white<-read_delim("winequality-white.csv",
delim=";",col_types=cols(.default=col_double())
)

データの整形と加工

 データ分析で1番面倒なところです.筆者は,半年ほど某会社でデータ分析に従事していたのですが,前処理の作業が大変であったことを思い出しました.今回は提供されているデータを用いているので,複雑な前処理はありません.ワインの種別を表す変数(赤,白)をここで追加.

#カラム名の空白を"."に置き換える 
#要重要
colnames(winequality_red) <- gsub(" ", ".", colnames(winequality_red))
colnames(winequality_white) <- gsub(" ", ".", colnames(winequality_white))
#ワイン種別の変数を追加
winequality_red <- winequality_red %>% mutate('wine type'="red")
winequality_white <- winequality_white %>% mutate('wine type'="white")
#データフレームの結合
winequality <- bind_rows(winequality_red,winequality_white)

ggplotパッケージを用いた可視化

 ggplot2は様々なデータを可視化するのに便利なパッケージです.ggplot2はtidyverseパッケージに含まれてるので,tidyverseを今回に使います.

まずベースとなる可視化の枠を作成します.

g<- ggplot(winequality)

x軸にfixed.acidity,y軸にvolatile.acidity,赤ワイン,白ワインで塗り分けて散布図をかくコマンドをコーデイングします.

scatter <- g+ geom_point(aes(
x=fixed.acidity,
y=volatile.acidity,
colour=wine.type
))
plot(scatter)

f:id:koki12070930:20190527210845p:plain 

次に赤ワインにフォーカスしてワインの味わいとアルコール度数の関係に注目します.
f:id:koki12070930:20190528103711p:plain
縦軸がqualityつまりワインの味わいを表していますが,quality=8あたりをみると若干ですが,アルコール度数が高いほど,qualityが高くなってることが分かります.
ここでは,1項目(アルコール度数)を用いて,qualityとの関係を視覚的に捉えましたが,ここにqualityの質を確証する根拠はありません.また多項目を用いてqualityとの関係を調べるのは煩雑であるため,それなりに根拠のある結果を得るには,統計学機械学習の手法が必然的に必要になってきます.

ランダムフォレストを用いた分析

まず赤ワインのデータを学習データとテストデータに分割します.

set.seed(100)
df.rows = nrow(iris) 
train.rate = 0.7 # 訓練データの比率
train.index <- sample(df.rows, df.rows * train.rate)
df.train = iris[train.index,] # 訓練データ
df.test = iris[-train.index,] # テストデータ

ランダムフォレストでモデルを作成し,テストデータで予測します.今回パラメータチューニングはカットしています.感覚でパラメータを設定します.

model<- randomForest(as.factor(quality)~.,df.train,mtry=2)
predict(model,newdata=df.test[,-12])

混合行列を出力してみます.

table(df.test$quality,predict(model,newdata=df.test[,-12]))
  
      3   4   5   6   7   8
  3   0   1   3   0   0   0
  4   0   0   7   5   0   0
  5   0   0 177  44   0   0
  6   0   0  46 134   6   0
  7   0   0   3  22  26   0
  8   0   0   0   4   2   0

対角線に数字が並べばうまく予測できていることになります.8の分類がまったくうまくいってないですね... そうはいっても分類率は0.716を出しているのでぼちぼちといったところでしょうか.

各変数の重要度を確認します.

importance(model)
                     MeanDecreaseGini
fixed.acidity                57.32868
volatile.acidity             71.19491
citric.acid                  59.22533
residual.sugar               53.27587
chlorides                    59.09640
free.sulfur.dioxide          53.56390
total.sulfur.dioxide         75.62268
density                      68.82106
pH                           55.31616
sulphates                    80.64674
alcohol                      91.56081

アルコール度数が1番重要な項目になっていることが分かります.
どうすれば,さらに精度が向上するのでしょうか.必要ない項目を削除したりとか?
経験談ですが,xgboostならもう少し精度が上がると思います.時間があれば編集してアップします.

今回役立った本がこちらです.少し値段が高いですが,それに見合った良本であるのでぜひ!


ではまた!