# chapter 3 記述統計 と 単回帰分析(推測統計の一つ)
# 演算用モジュール
import numpy as np
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame
# 可視化モジュール
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
sns.set()
%matplotlib inline
# 機械学習モジュール
from sklearn import linear_model
%precision 3
pwd
mkdir chapter3
cd chapter3
ls
import requests
import zipfile
from io import StringIO
import io
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip'
r = requests.get(url, stream=True)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
ls
data = pd.read_csv('student-mat.csv')
data.head()
# うまく区切れていない。次はセミコロンで分けてみる
data = pd.read_csv('student-mat.csv', sep=';')
data.head()
# うまくいった。
# データ情報を分析
print(data.info)
'''
[395 rows x 33 columns]
'''
data.keys()
'''
Index(['school', 'sex', 'age', 'address', 'famsize', 'Pstatus', 'Medu', 'Fedu',
'Mjob', 'Fjob', 'reason', 'guardian', 'traveltime', 'studytime',
'failures', 'schoolsup', 'famsup', 'paid', 'activities', 'nursery',
'higher', 'internet', 'romantic', 'famrel', 'freetime', 'goout', 'Dalc',
'Walc', 'health', 'absences', 'G1', 'G2', 'G3'],
dtype='object')
'''
# keysの内容を確認する
path = 'student.txt'
with open(path,encoding='utf-8') as f:
s = f.read()
print(s)
# 質的データ
data['sex'].head()
# 量的データ
data['absences'].head()
# 性別を軸にして、年齢の平均値を計算する
data.groupby('sex')['age'].mean()
# chapter 3-3 記述統計
# 欠席日数の度数分布をかいてみる
x = data['absences']
plt.hist(x, bins=30)
# ロングテールで 右に歪みのある分布になっている。
# 平均値 中央値 最頻値
print(data['absences'].mean())
print(data['absences'].median())
print(data['absences'].mode())
# 分散 標準偏差 n-1 でなくて n で割り算している。
print(data['absences'].var())
print(data['absences'].std())
# 要約統計量とパーセンタイル値
data.describe()
# 四分位範囲 25%~75%に入る分
print(data['absences'].describe().keys())
data['absences'].describe()['75%'] - data['absences'].describe()['25%']
# 箱ひげ図
data['G1'].head()
plt.boxplot(data['G1'])
# 下から 最小値 第1四分位 中央値 第3四分位 最大値
plt.boxplot(data['absences'])
# はずれ値は最大値に採用されない。
# 並べるときはリストで与える
plt.boxplot([data['G1'], data['G2'], data['G3']])
plt.grid(True)
# 変動係数 CV = σ/mean
cv = data['absences'].std() / data['absences'].mean()
cv
# 一気に標準偏差を求める
data.std()
# 一気に変動係数を求める
data.std() / data.mean()
# 散布図と相関係数 G1とG3の関係性を調べてみる
plt.plot(data['G1'], data['G3'], 'o')
plt.xlabel('G1')
plt.ylabel('G3')
plt.xlim(0, 30)
plt.ylim(0, 30)
plt.grid(True)
'''
G1に値があるのでG3がゼロのデータが複数ある。→謎
'''
# 2つの変数の関係性 共分散 cov
# 偏差の積の和の平均
np.cov(data['G1'], data['G3'])
'''
G1分散 共分散
共分散 G2分散
array([[11.017, 12.188],
[12.188, 20.99 ]])
'''
print(data['G1'].var())
print(data['G3'].var())
# 相関係数:共分散はスケールの影響を受けるので、それをなくす。
# 共分散をそれぞれの変数の標準偏差で割り算する
sp.stats.pearsonr(data['G1'], data['G3'])
# 相関係数:0.8014679320174141
# p値 :9.001430312276602e-90
# 相関係数では因果関係はわからないので注意
# 相関行列 すべての組み合わせで相関関係を算出する リストで入れる
np.corrcoef([data['G1'], data['G2'], data['G3']])
# すべての変数のヒストグラム 散布図を書く sns.pariplot([])
# アルコールと成績の関係性を確認してみる
sns.pairplot(data[['Dalc', 'Walc', 'G1', 'G3']])
# 任意の列を抽出するときは 列をリストで渡す
data[['Dalc','Walc']].head()
# 練習 要約統計量を表示する
file = 'student-por.csv'
with open(file) as f:
data = pd.read_csv(f, sep = ';')
data.head()
data.describe()
# 練習:マージする
file2 = 'student-mat.csv'
with open(file2) as f:
data2 = pd.read_csv(f, sep = ';')
data2.head()
# キーを指定してマージする
merge_keys = ['school', 'sex', 'age', 'address', 'famsize', 'Pstatus', 'Medu', 'Fedu', 'Mjob', 'Fjob', 'reason', 'nursery', 'internet']
data_m = pd.merge(data, data2, on = merge_keys, suffixes=( '_por', '_math'))
data_m.head()
# 練習
sns.pairplot(data_m[['Medu', 'Fedu', 'G3_math']])
# chapter 3-4 単回帰分析
# 数学のG1 G3データをよくみてみます。
file_path = 'student-mat.csv'
with open(file_path) as f:
data = pd.read_csv(f, sep=';')
print(data.keys())
plt.plot(data['G1'], data['G3'], 'o')
plt.xlabel('G1')
plt.ylabel('G3')
# このG1の成績を元に G3の成績を予測するモデルを単回帰分析で作成する
# G1は説明変数 G3は目的変数という。
from sklearn import linear_model
# インスタンスの作成
reg = linear_model.LinearRegression()
X = data.loc[:,['G1']].values # 説明変数は1変数でもベクトルとして入力しなければならない。
Y = data['G3'].values
reg.fit(X, Y)
print('回帰係数:', reg.coef_)
print('切片:', reg.intercept_)
# 回帰結果をグラフに表示する
plt.plot(data['G1'], data['G3'], 'o')
plt.xlabel('G1')
plt.ylabel('G3')
plt.plot(X, reg.predict(X)) # Xを再利用
# 決定係数 R^2 うまく回帰できているか具合
print('決定係数:', reg.score(X, Y))
# 練習
file_path = 'student-por.csv'
with open(file_path) as f:
data = pd.read_csv(f, sep=';')
X = data.loc[:,['G1']].values # ベクトルのベクトル
Y = data['G3'].values # スカラーのベクトル
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(X, Y)
print(reg.coef_, reg.intercept_, reg.score(X, Y))
plt.plot(X, Y, 'o')
plt.plot(X, reg.predict(X))
# 練習
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'
import requests
import io
r = requests.get(url, stream=True)
data =io.BytesIO(r.content) # zipファイルではない
df = pd.read_csv(data, sep=';')
df.head()
df_describe = df.describe()
df_describe.to_csv('df_describe.csv')
sns.pairplot(df)
'''
# すべての変数のヒストグラム 散布図を書く sns.pariplot([])
# アルコールと成績の関係性を確認してみる
sns.pairplot(data[['Dalc', 'Walc', 'G1', 'G3']])
'''
df