注目の投稿

【kepler.gl】コロナ対策による人流の変化も地図上に可視化(各種メディアで報道)

kepler.glのサイト画面 kepler.glを使ってコロナ対策の効果を分析したところ、テレビ、新聞、ネットのメディアから問い合わせや報道依頼が殺到。今も、土日返上で都内や全国の人流変化を分析しています。この記事では人流変化の可視化に便利なkepler.glにつ...

ラベル dplyr の投稿を表示しています。 すべての投稿を表示
ラベル dplyr の投稿を表示しています。 すべての投稿を表示

2017年8月13日日曜日

R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

前回のおさらい

dplyrとは?
  1. Rで大規模データをさくさく処理するためのパッケージ
  2. 内部結合とかSQLみたいな処理もできる
  3. Rでデータ処理する人は必ず使ってる(くらいメジャーで有用)

導入は簡単!

インストールして
> install.packages("dplyr")
 

パッケージを読み込むだけ
> library(dplyr)

今回は使い方を説明

前回はRのサンプルデータを使ったせいで妙なエラーに悩まされました。なので、オリジナルのサンプルデータを作成していろいろ使い方を紹介していきます。

実はRで遭遇するエラーの多くがデータの構造や型に起因するものです。データがしっかりしていれば、大抵うまくいきます。そのため、データのところは丁寧めに説明しています。

「ちゃんとした」サンプルデータをつくろう

と、言うわけでサンプルデータの作成からはじめていきます。

そのサンプルデータですが、データフレームの構造にする必要があります。なぜなら、dplyrはデータフレームでないと使えないためです。

ちなみに、dplyrは普通のデータフレーム(data.frame)でも利用できますが、dplyr用に最適化されたデーターフレーム(tbl_df)もあります。

違いは、普通のdata.frameでデータ名を実行するとコンソールに全データが表示されますが、tbl_dfだと勝手に要約して表示されます。

(え、それだけ!?)

たぶん他にも違いはあると思うので気になる方はぐぐってください!

では、データをつくります。

> #サンプルデータ作成
> 
> #まずはベクトルデータをつくる(先頭のv.はベクトルだと分かりやすいように付けているだけです)
> v.date <- c("2017-08-01","2017-08-02","2017-08-03","2017-08-04","2017-08-05")
> v.sales <- c(100,200,300,40,500)
> 
> #データフレームを作成
> df.data <- tbl_df(date = v.date, sales = v.sales)
Error in tbl_df(date = v.date, sales = v.sales) : 
  unused arguments (date = v.date, sales = v.sales)

 あ、やっぱりエラー出た。tbl_dfではデータをつくれないか。まずは、data.frame()でデータをつくる必要があるようですね。

気を取り直して、

> #データフレームを作成
> df.data <- data.frame(date = v.date, sales = v.sales)
> class(df.data) #データ構造の確認
[1] "data.frame"

無事にエラーなくデータフレームできました。classという関数でデータ構造を確認すると、ちゃんとdata.frameになってますね。

では、データを表示してみましょう。

> #データ表示
> df.data
        date sales
1 2017-08-01   100
2 2017-08-02   200
3 2017-08-03   300
4 2017-08-04    40
5 2017-08-05   500

今回はデータ少ないので特に問題ないですが、もし、100万行くらいのデータの場合はコンソールがデータでいっぱいになります。

では、data.frameをtbl_dfに変換します。

> #tbl_dfに変換
> df.data <- tbl_df(df.data)
> class(df.data) #データ構造の確認
[1] "tbl_df"     "tbl"        "data.frame"

tbl_dfが表示されています。うまく変換できているようです。

では、データを表示してみましょう。

> #データ表示
> df.data
# A tibble: 5 x 2
        date sales
      <fctr> <dbl>
1 2017-08-01   100
2 2017-08-02   200
3 2017-08-03   300
4 2017-08-04    40
5 2017-08-05   500

data.frameの時と少し違いますね。

# A tibble: 5 x 2
は、データが5行で2列のデータであることを示します。

カラム名の下にある<fctr>と<dbl>ですが、それぞれデータの性質を意味しており、簡単に言うと、

<fctr>は文字!
<dbl>は数値!

です(正確にはちょっと違いますが)。

第三者> あれれー? dateって日付なのに文字になってるー!

はい。

このままだと、dateを日付として扱うことができません。

そこで、日付に変換します。

> #dateを日付データに変換
> df.data$date <- as.Date(df.data$date)
> 
> #データ表示
> df.data
# A tibble: 5 x 2
        date sales
      <date> <dbl>
1 2017-08-01   100
2 2017-08-02   200
3 2017-08-03   300
4 2017-08-04    40
5 2017-08-05   500

dateの下が<date>となり日付として認識されました。(日付と認識されることで、日付の計算や不等号を用いての条件検索ができるようになります。)

やっぱり、tbl_df便利ですね!
データ名で実行しただけで、データ型も表示してくれます。

これでサンプルデータ作成は終わりです。


dplyrを使ってみよう

 一気にいきましょう。簡単です!

  1. 行指定の条件抽出:filter
  2. 列指定の条件抽出:select
  3. 並び変える:arrange
  4. 新しい列の作成:mutate
  5. 複数の処理をつなげる:%>%
  6. まとめて:group_by、計算する:summarise
  7. 結合処理もできる:inner_joinなど

1.行指定の条件抽出:filter

2017年8月3日以降のデータを抽出するには、

> #filter
> filter(df.data, date > "2017-08-03")
# A tibble: 2 x 2
        date sales
      <date> <dbl>
1 2017-08-04    40
2 2017-08-05   500

これでOK!

もし、dateをdate型に変換せずに<fctr>のままだと、

> #filter
> filter(df.data, date > "2017-08-03")
# A tibble: 0 x 2
# ... with 2 variables: date <fctr>, sales <dbl>
Warning message:
In Ops.factor(date, "2017-08-03") : ‘>’ not meaningful for factors

このようにエラーとなります。

2.列指定の条件抽出:select

 salesの列だけ抽出するのは、

> #select
> select(df.data, sales)
# A tibble: 5 x 1
  sales
  <dbl>
1   100
2   200
3   300
4    40
5   500

これでOK!ベリーイージー!

3.並び変える:arrange

salesの昇順で並べるには、

> arrange(df.data, sales)
# A tibble: 5 x 2
        date sales
      <date> <dbl>
1 2017-08-04    40
2 2017-08-01   100
3 2017-08-02   200
4 2017-08-03   300
5 2017-08-05   500

はい、OK!

ちなみに降順は、

> #arrange
> arrange(df.data, desc(sales))
# A tibble: 5 x 2
        date sales
      <date> <dbl>
1 2017-08-05   500
2 2017-08-03   300
3 2017-08-02   200
4 2017-08-01   100
5 2017-08-04    40

desc(カラム名)でOK!

そう言えば昔、記事書いていました。
R 順番を変える(arrange)

4.新しい列の作成:mutate

日付の年だけ取り出した新しい列をつくるには、

> #mutate
> mutate(df.data, year = substring(date,1,4))
# A tibble: 5 x 3
        date sales  year
      <date> <dbl> <chr>
1 2017-08-01   100  2017
2 2017-08-02   200  2017
3 2017-08-03   300  2017
4 2017-08-04    40  2017
5 2017-08-05   500  2017

これでOK!!

今回はsubstringという関数も使っています。

substringの使い方は、
substring(カラム名、切り出す最初の文字の順番、切り出す最後の文字の順番)
です。

こちらも昔、記事書いていたのでご参考まで
【R】 日付データから年や月だけを抜き出す方法

5.複数の処理をつなげる:%>%

複数の処理をつなげて一緒にするには、

> df.data %>%
+ filter(date > "2017-08-03") %>%
+ select(sales) %>%
+ arrange(desc(sales))
# A tibble: 2 x 1
  sales
  <dbl>
1   500
2    40

 これでOK!

6.まとめて:group_by、計算する:summarise

年でまとめてsalesの合計を計算するには、

> #group_by summarise
> df.data %>%
+   mutate(year = substring(date,1,4)) %>%
+   group_by(year) %>%
+   summarise(total = sum(sales))
# A tibble: 1 x 2
   year total
  <chr> <dbl>
1  2017  1140

これでオッケーです!

7.結合処理もできる:inner_joinなど

実は、SQLでお馴染みの内部結合とかもできます!

結合処理にはもう一つデータが必要なのでパパっと作成しましょう。

> #まずはベクトルを作成
> v.date <- c("2017-08-01","2017-08-02","2017-08-03","2017-08-04","2017-08-05")
> v.user <- c(1000,20,300,4,50)
> 
> #データフレームを作成
> df.data_2 <- data.frame(date = v.date, user = v.user)
> class(df.data_2) #データ構造の確認
[1] "data.frame"
> #tbl_dfに変換
> df.data_2 <- tbl_df(df.data_2)
> class(df.data_2) #データ構造の確認
[1] "tbl_df"     "tbl"        "data.frame"

はい。2つ目のデータ完成しました。

では、最初のデータを新たに作ったデータを確認しましょう。

> #data
> df.data
# A tibble: 5 x 2
        date sales
      <date> <dbl>
1 2017-08-01   100
2 2017-08-02   200
3 2017-08-03   300
4 2017-08-04    40
5 2017-08-05   500
> df.data_2
# A tibble: 5 x 2
        date  user
      <fctr> <dbl>
1 2017-08-01  1000
2 2017-08-02    20
3 2017-08-03   300
4 2017-08-04     4
5 2017-08-05    50

おっと、df.data_2のdateが<fctr>になってる。

df.data_2のdateを日付に変換するのを忘れてましたね。

変換しましょう。

> #日付に変換
> df.data_2$date <- as.Date(df.data_2$date)
> 
> #data
> df.data
# A tibble: 5 x 2
        date sales
      <date> <dbl>
1 2017-08-01   100
2 2017-08-02   200
3 2017-08-03   300
4 2017-08-04    40
5 2017-08-05   500
> df.data_2
# A tibble: 5 x 2
        date  user
      <date> <dbl>
1 2017-08-01  1000
2 2017-08-02    20
3 2017-08-03   300
4 2017-08-04     4
5 2017-08-05    50

これで準備OK。

やっぱり、tbl_dfだとすぐにデータ型を確認できるのでいいですね。

さて、2つのデータが揃ったので内部結合してみましょう。両データに共通するカラムはdateなので、dateをキーにして2つのデータを結合すると、

> #inner_join
> inner_join(df.data, df.data_2, by = "date")
# A tibble: 5 x 3
        date sales  user
      <date> <dbl> <dbl>
1 2017-08-01   100  1000
2 2017-08-02   200    20
3 2017-08-03   300   300
4 2017-08-04    40     4
5 2017-08-05   500    50

こうなります。

他にも外部結合とかアンチ結合とかもできるので下記の記事をご参照ください。

---他の結合---
R 内部結合(inner join)
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)


以上でdplyrの使い方は終わりです。

本当はまだまだ奥が深く1%も説明できてないですが、以上のことだけでも実用には十分だと思います。

次回は、tidyrという大規模データのクロス集計等を高速におこなうパッケージについて説明できればと思っています。

それでは、

一度は富士山に登ってみたい



2017年8月11日金曜日

R dplyrとはなんぞや?大規模データも簡単に処理? ~導入編~

dplyrとは

  1. Rで大規模データをさくさく処理するためのパッケージ
  2. 内部結合とかSQLみたいな処理もできる
  3. Rでデータ処理する人は必ず使ってる(くらいメジャーで有用)
以上!!

あとはだらだら使い方を説明。

使い方

まず、データを用意する。

用意するデータは、ドイツなどの株価指数のデータ。

(全然大規模データじゃないけど。。)

> #Rに最初からあるサンプルデータ(EuStockMarkets)を使う
> #中身は主要株価指数:DAX(ドイツ)、SMI(スイス)、CAC(フランス)、FTSE(イギリス)
> #データの先頭部分を確認してみる
> head(EuStockMarkets)
         DAX    SMI    CAC   FTSE
[1,] 1628.75 1678.1 1772.8 2443.6
[2,] 1613.63 1688.5 1750.5 2460.2
[3,] 1606.51 1678.6 1718.0 2448.2
[4,] 1621.04 1684.1 1708.1 2470.4
[5,] 1618.16 1686.6 1723.1 2484.7
[6,] 1610.61 1671.6 1714.3 2466.8
> #作図
> plot(EuStockMarkets)

plot(EuStockMarkets)の結果。上からドイツ、スイス、フランス、イギリスの主要株価指数の日次データ

グラフにすると分かりやすい♪

*このデータを使ったせいで後ほど不思議なエラーに遭遇します

準備①:dplyrをインストールする

下記のコードを実行。

> install.packages("dplyr")

これを実行すると、勝手にダウンロード・インストールが始まる。

インストールできたらdplyrを読み込む。

> library(dplyr)



準備②:データをtbl_dfというデータ構造に変換

(まあ、普通のデータフレーム:data.frameでも操作可能だけど。。)

ちなみに、dplyrを読み込まないと、、

> #tbl_df(データフレーム拡張したデータ構造)に変換
> EuStockMarkets_df <- tbl_df(EuStockMarkets)
Error in tbl_df(EuStockMarkets) : could not find function "tbl_df"

あ、エラーだ。
肝心のdplyr読み込むの忘れるとエラーになります。。

ちゃんと、dplyrを読み込むと、

> library(dplyr)

 次のパッケージを付け加えます: ‘dplyr’ 

 以下のオブジェクトは ‘package:data.table’ からマスクされています: 

     between, first, last 

 以下のオブジェクトは ‘package:stats’ からマスクされています: 

     filter, lag 

 以下のオブジェクトは ‘package:base’ からマスクされています: 

     intersect, setdiff, setequal, union 

> #tbl_df(データフレーム拡張したデータ構造)に変換
> EuStockMarkets_df <- tbl_df(EuStockMarkets)

エラーでません。

ちなみに、tbl_dfに変換しておくと、データ名実行でデータの要約が表示されます。

> EuStockMarkets_df
# A tibble: 1,860 x 4
       DAX    SMI    CAC   FTSE
     <dbl>  <dbl>  <dbl>  <dbl>
 1 1628.75 1678.1 1772.8 2443.6
 2 1613.63 1688.5 1750.5 2460.2
 3 1606.51 1678.6 1718.0 2448.2
 4 1621.04 1684.1 1708.1 2470.4
 5 1618.16 1686.6 1723.1 2484.7
 6 1610.61 1671.6 1714.3 2466.8
 7 1630.75 1682.9 1734.5 2487.9
 8 1640.17 1703.6 1757.4 2508.4
 9 1635.47 1697.5 1754.0 2510.5
10 1645.89 1716.3 1754.3 2497.4
# ... with 1,850 more rows

また、普通のデータフレームに変換して実行すると、

> data.frame(EuStockMarkets_df)

全データがコンソールに表示されます。
(今回は省いていますがコンソール画面はデータでいっぱいです)

あと、データ構造(クラス)を確認すると、

> class(EuStockMarkets_df)
[1] "tbl_df"     "tbl"        "data.frame"

ちゃんとtbl_dfになっています。
(data.frameも表示されているので普通のデータフレーム型としても扱えそうです)


使い方①:filterでほしい行のデータを抽出

方法は、filter(データ名, 条件)という感じ。

やってみると、

> filter(EuStockMarkets_df,  DAX <= 1450)
Error in filter_impl(.data, quo) : matrix as column is not supported

ん、エラーだ。。

意味はmatrixはサポートしてないよーて感じかな。
いやでもtbl_dfに変換しているからmatrixになってないはず。
一応、調べると、

> class(EuStockMarkets_df)
[1] "tbl_df"     "tbl"        "data.frame"

やっぱりmatrixになってない。おかしいなー。

元のサンプルデータは、、、

> class(EuStockMarkets)
[1] "mts"    "ts"     "matrix"

matrixだ。でも、変換してるから関係ないはず。。

んー、なぞだ。これバグでは??

元のサンプルデータがmatrixだから変な挙動してるのかな。

一回、データを書き出して新しいデータとして読み込んで実行してみるか。

> #write.csvでcsvファイルを書き出す *row.names = Fは行番号を書き出さない処理
> write.csv(EuStockMarkets,"C:/Users/mtsuj/data.csv",row.names = F)

> #freadはcsvを高速で読み込む関数
> #*data.tableをインストールしてlibrary(data.table)で読み込む必要
> EuStockMarkets_df <- fread("C:/Users/mtsuj/data.csv") 

> #freadで読み込むとdata.tableとdata.frameのデータ構造になる
> class(EuStockMarkets_df)
[1] "data.table" "data.frame"
> 
> #今のデータ構造でも問題ないが、今回はtbl_dfに変換する
> EuStockMarkets_df <- tbl_df(EuStockMarkets_df)
> class(EuStockMarkets_df)
[1] "tbl_df"     "tbl"        "data.frame"
> 
> #filterでドイツの株価指数が1450以下のものを抽出
> filter(EuStockMarkets_df,  DAX <= 1450)
# A tibble: 6 x 4
      DAX    SMI    CAC   FTSE
    <dbl>  <dbl>  <dbl>  <dbl>
1 1402.34 1788.0 1611.0 2446.3
2 1421.49 1820.5 1612.5 2488.4
3 1434.61 1858.2 1654.2 2517.1
4 1446.32 1870.3 1673.9 2538.8
5 1437.65 1878.4 1657.3 2541.2
6 1441.57 1881.5 1655.1 2557.2

お、いけた。

Rってこうゆうところありますよね。。

他の使い方は次回ご紹介

*使い方編はこちら
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

2017年6月24日土曜日

【R】 ‘Rcpp’ という名前のパッケージはありません

新しいPCを購入し、早速、RとRStudioをインストール。

dplyrをインストールして、いろいろ分析しようと思ったら、

  • ‘Rcpp’ という名前のパッケージはありません

というエラー!あれっ?

結局、McAfeeを停止したら解決。

マカフィー。。。

ちなみに、マカフィーの停止方法は、
富士通のQAがわかりやすい。




2016年11月8日火曜日

【R】data.tableとdplyrの内容が良くまとまっているページ

Rで大規模データの処理をするには、data.tableとdplyrが必須です。
下記のページは、その内容が簡潔にまとめられていて非常に参考になります。

 大規模データの高速処理 ーdata.table、dplyrー
http://kohske.github.io/ESTRELA/201410/index.html

特に、他のサイトではあまり紹介されていないキーの設定の説明があるところ良いです。

setkey(dt, key)

d: データテーブル
key: キーとなるカラム名

これだけでデータ集計が高速に!

2016年8月23日火曜日

R 高速に大規模データのクロス集計をおこなう(tally, spread)

【目的】 Rで高速に大規模データのクロス集計をしたい
【方法】 tallyとspredを使う
【補足】 library(dplyr)とlibrary(tidyr)が必要

df.cross <- df.data %>%
  group_by(x, y) %>%
  tally %>%
  spread(y, n)

#データが無い場合はNAとなるため必要に応じて0にする
df.cross[is.na(df.cross)] <- 0

◇参照URL
クロス集計~公式:dplyr + tidyr = (xtabs|(f)table)
http://d.hatena.ne.jp/teramonagi/20150312/1426109245

2016年1月12日火曜日

【R】dplyr基本関数


関数名内容類似の組み込み関数
filter指定した条件に合うデータを抽出subset
select列を抽出data[,c('hoge','fuga')]などと同じ
mutate列を追加transform
arrange並び替えorder, sort
summarise集約するaggregate

参照
http://rstudio-pubs-static.s3.amazonaws.com/13539_9391f54271b54222a507fe8ec110d4af.html

2015年12月21日月曜日

R よく使うもの一覧

2016-04-14
########### データ連結 ###########
# dfを縦に連結(x と y の列名が全て同じ場合)
rbind(df.x, df.y)
# dplyrのrbind_all (複数のdfを縦に連結)
rbind_all(list(df.x, df.y, df.z,))
# dfを横に連結(x と y の行数が同じ場合)
cbind(df.x, df.y)
# dplyr join
inner_join(df.x, df.y, by = "key")   # x と y の by がマッチする行のみ
left_join(df.x, df.y, by = "key")    # x の全ての行を保持。y に複数マッチする行があったらすべて保持
full_join(df.x, df.y, by = "key")    # x と y の全ての行を保持
anti_join(df.x, df.y)                # y にマッチしない x の行のみ
inner_join(df.x, df.y, by = c("key_1", "key_2"))   # 複数key指定
inner_join(df.x, df.y, by = c("key_1" = "key_a"))  # keyが別名のjoin
########### データ加工・集計 ###########
df.x$uid <- as.character(df.x$uid) #文字列に直す
df[df$x >=     1     &  1000   >= df$x, ]$x <- "A" #条件を満たした列を書き換える
str_c("g:", df.201511_start_and$user_id) #user_id の先頭にg:を付ける library(stringr)が必要
options(digits=10)  # 表示桁数を10桁に変える
read.csv(file_pass, fileEncoding = "Shift_jis") #文字化けを防ぐ方法
fread() #文字コードを変更できない(関数がない)
count(df, x, y)  # group_by(x) %>% summarise(num = length()) と同じ
comsum(df.x$x)  #累積和
n_distinct(df.x) # ユニーク数カウント length(unique(df.x)) と同じ
distinct(df, x)  # ユニークデータのみ抽出(デフォルトは、最初にあるデータになる)
filter(df, x == 1) # 条件を指定して、該当する行を抽出
rename(df, 変更後列名 = 変更後列名) # 列名変更
select(df, x, y)  # 指定した列を抽出
arrange(df, x, y) # 昇順 arrange(df, desc(column))で降順
summarise_each(funs(min, mean, max), x, y, z) # 繰り返して、
df.new <- df.new[,-1] # 1列目を消す
df.login_05$user_id <- str_c("@", df.login_05$user_id)         # user_idの先頭に"@"を追加 library(stringr)が必要
#group_by(x) でxだけ取り出したい
# ユニークデータのみ抽出(デフォルトは、最初にあるデータになる)
distinct(df, x)  %>%
  select(x)
# (df.a <- fread("/a.csv"))  ()で囲むと先頭5行と最後5行が表示される
df.old <- df.old[,-1] #1列目削除
#unix timeの変換
udate <- 1451029742
t <- as.POSIXct(udate,origin="1970-01-01")
#NAを0にする
df.all[is.na(df.all)] <- 0
#日時の差
set.date1 <- "2015-01-01 00:00:00"
set.date2 <- "2015-01-02 01:00:00"
as.POSIXct(set.date1) - 86400 #1日=86400秒
as.Date(set.date1) - 1
as.POSIXct(set.date2) - 86400
as.Date(set.date2) - 1
as.POSIXct(set.date2) - as.POSIXct(set.date1)
as.Date(set.date2) - as.Date(set.date1)
#特定の列だけを書き換えたい
df.pay_last_month$pay_rank <- "N"
df.rank_1m[df.rank_1m$rank == 1,]$rank <- "a"
#サンプルデータ作成
v.x1 <- c(1,2,3,4,5,6,7,8,9,10)
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(id = v.x1, item = v.x2, price =v.x3)
#8桁の数字を日付に変換
#サンプルデータ作成
v.date <- c(20160101,20160102,20160103)
df.test <- data.frame(date = v.date)
df.test
#①文字に変換
df.test$date <- as.character(df.test$date) #数字ではas.Dateできないため文字に変換
#②日付に変換
df.test$date <- as.Date(df.test$date, "%Y%m%d") #文字に変換後、日付に変換
df.test
#新たな列を追加
df.x$new <- "0"
#条件式
df.x[df.x$item == "c" & df.x$price >= 500,]$new <- "ok"
#指定の範囲の文字列だけを取り出す
set.date0 <- "2015-01-01 00:00:00"
set.date0
set.year <- substring(set.date0,1,4) #1~4文字目までの文字(年数)を取り出す
set.year
set.month <- substring(set.date0,6,7)
set.month
set.ym <- substring(set.date0,1,7)
set.ym
########### グラフ ###########
# ヒストグラム
hist(df, breaks = seq(10, 10000, 100))
# 横軸の範囲と分割の幅seq(範囲の最小値, 範囲の最大値, 表示範囲の間隔)
# 10から10000までを100単位で表示
hist(log10(df.month_201507$total_purchase), breaks = "Scott",freq = F)
# 散布図
plot() #対数軸 plot(,log = "xy")
# 棒グラフ
barplot()
# 円グラフ
pie()
#箱ヒゲ図
boxplot()
#複数のグラフを重ねる
plot(df.sum_fal$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 1)
par(new=T)
plot(df.sum_anm$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 2)
par(new=T)
plot(df.sum_mel$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 3)
par(new=T)
plot(df.sum_san$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 4)
legend("bottomleft", legend = c("fal","anmas","melty","sangoku"), col = c(1,2,3,4), pch = 1)

########### 文字コードの変換について ###########
df.test <- read("C:/---.csv")
df.test <- iconv(df.test,from = "UTF-8",to = "SJIS")
df.test <- data.frame(df.test)
sum(df.test$price)
iconvlist()
########### クロス集計 ###########
#cross集計
library(reshape2)
library(data.table)
#サンプルデータ作成
v.x1 <- c("oda","oda","oda","toyo","toyo","toyo","ie","ie","ie","ie")
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(user_id = v.x1, item = v.x2, price =v.x3)
df.x
#クロス集計 要素数はlength
tmp <- acast(df.x, user_id ~ item, sum, value.var = "price")
tmp
df.cross <- data.frame(tmp)
write.csv(df.cross,file = "./cross.csv")
df.cross <- fread("./cross.csv")
df.cross <- data.frame(df.cross)
names(df.cross)[1] <- c("user_id")
df.cross
########### logit ###########
setwd("C:/---")
getwd()
#サンプルデータを読み込む
df.sample <- fread("./sample.csv")
df.sample <- data.frame(df.sample)
#先頭6行のデータを表示
head(df.sample)
result <- glm(diff_dr ~ au,data = df.sample)
summary(result)
plot(df.sample$dr,df.sample$po)
########### k-means ###########
result <- kmeans(df.sample,3)
summary(result)
result <- result$cluster
result <- data.frame(result)
########### ローレンツ曲線 ###########
# ローレンツ曲線を描き,ジニ係数を計算する
Gini.index <- function(y,
                       # データベクトル
                       main = "",
                       # 図のタイトル(省略時は何も書かない)
                       xlab = "",
                       # x 軸の名前(省略時は何も書かない)
                       ylab = "")
  # y 軸の名前(省略時は何も書かない)
{
  stopifnot(y >= 0)                       # 非負データでなければならない
  n <- length(y)                               # データの個数
  y <- sort(y)                         # 小さい順に並べる
  y <- cumsum(y)                               # 累積度数をとる
  y <- c(0, y / y[n])                    # 累積相対度数(先頭に 0 を加える)
  x <- seq(0, 1, length = n + 1)           # 0 ~ 1 を等間隔に区切ったベクトルを作る
  old <- par(xaxs = "i", yaxs = "i")
  plot(
    x,
    y,
    type = "l",
    col = "gold",
    # これを結ぶとローレンツ曲線
    main = main,
    xlab = xlab,
    ylab = ylab
  )
  abline(0, 1)                            # 対角線(原点を通る,傾き 1 の直線)を描く
  par(old)
  return(2 * sum(x - y) / n)                    # ジニ係数
}
Gini.index(df.fal_kakin$total,
           main = "Lorenz curve",
           xlab = "",
           ylab = "")
########### 統計 ###########
p = 10 #アイテムを落とす確率
d = c() #試行結果を格納するベクトル
for(i in 0:1000)
{
  success = 0
  for(j in 1:100)
  {
    r = sample(1:100,1) #1~100の母集団から一つの標本を取り出す
    if(r <= p)
    {
      success = success + 1
    }
  }
  d[i] = success
}
mean_d <- mean(d) #平均
sigma_d <- sd(d) #標準偏差
-1.96 *
########### 月次 ###########
library(epitools)
time <- as.Date("2014-02-01")
month <- as.month(time)
month
month$month
df.test$month <- as.month(df.test$CREATE_DATE)$month #月変換処理

R セグメント分けと集計

目的:ユーザ別で集計した結果を条件に従ってセグメント分けして各セグメントの合計を求める
補足:library(dplyr)が必要

#サンプルデータ作成
v.x1 <- c("oda","oda","oda","toyo","toyo","toyo","ie","ie","ie","ie")
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(100,100,800,700,600,500,4000,5000,2000,1000)
df.payment_log <- data.frame(user_id = v.x1, item = v.x2, payment =v.x3)

> df.payment_log
   user_id item payment
1      oda    a     100
2      oda    a     100
3      oda    b     800
4     toyo    b     700
5     toyo    b     600
6     toyo    c     500
7       ie    c    4000
8       ie    c    5000
9       ie    c    2000
10      ie    c    1000

#各ユーザの合計を求める
df.user_payment <- df.payment_log %>%
  group_by(user_id) %>%
  summarize(pay_total = sum(payment))

> df.user_payment
Source: local data frame [3 x 2]

  user_id pay_total
   (fctr)     (dbl)
1      ie     12000
2     oda      1000
3    toyo      1800

 #セグメントに分ける
df.user_payment$rank <- "N"
df.user_payment[df.user_payment$pay_total >= 1 & df.user_payment$pay_total <= 1000,]$rank <- "C"
df.user_payment[df.user_payment$pay_total >= 1001 & df.user_payment$pay_total <= 10000,]$rank <- "B"
df.user_payment[df.user_payment$pay_total >= 10001,]$rank <- "A"

> df.user_payment
Source: local data frame [3 x 3]

  user_id pay_total  rank
   (fctr)     (dbl) (chr)
1      ie     12000     A
2     oda      1000     C
3    toyo      1800     B

 #セグメント別に集計する
df.seg <- df.user_payment %>%
  group_by(rank) %>%
  summarise(pay = sum(pay_total), pu = length(user_id))

> df.seg
Source: local data frame [3 x 3]

   rank   pay    pu
  (chr) (dbl) (int)
1     A 12000     1
2     B  1800     1
3     C  1000     1

2015年8月28日金曜日

R 順番を変える(arrange)

【目的】 指定した列を抽出する
【方法】 arrange(df, v1, v2) で 昇順、arrange(df, desc(column))で降順
【補足】 library(dplyr)が必要

#テスト用データフレーム作成
v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

df.x <- arrange(df.x, desc(id))
df.x

> df.x <- arrange(df.x, desc(id))
> df.x
  id item
1  4    b
2  3    b
3  2    a
4  1    a


df.x <- arrange(df.x, id)
df.x

> df.x <- arrange(df.x, id)
> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

R 列名を変更する(rename)

【目的】 列名を変更する
【方法】 rename(df, after = before)
【補足】 library(dplyr)が必要

#テスト用データフレーム作成
v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

rename(df.x, id2 = id)

> rename(df.x, id2 = id)
  id2 item
1   1    a
2   2    a
3   3    b
4   4    b

R 指定した列を選択(select)

【目的】 指定した列を抽出する
【方法】 select(df, v1, v2)
【補足】 library(dplyr)が必要

#テスト用データフレーム作成

v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

select(df.x, id)
> select(df.x, id)
  id
1  1
2  2
3  3
4  4

R 条件に合うデータを抽出する(filter)

【目的】 条件に合うデータを抽出する
【方法】 filter(df, v == 0 )
【補足】 library(dplyr)が必要

 #テスト用データフレーム作成

v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

filter(df.x, item == "a")

> filter(df.x, item == "a")
  id item
1  1    a
2  2    a

2015年7月7日火曜日

R 条件を指定して任意の行を抽出(filter)

【目的】 任意の行を抽出する
【方法】 filter(df, x == 1)
【補足】 library(dplyr)が必要

library(dplyr)

#テスト用データフレームを作成

v.x <- c(1,2,3,4)
v.x1 <- c("x","a","a","a")
v.x2 <- c("11","11","11","11")
df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

df.x

> df.x
  id name num
1  1    x  11
2  2    a  11
3  3    a  11
4  4    a  11

filter(df.x, name == "a")

> filter(df.x, name == "a")
  id name num
1  2    a  11
2  3    a  11
3  4    a  11


filterを使って簡単に移動平均を求める方法
http://tips-r.blogspot.jp/2015/01/r_1.html

2015年7月3日金曜日

R:複数列のユニークデータを抽出する(重複除去)

【目的】 複数列のユニークデータを抽出する(重複データを除去)
【方法】 distinct(df, x)
【補足】 library(dplyr)が必要

#テスト用データフレームを作成

v.x <- c(1,2,3,4)
v.x1 <- c("x","a","a","a")
v.x2 <- c("11","11","11","11")
df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

df.x

> df.x
  id name num
1  1    x  11
2  2    a  11
3  3    a  11
4  4    a  11

distinct(df.x, name)

> distinct(df.x, name)
  id name num
1  1    x  11
2  2    a  11


R ユニーク数をカウントする
http://mototeds.blogspot.jp/2015/06/r_29.html

2015年6月29日月曜日

R:複数列のユニーク数をカウントする(重複除去してカウント)

【目的】 ユニーク数を数える(重複を除去して数える)
【方法】 n_distinct(v.x)
【補足】 library(dplyr)が必要

#テスト用データフレームを作成

v.x <- c(1,2,3,4)
v.x1 <- c("x","a","a","a")
v.x2 <- c("11","11","11","11")
df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

df.x

> df.x
  id name num
1  1    x  11
2  2    a  11
3  3    a  11
4  4    a  11
> 

df.x %>%
  summarize(id_u = n_distinct(id),name_u = n_distinct(name),num_u = n_distinct(num))

> df.x %>%
+   summarize(id_u = n_distinct(id),name_u = n_distinct(name),num_u = n_distinct(num))
  id_u name_u num_u
1    4      2     1

R ユニークデータを抽出する
http://mototeds.blogspot.jp/2015/07/r.html

2015年6月18日木曜日

R 内部結合(複数key)

【目的】 Rで複数キーの内部結合をする
【方法】 inner_join(df.x, df.y, by = c("key_1", "key_2"))
【補足】 library(dplyr)が必要

#テスト用データフレームを作成

v.x <- c(1,2,3,4)
v.x1 <- c("x","a","a","a")
v.x2 <- c("11","12","13","14")

v.y <- c(1,2,3,40)
v.y1 <- c("x","a","x","a")
v.y2 <- c("21","22","23","24")

df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)
df.y <- data.frame(id = v.y, name = v.y1, num = v.y2)

> df.x
  id name num
1  1    x  11
2  2    a  12
3  3    a  13
4  4    a  14
> df.y
  id name num
1  1    x  21
2  2    a  22
3  3    x  23
4 40    a  24

#inner join
inner_join(df.x, df.y, by = c("id", "name")) 

> inner_join(df.x, df.y, by = c("id", "name"))
  id name num.x num.y
1  1    x    11    21
2  2    a    12    22

---他の結合---
R 内部結合(inner join)
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)

---dplyrとは?---
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

R アンチ結合(anti join)

【目的】 Rでアンチ結合(anti join)を使う
【方法】 anti_join(df.x, df.y, by = "key")
【補足】 library(dplyr)が必要

#テスト用データフレームを作成

v.x <- c(1,2,3)
v.x1 <- c("a","b","c")

v.y <- c(1,2,30)
v.y1 <- c("A","B","C")

df.x <- data.frame(id = v.x, name = v.x1)
df.y <- data.frame(id = v.y, name = v.y1)

> df.x
  id name
1  1    a
2  2    b
3  3    c
> df.y
  id name
1  1    A
2  2    B
3 30    C

#anti join
anti_join(df.x, df.y, by = "id")

> anti_join(df.x, df.y, by = "id")
  id name
1  3    c

---他の結合---
R 内部結合(inner join)
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)

---dplyrとは?---
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

R 完全外部結合(full join)

【目的】 Rで完全会部結合(full join)を使う
【方法】 full_join(df.x, df.y, by = "key")
【補足】 library(dplyr)が必要

# テスト用データフレームを作成
v.x <- c(1,2,3)
v.x1 <- c("a","b","c")
v.y <- c(1,2,30)
v.y1 <- c("A","B","C")
df.x <- data.frame(id = v.x, name = v.x1)
df.y <- data.frame(id = v.y, name = v.y1)

> df.x
  id name
1  1    a
2  2    b
3  3    c
> df.y
  id name
1  1    A
2  2    B
3 30    C

# full join
full_join(df.x, df.y, by = "id")

> full_join(df.x, df.y, by = "id")
  id name.x name.y
1  1      a      A
2  2      b      B
3  3      c   <NA>
4 30   <NA>      C

---他の結合---
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)

---dplyrとは?---
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

R 外部結合(left join, right join)

【目的】 Rで外部結合(left join, right join)を使う
【方法】 left_join(df.x, df.y, by = "key")
【補足】 library(dplyr)が必要

#テスト用データフレームを作成

v.x <- c(1,2,3)
v.x1 <- c("a","b","c")

v.y <- c(1,2,30)
v.y1 <- c("A","B","C")

df.x <- data.frame(id = v.x, name = v.x1)
df.y <- data.frame(id = v.y, name = v.y1)

> df.x
  id name
1  1    a
2  2    b
3  3    c
> df.y
  id name
1  1    A
2  2    B
3 30    C

# left join
left_join(df.x, df.y, by = "id")

> left_join(df.x, df.y, by = "id")
  id name.x name.y
1  1      a      A
2  2      b      B
3  3      c   <NA>

# right join
right_join(df.x, df.y, by = "id")

> right_join(df.x, df.y, by = "id")
  id name.x name.y
1  1      a      A
2  2      b      B
3 30   <NA>      C

---他の結合---
R 内部結合(inner join)
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)

---dplyrとは?---
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

◇Rでfor文を書く方法
【R】Rでfor文を書く(ループの設定)


R 内部結合(inner join)

【目的】 Rで内部結合(inner join)を使う
【方法】 inner_join(df.x, df.y, by = "key")
【補足】 library(dplyr)が必要

テスト用のデータフレーム作成

v.x <- c(1,2,3)
v.y <- c(10,20,30)

df.x <- data.frame(id = v.x)
df.y <- data.frame(id = v.y)

> df.x
  id
1  1
2  2
3  3

> df.y
  id
1 1
2 2
3 30 

inner_join(df.x, df.y, by = "id")

> inner_join(df.x, df.y, by = "id") 
  id
1  1
2  2

---他の結合---
R 内部結合(inner join)
R 内部結合(複数key)
R 外部結合(left join, right join)
R 完全外部結合(full join)
R アンチ結合(anti join)

---dplyrとは?---
R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~