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

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

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

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ならもう少し精度が上がると思います.時間があれば編集してアップします.

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


ではまた!

Seabornを用いたデータの可視化

 mathmaticaのコードをPythonに書き直してたら,Seabornに出くわしたのでまとめます.


このあたりの参考書がSeabornの勉強をするのに役に立ちます.

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()

f:id:koki12070930:20190525121024p:plain
デフォルトでは,ヒストグラム密度推定の関数の両方が描写されます.
ヒストグラムだけ,書きたかったらオプションでkde=Falseと指定
ヒストグラムがいらなけらば,hist=Falseと指定

sns.distplot(x,kde=False)
sns.distplot(x,hist=False)

f:id:koki12070930:20190525121737p:plain
kde=False


f:id:koki12070930:20190525122003p:plain
hist=False
色の変更もオプションで指定することができます.
sns.distplot(x,color="red")
f:id:koki12070930:20190525132133p:plain

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")

f:id:koki12070930:20190525142613p:plain
やっぱ夏かー
最近のデータを用いて,旅行のタイミングなど可視化してみたい気持ちになった.いつが空いていて安くいけるのだろうか.
kaggleデビューでもしょうかな.
今回はここまでにします.一度記事を書いたのですが,アップロードと間違えファイルを消してしまいもう一度書きました.かなり適当に書いたので誤字脱字あれば,ごめんないさい.
ではまた!

ニュートン・ラプソン(Newton-Raphson)法の基礎

 ニュートン・ラプソン(Newton-Raphson)法f(x)=0となる解を近似的に求める方法であり,解析的に解を求めることが困難な場合の有効な手法です.

f:id:koki12070930:20190520223334p:plain
図1
 図1を例に考えると,f(x)=0の近似解x_4を求めることが今回の目標となるわけです!ニュートン法を用いて,x_1 \rightarrow x_2\rightarrow x_3\rightarrow x_4という具合で近似解を求めます.

step1:
適当に初期値x_1を決め,x_1におけるf(x)の接線()~y=f'(x_1)(x-x_1)+f(x_1)を求める.
step2:
step1で求めた接線とx軸との交点x_2を求め,x_2におけるf(x)の接線(水色)を求める.
step3:
以下同様に,step1,2の操作を繰り返す.
x_kにおける接線を求める\rightarrow接戦とx軸との交点x_{k+1}を求める.\rightarrow x_{k+1}における接線を求める.
step4:
あるmに対して,x_mx_{m+1}の差の絶対値が限りなく小さくなった時,x_{m+1}f(x)の近似解とする.

以下にニュートン法のサンプルコードを記載します.ネットではC言語での実装が多かったので,Pythonでコードを書きました.
初期値x_1=3として,f(x)=x^3-2の近似解を求めてみました.

<サンプルコード>

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インストーラMacOSLinuxWindowsに対応しています.

テキストエディタEmacsとかmiをずっと使っていたのですが,Atomもかなり高機能なテキストエディタで,個人的にはとても使いやすく驚きました!

 

Atomの特徴は,

1.無料で公開されているパッケージで拡張が可能

2.タブ型で,使いやすいインターフェース

3.プロジェクト単位で下層ディレクトリごとファイルを管理することができる

1番驚いたのは,何と言っても拡張機能の多さです.もう便利なパッケージが多すぎます笑 あまりにも利便性が高いので次のような本まであります.

 

 

さらに,Atomオープンソース性を取り入れているため,米国GitHub Inc.の社員を中心にAtomの開発が進められているのでかなり将来性があるテキストエディタです!

 

どのくらい人気があるのかなーと思って調べたらかなり人気でした...(無知すぎた)

 

1位 Vim         

2位 Atom

3位 Visual Studio Code

4位 Emacs

 

2017年の調査結果ですが,かなり上位にいます.

Emacsは去年先輩が使っていたので利用していましたが,覚えるコマンドが多くて慣れるのが大変でした.一方Atomユーザーインターフェースなので比較的簡単に利用できことが上位に来てる要因の1つなのかなと思います.

 

f:id:koki12070930:20190514130545p:plain

 

 

 Atomの実行画面はこんな感じです! Atomに慣れて来たらまた記事にしたいと思います.

 

ランダム行列理論

 

 

ランダム行列理論についての特集が数学セミナーにあったので面白かったところをピックアップしたいと思います.

・ランダム行列とは?

ランダム行列とは確率変数を成分とする行列であり,多変量解析ではウィシャート行列が代表的なランダム行列であります.統計学に限らず,分布の仮定を変えることによって無線通信,ポートフォリオ理論,複雑ネットワーク,など様々な応用例があるところが興味深いです.特にいくつかの限定された統計集団の下での研究がなされています.ランダム行列理論には大きく分けて,ガウス型統計集団やラゲール統計集団などがあり,数学セミナーではガウス型統計集団が主にピックアップされていました.ガウス型統計集団にも大きく分けて3つあります.

(1)ガウス型直交統計集団(GOE)

(2)ガウス型ユニタリ統計集団(GUE)

(3)ガウス型シンプレクティック統計集団(GSE)

ランダム行列理論は,行列の固有値の分布を求めることが重要になります. (1)~(3)は具体的に固有値分布を計算することができるので多くの研究がされています.

 

 統計学から

ラゲール統計集団は,ウィシャート行列を用いて,ガウス型統計集団と同様の条件で構成されています.ウィシャート行列の固有値は主成分分析などを考える際とても重要になります.

医療データx_1,\cdots,x_d,(血圧,身長,体重,\cdots)をn人の患者について測定することを考えます.古典的にはdをfix,nを十分大きい場合の研究が多くされていましたが,医療データなどを考えるときには,nをfix,dが十分大きい場合は考える必要があります.

{n}<{d} の場合,ウィシャート行列の逆行列が存在しないなどの理由から固有値の分布を求めるのが困難になります.従って,先行研究では従来とは異なった手法や方法論が展開されたいます.

・ランダム行列理論とリーマン予想

数論の方からも近年ランダム行列が注目されています.リーマン予想とは数学の未解決問題であることはみなさん知っているかと思います.リーマン予想が重要である理由は,素数の分布問題に決定的な役割を果たすからです.リーマン予想はそれだけでなくゼータ関数と関わりがあり,リーマン・ゼータ関数の零点を考える際には,ランダム行列が役立ちます.

証明されている訳ではありませんが,多くの数値実験の結果により零点全体の分布がランダム行列の固有値の分布に似ていることが確認されています.この現象は「モンゴメリ-オドリツコの法則と呼ばれています.

 

ランダム行列には様々な応用例があることが改めて分かりました.機械学習方面でもランダム行列は注目されているようなので,そちらに詳しい方はコメント等で教えていただけると幸いです.