100日後にエンジニアになるキミ - 35日目 - Python - Pythonで出来る事

本日でPythonで何が出来るかについてです。

前回はこちら
[100日後にエンジニアになるキミ - 34日目 - Python - Python演習3]
(https://qiita.com/otupy/items/400f89fd2755bc7e47f0)


## その先、仕事とか、研究にどう使えるの？

[![表示されなかったらすみません](https://img.youtube.com/vi/c-yVo9l_Qvw/0.jpg)]
(https://youtu.be/c-yVo9l_Qvw)

さて
プログラミングの基礎はいかがだったでしょうか？

文法を一通りやって、演習もやってもらえれば
それなりに理解できると思いますが

まだ、ここまでの段階だと
プログラミングでどんなことができるかとか

どんなことに役立つのかとか・・
イメージが湧かない方の方が多いのではないかと思います。

なので、実際に仕事で使っているコードも見ながら
プログラミングがどういうものなのかを
改めて体験していただき、その後どうすれば良いか
というところを深く掘り下げて行きたいと思います。

### ファイルの読み込み

```python
with open(ファイルパス) as 変数名:
    処理
```

```python
# 同じ階層に配置してあるファイルの中身を表示する。
with open('sample.py') as _r:
    print(_r.read())
```
def hello(aa):
print(aa)

読み込みした際の`変数名.read()`で
ファイルの中身を全て読み込みします。
上記の例だとファイルのコードを全て読み込んでプリントしています。

### CSVファイルの読み込み

ファイルの読み込み部分は一緒です。
CSVは`,`で区切りフォーマットのファイルで
`,`で区切って読み込みを行う事ができます。

`文字列.split(',')`でカンマで区切りリスト型に変換を行う


```python
# 結果を格納する変数を用意
res = []
# ファイルの読み込み
with open('sample.csv') as _r:
    for row in _r:
        # 改行を取り除き、カンマで区切って配列にする
        rows = row.replace('\n','').split(',')
        # 結果用の変数に追加
        res.append(rows)

print(res)
```
[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff'], ['hhh', 'iii', 'jjj'], ['kkk', 'lll', 'mmm']]

```python
for row in res:
    # タブ区切りで表示
    print('\t'.join(row))
```
aaa bbb ccc
ddd eee fff
hhh iii jjj
kkk lll mmm

### スクレイピング

スクレイピングはwebサイトへアクセスして情報取得する技術の事です。
Python言語には、スクレイピング用のライブラリが備わっているので
比較的簡単にWEBサイトから情報取得する事ができます。

`requests.get(サイトURL)`
WEBサイトへアクセスして情報を取得する。

```python
import requests

# webサイトへアクセスしてデータを取得
html = requests.get('http://yahoo.co.jp')

# 取得したデータの最初の800文字を表示
print(html.content.decode('utf-8')[0:800])
```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">・・・


### 機会学習系のライブラリの利用

**データの可視化**

`データフレーム.plot()`
でデータの可視化を行う(デフォルトは折れ線グラフ)

```python
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# データフレームの作成
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['a','b'])
# データフレームを描画
df.plot()
```

![picture_pc_b463ab3888be9e6bd9aeab91092a3f38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/5f10facf-f860-1629-c7bb-9090eb55ea29.png)

`plt.scatter(データフレーム,データフレーム)`
データフレームの２列を用いて散布図を表示する。

```python
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['1','2'])
# 散布図を描画
plt.scatter(df['1'],df['2'])
```

![picture_pc_a8c38af18c86a5f3bbd40136ad410ebf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/946552e7-f3c8-4d95-68f7-6791b3de588c.png)

**scikit learn**

scikit learnは機械学習用のライブラリで各種モデル作成のためのプログラム群と
学習用のサンプルデータが揃っている。

`datasets.load_iris()`
学習用データの読み込み(iris:あやめのサンプルデータ)

```python
import pandas as pd
# 必要なライブラリのインポート
from sklearn import datasets, model_selection, svm, metrics

# 有名なアヤメのデータの読み込み
iris = datasets.load_iris()
# アヤメのデータをデータフレームに変換する。
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 5行だけ表示
iris_data.head()
```

![picture_pc_ced98ddad2006872848bd89899ea6d30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/b9adafd5-4226-30d2-517c-81434db89e30.png)


```python
# ラベルデータの読み込み
iris_label = pd.Series(data=iris.target)
# 5行だけ表示
iris_label.head()
```
0 0
1 0
2 0
3 0
4 0
dtype: int64

`train_test_split(学習データ, 正解ラベル)`
学習データを訓練用とテスト用に分ける。

```python
# アヤメのデータを訓練データ、テストデータ、訓練ラベル、テストラベルに分ける。
train_data, test_data, train_label, test_label = model_selection.train_test_split(iris_data, iris_label)
# 訓練データ
train_data.head()
```

![picture_pc_a25a69aed0a1eb7c8df14251d9dd99ba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/cbeea569-0479-7b5d-619b-43c739439bb1.png)

```python
# 訓練ラベル
train_label.head()
```
70 1
125 2
77 1
25 0
51 1
dtype: int64

```
#  訓練データとテストデータの個数
print(len(train_data), '\t',  len(test_data))
```
112 38

`変数名 = 学習モデルの変数名.クラス()`
`学習モデルの変数名.fit(訓練データ,訓練ラベル)`
訓練データで学習をおこなう。


```python
# SVM学習器の定義
clf = svm.SVC()

# 訓練データで学習
clf.fit(train_data, train_label)

# テストデータで予測
pre = clf.predict(test_data)

print(type(pre))
print(pre)
```
<class 'numpy.ndarray'>
[0 0 1 1 0 2 1 0 2 1 2 0 2 2 0 1 0 0 2 1 0
0 0 2 0 2 2 2 1 0 2 0 1 2 2 1 0 1]

`accuracy_score(テストラベル, 予測値)`
予測値の正答率を算出する

```python
# 正答率
ac_score = metrics.accuracy_score(test_label, pre)
print(ac_score)
```
0.947368421053

サンプルデータだけでも10種類ほどは揃っているので
様々な機械学習モデルを試す事ができます。

### その他

他にどんな事が出来るのか、コードを併記しませんが事例を挙げておきます。

**定型作業の自動化**
メールの受発信、一覧作成
SNSの投稿、書き込みの収集
エクセル、ワード文書などの作成(レポート作成)
PDFのテキスト抽出
GUI操作

**データベース操作**
データの加工、登録、追加、削除
大量データ加工

**画像処理**
画像収集
opencvなどを用いた画像加工
顔の抽出
物体検知

**統計分析**
基礎統計量の算出
分布の計算、可視化
回帰分析
区間推定
仮説検定

**Webアプリケーション開発**
FlaskやDjangoなどのフレームワークを用いたWEBサイト構築

**ゲーム開発**
PyGameやKivyなどのフレームワークを用いたゲーム開発

**自然言語処理**
テキストマイニング
形態素解析
係り受け
n-gram
woed2vec

**AI開発**
機械学習
DeepLearning
強化学習
GAN



## まとめ

これでプログラミングを一通り学んだ訳です。
文法についてはやってきているので、だいたい書けるようになっているはずです。

ここからは自分自身の作りたいプログラムを作ってみましょう。

よく使うコードについてはひとまとめにしておきました。

こちらにリンクを貼っておきますので、是非参考にしてみてください。
https://note.com/otupy/n/n1bedb9f36e54

君がエンジニアになるまであと65日

## 作者の情報

乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython