へっぽこ研究者、立ち上がるってよ

あなたを応援するブログ

松尾研究室データサイエンティスト育成講座の第3章の解答

3.1.1 記述統計学

練習問題1

studet-por.csvを読み込んで、要約統計量を表示してください。

解答
student_por=pd.read_csv("student-por.csv",sep=";")
student_por.describe()

結果はちょっと大きすぎるので省略

練習問題2

下の変数をキーとして、先ほどの数学のデータとポルトガル語のデータをマージしてください。マージするときは、両方ともに含まれているデータを対象としてください(内部結合と言います)。そして、要約統計量など計算してください。なお、以下以外の変数名は、重複がありますので、suffixes=('math', 'por')のパラメータを追加して、どちらからのデータかわかるようにしてください。

["school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet"]

解答
#キーのリストを作成
merge_list=["school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet"]

#metge関数、onでキーとなる列名を指定、suffixesで重複した場合の追加文字列を指定
student_merge=pd.merge(student_data_math,student_por,on=merge_list,suffixes=("_math","_por"))
student_merge.describe()

結果は(rya

練習問題3

上記のマージしたデータについて、変数を幾つかピックアップして、散布図とヒストグラムを作成してみましょう。どういった傾向がありますか。また、数学データのみの結果と違いはありますか。考察してみましょう。

解答
#1学期の成績と旅行時間の間の相関を比較してみる
sns.pairplot(student_merge[["G1_math","G1_por","traveltime_math","traveltime_por"]])
plt.grid(True)

結果

旅行時間長い少数の人は成績も悪くなる。 これは数学も物理も同じ傾向 また物理のときの旅行時間が長い人は数学の成績も悪い。 などいろいろ分析できそう。

f:id:do1208:20190601120557p:plain

3.1.2 単回帰分析

練習問題1

student-por.csvのデータを使って、G3を目的変数、G1を説明変数として単回帰分析を実施し、回帰係数、切片、決定係数を求めてください。

解答
#as_matrixはなくなるらしいので代わりにvaluesを使いました
X=student_por.loc[:,["G1"]].values
Y=student_por["G3"].values
<200b>
clf.fit(X,Y)
<200b>
print("回帰係数:",clf.coef_)
print("切片:", clf.intercept_)
print("決定係数:", clf.score(X, Y))

結果

回帰係数: [0.973]
切片: 0.8203984121064547
決定係数: 0.6829156800171085

練習問題2

上のデータの実際の散布図と、回帰直線を合わせてグラフ化してください。

解答
plt.scatter(X,Y)
plt.xlabel("G1 grade")
plt.ylabel("G3 grade")

plt.plot(X, clf.predict(X))
plt.grid(True)

結果

f:id:do1208:20190602105134p:plain

練習問題3

student-por.csvのデータを使って、G3を目的変数、absences(欠席数)を説明変数として単回帰分析を実施し、回帰係数、切片、決定係数を求めてください。この結果を見て、考察してみましょう。

解答
X=student_por.loc[:,["absences"]].values
Y=student_por["G3"].values

clf.fit(X,Y)

print("回帰係数:",clf.coef_)
print("切片:",clf.intercept_)
print("決定係数:",clf.score(X,Y))

plt.scatter(X,Y)
plt.plot(X,clf.predict(X))

結果

回帰係数: [-0.064]
切片: 12.138800862687441
決定係数: 0.008350131955637274

負の傾きで切片は約12の回帰式。 決定係数が低いので相関はないと考えていい。 散布図と線形回帰曲線を引くと以下のようになる。

f:id:do1208:20190602105912p:plain

3.2 総合問題

3.2.1 統計の基礎と可視化

(1)基本統計量(平均、最大値、最小値、標準偏差など)を算出してください。

解答
# データがあるurl の指定
file_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"

# データをurlから取得する
r = requests.get(file_url, stream=True)

wine_data= pd.read_csv("winequality-red.csv")
wine_data=pd.read_csv("winequality-red.csv",sep=";")
wine_data.describe()

結果は(rya

(2)それぞれの変数の分布と、それぞれの変数の関係性(2変数間のみ)がわかるように、グラフ化してみましょう。何かわかる傾向はありますか。

解答
ns.pairplot(wine_data[["fixed acidity","volatile acidity","citric acid","quality"]])
ns.pairplot(wine_data[["total sulfur dioxide","density","pH","quality"]])
sns.pairplot(wine_data[["sulphates","alcohol","quality"]])

図は省略。 qualityに対してdensityとalcoholが少しは相関がありそうなので、相関係数を調べてみると以下のようになる。

X=wine_data.loc[:,["density"]].values
Y=wine_data["quality"].values

clf.fit(X, Y)

print("densityについて")
print("回帰係数:",clf.coef_)
print("切片:",clf.intercept_)
print("決定係数:",clf.score(X,Y))

X=wine_data.loc[:,["alcohol"]].values
Y=wine_data["quality"].values

clf.fit(X, Y)

print()
print("alcoholについて")
print("回帰係数:",clf.coef_)
print("切片:",clf.intercept_)
print("決定係数:",clf.score(X,Y))

結果

densityについて
回帰係数: [-74.846]
切片: 80.23853802079057
決定係数: 0.03059673624832382

alcoholについて
回帰係数: [0.361]
切片: 1.8749748869971672
決定係数: 0.22673436811275482

alcoholでも決定係数は0.23と低いことがわかった。

3.2.2 ローレンツ曲線とジニ係数

こちらの問題はまた別の機会に記事にします。