僕がデータ分析者として覚醒するまで

しがない会社員がデータ分析者として覚醒するまでのブログ

テキストマイニング(前回の続き2)

概要

前回までのあらすじ

  • 入力したURL(yah○○ニュース)から本文を抽出
  • 抽出した本文から名詞を抜き出し
  • 抜き出した出力はこんなかんじ f:id:snuow:20190417135943p:plain

今回やること

  • グラフ化して、単語の出現頻度を確認する
  • グラフ化はpandasのDataFrameから行う

SourceCode

# URLを指定し、htmlデータを取得
url = u'https://headlines.yahoo.co.jp/hl?a=20190419-00000057-it_nlab-sci'
response = urllib.request.urlopen(url)
data = response.read().decode('utf-8')
soup = BeautifulSoup(data)

main = soup.find('p',class_="ynDetailText yjDirectSLinkTarget")

text = main.text
token_filters = [POSKeepFilter('名詞'), TokenCountFilter()]
a = Analyzer(token_filters=token_filters)

# 取得したデータをデータフレームに格納する。
# それぞれname,countsに分けてデータフレームを作成する。
df = pd.DataFrame(index=[],columns=['name','counts'])
for k, v in a.analyze(text):
  add_list = pd.Series([k,v],index=df.columns)
  df = df.append(add_list,ignore_index=True)

# グラフの背景を白くする。
# Colaboratoryのダークモードだと、透過してnameが見えなくなるため
plt.rcParams['figure.facecolor'] = 'white'

df.index = df.name
df[df.counts > 2].sort_values('counts',ascending=False).plot(kind='bar',figsize=(15,5))

f:id:snuow:20190419173132p:plain

まとめ

  • 1つの記事で名詞の出現頻度を知ることができるようになった。
  • アライさんがでてくることはわかりやすいが、他の「Twitter」や「アカウント」などの出現回数が少ないため、なんの記事なのかこれだけでは判断が難しいかもしれない。
  • 次はクローリングして、名詞を収集してなにかできないか模索する。

テキストマイニング(前回の続き)

概要

前回までのあらすじ

  • ここまでできました。 f:id:snuow:20190417135111p:plain

今回やること

SourceCode

  • BeautifulSoupとurllibをimport
  • 指定したURLからhtmlを取得
  • 取得したhtmlから本文を抜き出し、形態素分析にかける
# BeautifulSoupとurllibをimport
from bs4 import BeautifulSoup
import urllib

#urlを指定して、dataにhtmlを格納
url = u'https://headlines.yahoo.co.jp/hl?a=20190417-00000073-impress-sci'
response = urllib.request.urlopen(url)
data = response.read().decode('utf-8')

# dataから特定のタグ内のテキストをmainに格納
soup = BeautifulSoup(data)
main = soup.find('p',class_="ynDetailText yjDirectSLinkTarget")

#---ここからは同じ
t = Tokenizer()
tokens = t.tokenize(main.text)
for token in tokens:
  print(str(token))
  • 出力はこんな感じ f:id:snuow:20190417135943p:plain

テキストマイニング

テキストマイニングとは

テキストマイニング(英: text mining)は、文字列を対象としたデータマイニングのことである。通常の文章からなるデータを単語や文節で区切り、それらの出現の頻度や共出現の相関、出現傾向、時系列などを解析することで有用な情報を取り出す、テキストデータの分析方法である。(出典:Wikipedia)

Pythonで実装する

概要

  • 実装環境は、GoogleColaboratory
  • janome形態素分解を行う。

Install

  • まずは、pipでjanomeをインストール
pip install janome

SourceCode

  • 以下のような形でソースを書くと形態素に分解してくれます。
t = Tokenizer()
tokens = t.tokenize(u'こんにちは。私は日本人です。')
for token in tokens:
  print(str(token))
こんにちは 感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
。 記号,句点,*,*,*,*,。,。,。
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
日本人   名詞,一般,*,*,*,*,日本人,ニッポンジン,ニッポンジン
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 記号,句点,*,*,*,*,。,。,。

Next

概要

importライブラリ

from bokeh.io import output_notebook, show
from bokeh.plotting import figure, output_file, show
from bokeh.layouts import column
from bokeh.models import DataSource,RangeTool,HoverTool
import bokeh.palettes as bp
output_notebook()
import pandas as pd
import numpy as np

使用データ

# データの読み込み
df = pd.read_csv(r'sample_data.csv',names=['date','pointA','pointB','pointC'],skiprows=[0],engine='python',index_col=[0],parse_dates=[0])
df.index.freq = 'H'
df.dropna().head()

Bokehによるグラフ

  • Bokehによる線グラフ
  • bokehによる線グラフは下記のコードで実装できます。
  • 適宜変数の値は変更してもらえればと思います。
# 適宜'pointA'などの文字列を変更してください。
pointA = 'pointA'
pointB = 'pointB'
pointC = 'pointC'

# グラフの設定
p = figure(title='タイトル',         # タイトルを入力
           x_axis_type='datetime',   # x軸が時系列のindexを持っている場合、datetimeを指定 
           x_axis_label='timestamp', # x軸のラベル
           y_axis_label='EP',        # y軸のラベル
           x_range = [df.index[0],df.index[168]], # x軸のレンジ(list型)
           y_range = [0,2000],         # y軸のレンジ(list型)
           width=800,height=350,     # グラフの幅と高さの指定
          )

#適宜追加したいグラフ分だけp.line()を追加してください。
# pointAの線グラフを追加
p.line(x=df.index,y=df.loc[:,pointA],color='red',legend=pointA)
# pointBの線グラフを追加
p.line(x=df.index,y=df.loc[:,pointB],color='blue',legend=pointB)
# pointCの線グラフを追加
p.line(x=df.index,y=df.loc[:,pointC],color='green',legend=pointC)
# pointCのマーカーを追加
p.circle(x=df.index,y=df.loc[:,pointC],color='green',fill_color='white',legend=pointC)

# rangetoolの作成
# rangetoolは、上記で追加したグラフの描画範囲をスライダーで変更することができます。
# rangetool用のグラフの設定を追加
select = figure(title="上段のグラフの表示範囲をスライダーで指定できます",
                plot_height=130, plot_width=800, y_range=p.y_range,
                x_axis_type="datetime", y_axis_type=None,
                tools="", toolbar_location=None, background_fill_color="#efefef")

# Rangetoolの設定
range_rool = RangeTool(x_range=p.x_range) # Rangetoolのx_rangeの範囲を設定(p.x_range)
range_rool.overlay.fill_color = "navy"    # overlay.fill_colorはスライダーの色を指定
range_rool.overlay.fill_alpha = 0.2       # 透明度の指定

select.line(x=df.index,y=df.loc[:,pointA])# p.lineと同様に、x軸とy軸の設定
select.ygrid.grid_line_color = None
select.add_tools(range_rool)              # range_roolを追加
select.toolbar.active_multi = range_rool

# グラフの描画
show(column(p,select))

20181230.gif

  • Bokehによる棒グラフ
  • 1dayにリサンプリングして棒グラフにしています。
# 1データdayの可視化(棒グラフ)
day_df = df.resample('D').sum()

# グラフの設定
p2 = figure(title='タイトル',         # タイトルを入力
           x_axis_type='datetime',   # x軸が時系列のindexを持っている場合、datetimeを指定 
           x_axis_label='timestamp', # x軸のラベル
           y_axis_label='EP',        # y軸のラベル
           width=800,height=350     # グラフの幅と高さの指定
            
          )

# caution
# bokehのx_axis_typeはmsの分解能をもっているため、barの太さを1日分にするには
# 下記のようにms → 1dayに直す必要がある。
day_width = 1000* 3600 * 20 # ms * hour * 1day(隙間をあけるために20にしています)

# pointAの棒グラフを追加
p2.vbar(x=day_df.index,top=day_df.loc[:,pointA],color='red',legend=pointA,width=day_width)
# pointBの棒グラフを追加
p2.vbar(x=day_df.index,top=day_df.loc[:,pointB],color='blue',legend=pointB,width=day_width)
# pointCの棒グラフを追加
p2.vbar(x=day_df.index,top=day_df.loc[:,pointC],color='green',legend=pointC,width=day_width)
# pointCのマーカーを追加
p2.line(x=day_df.index,y=day_df.loc[:,pointC],legend=pointC,color='black')

show(p2)

bokeh_plot.png

まとめ

  • Bokehでデータを可視化し、スライドバーを導入することで、データフレームを細かく分割せずに一気に長期間を確認することができる。
  • 報告書等にまとめる際は、適宜画像を保存する必要がある。
  • Bokehはすごく便利なことがわかった!今度からこれ使おう。

Qiitaの記事が伸びた理由を考えてみた。

概要

 初心者による「Python初心者がコピペで使える!時系列データの可視化!」が自分史上かなり伸びたので、やったことないGoogleAnalyticsを導入してみました。 Qiitaの記事をGoogleAnalyticsに登録するのは意外と簡単で、ここを参考にしました。

↓こんな感じの結果になりました。
qiita投稿_20180729_result2.JPG qiita投稿_20180729_result.JPG

GoogleAnalyticsの結果

  • 初心者による「Python初心者がコピペで使える!時系列データの可視化!」の投稿は7/26に投稿しました。
    27日に一気に伸びたので、糞記事過ぎて晒されたのかとちょっと思いました。今までが超低空飛行なので他の日のセッション数が0に見えます。
  • 時間帯別ユーザー数をみると、7時~10時の伸びが大きく、通勤時間帯に多く見ていただけたのかと思いました。
    qiita投稿_20180729.JPG

  • ユーザーの訪れているページの最も多いページViewのページはもちろん26日に投稿された記事です。

  • バイス別セッション数をみるとモバイルやタブレットが約45%程度いることから、 時間別のデータとの兼ね合いからやはり通勤時間に目を通して頂けたのかなと推察しています。 qiita投稿_20180729_2.JPG

ユーザーの行動フロー

どこからの流入

全体の結果

  • 26~27日での伸び率をみると、SocialとDirectがページViewに最も寄与している結果となりました。 qiita投稿_20180729_7.JPG

Social

  • Socialカテゴリからの流入で最も多いのは、はてブの457でした。はてブのテクノロジーカテゴリに表示されたのが大きかったようです。27日に最も大きくなり、28日に0になったところを見ると1日しかはてブの目につく場所には掲載されなかったようです。
  • 因果関係はわかりませんが、この1回掲載で大きく伸びたと思っています。
  • 時間毎のデータがあればもう少し詳しくできると思います。 qiita投稿_20180729_8.JPG

Direct

  • Directカテゴリは流入元がわからなかったのですが、おそらくQiitaのトレンドに載ったことが原因だと思っています。(表示方法ってあるんですかね?)
  • 27日にSocialと同様に伸びて以降もトレンドに残り続けているため、28日29日もじわじわView数を伸ばした結果となりました。 qiita投稿_20180729_9.JPG

考察

  • View数が4000に対して、はてブ50,Pocket89ということは、3%程度の人しか後々見たいと思っていない。
  • ユーザー行動フローから30人程度の人は、私にも少し興味があった。
  • 流入数を一気に増やすには、はてブに掲載されることが重要。
    掲載されると、いいねが付きやすくQiitaのトレンドに載り持続的に伸びる。
  • その後に伸び続けるかは記事の質による。初心者による「Python初心者がコピペで使える!時系列データの可視化!」は翌日にはほぼ収束していたため、比較的チープな記事といえる。

まとめ

  • もっと技術の研鑽を怠らないようにして、良い記事をかける技術を身に着けよう。
  • 技術の研鑽はもちろんのこと、良い記事となるように文章も書けるようになろう。

初心者による「Python初心者がコピペで使える!時系列データの可視化!」

Qiitaで書きました。

qiita.com

時系列データ分析の可視化

 僕が普段扱っているデータ(エネルギーデータ)の可視化をPythonを使って行うためのメモです。 Githubにまとめもあげています。 エネルギーデータの分析にPythonを使うときの参考になればと思っています。私も勉強中なのでこんなのがあればというものがあれば教えてください。m( ;)m

概要

  • エネルギーデータを使用(1h間隔のデータ)
  • 使用言語はPython
  • 可視化は、pandasのplot, matplotlib, seabornなど
  • githubではJupyterNotebookで実現
  • Pandas,Seabornの両方で行っているものもあります
  • Bokehも使ってインタラクティブなチャートも使いたい

電力量データ

月別データ

Pandas

SnapCrab_NoName_2018-7-26_16-49-7_No-00.jpg

Seaborn

  • Bar
    SnapCrab_NoName_2018-7-26_16-49-21_No-00.jpg

月別用途別データ

Seaborn

SnapCrab_NoName_2018-7-26_16-49-32_No-00.jpg

  • Pie
    SnapCrab_NoName_2018-7-26_16-55-24_No-00.jpg

相関データ

SnapCrab_NoName_2018-7-26_16-49-44_No-00.jpg

まとめ

 こんな形で随時作っていこうと思います。Qiitaの編集およびGithubの更新を行っていきます。  時系列データの分析に有用なやり方があれば教えていただけると幸いです。

統計検定2級_わからんメモ

わからないことメモ

2014年度の過去問を解いていく中で、頭に入っていない項目を列挙した。

  • χ2分布およびその検定
  • t分布およびその検定(統計量の求め方)
  • クロス集計表(およびその自由度)
  • 標準偏差の式
  • 確率密度関数
  • 偏差値の算出
  • 母集団の比率の問題
  • F分布
  • プールした分散
  • 独立性の検定
  • 2標本の検定

時間ばっかりかかって、こんなに抜けがあるなんて・・・ もっと集中して短期で覚えきって、繰り返さないと定着しないなぁ。