ながれとよどみ

自分が解いた問題の解法など

データサイエンティスト養成講座2章の演習

引き続きこの本を読む

2章にはnumpy、matplotlibなどのデータ分析に用いるライブラリの基本的な説明が書かれている。

はてなブログに数式を打ち込む方法は、このブログを参考にした。

この本のサポートページはこちら

データのランダムな抽出

import numpy as np
import numpy.random as random

random.seed(3)
data = np.array([2, 4, 6, 8, 1, 3, 5, 7, 9])

print(random.choice(data, 5))

p.44 演習問題 1から50の和

#1から50までの和を求める
a = [x for x in range(1, 51)]
b = np.array(a)

ans = np.sum(b)
print("1から50の和は", ans)

p.44 演習問題 正規分布に従う乱数を10個発生させて、最小値、最大値、和を求める

random.seed(0)
rnd = random.randn(10)
print(np.min(rnd))
print(np.max(rnd))
print(np.sum(rnd))

p.44 演習問題 成分が3の5*5行列 Aを作って[tex: A2]を計算する。

import numpy as np
A = np.full(25, 3).reshape(5, 5)
#行列Aの二乗
print("行列Aの二乗は", np.dot(A, A))

[tex: f(x) = x2+ 3x + 1]について、 f(x) = 0の解と f(x)の最小値を求める

import scipy.linalg as linalg
from scipy.optimize import minimize_scalar
from scipy.optimize import newton
def my_func(x):
  return (x**2 + 3*x + 1)

#ニュートン法
print(newton(my_func, 0))
#最小値を求める
print(minimize_scalar(my_func, method="Brent"))

行列 Aについて、行列式の値、逆行列固有値固有ベクトルをそれぞれ求める

A = np.array([[1, 2, 3], [1, 3, 2], [3, 1, 2]])
#行列式を求める
print(linalg.det(A))
#逆行列を求める
print(linalg.inv(A))
#固有値、固有ベクトルを求める
eig_value, eig_vec = linalg.eig(A)
print("固有値は", eig_value)
print("固有ベクトルは", eig_vec)

関数[tex: f(x) = x3 + 2x + 1 = 0]の解をnewton法により求める。

def prob_func(x):
  return (x**3 + 2*x +  1)

print(newton(prob_func, 0))

Section2-5 pandas

p.53 pandas入門 IDが103以下の人を抽出

import pandas as pd
from pandas import Series, DataFrame

attri_data = {'ID': ['100', '101', '102', '103', '104'], 
              'City': ['Tokyo', 'Tokyo', 'Sendai', 'Sendai', 'Sendai'],
              'Birth_year': ['1990', '990','1490','1940','1991',],
              'Name': ['Hiroshi', 'Akiko', 'Yuki', 'Satoru', 'Steve']}

attri_data_frame = DataFrame(attri_data)
attri_data_frame_indexl = DataFrame(attri_data, index=['a', 'b', 'c', 'd', 'e'])

attri_data_frame_indexl

#IDが103以下の人を抽出
attri_data_frame_indexl[attri_data_frame_indexl['ID'] <= '103']

p.56 各都市ごとに誕生年の最大値と最小値を表示

#各都市ごとに誕生年の最大値と最小値を表示
print(attri_data_frame_indexl.groupby('City')['Birth_year'].max())
print(attri_data_frame_indexl.groupby('City')['Birth_year'].min())

練習問題2-7

1,Moneyが500以上の人を絞り込み 2,男女それぞれの平均Money 3,あらたにDataFrameオブジェクトを用意し、データをマージしてMoney, Math, Englishの平均を求める。

from pandas import Series, DataFrame
import pandas as pd

attri_data1 = {'ID':['1', '2', '3', '4', '5'],
              'Sex': ['F','F','M','M','F'],
              'Money': [1000, 2000, 500, 300, 700],
              'Name': ['Saito', 'Horie', 'Kondo', 'Kawada', 'Matduhara']}

attri_data_frame1 = DataFrame(attri_data1)
#Moneyが500以上の人のみ表示
print(attri_data_frame1[attri_data_frame1["Money"] >= 500])
#男女それぞれの平均Money
print(attri_data_frame1.groupby('Sex')['Money'].mean())

#あらたにDataFrameオブジェクトを用意して、IDをキーとしてマージする
attri_data_frame2 = DataFrame({'ID':['3', '4', '7'],
                         'Math': [60, 30, 40],
                         'English': [80, 20, 30]})

attri_new_frame = pd.merge(attri_data_frame1, attri_data_frame2)
print(attri_new_frame)
print("Moneyの平均点は", attri_new_frame['Money'].mean())
print("数学のの平均点は", attri_new_frame['Math'].mean())
print("英語の平均点は", attri_new_frame['English'].mean())

Section2-5 Matplotlib

p.65 演習問題2-10から2-12

 y = 5x + 3  (-10 \lt X \lt 10) を図示  y = sin(x) y = cos(x)のグラフを図示 一様乱数 X \sim U(0, 1)を1000個発生させて、ヒストグラムを図示

import numpy as np
import matplotlib as mlp
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline


def my_func(x):
  return 5*x + 3
x = np.linspace(-10, 10, 100)
plt.plot(x, my_func(x))
x = np.linspace(-10,10, 100)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
import random
x = np.random.uniform(0.0, 1.0, 1000)
y = np.random.uniform(0.0, 1.0, 1000)
plt.subplot(2, 1, 1)
plt.hist(x, bins=60, range = (0, 1.5))

plt.subplot(2, 1, 2)
plt.hist(y, bins=60, range = (0, 1.5))

Todo:総合問題を解く(モンテカルロ法)