けむブログ

データ分析に関する気付きや学びを記録するブログ

多重共線性について調べたメモ

多重共線性とは

モデル内の独立変数が他の独立変数と相関しているときに起こる状態

多重共線性が起きると

多重共線性があると、逆行列の計算の部分で、いわゆる「ゼロ割」(分母に0が来る)問題が発生

jojoshin.hatenablog.com

解決策

まず相関行列で確認する

import matplotlib.pyplot as plt

corr_mat = cluter_log.corr(method='pearson')
corr_mat

import seaborn as sons
sons.heatmap(corr_mat,
            vmin=-1.0,
            vmax=1.0,
            center=0,
            annot=True, # True:格子の中に値を表示
            fmt='.1f',
            xticklabels=corr_mat.columns.values,
            yticklabels=corr_mat.columns.values
           )
plt.show()

f:id:kemuex:20180904140028p:plain

→今回は説明変数同士の相関は見られなかった

※参考 https://blog.amedama.jp/entry/2017/04/18/230431

※ 多重共線性が見られる場合は、解決策としてリッジ回帰(正則化回帰の一つ)を行う。  正則化項を付け加えることでこの多重共線性の問題を解決する

リッジ回帰による多重共線性の問題回避について - 統計学と疫学と時々、助教生活

【pythonでの前処理】データの正規化、標準化する方法

データの正規化の方法

単体?か、ベクトル単位によって大きく二通りある

単体の場合:二種類ある

  1. データの加算平均が0、分散が1になるように調整する(z-score noramalization(標準化))
  2. データの最小値が0、最大値が1となるように調整する(min-max normalization)

使い分け

前者はガウス分布(A)、後者は一様分布(B)が想定されている。

(*A)正規分布。平均値の付近に集積するようなデータの分布を表した連続的な変数に関する確率分布 ランダムサンプリングの場合、サンプルの分布がガウス分布に近づくことが知られています(中心極限定理という名前がついています)。この性質があるので、ランダムサンプリングを伴う調査では、調査で扱われる指標がガウス分布をとると暗黙のうちに仮定されます。そうすると、分布の中心から極端に遠い値は、サンプルを得る過程での何らかのエラーによるものと考えることができて、解析から除外することもあります。

(*B)サイコロを振ったときの、それぞれの目の出る確率など、すべての事象の起こる確率が等しい場合の分布

webbeginner.hatenablog.com

ベクトル単位のの正規化方法

次は大きさを1にする正規化する。ベクトルの大きさのことをノルムというが、これを各要素に割っていくことでノルムを1にする。

deepage.net

python スクレイピング ~タグの中のテキストと、リンクを取得する時~

スクレイピングして、タグの中身を取得する時の方法

テキストのみ取得する時

・findAll(text = True) で取得できる!

for news in contents:
    for anchor_text in news.findAll('a'):
        print(anchor_text.findAll(text=True)) 
#findAll(text=True) でテキストのみを抽出できる
リンクを取得する時

・.get('href') で取得できる!

for news in contents:
    for anchor_text in news.findAll('a'):
        print(anchor_text.get('href')) #リンクのみを取得できる

python pandasで欠損値を補完するとき ~平均、1次関数、決まった値~

python pandasで欠損値を補完するときのパターン

  • 列ごとの平均を入れる時
  • 隣り合った値の1次関数を入れる時
  • 決まった値を入れる時

列ごとの平均を入れる時

df.fillna(df.mean().to_dict())
df.mean().to_dict()

は列ラベルをキーに、平均値を値として持った辞書。

隣り合った値の1次関数を入れる時

df.列名.interpolate()

以下が欠損値を補ったパターンごとのグラフだが、「1次関数で埋める」というにはこの赤線のように埋めるということ。 f:id:kemuex:20180704000102p:plain

※二次関数で埋める場合は以下

df.列名.interpolate(method=''quadratic)

決まった値を入れる時

たとえば全て0を入れる時

df.fillna(0)

python pandasで欠損値を削除するとき dropna()

df_log.dropna()

欠損値を1つでも含む行を削除

df_log.dropna(1)

欠損値を1つでも含む列を削除して返します。

df_log.dropna(subset=['Date', 'Product'])

欠損値の調べる範囲を指定することができる

df_log.dropna(inplace=True)

オプションを付けると、df_logそのものを変更できます。

df_log.dropna(inplace = true)

Python スクレイピング findAll

 findAll

 使用例

指定したURLをスクレイピングして、BeautifulSoupを用いてHTMLを取得した後にそのHTMLを分解してほしいデータを取ってくるときなどで使う

 

指定したタグの中身を順に取得する 

soup = 取得したHTML

for a in soup.findAll("table"):

     print(a)

 

で tableタグのつくものを順に取得してaに返す。

なお、printをつけなかった場合は最後の一つだけが表示されるので注意!!

リストに格納すれば、二重配列のリストができる

 

 

ページャー「次へ」をクリックしてスクレイピングする方法 python

やりたいこと

以下の上場企業のリストを取得したい。 売上高:株式ランキング - Yahoo!ファイナンス ページ下部にある「次へ」ボタンをクリックして全て取得したい。

方法

前提

こういう状態のとき

import time
from bs4 import BeautifulSoup as bs
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

options = Options()
# Chromeのパス(Stableチャネルで--headlessが使えるようになったら不要なはず)
options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
# ヘッドレスモードを有効にする(次の行をコメントアウトすると画面が表示される)。
options.add_argument('--headless')
# ChromeのWebDriverオブジェクトを作成する。

driver = webdriver.Chrome('C:/chromedriver/chromedriver.exe')

driver.get('https://info.finance.yahoo.co.jp/ranking/?kd=46&mk=1&tm=d&vl=a')

import socks,socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
for i in range(1,13):
    time.sleep(1)
    html = driver.page_source
    soup = bs(html, "html.parser")
    
    for t in soup.findAll("table",{"class":"rankingTable"}):
        l.append(t)

 driver.find_element_by_xpath('//*[@id="contents-body-bottom"]/div[2]/ul/a['+str(i)+']').click()

といったfor文の中で以下のように記載することで取れる。

driver.find_element_by_xpath('//*[@id="contents-body-bottom"]/div[2]/ul/a[11]').click()```

  //*[@id="contents-body-bottom"]/div[2]/ul/a[11]



の箇所は「次へ」を選択した状態で右クリック>検証>copy>copy xpath の値を指定している。
xpathを指定することで、特定できる。