【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【初心者・入門】Pythonを用いたデータ処理・統計(データサイエンス) ~チュートリアル~

f:id:AIProgrammer:20210426154921p:plain

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版

目的

  • Pythonを用いた簡単なデータ処理・統計(データサイエンス)

チュートリアル

0. 準備

必要なライブラリをインストールする。

# pip3 install jupyter
# pip3 install numpy
# pip3 install scipy
# pip3 install pandas
# pip3 install matplotlib
# pip3 install seaborn
# pip3 install requests

1. データ取得

import requests  # for HTTP requests (web scraping, APIs)
import os

# ウェブページから情報を取得
r = requests.get("https://github.com/adambard/learnxinyminutes-docs")
print(r.status_code)  # "200"であればアクセス成功
print(r.text)  # 取得したウェブページのテキストを表示
200


<!DOCTYPE html>
<html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark">
  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  ...
  <省略>
# テキストを保存:
print(os.getcwd())  # 現在作業しているディレクトリ(カレントディレクトリ)を確認
with open("learnxinyminutes.html", "wb") as f:
    f.write(r.text.encode("UTF-8"))
# インターネット経由で、CSVファイルをダウンロード
fp = "https://raw.githubusercontent.com/adambard/learnxinyminutes-docs/master/"
fn = "pets.csv"

# アクセス
r = requests.get(fp + fn)
print(r.text)
name,age,weight,species
"fluffy",3,14,"cat"
"vesuvius",6,23,"fish"
"rex",5,34,"dog"
# CSVファイルを保存:
with open(fn, "wb") as f:
    f.write(r.text.encode("UTF-8"))

2. CSVファイルを読み込み

import pandas as pd
import numpy as np
import scipy as sp

# CSVファイルを読み込み
fn = "pets.csv"
pets = pd.read_csv(fn)

print(pets)
#        name  age  weight species
# 0    fluffy    3      14     cat
# 1  vesuvius    6      23    fish
# 2       rex    5      34     dog
       name  age  weight species
0    fluffy    3      14     cat
1  vesuvius    6      23    fish
2       rex    5      34     dog

Pandasを使ったデータフレーム(DataFrame)のアクセス

# 2種類のアクセス方法
print(pets.age)

print(pets["age"])
0    3
1    6
2    5
Name: age, dtype: int64
0    3
1    6
2    5
Name: age, dtype: int64
# name列の内2行目を表示
print(pets.name[1])  # 'vesuvius'

# species列の内1行目を表示
print(pets.species[0])  # 'cat'

# weight列の内3行目を表示
print(pets["weight"][2])  # 34

# age列の内0-1行目を表示
print(pets.age[0:2])
# 0    3
# 1    6
vesuvius
cat
34
0    3
1    6
Name: age, dtype: int64
# 上から2行を表示
print(pets.head(2))

# 下から1行を表示
print(pets.tail(1))
       name  age  weight species
0    fluffy    3      14     cat
1  vesuvius    6      23    fish
  name  age  weight species
2  rex    5      34     dog

演算

# age列の合計した後2倍
print(sum(pets.age) * 2)  # 28

# weight列の最大値と最小値の差
print(max(pets.weight) - min(pets.weight))  # 20
28
20

3. 図示

# 必要なライブラリをインポート
import matplotlib as mpl
import matplotlib.pyplot as plt
# %matplotlib inline  # Jupyter Notebookを使うときに実行

Matplotlibを用いたシンプルな方法

# ヒストグラム
plt.hist(pets.age)

# 図のプロパティ
plt.xlabel("age")  # 横軸名
plt.ylabel("weight")  # 縦軸名

# 表示
plt.show()

f:id:AIProgrammer:20210426155326p:plain

# 箱ひげ図
plt.boxplot(pets.weight)

# 図のプロパティ
plt.xlabel("age")  # 横軸名
plt.ylabel("weight")  # 縦軸名

# 表示
plt.show()

f:id:AIProgrammer:20210426155355p:plain

# 散布図
plt.scatter(pets.age, pets.weight)

# 図のプロパティ
plt.xlabel("age")  # 横軸名
plt.ylabel("weight")  # 縦軸名

# 表示
plt.show()

f:id:AIProgrammer:20210426155412p:plain

seabornを用いた図示

import seaborn as sns

# seabornを用いた棒グラフ
sns.barplot(pets["age"])

# 表示
plt.show()

f:id:AIProgrammer:20210426155421p:plain

# Rでよく用いられるggplotを使った図示
from ggplot import *
ggplot(aes(x="age",y="weight"), data=pets) + geom_point() + labs(title="pets")

# 表示
plt.show()

4. 簡単なデータクリーニングと探索的分析

# 神聖ローマ皇帝のデータを取得
url = "https://raw.githubusercontent.com/adambard/learnxinyminutes-docs/master/hre.csv"
r = requests.get(url)

# CSVファイルに書き込み
fp = "hre.csv"
with open(fp, "wb") as f:
    f.write(r.text.encode("UTF-8"))

# CSVファイルを読み込み
hre = pd.read_csv(fp)

# 先頭から5行を表示
print(hre.head())
"""
   Ix      Dynasty        Name        Birth             Death
0 NaN  Carolingian   Charles I  2 April 742    28 January 814
1 NaN  Carolingian     Louis I          778       20 June 840
2 NaN  Carolingian   Lothair I          795  29 September 855
3 NaN  Carolingian    Louis II          825     12 August 875
4 NaN  Carolingian  Charles II  13 June 823     6 October 877

       Coronation 1   Coronation 2 Ceased to be Emperor
0   25 December 800            NaN       28 January 814
1  11 September 813  5 October 816          20 June 840
2       5 April 823            NaN     29 September 855
3        Easter 850     18 May 872        12 August 875
4   29 December 875            NaN        6 October 877
"""
   Ix      Dynasty        Name        Birth             Death  \
0 NaN  Carolingian   Charles I  2 April 742    28 January 814   
1 NaN  Carolingian     Louis I          778       20 June 840   
2 NaN  Carolingian   Lothair I          795  29 September 855   
3 NaN  Carolingian    Louis II          825     12 August 875   
4 NaN  Carolingian  Charles II  13 June 823     6 October 877   

       Coronation 1   Coronation 2 Ceased to be Emperor  
0   25 December 800            NaN       28 January 814  
1  11 September 813  5 October 816          20 June 840  
2       5 April 823            NaN     29 September 855  
3       15 June 844     18 May 872        12 August 875  
4   29 December 875            NaN        6 October 877  





'\n   Ix      Dynasty        Name        Birth             Death\n0 NaN  Carolingian   Charles I  2 April 742    28 January 814\n1 NaN  Carolingian     Louis I          778       20 June 840\n2 NaN  Carolingian   Lothair I          795  29 September 855\n3 NaN  Carolingian    Louis II          825     12 August 875\n4 NaN  Carolingian  Charles II  13 June 823     6 October 877\n\n       Coronation 1   Coronation 2 Ceased to be Emperor\n0   25 December 800            NaN       28 January 814\n1  11 September 813  5 October 816          20 June 840\n2       5 April 823            NaN     29 September 855\n3        Easter 850     18 May 872        12 August 875\n4   29 December 875            NaN        6 October 877\n'
# "Birth"と"Death"列をクリーニング
import re  # 正規表現を扱うモジュール

rx = re.compile(r'\d+$')  # 末尾の数字を検索


from functools import reduce

# 末尾にある数字3桁を取得
# 例:"January 814"から"814"を取得
def extractYear(v):
    return(pd.Series(reduce(lambda x, y: x + y, map(rx.findall, v), [])).astype(int))

# クリーニング実行
hre["BirthY"] = extractYear(hre.Birth)
hre["DeathY"] = extractYear(hre.Death)

# 先頭から5行を表示
print(hre.head())
   Ix      Dynasty        Name        Birth             Death  \
0 NaN  Carolingian   Charles I  2 April 742    28 January 814   
1 NaN  Carolingian     Louis I          778       20 June 840   
2 NaN  Carolingian   Lothair I          795  29 September 855   
3 NaN  Carolingian    Louis II          825     12 August 875   
4 NaN  Carolingian  Charles II  13 June 823     6 October 877   

       Coronation 1   Coronation 2 Ceased to be Emperor  BirthY  DeathY  
0   25 December 800            NaN       28 January 814     742     814  
1  11 September 813  5 October 816          20 June 840     778     840  
2       5 April 823            NaN     29 September 855     795     855  
3       15 June 844     18 May 872        12 August 875     825     875  
4   29 December 875            NaN        6 October 877     823     877  
# "BirthY"と"DeathY"列から年齢を算出し、"EstAge"列に格納
hre["EstAge"] = hre.DeathY.astype(int) - hre.BirthY.astype(int)

# "BirthY"と"EstAge"の散布図
sns.lmplot("BirthY", "EstAge", data=hre, hue="Dynasty", fit_reg=False)

# 図示
plt.show()

f:id:AIProgrammer:20210426155448p:plain

# scipyライブラリで回帰分析
from scipy import stats
(slope, intercept, rval, pval, stderr) = stats.linregress(hre.BirthY, hre.EstAge)

# 傾き
print(slope)  # 0.0042153573174446585

# R^2値
print(rval**2)  # 0.011132475593918311

# p値
print(pval)  # 0.49032107445388495

# seabornを用いて散布図と回帰直線を図示
sns.lmplot("BirthY", "EstAge", data=hre)

# 図示
plt.show()
0.0042153573174446585
0.011132475593918311
0.49032107445388495

f:id:AIProgrammer:20210426155458p:plain


頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版