pimientitoの機械学習

「機械学習って何だろう。」から、はじまり、いまだ???の毎日。数学初心者、PG・DBアマチュアのサービス・エンジニアが、どこまで理解できるのか。

【前処理の学習-6】データ読込み~下準備(Windows環境編)①~

前回、Shift-JIS形式のデータファイルをUTF-8形式へ変更することで、正常にjupyter notebookへ読込むことができました。

pimientito-handson-ml.hatenablog.com

しかし同時に、これより先に進むためには、まだ何点か課題をクリアする必要があることも分かりました。

例えば。。。

  1. すべてのCSVファイルをUTF-8に変換する

  2. データ項目(特徴量)が2次元(配列)のため、1次元に調整する

  3. 複数のCSVファイルのデータをひとつにまとめる

少なくとも、これらの課題を解決しないとデータファイルとしてDBやR言語Pythonで読込むことができません。


なおファイル操作や扱いについてWindows環境とmacOS環境では異なるところがあるため、今回の「データ読込み~下準備~」編では、OSごとに記事を分けることにいたしました。


では、早速はじめます。

すべてのCSVファイルをUTF-8に変換する

LinuxOSでは、nkfコマンドという文字コードを変換する便利なツールがあるのですが、Windows環境では簡単に利用することができないため、下記の項目について、ひとつずつ解決方法を探していきます。


データファイルの文字コードを確認

Windows7では標準コマンドで文字コードを確認できないためメモ帳を使用いたします。

対象のCSVファイルをメモ帳で開き、メニューバーの[ファイル]から[名前を付けて保存]を選択します。 f:id:Pimientito:20180716160401j:plain


表示された「名前を付けて保存」ダイアログボックスの画面下部の「文字コード」に"ANSI"と記載されている場合は、"Shift-JIS"で作成されたファイルであると判断できます。 f:id:Pimientito:20180716160754j:plain


続きまして。。。

複数データファイルの文字コードをまとめて変換

ここでは複数あるCSVファイルの文字コードをまとめて変換するExcel VBAを作成いたしました。

今回、参考にさせていただいた情報は【参考資料】に記載いたしましたので、コードなど詳細な情報は各サイトからご覧ください。

なお残念ながら、今回作成したVBAコードは、私のオリジナルではないため、記載は控えさせて頂きます。

作成したExcel VBAプログラムの主な動き

  • CSVファイルが保存されたルートフォルダ(一番上のフォルダ)を指定

  • 指定されたルートフォルダ配下のサブフォルダに保存されているCSVファイルを再帰的に検索

  • 検索されたCSVファイルを一度開き、文字コードUTF-8に変更して上書き保存

  • 以後、すべてのCSVファイルが検索されるまで繰り返し


作成したVBAプログラムを実行したところ、指定したフォルダに保存されているCSVファイルの文字コードが、すべてUTF-8に変換されていることを確認いたしました。

次回は、再度、jupyter notebookを使用して、データファイルの内容を確認いたします。


今回は、以上です。



【参考資料】

vbabeginner.net

  • Office TANAKA「フォルダを選択するダイアログ」

Office TANAKA - Excel VBA Tips[フォルダを選択するダイアログ]

  • 医療情報総合研究所(JMIRI)「[VBA]サブフォルダ含むファイル一覧を再帰的に取得する」

blog.jmiri.net


【前処理の学習-5】データ読込み~事前確認②~

前々回【前処理の学習-3】では、読込んだデータが文字化けしたことで頓挫したデータ読込み。いったん文字コード・改行コードについて見直し、あらためてデータ読込みに挑戦いたします。

データ分析は本業ではないためセオリーを分かっておらず、どのように進めていけば良いのか考えに耽っていると、ふっとひらめいたのは「他のアプリケーションで、直接データを覗いてみよう。」でした。

前々回では、すべてMacOS環境下で、以下のようにいろいろと試してみました。

  • jupyter notebookでエラー確認

  • terminalから$cat {データファイル.csv}で文字化けを確認

  • テキストエディタで開くも、やはり文字化けを確認



以上のことから、今回は、Windows環境で、以下のことを試してみました。

  • データファイルをExcelで開いてみる

  • テキストエディタでも開いてみる

  • 念のためメモ帳でも動作確認をする。



その結果が、下記の通りです。

!!! 注意 !!! 必ずデータは、コピーを取ってから、いろいろと試してください。

データファイルをExcelで開いてみる

結果から申しますと文字コードや改行コードのような制御コードは見えないため、きれいなデータが表示されました。

[Windows7][-][Excel]

f:id:Pimientito:20180713014744j:plain

若干、赤枠で囲った部分に違和感を感じながらも、内容を読む事ができたので、ちょっと嬉しかったです。

続いて

データファイルをテキストエディタで開いてみる

こちらも、結果は良好。MacOSテキストエディタでは、文字化けしていた部分が、Windows上のテキストエディタでは、クリアにデータを読むことができました。

[Windows7][-][サクラエディタ]

f:id:Pimientito:20180713015520j:plain

やはり赤枠のところに違和感を感じつつも、先に進めます。

このあと、テキストエディタ上で、現在設定されている文字コード/改行コードを確認いたしました。

確認方法は「名前を付けて保存」で表示されるダイアログから見てみました。
[Windows7][-][サクラエディタ]

f:id:Pimientito:20180713020645j:plain



確認の結果

  • 文字コード(セット)はSJIS(Shift-JIS)」

  • 改行コードは「変換なし」(変換なしとは、どういう状況なのか。またの機会に確認いたします。)


文字コードが「UTF-8」ではありませんでした。これが文字化けの原因だったのですね。

再度、動作確認をするため、一度開いたデータファイルは破棄し、あらためてオリジナルデータファイルのコピーを取り、Windows環境のjupyter notebookでデータを読込んでみました。

結果は、以下の通り、Windows環境でも、やはりエラーとなってしまいました。。。
[Windows][Python][jupyter notebook]

f:id:Pimientito:20180713021552j:plain



[Windows][Python][jupyter notebook]

f:id:Pimientito:20180713021609j:plain


では先ほど「名前を付けて保存」で確認したダイアログから、文字コードを「UTF-8」に変更し保存することで、何か変化があるのか試します。


[Windows7][-][サクラエディタ]

f:id:Pimientito:20180713022133j:plain


文字コード変更後、あらためてjupyter notebookで、データファイルを読込みます。


[Windows][Python][jupyter notebook]

f:id:Pimientito:20180713022342j:plain



「あれっ?エラーが出なかった。」



続けてコードdf.head()を書き実行しました。


[Windows][Python][jupyter notebook]

f:id:Pimientito:20180713022544j:plain


「おおぉっ~データが表示されたっ!」

とても他愛無いことですが、サンプルプログラムの写経や、GitHubに用意された学習用データファイルを利用していた身といたしましては、感慨深いものがあります。

表示されたデータの内容については、やはり「う~ん。。???」という部分もありますが、いったん「データ読込み~事前確認~」のミッションはクリアしたのではと思います。

最後に、もうひとつ確認を。

メモ帳でも、文字コードの設定が変更できるのか

これは非常に大切なことで、有償など特別なアプリケーションを用意しなくても、誰でもすぐに始められる機械学習であってほしいという思いから、Windowsに標準装備されているメモ帳でも、今回の作業ができることを確認したかったのです。

その結果は、以下の通りです。


[Windows][-][メモ帳]

f:id:Pimientito:20180713024818j:plain

当たり前のことなのでしょうが、メモ帳でも「UTF-8」への設定変更が可能でした(^-^)v

いよいよ次回からは、データの内容に迫って参ります。

今回は、以上です。





【参考資料】

【前処理の学習-4】文字コード・改行コードについて

前回「【前処理の学習】データ読込み~事前確認①~」の後半、mac環境のjupyter notebookでデータファイルを読込むと文字化けしてしまうことが分かりました。

pimientito-handson-ml.hatenablog.com

今回はいったんデータ読込みから離れて文字コードや改行コードについて、あらためて調べてみました。

まずは文字コードとは何でしょうか。

文字コード(もじコード)とはコンピュータ上で文字(キャラクタ (コンピュータ))を利用する目的で各文字に割り当てられるバイト表現。もしくは、バイト表現と文字の対応関係(文字コード体系)のことを指して「文字コード」と呼ぶことも多い。

参照元 Wikipedia文字コード

代表的な文字コードだけでも100種類以上存在するそうです。多種多様の目的で開発されている文字コード、それだけ多くなれば問題も多くなるのでしょう。同資料では、このように説明されています。

多様な文字コードの存在は文字コードの互換性問題をひきおこす。文字コードの互換性問題とは、ある文字コードで記録されたデータを別の文字コードに変換しようとするとき、一方で定義されている文字がもう一方では定義されていない(あるいは用途によって2種類の文字に分けられている)という問題である。

参照元 Wikipedia文字コード 概説」



主な文字コードをいくつか挙げます。

  • JIS漢字コード

日本工業規格 漢字などの文字コード

  • Shift-JIS

コンピュータ上で日本語を含む文字列を表現するために用いられる文字コードの一つ。

またMicroSoftAppleでは、各社の拡張文字コードを含めたShift-JISを使用している。

  • ASCII(American Standard Code for Information Interchange)

現代英語や西ヨーロッパ言語で使われるラテン文字を中心とした文字コード

これはコンピュータその他の通信機器において最もよく使われているものである。

世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで作られ、UnixWindowsmacOSJavaなどで利用されている。

UNIX上で使われてきた文字コード

UNIX上で日本語の文字を扱う場合にもっとも多く利用されている文字コード

データ交換方式・ファイル形式として一般的に使われる傾向にある。



続いて改行コードについて調べました。

改行コード(広義)は以下の2種類であり、システム(ソフトウェア)により片方または両方が使用される。

  • キャリッジリターン(英: carriage return、CR、復帰)

  • ラインフィード(英: line feed、LF、狭義の改行)またはニューライン(newline、line break または end-of-line、EOL)

参照元 Wikipedia「改行コード」

また同資料では、以下の問題点について言及しています。

コンピュータでは、同じ文字コードを使用していても、改行コードは異なる場合があるため、異なるシステム間でのデータの際には、改行が正確に反映されない場合がある。



同じ文字コードを使用しているにもかかわらず、改行コードが異なる場合とは、どのような状況なのでしょうか。

残念ながら(幸運にも?)そのような状況に出合ったことが無いため、なかなかイメージができませんでした。



最後に、主なコンピューターOSに絞って、それらが使用している改行コードを記載いたします。

参照元 Wikipedia「改行コード」

以上が、文字コード、改行コードについて調べた内容です。

今回、ほとんど引用ばかりでしたが、何となくうろ覚えだったことを、あらためて掘り起こして良い勉強になりました。

次回から、またハンズ・オンな記事をお送りいたします。

今回は、以上です。

【参考資料】

文字コード - Wikipedia

JIS漢字コード - Wikipedia

Shift_JIS - Wikipedia

ASCII - Wikipedia

Unicode - Wikipedia

Extended Unix Code - Wikipedia

EUC-JP - Wikipedia

UTF-8 - Wikipedia

改行コード - Wikipedia

【前処理の学習-3】データ読込み~事前確認①~

今回は、各言語(SQL/R/Python)でデータの読込みを行いたいと思います。

はじめに今回使用するデータについて簡単にご説明いたします。

(財)気象業務支援センター発行の「地上気象観測時日別編集データ(CSV版)2000年」を使用いたします。

CD-ROM内に収められているテキストファイルを読むと、かなり専門的な内容が記載されています。

しかし実際の現場でも専門外のデータに触れる機会もあるのではと想像し、このデータを使って学習を進めてみます。

データが収められているディレクトリ構成は以下の通りです。

ディレクトリ構成】※CD-ROM内のREADME.txtより引用

f:id:Pimientito:20180711014320j:plain

12個あるディレクトリ(SDPyymm)のひとつひとつに 

  • 時別ファイル(Hyymmiii.csv)が155ファイル

  • 日別ファイル(Dyymmiii.csv)が155ファイル

またそれぞれのファイルの内容は

  • 時別ファイルは744レコード(行)

  • 日別ファイルには31レコード(行)

それぞれ合算(ディレクトリ数×ファイル数×1ファイル内のレコード数)すると

  • 時別データレコードは約140万行

  • 日別データレコードは約58,000行

となります。

※yyは西暦下2桁、mmは月、iiiは国際地点番号下3桁

また各ファイルの概要ですが

  • 地上気象観測時別編集データは、各観測時刻ごとに「インデックスと時別値データ(毎時データ)」で1レコード(行)

  • 地上気象観測日別編集データは、1日ごとに「インデックス、日別値データ、欠測処理コード」で1レコード(行)

という構成です。

次にレコードの特徴量(項目)をみていきます。

本来、機械学習では、事前にオリジナルデータを「トレーニング用」と「テスト用」に分けてから学習を始めますが、今回は、先にデータの中身をざっくりと確認いたします。

「時別編集データ」(22項目)

地点番号,管区コード,観測回数,観測項目,地点名,年,月,日,時,現地気圧,海面気圧,気温,蒸気圧,相対湿度,風向,風速,雲量,現在天気,露点温度,日照時間,全天日射量,降水量

「日別編集データ」(73項目)

地点番号,管区コード,観測回数,観測項目,地点名,年,月,日,平均現地気圧,平均海面気圧,最低海面気圧,平均気温,最高気温,最低気温,平均蒸気圧,平均相対湿度,最小相対湿度,平均風速,最大風速,最大風速の風向,最大瞬間風速,最大瞬間の風向,平均雲量,日照時間,全天日射量,蒸発量,日降水量,最大1時間降水量,最大10分間降水量,降雪の深さの日合計,日最深積雪,未使用,未使用,大気現象1,大気現象2,大気現象3,大気現象4,大気現象5,降水強風時間,欠測処理1,欠測処理2,概況1接続詞,RMK,概況1天気,RMK,概況2接続詞,RMK,概況2天気,RMK,概況3接続詞,RMK,概況3天気,RMK,概況4接続詞,RMK,概況4天気,RMK,概況1接続詞,RMK,概況1天気,RMK,概況2接続詞,RMK,概況2天気,RMK,概況3接続詞,RMK ,概況3天気,RMK,概況4接続詞,RMK,概況4天気,RMK,

各特徴量の詳細については、学習を進めていくなかで、調べていきたいと思います。

いよいよCSVファイルからデータを読み込んでみます。

複数ファイルに別れた大量のデータをすべて読み込む前に、はじめは1ファイルだけ読み込んでみます。

なお今後コードや実行結果を記載する際は、実行環境を分かりやすくするため、下記の凡例を記事に併記いたします。

[OS名][言語名][開発環境/実行環境]

では読み込みます。

[Mac][Python][jupyter notebook]

f:id:Pimientito:20180711020609j:plain

早速エラーです。。。

エラー内容を読んでみると、どうやら文字コードに何か問題があるようです。

f:id:Pimientito:20180711020636j:plain

Macのアプリケーション「Terminal」を使って対象のCSVファイルの中身を表示させてみます。 使用したコマンドは$cat {ファイル名.csv}です。

[Mac][-][Terminal]

f:id:Pimientito:20180711022620j:plain

実行結果の画面上部を見てみると、ひどい文字化けです。やはり読込む前に文字コードなどを見直す必要があります。

今後使用していく環境は、WindowsMac。各OSや言語・開発環境での文字コードの仕様について調べなければ、先に進めそうもありません。

機械学習の醍醐味であるモデリングまでには、まだまだ道程が長そうです。

今回は、以上です。

【参考資料】




【更新履歴】 2018.07.13 タイトル【前処理の学習】にインデクスを追加しました。

【前処理の学習-2】環境構築

今回は、これから機械学習を行うための環境作りを行います。

本橋智光氏著書の「前処理大全 データ分析のためのSQL/R/Python 実践テクニック」(技術評論社)のなかでは、3つのプログラミング言語を挙げており、前処理の各場面によって使い分けるとのことです。

なお事前準備として、各言語や開発環境などの各種設定を行いますが、インストール手順などは、機械学習を「学習」することから少々逸れてしまうため、割愛させていただきます。

また本橋氏は著書のなかで、SQL(Database)については、BigQuery(Google)やRedshift(Amazon)を挙げられていらっしゃいますが、超初心者である自分は、機械学習「外」の操作や設定などで悩むことを避けるため、いったんPostgreSQLを選択いたしました。

今後、学習を進めるなかで、前述のDatabaseの機能が必要となったとき、あらためて導入することといたします。

今回の機械学習で使用する環境は、以下の通りです。

【環境】

【言語/開発環境】※Pythonを除き、各言語のバージョンは明記しておりません。

今回は、以上です。




【更新履歴】 2018.07.13 タイトル【前処理の学習】にインデクスを追加しました。

【前処理の学習-1】主な参考資料とサンプルデータについて

残念ながら資料を一切使わずにお話しを進めることができないため、学習を始める前に参考にさせて頂く書籍等をご紹介させて頂きます。

前処理の学習資料は、本橋智光氏著作の「前処理大全 データ分析のためのSQL/R/Python実践テクニック」(技術評論社)を中心に進めさせていただきます。

ほかにも、多くの書籍を参考にさせて頂くと思いますが、その都度、引用元をご紹介いたします。

続いてサンプルデータは、気象庁舎内の書店「津村書店」さんで購入した、以下の気象データを参考にさせて頂きます。

・「地上気象観測時日別編集データ(CSV版)2000年」((財)気象業務支援センター発行)

・「メッシュ気候値 2000 MESH CLIMATIC DATA OF JAPAN 統計期間 1971~2000年」(気象庁 編集兼発行者)

f:id:Pimientito:20180707005002j:plain
サンプルデータ

このほか、学習が進むなかで、使いやすいまたは説明に適しているデータがある場合は、こちらも、その都度ご紹介させて頂きます。

今回は、以上となります。

【更新履歴】 2018.07.13 タイトル【前処理の学習】にインデクスを追加しました。

はじめに

ほんの些細なことからはじめた機械学習

関連書籍を何冊購入しても、サンプルプログラムを写経しても、いまひとつ要領を得ない日々。

ついつい華やかで難しい数式やアルゴリズムに目を奪われてしまいますが、あらためて考えてみると、競技プログラミングの場以外で、どのようにデータを集められるのか。 また入手したデータをどのように加工するのか。すら自分は分かっていません。

そこで「前処理」「本処理」「後処理」と、ひとつひとつ課題をクリアすれば、いまよりは、もう少し機械学習というものを理解できるのではと淡い期待を抱きつつ、始めてみたいと思います。