多重共線性について調べたメモ
多重共線性とは
モデル内の独立変数が他の独立変数と相関しているときに起こる状態
多重共線性が起きると
多重共線性があると、逆行列の計算の部分で、いわゆる「ゼロ割」(分母に0が来る)問題が発生
解決策
まず相関行列で確認する
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()
→今回は説明変数同士の相関は見られなかった
※参考 https://blog.amedama.jp/entry/2017/04/18/230431
※ 多重共線性が見られる場合は、解決策としてリッジ回帰(正則化回帰の一つ)を行う。 正則化項を付け加えることでこの多重共線性の問題を解決する
【pythonでの前処理】データの正規化、標準化する方法
データの正規化の方法
単体?か、ベクトル単位によって大きく二通りある
単体の場合:二種類ある
- データの加算平均が0、分散が1になるように調整する(z-score noramalization(標準化))
- データの最小値が0、最大値が1となるように調整する(min-max normalization)
使い分け
前者はガウス分布(A)、後者は一様分布(B)が想定されている。
(*A)正規分布。平均値の付近に集積するようなデータの分布を表した連続的な変数に関する確率分布 ランダムサンプリングの場合、サンプルの分布がガウス分布に近づくことが知られています(中心極限定理という名前がついています)。この性質があるので、ランダムサンプリングを伴う調査では、調査で扱われる指標がガウス分布をとると暗黙のうちに仮定されます。そうすると、分布の中心から極端に遠い値は、サンプルを得る過程での何らかのエラーによるものと考えることができて、解析から除外することもあります。
(*B)サイコロを振ったときの、それぞれの目の出る確率など、すべての事象の起こる確率が等しい場合の分布
ベクトル単位のの正規化方法
次は大きさを1にする正規化する。ベクトルの大きさのことをノルムというが、これを各要素に割っていくことでノルムを1にする。
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次関数で埋める」というにはこの赤線のように埋めるということ。
※二次関数で埋める場合は以下
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を指定することで、特定できる。