なんちゃってだよ

見習いデータアナリストになった元SE→元コンサルによるなんちゃってデータ分析

【Python】【可視化】東京の気温の今と昔

今と昔では気温が全然違うという話題があるので、データを取得して可視化するだけのメモです。 とくにメッセージ性もなく可視化するので、あまり有意義ではないと思いますが、ご承知おきください。

環境

  • Python
  • ネットワークが通り、エアコンの効いた部屋

データ取得

  • 気象庁の過去データ: www.data.jma.go.jp
  • 今回は、東京の1875~2022年の7月と8月の最高気温だけ拝借することで、データ量を節約
  • 列名を手動で修正 (日付の列を「yyyymmdd」、 最高気温の列を「max_temp」)
  • その他不要な行、列を削除

パッケージ

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

データ加工部分の処理

data = pd.read_csv("tenki/data.csv", parse_dates=["yyyymmdd"], dtype={"max_temp": float})
data = data.dropna(axis=0) #値が無い行を削除

data.loc[:,"yy"] = data["yyyymmdd"].dt.year
data.loc[:,"mm"] = data["yyyymmdd"].dt.month

可視化部分の処理

  • 凡例に全部の年を表出させると多すぎるので、10年づつにさせるためにif文書いてます (もっといい書き方あったら教えてください)
  • 特に意味はないですが、8月のデータだけ使いました。意味はないです。
fig, ax = plt.subplots(1, 1, figsize=(10,5))
col_map = sns.color_palette("rainbow",2023-1875)

for i in range(0,2023-1875):
    if i%10 == 7:
        sns.kdeplot(
            data.loc[(data["yy"]==i+1875)&(data["mm"]==8), "max_temp"], 
            shade=True, label=i+1875, alpha=.1, color=col_map[i], ax=ax
        )
    else:
        sns.kdeplot(
            data.loc[(data["yy"]==i+1875)&(data["mm"]==8), "max_temp"], 
            shade=True, alpha=.1, color=col_map[i], ax=ax
        )

plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show() # おまじない
plt.close() # おまじない
plt.clf() # おまじない

お詫び

  • 個人的なPythonのリハビリでした。
  • こういう、グラフを沢山並べるのは見づらいので避けるべきというのが個人的な感想です。
  • でも、わざと沢山ならべて、見づらいけどそれでもなお、最近の方があついね~というメッセージ性が伝えられるんじゃないかと(何を言っているのか)

画像(png・pdf)をOCR処理→文字を埋め込んだpdf作成

メモなのです

環境

・mac OS (スイマセンまだMojaveです)
・冷房の効いた部屋(梅雨がバッチリ明けた8月に作成した記事)
・胃に優しいコーヒー

必要なライブラリ

・pdfをpngに変換するのに必要(対象ファイルがすでにpngなら不要)

$ brew install imagemagick
$ brew install poppler

OCR処理に必要

$ brew install tesseract

gitはこちら github.com ・日本語のOCR用のファイル 以下の2つ(jpn.traineddata、jpn_vert.traineddata)をダウンロード github.com

github.com

以下に格納 (バージョンによってフォルダ違うので注意)

$ mv jpn.traineddata /usr/local/Cellar/tesseract/4.1.1/share/tessdata/
$ mv jpn_vert.traineddata /usr/local/Cellar/tesseract/4.1.1/share/tessdata/

pdfのpng変換(対象ファイルがすでにpngなら不要)

$ pdftoppm -png ファイル名.pdf pngを格納したいフォルダ/page

これで複数ページのpdfファイルは、page-1.png、page-2.png、、、のように分割されてpng

pngOCR処理→pdf変換

pngファイルが1つ

$ tesseract pngを格納したフォルダ/page-1.png out -l jpn pdf

この場合はout.pdfという名前で出来上がり〜〜〜

pngファイルが複数

$ find "pngを格納したフォルダ" -type f -name "*.png" | sed 's/\.png$//' | xargs -P8 -n1 -I% tesseract %.png % -l jpn pdf

pngを格納したいフォルダ内にpage-1.pdf、page-2.pdf、、が出来上がっています。 あとは結合させれば完成〜〜〜〜

R言語のrvestパッケージでWebスクレイピングしてみた素人

久しぶりすぎてスイマセン。
 

Webページの情報を自動で取得したいなーと昔から思ってた訳ですが、、、
仕事で、「できます?」と聞かれることが増えたので調べてみました。

 
今回はR言語で、Webページ(今回はJSP)の情報を取得してみました。
(別に次回に予定はない)
 

<必要なもの>

・ネットにつながるパソコン
R言語でインストールされたパソコン
・妻と子供が寝静まった部屋とYシャツと私
・手ごろなサイト(以下で記載)

<スクレイピングするサイト>

テーブルだけ書いてあるHTMLとして、こんなの見つけました。
https://www.jnss.or.jp/jns_web/jsp_pub/map.jsp
f:id:grarara:20180318204206p:plain


北海道のボタンを押下すると
https://www.jnss.or.jp/jns_web/meib_ken.do?ken=1
f:id:grarara:20180318204326p:plain


 さらに施設を選択すると、
f:id:grarara:20180318204410p:plain

最後のページのURLはどの施設も
https://www.jnss.or.jp/jns_web/meibo.do
でした。

 

<やりたいこと>

都道府県の、全施設の、医師の名前を取得する。
その医師の名前に、最後ページの一つ目のテーブルの情報を紐付ける。
(イメージ)
f:id:grarara:20180318205117p:plain

<作業ログ>

1.調査

(特段何の理由も無く新卒入社したSE会社から転職してコンサル目指してるのに、時々技術的なことしたくなる中途半端野郎)
かすかな記憶で「Node.js」という単語から、「スクレイピング」という単語にたどり着き、「rvest」をはじめて知る。
このとき初めてRでWebスクレイピングできることを知る。
Google先生と一緒にネットサーフィンして、rvestパッケージを知らべる。
https://qiita.com/rmecab/items/9612f55097fa2f6701d8
このページを参考にしました。ありがとうございました。

2.コーディング(お試し)

最初に言っておくと、全ソースコードは載せません。エンジニアではなく、汚いので(`・ω・´)((キリッ)
(いいときだけエンジニアではないという剣を振る)
とりあえず、各都道府県のページから情報を取得

get_html <- function(num) {
  # 特定の都道府県のページ情報取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meib_ken.do?ken=%s", num), encoding = "SJIS")
}
res <- get_html(i)
shisetsu_num <- res %>% html_nodes("a") %>% html_attr("href")


これで施設番号がとれた模様。
"javaScript:doSubmit('1');"という文字列なので、いい感じで番号だけ取得。

ここで、各施設のページに行きたいが、URLがすべて同じ。。
(筆者にはJSPの知識は無いのだ。叩かないでくれ!しょげるから)

HTMLを眺めること数分。。。

	<input type="button" name="back" value="戻る" onclick="JavaScript:history.back()"><br>
	<form name="MeiboShisetsuForm" method="post" action="/jns_web/meibo.do" id="meibo"><input type="hidden" name="shisetsu" value="0">

というコードを見つけ、shisetsu=pekepekeでいけることを知る。
https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=1

あとはこのページから情報を取得。

get_html_s <- function(num) {
  # 特定の施設のページ取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=%s", num), encoding = "SJIS")
}
res_s <- get_html_s(1)
shisetsu_table <- res_s %>% html_nodes("td") %>% html_text


なぜhtml_tableで取得しないかというのを書こうとしたが、忘れたので許してほしい。
あとはいい感じに加工したら終わり。。。。と思いきや、ここではまる。

詳細は書かないが、Google先生と二度目のサーフィンをして、以下のサイトのお世話になる。
notchained.hatenablog.com

そのまま拝借すると、以下関数をかませて、HTMLエスケープを元に戻す

unescape_html <- function(str){
  purrr::map_chr(
    sprintf("<x>%s</x>", str),
    ~xml2::xml_text(xml2::read_html(.)))
}


あとは、全都道府県をループしよ~っとしたら、にっくき大阪府のページでエラーが起こる

三度目の波乗りで以下のサイトにたどり着く。

ja.stackoverflow.com

コード変更して難を逃れる

get_html_CP932 <- function(num) {
  # 特定の都道府県のページ情報取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meib_ken.do?ken=%s", num), encoding = "CP932")
}
get_html_s_CP932 <- function(num) {
  # 特定の施設のページ取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=%s", num), encoding = "CP932")
}


これで無事にループ、、、、
でも、このサイトはそもそもそんなことをやっていいサイトなのかしら。
Sys.sleep(pekepeke)かませながらやっても、、、まぁ怪しいから止めておこう。

今は知らないけど、気象庁のサイトではクローラー禁止という言葉がありましたね。
(今みたら、そんな記載ないから、やってもいいのかな??)


とりあえず、今回はこんな技術が身についたよというところでお終い。

次回は無いけど、ログインしないと見れないページはどうするのかなと思い検索したらこんなサイトも
qiita.com
また、遊んでみよう。


以上、またいつかここで会える日まで

D.カーネギー「人を動かす」を読んでまとめてみた(DMK第1回)

ご無沙汰しております。grararaです。

 

コンサルと呼ばれる職に就き早二ヶ月が経過しようとしております。

仕事内容はやっぱり書きづらいので、自主学習の結果を発表する場にしよと思います。

 

名付けて、「DMK」

(D)データ分析コンサルタントを(M)目指す(K)会

 

第一回は、自己啓発な内容です。

 

前職SIerでは、データ分析していてもやはりSEなので、高度ななんとか~専門的なうんたら~という(悪く言えば)自己中心的。

現時点の私が考えるコンサルタントとは顧客を動かすという(良く言えば)他者中心的。

 

ということで、有名な本を読んでみました。

 

D.カーネギーの「人を動かす」

 

読んだだけだと、内容を忘れてしまうので、資料にまとめました。

 

 

 

こうすることで、意識改革というか、常に意識して行動できるのかなと思います。

 

ただただ、本の内容を転写+感想を追記しただけです。

詳細は本の中身を読まないと、重要なことは伝わらないと思いますので、気になった人は読んでみてください。

 

少し感想を書くと、

<マイナス>

・欧米か!日本じゃ当てはまりにくいんじゃないの?

・例文が古い!

<プラス>

・こんなことしてくれる上司は最高だな!おれもこうなりたい

・仕事でもプライベートでも役に立つかも

です。

 

今は、スライド作成術とか、可視化術なんかの本を読んでます。内容がまとまれば、アップしていきたいと思います。

これからもよろしく。

 

最後に内輪ネタを。。。。

>前会社のとあるメンバーへ

脱出おめでとうございます。これからも応援しております。東京で逢いましょう。

 

>他のメンバーへ

頑張り時+チカラをつける時だと思います。本当に本当に応援しています。

 

以上

【決定版】可視化手法のまとめ

自己紹介記事からだいぶ日が経ってしまいました。

取り敢えず、「なんか技術系のブログ書いてやっペ」
という意気込みだけで開設してしまいました。

なんか書かねば、、、
そう想いながら時間が経ってしまいました。


さて、一発目はハッタリから。

library(ggplot2)
# s:start, e:end
d <- data.frame(
 # 
  xs_01=3    ,ys_01=8.5  ,xe_01=1    ,ye_01=5
 ,xs_02=3    ,ys_02=8.5  ,xe_02=5    ,ye_02=5
 ,xs_03=2    ,ys_03=5.5  ,xe_03=4    ,ye_03=5.5
 ,xs_04=1.5  ,ys_04=4.5  ,xe_04=4.5  ,ye_04=4.5
 ,xs_05=4.5  ,ys_05=4.5  ,xe_05=2.5  ,ye_05=2.5
 # 
 ,xs_06=6.5  ,ys_06=8    ,xe_06=6.5  ,ye_06=3
 ,xs_07=6.5  ,ys_07=8    ,xe_07=9.5  ,ye_07=8
 ,xs_08=6.5  ,ys_08=5.5  ,xe_08=9.5  ,ye_08=5.5
 ,xs_09=6.5  ,ys_09=3    ,xe_09=9.5  ,ye_09=3
 ,xs_10=9.5  ,ys_10=8    ,xe_10=9.5  ,ye_10=3
 # 
 ,xs_11=12.5 ,ys_11=7.5  ,xe_11=11.5 ,ye_11=3.5
 ,xs_12=13.5 ,ys_12=7.5  ,xe_12=14.5 ,ye_12=3.5
 # 
 ,xs_13=1    ,ys_13=1    ,xe_13=5    ,ye_13=1
 ,xs_14=3    ,ys_14=1    ,xe_14=3    ,ye_14=-3
 ,xs_15=1    ,ys_15=-3   ,xe_15=5    ,ye_15=-3
 # 
 ,xs_16=10   ,ys_16=1    ,xe_16=6    ,ye_16=-1.5
 ,xs_17=8    ,ys_17=-0.5 ,xe_17=8    ,ye_17=-3
 # 
 ,xs_18=11   ,ys_18=0    ,xe_18=13.5 ,ye_18=0
 ,xs_19=13.5 ,ys_19=0    ,xe_19=12   ,ye_19=-3
 ,xs_20=14.5 ,ys_20=2    ,xe_20=14.5 ,ye_20=1
 # 
 ,xs_21=16.5 ,ys_21=0.5  ,xe_21=16.5 ,ye_21=-1.5
 ,xs_22=19.5 ,ys_22=1    ,xe_22=19.5 ,ye_22=-1.5
 ,xs_23=19.5 ,ys_23=-1.5 ,xe_23=18   ,ye_23=-3
 # 
 ,xs_24=2    ,ys_24=-6.5 ,xe_24=1    ,ye_24=-9
 ,xs_25=3.5  ,ys_25=-4.5 ,xe_25=3.5  ,ye_25=-10.5
 ,xs_26=3.5  ,ys_26=-10.5,xe_26=5    ,ye_26=-8.5
 # 
 ,xs_27=6.5  ,ys_27=-6   ,xe_27=9.5  ,ye_27=-6
 ,xs_28=9.5  ,ys_28=-6   ,xe_28=7    ,ye_28=-10.5
 # 
 ,xs_29=11   ,ys_29=-8.5 ,xe_29=15   ,ye_29=-8.5
 # 
 ,xs_30=17   ,ys_30=-6.5 ,xe_30=16   ,ye_30=-9
 ,xs_31=18.5 ,ys_31=-4.5 ,xe_31=18.5 ,ye_31=-10.5
 ,xs_32=18.5 ,ys_32=-10.5,xe_32=20   ,ye_32=-8.5
)

p <- ggplot(data=d)
# 
p <- p + geom_curve(  aes(x=xs_01, y=ys_01, xend=xe_01, yend=ye_01),curvature=-0.1)
p <- p + geom_curve(  aes(x=xs_02, y=ys_02, xend=xe_02, yend=ye_02),curvature=0.1)
p <- p + geom_segment(aes(x=xs_03, y=ys_03, xend=xe_03, yend=ye_03))
p <- p + geom_segment(aes(x=xs_04, y=ys_04, xend=xe_04, yend=ye_04))
p <- p + geom_curve(  aes(x=xs_05, y=ys_05, xend=xe_05, yend=ye_05),curvature=-0.2)
# 
p <- p + geom_segment(aes(x=xs_06, y=ys_06, xend=xe_06, yend=ye_06))
p <- p + geom_segment(aes(x=xs_07, y=ys_07, xend=xe_07, yend=ye_07))
p <- p + geom_segment(aes(x=xs_08, y=ys_08, xend=xe_08, yend=ye_08))
p <- p + geom_segment(aes(x=xs_09, y=ys_09, xend=xe_09, yend=ye_09))
p <- p + geom_segment(aes(x=xs_10, y=ys_10, xend=xe_10, yend=ye_10))
# 
p <- p + geom_curve(  aes(x=xs_11, y=ys_11, xend=xe_11, yend=ye_11),curvature=-0.1)
p <- p + geom_curve(  aes(x=xs_12, y=ys_12, xend=xe_12, yend=ye_12),curvature=0.1)
# 
p <- p + geom_segment(aes(x=xs_13, y=ys_13, xend=xe_13, yend=ye_13))
p <- p + geom_segment(aes(x=xs_14, y=ys_14, xend=xe_14, yend=ye_14))
p <- p + geom_segment(aes(x=xs_15, y=ys_15, xend=xe_15, yend=ye_15))
# 
p <- p + geom_curve(  aes(x=xs_16, y=ys_16, xend=xe_16, yend=ye_16),curvature=-0.1)
p <- p + geom_segment(aes(x=xs_17, y=ys_17, xend=xe_17, yend=ye_17))
# 
p <- p + geom_segment(aes(x=xs_18, y=ys_18, xend=xe_18, yend=ye_18))
p <- p + geom_curve(  aes(x=xs_19, y=ys_19, xend=xe_19, yend=ye_19),curvature=-0.3)
p <- p + geom_curve(  aes(x=xs_20, y=ys_20, xend=xe_20, yend=ye_20),curvature=-1)
p <- p + geom_curve(  aes(x=xs_20, y=ys_20, xend=xe_20, yend=ye_20),curvature=1)
# 
p <- p + geom_segment(aes(x=xs_21, y=ys_21, xend=xe_21, yend=ye_21))
p <- p + geom_segment(aes(x=xs_22, y=ys_22, xend=xe_22, yend=ye_22))
p <- p + geom_curve(  aes(x=xs_23, y=ys_23, xend=xe_23, yend=ye_23),curvature=-0.1)
# 
p <- p + geom_curve(  aes(x=xs_24, y=ys_24, xend=xe_24, yend=ye_24),curvature=-0.1)
p <- p + geom_segment(aes(x=xs_25, y=ys_25, xend=xe_25, yend=ye_25))
p <- p + geom_curve(  aes(x=xs_26, y=ys_26, xend=xe_26, yend=ye_26),curvature=0.1)
# 
p <- p + geom_segment(aes(x=xs_27, y=ys_27, xend=xe_27, yend=ye_27))
p <- p + geom_curve(  aes(x=xs_28, y=ys_28, xend=xe_28, yend=ye_28),curvature=-0.3)
# 
p <- p + geom_segment(aes(x=xs_29, y=ys_29, xend=xe_29, yend=ye_29))
# 
p <- p + geom_curve(  aes(x=xs_30, y=ys_30, xend=xe_30, yend=ye_30),curvature=-0.1)
p <- p + geom_segment(aes(x=xs_31, y=ys_31, xend=xe_31, yend=ye_31))
p <- p + geom_curve(  aes(x=xs_32, y=ys_32, xend=xe_32, yend=ye_32),curvature=0.1)
# 
p <- p + xlim(0,20) + ylim(-15,10)
plot(p)

スイマセン。。
こんな記事でスイマセン。

次回以降に、乞うご期待。ということで、今日はこの辺で。

最後まで読んでくれてありがとうございます。

ブログはじめました

はじめまして。

ブログはじめます。

 

SIerでエンジニアスキルを身につけられなかったSEが、次の4月から見習いコンサルに転職しました。

一応SIerでなんちゃってデータ分析をしていたので、見習いコンサルでもなんちゃって分析をすることでしょう。

その中での気づきなどをメモしていきたいと思います。

 

メモ帳ではありますが、ブログとして残すことで、多くの人からの暖かい指摘を全力で受けて屍になりたいと思います。

 

以後、お見知りおきを。

 

(ブログのネタなんか何も思いついてないのにはじめたブログ。このブログに次回はあるのか)

 

以上