ともにゃん的データ分析ブログ

勉強したことの備忘録とかね

【R】データフレームを渡すと欠損値のある列を抜いてくれる関数

タイトル通りの関数を作ったのでここに置いておきます。

# データフレーム df から欠損値のある列を除去する関数
removeNaCol <- function(df){
  is_na <- apply(df, 2, function(x) sum(is.na(x))) > 0
  return(df[,which(!is_na)])
}

kaggleのtitanicで0.81340を出した話

はじめに

みんな大好き(?)kaggleのtitanicコンペ

Titanic: Machine Learning from Disaster | Kaggle

で0.81340のスコアを出したので色々まとめてみましたという記事です。

このコンペはtitanic号が沈没したときのデータを使用して、乗客が生存したか死亡したかを予測するモデル構築し、そのモデルの予測精度を競うコンペです。
一般に80%の精度を超えると良いとされているコンペのようですので、この記事がそこを目指している方々への参考となればよいかと思います。

続きを読む

ハミルトニアン・モンテカルロ(HMC)法のざっくりとした解説とPythonによる実装

ベイズモデリングが流行っている中で多くのRユーザーはStanを使って解析をしているんではないかと思います。そして、Stanはハミルトニアンモンテカルロ(HMC)法と呼ばれる方法で事後分布からのサンプルを得ています。色々と解説記事はありますが、超ざっくりとHMCの原理をメモとして残しておくことにします。

ここで、基本的に私はHMCを伊庭先生のハミルトン4.pdf - Google ドライブこの資料で勉強したので、伊庭先生の資料を読めば私のこの記事は必要ないことをあらかじめ断っておきます((´^ω^)
なんでこれでいいの?という疑問は伊庭先生の資料で解決することでしょう((´^ω^)

続きを読む

【python】beautifulsoupでYahoo! ファイナンスから日経平均のデータをスクレイピング

ずっっっっっと前にbeautifulsoupでスクレイピングしたことがあったけど、使い方を完全に忘れてたので再び入門的なことをやってみた。

とりあえずYahoo! Financeから日経225に関するデータを引っ張ってこようかと思います。

from bs4 import BeautifulSoup
import urllib.request
import time

# 今回は30ページ分のデータを取得してみる。
page_num = 30
stock_temp = []
for i in range(page_num):
    # Yahoo Financeのページ。url末尾の数字を変更すると日経225の過去のデータが取得できる。
    url = "http://info.finance.yahoo.co.jp/history/?code=998407.O&sy=2010&sm=12&sd=4&ey=2017&em=3&ed=4&tm=d&p=" + str(i+2)
    html = urllib.request.urlopen(url)
    soup = BeautifulSoup(html, "lxml")

    # 上記urlのソースをみると<td>~~~</td>にほしい数値が入っているっぽいから、soup.find_all("td")でその部分を抽出する。
    # soup.find_all("td")では<td>~~~</td>といったタグと一緒にリスト型で結果を抽出してくるので、
    # リストのそれぞれの要素に対してget_textメソッドを使って数値だけにする。
    stock_extract = [value.get_text() for value in soup.find_all("td")[3:103]]
    stock_temp.extend(stock_extract)
    
    time.sleep(0.5)
    
stock_temp = np.array(stock_temp)


stock = stock_temp.reshape(int(len(stock_temp)/5), 5)
stock = pd.DataFrame(stock[:,1:5], columns=["start", "high", "low", "end"], index=stock[:,0])

# 株価のカラムが文字列になっていて、かつカンマが入っているのでカンマを除去してfloat型にする。
for i in range(4):
    stock.ix[:,i] = stock.ix[:,i].str.replace(",", "").astype(float)


結果として

stock

f:id:kefits:20170305123205p:plain

こんな感じ。いいんじゃないですかね?

【R】ダミー変数を一度に生成する関数

探せばあるんだろうけど、データフレームを引数に複数列を一度にダミー変数化する関数を作りました。
よければ使ってください。


使い方:

(0) {dummies} パッケージをインストールする

(1) 引数 data にダミー変数化したいデータフレームを入れる

(2) 回帰等で多重共線性を避けるために1列除きたい場合は is.drop = TRUE とする

convDummies <- function(data, is.drop = FALSE){
  library(dummies)
  
  N <- ncol(data)
  row_names <- names(data)
  
  names_list <- c()
  new_data <- rep(NA, nrow(data))
  for(n in 1:N){
    unique_value <- sort(unique(data[,n]))
    dummied_data <- dummy(data[,n])
    
    if(is.drop == TRUE){
      new_data <- cbind(new_data, dummied_data[,-ncol(dummied_data)])
      names_list <- c(names_list, 
                      paste(row_names[n], unique_value, sep = ".")[-ncol(dummied_data)])
    } else {
      new_data <- cbind(new_data, dummied_data)
      names_list <- c(names_list, paste(row_names[n], unique_value, sep = "."))
    }
  }
  
  new_data <- as.data.frame(new_data)
  names(new_data) <- c("temp", names_list)
  
  return(new_data[,-1])
}