コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

NoSQLのメリットと選ぶべき理由

NoSQLデータベースに触れる機会があったので、RDBMSとの違いを明らかにしながら利点や特徴についてまとめました。

目次

NoSQL とは

NoSQLとは Not only SQL の略であり、名前の通りデータの処理にSQLを必要としないデータベース (DB) です。1つのキーに対して1つの値を持つキー値型と、1つのキーに対して値だけでなく、配列など自由なデータ形式を持つことができるドキュメント型などが主に使われています。特徴としては、一意のキーに対して1つのデータが決まっているということがあります。これだけ書くと、MySQLやPostgresなどのRDBMSでもキーで検索して値を取り出せるし、そちらの方が便利なのでは?と感じる方も多いと思います。RDBMSとの違いを踏まえて、NoSQLのメリットを紹介していきます。


NoSQL のメリット

NoSQLが生まれた背景には、システムのあり方が多様化する中で、より柔軟なデータベースが求められていったということがあります。RDBMSは、データの複雑な関係構造を保持できる一方で、データの肥大化によって性能が劣化してしまうというデメリットがありました。ゲーム系のサービスや、アドテクノロジー、IoTシステムなど、大量のデータを扱うようなシステムのデータベースでは、データ量やユーザー数の増加・減少に応じて容量を柔軟に拡張したり、縮退させるような弾力的な拡張性が必要とされています。RDBMSは原則として1台のサーバーで動作するように設計されているのに対して、NoSQLはサーバを増加させると性能が改善するため、スケールアウトさせやすいというメリットがあります。そのため、データベース設計時にデータ量についてあまり考慮する必要がなく、ビッグデータと呼ばれるような大規模なデータ量を扱うときには強い味方となってくれるでしょう。

NoSQLを選ぶべき場面

ここまでで、NoSQLのメリットについて理解することができました。それでは実際にシステム要件を考えるときに、どのような場合にNoSQLデータベースを選択するべきかについて考えていきたいと思います。特にNoSQLが適しているのは、追加処理やデータ参照が多いシステムです。NoSQLはこれらの処理に最適化されているため、高速でデータの追加や参照が可能です。先ほど例を挙げたようなゲームのウェブサービスや、アドテク、センサデータなどを1秒間に何百件も扱うようなIoTシステムなどがこれに当てはまります。他にも画像データや音声データなどの非構造データを大量に保持したいときにはRDBMSよりもNoSQLのほうが有効でしょう。また、将来的にカラムを増やす可能性があるような時には、より柔軟なNoSQLデータベースのほうが扱いやすいと思います。

一方で、予約情報などのような厳密な処理が求められるシステムには適していないと言えます。しかし、最近ではこのような課題にも対応したNoSQLもあるようなので、開発するシステムに合ったデータベースを選んでいくことが大事だと思います。

まとめ

NoSQLのメリットと使用すべき場面についてご紹介しました。強みとしては、より柔軟に拡張でき、スケールアウトさせやすいということがありました。大量のデータを追加させていくようなシステムを開発する際は、ぜひ検討してみてはいかがでしょうか。

* 参考記事
https://academy.gmocloud.com/qa/20160509/2284
https://morizyun.github.io/blog/rdbms-nosql-merit-demerit/index.html
https://boxil.jp/mag/a3032/
https://employment.en-japan.com/engineerhub/entry/2017/11/22/110000

リスト内包表記を使ってPythonのリストの要素を条件付きで検索・抽出

コードを書く仕事をしていると、Pythonでリストの中から条件に一致する要素だけを抽出するようなスクリプトを書く機会も少なくないと思います。このようなとき、普通はforループを使って書いてしまいたくなるのですが、Pythonリスト内包表記を使えば、「これ1行で書けるんじゃね?」となります。for文との違いを示しながら実装例をご紹介します。

目次

Pythonのリストから要素を条件付きで抽出

次のような文字列のリストがあるとします。このリストから文字列などの条件をもとに特定の要素のみを抜き出したいとします。

txt_files = ['データサイエンス集中講義_20180912.txt', ¥
                  'データサイエンス集中講義_20180914.txt', ¥
                  'Pythonプログラミング_20180912.txt', ¥
                  'Pythonプログラミング_20180915.txt', ¥
                  'Pythonプログラミング_20180916.txt']

文字列が完全一致する要素を抽出

まずは 'データサイエンス集中講義_20180912.txt' と完全一致する要素を抽出し、新たなリスト output_list に入れたいとします。

forループで記述

普通に書くと次のようになります。

output_list = []

for file in txt_files:
    if file == 'データサイエンス集中講義_20180912.txt':
        output_list.append(file)
リスト内包表記で記述

リスト内包表記を使えば1行で次のように書くことができます。簡単ですよね?

[file for file in txt_files if 'データサイエンス集中講義_20180912.txt' == file]
コードの比較

各変数がどのように対応しているかを色別でみていくと理解が深まると思います。

forループ
> for file in txt_files:
> ____if file == 'データサイエンス集中講義_20180912.txt':
>________output_list.append(file)

リスト内包表記
> [file for file in txt_files if 'データサイエンス集中講義_20180912.txt' == file]


ある文字列を含む要素を抽出

今度は、'データサイエンス' という文字列を含む要素を抽出したいとします。in 句を使うと、特定の文字列が含まれているかどうかを分岐させることができます。

forループで記述

さきほどと同じように、forループを使って書くと次のようになります。

output_list = []
for file in txt_files:
    if 'データサイエンス' in file:
        output_list.append(file)
リスト内包表記で記述

リスト内包表記を使えば、こちらも1行ですっきりと書くことができます。

[file for file in txt_files if 'データサイエンス' in file]

文字列の一部を抽出

最後に、実務で発生しそうな例を紹介します。こちらではテキストファイルのファイル名のうち、日付部分のみを取り出して条件付きで抽出したい場合を考えます。

forループで記述

pythonは文字列変換に強いので、1つの文だけで多くのことができます。

output_list = []
for file in txt_files:
    if file.replace('.txt', '').split('_')[1] == '20180912':
        output_list.append(file)
リスト内包表記で記述

難しい処理も次のように1行で書くことができます。

[file for file in txt_files if '20180912' == file.replace('.txt', '').split('_')[1]]

まとめ

リスト内包表記を使ってPythonのリスト中身を条件付きで検索および抽出する方法についてご紹介しました。ある程度複雑な処理でも、リスト内包表記を使えば1行で書くことができることをお伝えしました。実は、リスト内包表記は1行で書けること以外にも処理速度が速いというメリットがあります。Pythonを書く機会が多い方は是非ともおさえておきましょう。

PythonのおすすめWebフレームワーク flask 入門

初心者向けに、おすすめのPythonのWeb開発フレームワークのひとつである flask の概要と簡単な実装例についてご紹介します。
 
目次

PythonのWebフレームワーク

Web開発というと RubyRuby on RailsPHP の Cake PHPや Laravel などが有名で、Pythonはあまり聞く機会が多くないかもしれません。しかし、PythonにもInstagramなどで使用されているDjangoという強力なWeb開発フレームワークや、Djangoと比べて軽量なフレームワークであるflaskなどがあります。今回の記事ではよりシンプルに実装ができるflaskについてご紹介します。

Django と flask の違い

簡単に Django と flask の用途の違いについて説明します。

Django

  • 多くの機能を備えており、大規模なウェブ開発が可能。
  • 実際のサービスでも多く使われている。

flask

  • 1つのpythonファイルで完結させることができ、スピーディな開発が可能。 
  • 覚えることも少なく、初心者向き。

簡単なデモシングルページアプリケーションを開発するのであれば、flaskのほうが適していると考えられます。

flaskはDjangoほどの人気はないものの、近年の機械学習の流行にともなって、Djangoとともに伸びていくフレームワークであると思います。

 

flask で Webサイトを作る

flaskを使うと、実にさまざまなウェブアプリケーションを開発することができます。今回はそのようなウェブアプリケーションを開発するための型を用意し、今後の開発の土台を作成していきたいと思います。

準備

まずは flask をインストールします。

pip install flask

ファイル構成

適当なディレクトリを作成し、ウェブサイトに必要なファイルを用意していきます。
flaskでは、基本的に以下のようなファイルの置き方に従います。

  • ルートディレクトリ(メインのフォルダ)下にメインのpythonファイルを直接配置します。
  • cssやjsファイルは、staticフォルダの下に配置します。
  • htmlファイルは、templates フォルダの下に配置します。
├ app.py
├ static
│   ├ css
│   │  ∟style.css
│   ├ js
├ templates
     ∟index.html

Python ファイル

pythonプログラムをwebアプリケーションのサーバーとして動かします。
@app.route('/') 以下の index 関数では、ウェブサイトのルートディレクトリにアクセスしたときの挙動について記述します。今回は、index.htmlを表示するように記述しています。

from flask import Flask, request, render_template

app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0', port=8080)

html ファイル

htmlファイルを用意します。cssやjsファイルも、通常と同じように読み込みます。

<html>
    <head>
      <link rel='stylesheet' type='text/css' href='static/css/style.css'>
      <script src="http://code.jquery.com/jquery-latest.js"></script>
    </head>
    <body>
      <div id='header'>
        <h1>デモサイト</h1>
      </div>
      <div id='contents'>
      ここにコンテンツを作成していきましょう!
      </div>
    </body>
</html>

css ファイル

見た目を変更するためのcssファイルも用意します。

#header{
  height: 90px;
  width:100%;
  padding: 20px 20px 0 20px;
  background-color: #007bff;
  color: #fff;
}
 
#contents {
  width: 100%;
  height: 90%;
  padding: 20px 0 0 0;
  display: flex;
}

 

Webサイトを立ち上げる

pythonプログラムを実行する

app.pyが置かれたルートディレクトリへ移動し、pythonスクリプトを実行します。

python app.py

下記のような表示が出ていれば成功です。

 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat

サーバーにアクセスしてwebサイトを確認する

ブラウザを開き、下記のURLにアクセスしましょう。

http://0.0.0.0:8080/

このようにサイトが表示されていれば、flaskでWeb開発を行う土台は完成です。
f:id:hktech:20180911225606p:plain

まとめ

PythonのWeb開発フレームワークであるflaskについて紹介しました。今回はウェブサイトの型だけを作成したので、次回はこの土台を使ってflaskおよびpythonの強みを活かしたウェブアプリケーションを開発していきます。

 

PythonでCSVからJSON形式に変換する方法

Pythonを用いてCSVからJSON形式に変換する方法についてソースコードと共にご紹介します。

目次

f:id:hktech:20180911214935p:plain

CSVデータの1行目にヘッダーがある場合

import json
import csv

json_list = []

# CSV ファイルの読み込み
with open('input_data.csv', 'r') as f:
    for row in csv.DictReader(f):
        json_list.append(row)

# JSON ファイルへの書き込み
with open('output.json', 'w') as f:
    json.dump(json_list, f)

# JSONファイルのロード
with open('output.json', 'r') as f:
    json_output = json.load(f)

CSVデータの1行目にヘッダーがなく、自分で指定したい場合

import json
import csv

json_list = []
keys = ('column1', 'column2', 'column3') # 列数と要素数を一致させる

# CSV ファイルの読み込み
with open('input_data.csv', 'r') as f:
    for row in csv.DictReader(f, keys):
        json_list.append(row)

# JSON ファイルへの書き込み
with open('output.json', 'w') as f:
    json.dump(json_list, f)

# JSONファイルのロード
with open('output.json', 'r') as f:
    json_output = json.load(f)

まとめ

PythonCSVデータをJSON形式に変換する方法についてご紹介しました。最近よく使われているNoSQLデータベースなどでは、入力がJSON形式に限定されていることも多いので、この記事を参考にしてみてはいかがでしょうか。

はてなブログでソースコードを表示させる方法

エンジニアの方のブログでよく見かける、プログラムなどのソースコードを載せる方法についてまとめます。

 

目次

 

準備

大前提として、ブログの設定を「はてな記法モード」に変更する必要があります。

はてな記法モードへの変更方法

[設定] タブ > [基本設定] に移動します。

f:id:hktech:20180909030246p:plain

デフォルトでは「見たままモード」になっているので、「はてな記法モード」に変更しましょう。

f:id:hktech:20180909030251p:plain

ソースコードを載せたのにうまく表示されないという場合のほとんどはこのステップが抜けていると思うので確認してみてください。

はてなブログソースコードを表示させる


Pythonソースコードを表示させるためには、下記のように記述してください。

>|python|
import numpy as np
arr = np.array([1, 2, 3])
||<

 

私たちが見慣れたソースコードの表示スタイルになりましたね

import numpy as np
arr = np.array([1, 2, 3])

 

||の中身は他のプログラミング言語に変更することもできるので、表示させたいプログラミング言語の種類に応じて変えてみてください

例: java, javascript, ruby ....

(参考: ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ)

 

まとめ

はてなブログソースコードを表示させる方法についてまとめました。普段は見たままモードで編集している方も、ソースコードを表示させたいときだけはてな記法モードに切り替えるなど工夫をしてみてはいかがでしょうか。

【Python】ゼロから始めるWindowsユーザ向け環境構築のすすめ

Python を始めてみようかな〜というWindowsユーザーの方のために、最速で簡単にPythonのコードを書き始められる方法をご紹介します。

特に、WindowsMac と比べて仮想OSのインストールが必要だったりとプログラミング初心者にはとっつきにくいところがあります。また、Python入門サイトや初心者向けの記事をみても、Python2系と3系のどちらがいいとか、ディストリビューションはどれがいいかなどといった議論が展開されていて結局なにをすればいいかわからないまま諦めてしまう方も多いかと思います。そんなみなさんにおすすめの環境構築方法を紹介します。 

 

目次

 

結論

Anacondaというパッケージを使いましょう

Pythonを始めたいと考えた方の中には、いま流行りの機械学習ディープラーニングなどを試してみたいと考えている方もいるでしょう。こちらのパッケージを使えば、あとから色々とインストールをする必要もなく、手軽にプログラミングを始めることができます。

 

インストール

まず、下記サイトからインストーラーをダウンロードしてください。

www.anaconda.com

 

Python2系 (2.x version) または Python3系 (3.x version)の選択を求められますが、ここはなにも考えずに左側のPython3系をダウンロードしましょう。

f:id:hktech:20180906000542p:plain

 

ダウンロードが終わったらインストーラを実行しましょう。

インストーラは全て英語なのでここで挫折してしまう人もいるかもしれません。しかし、ここはなにも変えずに Next, Install, Finish を押しまくればOKです。

 

Python のコードを書き始める

Finishでインストールが完了したら、スタートメニューの検索ボックスで Anaconda と検索しましょう。正常にインストールされていれば、Anaconda3というフォルダが見つかると思います。こちらの Jupyter Notebook をクリックしましょう。

 

f:id:hktech:20180906002650p:plain

 

すると、ブラウザが立ち上がり、次のような画面が現れると思います。

このとき立ち上がるブラウザはみなさんの既定となります。基本的に Google Chrome が推奨されていますが、他のブラウザでも動くと思います。もし気になる方は、アドレスバーのリンクをコピーして、Google Chrome のアドレスバーに貼り付けましょう。

 

f:id:hktech:20180906002917p:plain

 

ここで見えているのは、Windows上のディレクトリ階層です。これはWindowsエクスプローラと対応しています (Desktop → デスクトップ、 Documents -> ドキュメント)。コードを書くファイルをどこに置くかという話なので基本的にはどこでもいいですが、よくわからない方は適当にDocumentsをクリックしてその階層に入りましょう。階層が切り替わったら、右上の New ボタンを押し、Python 3 と書かれたボタンを押します。

 

f:id:hktech:20180906003711p:plain

 

あとは好きにコードを書くだけです。Pythonスクリプト言語なので、1行ずつ実行できます。Jupyter notebookでは1行ずつ出力しながら、必要に応じて文章なども差し込むことができてとても便利です。

まとめ

WindowsPython の開発環境を構築する方法についてご紹介しました。半ば押し付けるようにAnacondaがおすすめと書きましたが、基本的に後悔することはないと思います。また、Jupyter notebookについては、初めは多少違和感があるものの、Python コードを試し書きする上では最善のツールだと思います。今後は初心者向けにPythonのコーディング入門を紹介したいと思います。

 

オートエンコーダを用いた異常検知についてまとめた

ニューラルネットワークおよび Deep Learning の応用として、オートエンコーダを用いた異常検知について紹介したいと思います。

 

目次

 

オートエンコーダとは

オートエンコーダ (Auto encoder) とは自己符号器と呼ばれるニューラルネットワークの一種です。ニューラルネットワークにはさまざまな役割を果たすものがありますが、オートエンコーダは入力データを次元削減して圧縮し、出力データを生成するニューラルネットワークです。この圧縮処理はエンコードと呼ばれ、オートエンコーダの名前の由来となっています。

統計・機械学習分野で使われている次元圧縮手法としては主成分分析 (PCA) が有名ですが、オートエンコーダの圧縮処理はこれとほとんど同じであると考えてよいでしょう。

ニューラルネットワークは入力データに対して、所望の出力になるように内部の重みを調整していくことで学習を行います。オートエンコーダでは、入力と出力が同じになるようにネットワークの学習を進めます。

 

f:id:hktech:20180905214819p:plain

オートエンコーダを用いた異常検知

オートエンコーダを用いて異常検知を行う方法についてご紹介します。オートエンコーダは学習された入力データについては、同じようなデータを出力しようとします。ここで、入出力されるデータとしては波形を想像してみてください。

学習がうまくできているオートエンコーダを使えば下記のような結果が得られます。

  • 正常波形入力 → 学習した波形と同じような波形の出力
  • 異常波形入力 → 学習した波形とは異なる波形の出力

このように、オートエンコーダの復元結果をもとに異常検知を実現することができます。

 

まとめ

オートエンコーダを用いた異常検知について紹介しました。ニューラルネットワークを用いることから、構造データや時系列データに限らず、画像データや文書データなどにも使えるという利点があります。簡単な異常検知手法がうまく適用できないような場面で、ぜひ試してみてはいかがでしょうか。