ごはんと飲み物は紙一重

このブログはモチベーションアップのために情報工学関連について記事を更新していこうと思います。三日坊主にならないよう頑張ります。

報連相は大切

タイトルの通り。最近私自身に報連相が足りてないような気がして、周りの人たちを困らせてばっかりいます。

なので報連相はしっかりしましょう。する側もされる側もwin-winなので積極的にやっていきたい。

というわけで表題は終わり←

本題はここからで、いろんな予定がガツガツついてきたのでタスク管理しないとなと思って、今年の4月から導入しているアプリケーションがToDoistでございます。

こちらタスク管理ツールなのですが、操作もシンプルでなおかつgoogleアカウントと連携すると、タスクをカレンダーに追加してくれるスグレモノ。無料で使える割には優秀かなと思っております。まる。

ここに報連相することをちゃんとタスク追加できれば忘れない・・・ような気がします・・・ぜひお試しを・・・

12/11 21:00 追記 f:id:ST_ha1cyon:20171211214301p:plain

どうやらタスク消化のタイミングでプロになったらしく3ヶ月分の有料クーポンもらえました。やったね。

ついに研究室配属が佳境を迎える感じに

私の通う大学でも研究室配属が始まっているわけで、とはいえこの時期だとだいぶ遅いって言われそうなのですが、どうも今年の研究室配属関係に参加している学生がなかなか話を進めないせいかずるずると12月に。

私自身は夏休み中盤以降から話はふっていたのですが、動いてくれずあきらめモード。

というのも大学での研究室配属での決め方が基本的に成績重視の決め方をするので、これまで培ってきた講義の成績がすべてなわけですよ。その中でも上位10%に入っているので、とくにどういう決め方になろうと成績重視が変わらない限りは雲の上から研究室配属による戦争を覗いていられるわけですよ。

そして明後日に仮配属決定を控えた今、周りの学生がざわざわしていて非常に面白いなと。2週間前から個人的に色々動いて、研究室の希望状況を分析して公開したり、各研究室に関する情報をまとめたりと、戦争を激化させるような働きをしてたこともありいい感じに面白くなってきました。

研究室も迷うことなく機械学習をさせてくれそうな研究室を選びあとは待つだけ。

正直もっと早く動けば先生と学生との面談とかして相性を確認するのがよかったんじゃないかなと思いますよ。来年の研究室配属では今年の失敗をぜひとも踏まないように頑張っていただきたいですね。

【Python Advent Calender 1日目】scrapyを使ってpixivのランキングから評価の高い画像だけをクローリングする

Python Advent Calender

※本記事は、【Python Advent Calender 2017 1日目】の記事になります。

もともとはOMEGA014さんが埋めていたカレンダーでしたが、もともと書きたいとは思いながらも埋まっているわ何か書こうかとか考えているうちに埋まってしまうわで散々でしたが、なんとなんと1日目に穴が空いているではありませんか!

私の誕生日が12月1日ということもありこれはもしかすると運命かもしれないと思い投稿することに。

というわけで飛び入り遅刻勢で滑り込んでいこうというスタンスです←

お前さん誰だ

  • 某南の島にて情報工学を学ぶ大学生です
  • 普段はJupyter + Python でデータ分析や画像処理(OpenCV)、自然言語処理など幅広く勉強しています。
  • そろそろ進路を決めなきゃいけない学年でございます

んで本題

なんでも書いてよい感じだったのでつい最近やったことを晒そうかと。

大学の講義実験にて、「pixivの人気イラストの特徴が何か分析してみよう」という題のもとプロジェクトがスタートするにあたり、分析する画像が必要となりこれを数百枚以上用意する必要が出てきたのでそのときに書いたプログラムなどを晒しながら個人的なポイントとかを紹介して行こうと思います。

scrapy とは

2年前のPython Advent Calender にてすっごく分かりやすい説明をしていただいた記事があったのでそちらを参考にしていただけると。

ベースとなったプログラム

基本的には上記リポジトリに変更を加えるような形でプログラムを作りました。先人の知恵でログインのところやparseのところをかいてくれていたお陰でだいぶ楽にクローリングすることができました。この場をお借りして感謝申し上げたいと思います。謝謝。

変更点

主に変更したのは画像をダウンロードする部分(parse_detail)で、

def parse_detail(self, response):
        item = response.meta['item']
        item['url'] = response.url
        img_url = response.css('._illust_modal img').css('::attr("data-src")').extract()

        rated_count = response.xpath("//div[@class='user-reaction']/section[@class='score']/dl/dd[@class='rated-count']//text()").extract_first()

        # 画像が存在し、なおかついいね数が5000以上のみ収集
        print("=====================================")
        print("This illust rated_count is {}" .format(rated_count))
        if (len(img_url) > 0) and int(rated_count) > 5000:
            item['img_urls'] = img_url
        yield item

rated_countが新しく加えた部分です。ポイントはxpathを使用して必要なデータを細かく指定しているところですね。わりと当たり前な方法といえば当たり前ではあるのですが、scrapyが初心者である私にはxpathcssの指定でクローリングしたデータから抽出できることに感動していました。

実際に抽出する場所はブラウザの検証などをつかってソースを眺める作業に費やしていたので目がとても痛かった・・・

結果

今回はいいね数が5000以上の画像のみを取得するようにして・・・

f:id:ST_ha1cyon:20171203171127p:plain

いい感じにクローリングできました。

scrapyの使用が初めてだったのでソースの理解やxpathの理解に時間を費やしてしまったのですが、おかげさまでクローリングのちょっとした理解ができました。データ収集はこれからも必要な技術ではあるので面白い方向にscrapyをどんどん使用していきたいと思います!

(もちろん!悪意のあるクローリングは相手先サーバに負荷をかけてしまうので気をつけてくださいね!sleepを適度に挟む必要が有ることを初めて知った )

長年使い続けるとよくある手放せない感

f:id:ST_ha1cyon:20171127224210j:plain

イヤホンの話です。このイヤホンは買ったときの原型をほとんどとどめていないのですが、一応SHURE SE215-SP っていう遮音性の高い良いイヤホンです。

https://www.amazon.co.jp/SHURE-Special-%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B9%E3%83%AB%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%E3%83%96%E3%83%AB%E3%83%BC-SE215SPE-%E3%80%90%E5%9B%BD%E5%86%85%E6%AD%A3%E8%A6%8F%E5%93%81%E3%80%91/dp/B00A16BT4E

元画像はこちら。

f:id:ST_ha1cyon:20171127224438j:plain

そう。このイヤホンはリケーブル可能なイヤホンで、つまり耳につけるイヤホン本体が壊れない限り、リケーブルやイヤーピースの交換だけで長く使えるってわけです。

このイヤホンは思い出の品で、浪人時代にもらった初めてのバイト代で奮発して購入し、その浪人時代から今に至るくらいまで4年ほどお世話になっています。

今年の夏についに断線・・・ではなく耳にかけるための針金が折れてしまい、応急処置をして1年持たせていたのですがそろそろ買い替えと思いケーブルを交換することに。

このイヤホンはSHUREがけという普通のイヤホンとは違うかけ方をしていて、詳しくは「シュアがけ」で調べてみてください。

そして交換したケーブルとイヤーピースとともに今のイヤホンに至るわけです。高いイヤホンでありながら、長く大切に使えるってとても素晴らしいと今になって改めて思います。

ケーブルは2年前から買おう買おうとしてかってなかった青のクリアなケーブル。若干低音が強くなります。耳の中が幸せになれるイヤーピース。遮音性もバッチリ。

たぶん今後も高いイヤホンに手を出そうとおもいながらも結局リケーブルしてしまいそうです。4年も使うと表のSHUREのロゴなんてかすれて消えてしまいますww

徒然と書きなぐった上で、何が言いたいのかというと、身の回りにある長年使っているものは機会のあるうちに手入れしておきましょうって話です。愛着もわくし。

P.S. なんか最近埋め込みできないことがちらほら・・・なぜ・・・?

mac + Jupyter + IJulia でデータ分析用環境構築 【2017/11/25現在】

風の吹くまま気の向くままにqiita記事を見ていると、juliaが熱い感じの流れが。ここ最近Pythonに頼りがちではあるけれども、juliaも気になっていたので使う使わないは置いといて環境構築しようと思いました。

実行環境

あとは流れに沿ってbrewとjuliaがいろいろ入れてくれるので。

環境構築

juliaのインストール

まずはbrewでjuliaをインストール。

brew tap staticfloat/julia
brew install julia

tapがわりと時間かかっていたけれども無難に終えられました。brew楽チンでいいね。現状最新juliaバージョンは0.5.1になってました。

julia上でIJuliaのインストール

ターミナル上でjuliaを起動し、

Pkg.add("IJulia")

をするとIJuliaに必要なものをダウンロードしてくれます。そこそこ時間食う。必要なもの入れてるのでなんかPython2系も入れさせられました。なぜ。

インストールが終わればJupyter notebookを起動。うまく行っていればnotebooksにjuliaが入っているはず。途中でエラーになってしまって失敗したときは、Pkg.build()で再開できます。

f:id:ST_ha1cyon:20171125201235p:plain

データ分析用モジュールのインストール

上記同様、Pkg.add()で入れていきます。

notebookを作成し、以下のモジュールをインストール。

Pkg.add("RDatasets")
Pkg.add("Gadfly")

RDatasetsはデータセットを引っ張れるやつ。GadflyはJuliaのプロットモジュールですね。たぶんmatplotlib的な位置。

その後、ロードして

using RDatasets
using Gadfly

あとは適当にirisデータを引っ張ってきて散布図を可視化します。

set_default_plot_size(9inch, 9inch/golden);
plot(dataset("datasets", "iris"), x = "SepalWidth", y = "SepalLength", color="Species")

すると、

f:id:ST_ha1cyon:20171125201544p:plain

いい感じに可視化してくれます。ちなみにズームも可能。 環境構築としてはこれでできました。意外とあっさりとインストールできたので個人的にも大満足。 あとは細かいところでぜひぜひ使っていきたいですね。

参考サイト

https://qiita.com/fkm_y/items/cde1f63dd5ff1cb2d051 https://qiita.com/miiton@github/items/33c2b62c4911216d5fdb

データ分析と可視化をして思ったこと

技術的なところを書こうと思ったのですが、いろいろと説明するのはあれなので今日は日記カテゴリで書こうかと。

最近はバイト先や大学の講義、それ以外の多くの場所でデータ分析や可視化をすることが増えてきました。毎日毎日pythonとデータとにらめっこしていて日々楽しいのですが、続けてきて思ったことは、

可視化が難しいときに可視化に関する方向で対処しようとしないこと

ですね。何が言いたいのかというと、前処理したデータを無理して可視化の技術だけでなんとかしないようにしようということです。

たとえば今回の例えで行くと「あるデータの散布図を出しその数をバブルの大きさとして出力する」という方向で進めようとした時、元のデータをplt.scatterで散布図にしてサイズを変えてやればいいだけなのですが、それがうまく行かなくてなおかつ原因がつかめないときがありました。

f:id:ST_ha1cyon:20171122182457p:plain

↑図はサイズを反映させていない散布図

実際には散布図に反映させようとしたときにある値がどれだけ集まっているかをcountしておらず、どうにかこうにかしてsizeを一生懸命適応させようと原因を模索していました(結局原因は点の重なりであることを見抜けず基本中の基本の原因がわからず1日苦戦しました)。

次の日にどうしたかというと、本来の目的に沿ったより簡単なデータに前処理をして改めて棒グラフに可視化しました。

f:id:ST_ha1cyon:20171122182858p:plain

つまり「あるデータの散布図を出しその数をバブルの大きさとして出力する」のではなく「あるデータの数の散らばり具合を棒グラフとして出力する」という問題に変更したというわけです。

問題に対して正しいデータ分析を行う必要があり、技術のある人ならそこまで苦労するところではないと思うのですが、勉強中の身として技術がないなりに工夫する必要が出てきたときに、

問題の見直しや前処理の見直し

をしっかりしなきゃいけないななんて思いました。もちろん可視化の知らない技術もあるため、様々なところで学ぶところはたくさんあるので時間をかけることはこれから先も必要になると思いますが、

  • どうしたらいいかわからなくなったらとりあえず1日置こう
  • 自分の悩んでいる分野以外で立ちはだかる問題にアプローチできないかを考える

の2つが大事になるんじゃないかと思いました。久しぶりに日記なんて書いたので文章がひどいことになっていますが、こういった現状の問題に対してすぐに気づいて早急に対処できるようになれたらなぁと思う水曜19時でした。

matplotlibのsubplotsで文字が重なるのをどうにかきれいにしたい

連続投稿することになりそうなりました。

というわけで、前回の記事でいい感じにsubplotsしたいのはいいものの、その他titleだったりxlabelとかをつけていると、重なっちゃってうまく出力できない問題があるわけです。

これを解消する関数に

plt.tight_layout()

なんて関数があるんですね。すばらしい。コレを使うとxlabelとtitleがかぶらなかったり、グラフにかぶらなかったりでいい感じに出力できるようです。やったね。