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)
次に赤ワインにフォーカスしてワインの味わいとアルコール度数の関係に注目します.
縦軸が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ならもう少し精度が上がると思います.時間があれば編集してアップします.
今回役立った本がこちらです.少し値段が高いですが,それに見合った良本であるのでぜひ!
ではまた!
Seabornを用いたデータの可視化
mathmaticaのコードをPythonに書き直してたら,Seabornに出くわしたのでまとめます.
このあたりの参考書がSeabornの勉強をするのに役に立ちます.
はじめてのPython & seaborn グラフ作成プログラミング/十河宏行
- ジャンル: 本・雑誌・コミック > PC・システム開発 > プログラミング > その他
- ショップ: bookfan 1号店 楽天市場店
- 価格: 3,240円
Seabornとは何か?
Seabornとは,ニューヨーク大学の研究者 Michael Waskom氏によって作られたPythonの可視化ライブラリです.Matplotlibベースで作られていて,デフォルトのMatplotlibより美しく描写できます.
distplot
「seaborn.distplot」はヒストグラムを描写できます.
まずseabornをインストールします.
pip install seaborn
次に必要なものをインポートして,それぞれnp,sns,pltと略記
import numpy as np import seaborn as sns import matplotlib.pyplot as plt
はじめに標準正規分布に従う乱数5000個を発生させて可視化します.
x = np.random.normal(size=5000)
sns.distplot(x)
plt.show()
デフォルトでは,ヒストグラムと密度推定の関数の両方が描写されます.
ヒストグラムだけ,書きたかったらオプションでkde=Falseと指定
ヒストグラムがいらなけらば,hist=Falseと指定
sns.distplot(x,kde=False) sns.distplot(x,hist=False)
色の変更もオプションで指定することができます.
sns.distplot(x,color="red")
heatmap
「seaborn.heatmap 」は,色の濃淡や色相でデータの密度や値の分布を可視化します.
旅客機のデータを用いてヒートマップを出力します.
#データを読み込み flights = sns.load_dataset("flights") # データの整形 flights = flights.pivot("month", "year", "passengers") sns.heatmap(flights)
セルにデータを出力するためオプションで,annot=Trueと指定
整数値で出力させるため,fmt="d"と指定します.
sns.heatmap(flights, annot=True, fmt="d")
やっぱ夏かー
最近のデータを用いて,旅行のタイミングなど可視化してみたい気持ちになった.いつが空いていて安くいけるのだろうか.
kaggleデビューでもしょうかな.
今回はここまでにします.一度記事を書いたのですが,アップロードと間違えファイルを消してしまいもう一度書きました.かなり適当に書いたので誤字脱字あれば,ごめんないさい.
ではまた!
ニュートン・ラプソン(Newton-Raphson)法の基礎
ニュートン・ラプソン(Newton-Raphson)法はとなる解を近似的に求める方法であり,解析的に解を求めることが困難な場合の有効な手法です. 図1を例に考えると,の近似解を求めることが今回の目標となるわけです!ニュートン法を用いて,という具合で近似解を求めます.
step1:
適当に初期値を決め,におけるの接線(緑)を求める.
step2:
step1で求めた接線と軸との交点を求め,におけるの接線(水色)を求める.
step3:
以下同様に,step1,2の操作を繰り返す.
における接線を求める接戦と軸との交点を求める.における接線を求める.
step4:
あるに対して,との差の絶対値が限りなく小さくなった時,をの近似解とする.
以下にニュートン法のサンプルコードを記載します.ネットではC言語での実装が多かったので,Pythonでコードを書きました.
初期値として,の近似解を求めてみました.
from sympy import Symbol,diff,sympify import math f=input('式を入力してください:') a=int(input('初期値を入力してください:')) eps=1.0e-5 max=10 count=0 x=Symbol('x') f = sympify(f) df=diff(f,x) for i in range(0,max): newa = a-(f.subs({x:a})/df.subs({x:a})) print(round(a,6)) if abs(a-newa)<eps: a=newa break a=newa count=count+1 if(count==max): print('収束しません') print('反復回数は{0}回です.'.format(count))
式を入力してください:x*x*x-2 初期値を入力してください:3 3 2.074074 1.537691 1.307076 1.261602 1.259923 反復回数は5回です.
Newton-Raphson 法の簡単な修正法として,Fisher のスコア法というものがあります.Newton-Raphson 法,Fisherのスコア法は確立分布のパラメータ推定に役に立ちます.
近々,Newton-Raphson 法,Fisherのスコア法さらにEMアルゴリズムを用いて,確立分布のパラメータ推定について取り上げた記事を書きたいと思います.
ここまで読んでいただいてありがとうございました.ではまた!
テキストエディタAtom最強説
最近TAの関係でAtomを使ってコードを書いていたので,Atomについて書きます.
そもそもAtomとは何?
Atomとは,「GitHub社」によって2015年に正式にリリースされた比較的新しいテキストエディタです.AtomのインストーラはMacOS, Linux,Windowsに対応しています.
テキストエディタはEmacsとかmiをずっと使っていたのですが,Atomもかなり高機能なテキストエディタで,個人的にはとても使いやすく驚きました!
Atomの特徴は,
1.無料で公開されているパッケージで拡張が可能
2.タブ型で,使いやすいインターフェース
3.プロジェクト単位で下層ディレクトリごとファイルを管理することができる
1番驚いたのは,何と言っても拡張機能の多さです.もう便利なパッケージが多すぎます笑 あまりにも利便性が高いので次のような本まであります.
Atom実践入門──進化し続けるハッカブルなエディタ【電子書籍】[ 大竹智也 ]
- ジャンル: 本・雑誌・コミック > PC・システム開発 > その他
- ショップ: 楽天Kobo電子書籍ストア
- 価格: 2,894円
さらに,Atomはオープンソース性を取り入れているため,米国GitHub Inc.の社員を中心にAtomの開発が進められているのでかなり将来性があるテキストエディタです!
どのくらい人気があるのかなーと思って調べたらかなり人気でした...(無知すぎた)
1位 Vim
2位 Atom
4位 Emacs
2017年の調査結果ですが,かなり上位にいます.
Emacsは去年先輩が使っていたので利用していましたが,覚えるコマンドが多くて慣れるのが大変でした.一方Atomはユーザーインターフェースなので比較的簡単に利用できことが上位に来てる要因の1つなのかなと思います.
Atomの実行画面はこんな感じです! Atomに慣れて来たらまた記事にしたいと思います.
ランダム行列理論
ランダム行列理論についての特集が数学セミナーにあったので面白かったところをピックアップしたいと思います.
・ランダム行列とは?
ランダム行列とは確率変数を成分とする行列であり,多変量解析ではウィシャート行列が代表的なランダム行列であります.統計学に限らず,分布の仮定を変えることによって無線通信,ポートフォリオ理論,複雑ネットワーク,など様々な応用例があるところが興味深いです.特にいくつかの限定された統計集団の下での研究がなされています.ランダム行列理論には大きく分けて,ガウス型統計集団やラゲール統計集団などがあり,数学セミナーではガウス型統計集団が主にピックアップされていました.ガウス型統計集団にも大きく分けて3つあります.
(1)ガウス型直交統計集団(GOE)
(2)ガウス型ユニタリ統計集団(GUE)
ランダム行列理論は,行列の固有値の分布を求めることが重要になります. (1)~(3)は具体的に固有値分布を計算することができるので多くの研究がされています.
統計学から
ラゲール統計集団は,ウィシャート行列を用いて,ガウス型統計集団と同様の条件で構成されています.ウィシャート行列の固有値は主成分分析などを考える際とても重要になります.
医療データ(血圧,身長,体重,)を人の患者について測定することを考えます.古典的にはをfix,を十分大きい場合の研究が多くされていましたが,医療データなどを考えるときには,をfix,が十分大きい場合は考える必要があります.
< の場合,ウィシャート行列の逆行列が存在しないなどの理由から固有値の分布を求めるのが困難になります.従って,先行研究では従来とは異なった手法や方法論が展開されたいます.
・ランダム行列理論とリーマン予想
数論の方からも近年ランダム行列が注目されています.リーマン予想とは数学の未解決問題であることはみなさん知っているかと思います.リーマン予想が重要である理由は,素数の分布問題に決定的な役割を果たすからです.リーマン予想はそれだけでなくゼータ関数と関わりがあり,リーマン・ゼータ関数の零点を考える際には,ランダム行列が役立ちます.
証明されている訳ではありませんが,多くの数値実験の結果により零点全体の分布がランダム行列の固有値の分布に似ていることが確認されています.この現象は「モンゴメリ-オドリツコの法則」と呼ばれています.
ランダム行列には様々な応用例があることが改めて分かりました.機械学習方面でもランダム行列は注目されているようなので,そちらに詳しい方はコメント等で教えていただけると幸いです.