東京大学のデータサイエンス育成講座~1日目~

データサイエンス

『東京大学のデータサイエンス育成講座』という本を読み始めたので学習した内容をアウトプットしていきます。

Chapter1とChapter2の内容をデータサイエンスというよりPythonやライブラリの使い方の基礎という感じだったので軽く流し読みしました。

Python初心者でも0から始められる構成になっているのは優しいなと感じました。

1日目はChapter3の内容についてアウトプットしていきます。

使用データ

『東京大学のデータサイエンス育成講座』と同じデータを使って分析していても、同じことの繰り返しでためにならないので今回はWine data setを使用していきます。

UCI Machine Learning Repository: Wine Data Set
# Wine data setの読み込み
from sklearn.datasets import load_wine
wine_data = load_wine()

wine_data_x = pd.DataFrame(wine_data.data,columns=wine_data.feature_names)
wine_data_y = pd.DataFrame(data=wine_data.target)
wine_data_y = wine_data_y.rename(columns={0: 'class'})
wine_data = wine_data_x.join(wine_data_y)

wine_data.head()
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesprolineclass
014.231.712.4315.61272.83.060.282.295.641.043.9210650
113.21.782.1411.21002.652.760.261.284.381.053.410500
213.162.362.6718.61012.83.240.32.815.681.033.1711850
314.371.952.516.81133.853.490.242.187.80.863.4514800
413.242.592.87211182.82.690.391.824.321.042.937350

Wine data setのデータ項目は以下のような感じになっています。

1alcoholアルコール度数
2malic_acidリンゴ酸
3ash灰分
4alcalinity_of_ash灰分のアルカリ度
5magnesiumマグネシウム
6total_phenols全フェノール含量
7flavanoidsフラボノイド
8nonflavanoid_phenols非フラボノイドフェノール
9proanthocyaninsプロアントシアニン
10color_intensity色の濃さ
11hue色相
12od280/od315_of_diluted_wines希釈ワイン溶液のOD280/OD315(=280nmと315nmの吸光度の比)
13prolineプロリン
14classワインの種類(0, 1, 2)
Wine data setの各変数

データをざっと見た感じclass以外は量的データとなっているようです。

記述統計による分析

データの内容をざっくり確認できたところでグラフなどを使い可視化していきデータを分析していこうと思います。

ヒストグラム

ヒストグラムはそれぞれの値がどれぐらいあるのか観測するのに有効です。

classの各値がどれぐらいあるのかヒストグラムを使い確認していきます。

plt.hist(wine_data['class'])
plt.xlabel('class')
plt.ylabel('count')
plt.grid(True)
classのヒストグラム

少し1の数が多いもののだいたい同じぐらいみたいですね。

分散と標準偏差でデータのばらつき具合を確認

分散を求めることでそのデータがまとまっているのか(平均値付近を固まっているのか)を調べることができます。

アルコール度数についての分散を確認していきます。

wine_data['alcohol'].var(ddof=0)

# 0.6553597304633255

ワインのアルコール度数はそこまで偏りがなさそうです。

ただ、分散では実際のデータのばらつきが分からないため、実際のデータのばらつきを確認するのには標準偏差を使います。

wine_data['alcohol'].std(ddof=0)

# 0.8095429145285168

標準偏差を求めることでワインのアルコール度数のばらつきは±0.8度ほどだと分かります。

要約統計量の確認

平均や分散などを各データ毎に求めるのはコードを書く量が増えて意外と大変です。

そこでpandasではdescribeメソッドを使用することで要約統計量をすぐに確認することができます。

wine_data.describe()
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesprolineclass
count178178178178178178178178178178178178178178
mean13.0006182.3363482.36651719.49494499.7415732.2951122.029270.3618541.5908995.058090.9574492.611685746.8932580.938202
std0.8118271.1171460.2743443.33956414.2824840.6258510.9988590.1244530.5723592.3182860.2285720.70999314.9074740.775035
min11.030.741.3610.6700.980.340.130.411.280.481.272780
25%12.36251.60252.2117.2881.74251.2050.271.253.220.78251.9375500.50
50%13.051.8652.3619.5982.3552.1350.341.5554.690.9652.78673.51
75%13.67753.08252.557521.51072.82.8750.43751.956.21.123.179852
max14.835.83.23301623.885.080.663.58131.71416802

describeメソッドで表示される情報は上から順に、データ数、平均値、標準偏差、最小値、25、50、75パーセントタイル値、最大値となっています。

箱ひげ図による最大値、最小値、中央値、四分位範囲の可視化

箱ひげ図を使用することで先程要約統計量で確認した最大値、最小値、中央値、四分位範囲を可視化することができます。

plt.boxplot(wine_data['alcohol'])

箱ひげ図からもアルコール度数はばらつきが少ないデータだということが分かりますね。

以下のように複数の箱ひげ図を同時に表示することもできるみたいです。

plt.boxplot([wine_data['alcohol'], wine_data['malic_acid'], wine_data['ash']])

データ間の相関関係の分析

データ間の相関関係を可視化して確認したい場合には、散布図が有効です。

全フェノール含量とフラボノイドの関係を散布図で表示してみます。

plt.scatter(wine_data['total_phenols'], wine_data['flavanoids'])

散布図を見てみると全フェノール含量が増加するに連れてフラボノイドも増加していることからこの2つの変数には正の相関関係があることが分析できます。

ちなみにヒストグラムや散布図を全ての変数に対してまとめて表示したい場合は次のコードが便利です。

sns.pairplot(wine_data[wine_data.columns.values])

今散布図で確認した2つの変数の関係を確認するためには相関係数を求める必要があります。

相関係数は-1~1までの範囲をとり、1に近ければ正の相関、-1に近ければ負の相関があるといえます。

また相関係数が0に近い場合は無相関ということができます。

それでは先程散布図を表示して正の相関がありそうだと分かった、全フェノール含量とフラボノイドの相関係数を求めてみます。

sp.stats.pearsonr(wine_data['total_phenols'], wine_data['flavanoids'])

# 出力1:相関係数, 出力2:p値
# (0.864563500095115, 1.7558389525863232e-54)

相関係数が約0.86で正の相関を持つことが数値的にわかりました。

相関関係は、2つの事象の間にある何らかの関係のことでが、どちらかの事象がもう片方の事象の直接的な原因かどうかは不明です。

そのため相関係数が高いからと言って因果関係があるとは必ずしも言うことができません。

因果関係の分析については後のChapterで語られるようです。

線形単回帰分析による予測

回帰分析とは数値を予測するための分析です。

機械学習ではデータの予測を行いますがその基本となるのが単回帰分析です。

先程の分析から全フェノール含量とフラボノイドには相関関係がありそうだということがわかりました。

線形単回帰分析では説明変数(x)と目的変数(y)が「y = ax + b」の関係が成り立つことを前提として回帰問題を解く方法です。

ここでは説明変数に全フェノール含量、目的変数にフラボノイドを使用して線形単回帰分析を行います。

# 説明変数と目的変数の設定
x = wine_data.loc[:, ['total_phenols']].values
y = wine_data['flavanoids'].values

# 線形回帰のインスタンスの生成と予測モデルの計算(a, bを求める)
reg = linear_model.LinearRegression()
reg.fit(x, y)
print('a = ', reg.coef_)
print('b = ', reg.intercept_)

# a =  [1.38]
# b =  -1.137627158404062

線形単回帰分析で予測した値と実測値を比較してみます。

グラフを見ていると実測値と予測式の関係はうまく行ってそうに見えます。

ただこのグラフだけでは客観的な判断がつけられないため、どれぐらい実測値と予測式が上手くいっているのかを数値化したものとして決定係数と呼ばれるものを計算していきます。

決定係数は1に近ければ近いほどよいモデルだということになります。

print('決定係数 = ', reg.score(x, y))

# 決定係数 =  0.7474700456967156

決定係数が約0.74で線形回帰だと考えればそこそこ上手く行っていそうです。

まとめ

『東京大学のデータサイエンス育成講座』の1日目の内容としてはデータの分析方法と分析データをもとに線形単回帰分析を行っていきました。

今までデータをもらってなんとなくグラフをだしていた私としてはデータ分析の基礎が学べたのでよかったです。

この調子で2日目以降も頑張っていきたいです。

コメント

タイトルとURLをコピーしました