fc2ブログ

RからPythonへの道(5)

 今回はPythonで「4. ggplot」を実行する話をします。Rでお馴染みのグラフ化ツールggplot2のPython版です。Rでも以前はggplotパッケージと言われていたのが、種々の更新を経てggplot2になったとのこと(余談)。

 まず、例として『みんなのR(第二版)』に記載の単回帰のコードを利用させてもらいます。 Rのコードは以下の通りです。
data(father.son, package = 'UsingR')
library(ggplot2)

ggplot(father.son, aes(x=fheight, y=sheight)) +
geom_point() +
geom_smooth(method = "lm") +
labs(x="Fathers", y="Sons")
実行結果は以下の通りです。R_result_191022.pngfather.sonのデータセットを読み込んで散布図を書き、回帰直線結果が出力されます。

 次に、Pythonにこのコードを実装しますが、その前にライブラリggplot(ggplot2ではないので注意)を以下のコマンドでインストールします。
pip install ggplot
 まず初めに、何も調べずに書いたコードは以下の通りで、案の定エラーが出ました。
# エラーの出るコード1
import numpy as np
import pandas as pd

df = pd.read_csv('father_son.csv')
print(df.head())

ggplot(df, aes(x = fheight, y = sheight)) + geom_point() + geom_smooth(method = "lm") + labs(x = "Fathers", y = "Sons")
データファイルfather_son.csvはRで読み込んだデータをcsvファイルに保存したものを使いました。実行した時のエラーは以下の通り。error1_191022.pngネットで調査していると、幸いgithubに記事があったので対応を取りました。インストールしたggplotパッケージ内のファイルの中身を修正する必要がありました。修正するファイルは、utils.pyとsmoothers.pyの2つです。
① utils.py
私の環境では以下のフォルダ内に該当ファイルがありましたので、中身のコードを一箇所修正しました。
/Users/x...x/anaconda3/envs/py37/lib/python3.7/site-packages/ggplotRevised1_191022.png② smoothers.py
このファイルは以下のフォルダ内にありましたので、二箇所修正しました。
/Users/x...x/anaconda3/envs/py37/lib/python3.7/site-packages/ggplot/statsRevised2_191022.png 仕切り直して、以下のコードを実行させました。
# エラーの出るコード2
import numpy as np
import pandas as pd
from ggplot import *

df = pd.read_csv('father_son.csv')

p = ggplot(aes(x='fheight', y="sheight"), data=df)
print(p + geom_point() + geom_smooth(method = "lm") + labs(x="Fathers",y="Sons"))
実行すると以下のエラーが出ました。error2_191022.pnggeom_smooth(method = "lm")が悪さをしているようで、これを取り去ると回帰直線は描かれませんが、正常にグラフはプロットできました。Rではこのgeom_smooth(method = "lm")で回帰分析し、回帰直線まで引いてくれますが、Pythonのこのライブラリでは試行錯誤はしましたが、一発では行きませんでした。

 結局、別途回帰分析をして、直線を描画することにしました。回帰分析は以前のブログを参考に、scikit-learnのlinear_modelを使いました。最終的には以下のコードに落ち着きました。
import numpy as np
import pandas as pd
from ggplot import *
from sklearn import linear_model

df = pd.read_csv('father_son.csv')

# Linear Regression
x = df['fheight'].values.reshape(-1, 1) # np.ndarray
y = df['sheight'].values.reshape(-1, 1) # np.ndarray
lrm = linear_model.LinearRegression()
lrm.fit_intercept = True
lrm.fit(x, y)
print('< y = ax + b >')
print('Slope = ', (lrm.coef_[0])[0] )
print('Intercept = ', lrm.intercept_[0])
print('R-squared = ', lrm.score(x, y))

p = ggplot(aes(x='fheight', y="sheight"), data=df)
print(p + geom_point() + geom_abline(intercept = lrm.intercept_[0], slope = (lrm.coef_[0])[0], color="blue") + labs(x="Fathers",y="Sons"))
実行結果は以下の通り。

< y = ax + b >
Slope = 0.5140930386233077
Intercept = 33.886604354077924
R-squared = 0.2513401022491373
Python_result_191022.png手間はかかりましたが、Rと同じようなグラフは書けそうです。ggplotはやはりRの方が研ぎ澄まされているようですね。今回はこれまでにします。

『RからPythonへの道』バックナンバー
(1) はじめに
(2) 0. 実行環境(作業環境)
(3) 1. PythonからRを使う方法
   2. RからPythonを使う方法
(4) 3. データフレーム
スポンサーサイト



RからPythonへの道(4)

 今回は、Pythonでggplotを使う話をする予定でしたが、その前に「3. データフレーム」の話をします。RとPythonには共にデータフレームがありますが、取り扱い操作が微妙に異なりますので、その違いを以下にまとめました。この表は前々回に紹介したサイトを参考にしています。R_to_Python_CommandList_191020.png まず、Rのコードですが、『みんなのR(第2版)』のコードを一部参照しました。
x = 10:1
y = -4:5
q = c('Hockey', 'Football', 'Baseball', 'Curling', 'Rugby', 'Lacrosse', 'Basketball', 'Tennis', 'Cricket', 'Soccer')
df = data.frame(x, y, q)
print(df)

class(x)
class(y)
class(q)
class(df)

rownames(df)
colnames(df)
head(df, 5)
tail(df, 5)
dim(df)

df[3,3] # Start position [1,1]
実行結果は以下の通りです。
> x = 10:1
> y = -4:5
> q = c('Hockey', 'Football', 'Baseball', 'Curling', 'Rugby', 'Lacrosse', 'Basketball', 'Tennis', 'Cricket', 'Soccer')
> df = data.frame(x, y, q)
> print(df)
x y q
1 10 -4 Hockey
2 9 -3 Football
3 8 -2 Baseball
4 7 -1 Curling
5 6 0 Rugby
6 5 1 Lacrosse
7 4 2 Basketball
8 3 3 Tennis
9 2 4 Cricket
10 1 5 Soccer
>
> class(x)
[1] "integer"
> class(y)
[1] "integer"
> class(q)
[1] "character"
> class(df)
[1] "data.frame"
>
> rownames(df)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
[10] "10"
> colnames(df)
[1] "x" "y" "q"
> head(df, 5)
x y q
1 10 -4 Hockey
2 9 -3 Football
3 8 -2 Baseball
4 7 -1 Curling
5 6 0 Rugby
> tail(df, 5)
x y q
6 5 1 Lacrosse
7 4 2 Basketball
8 3 3 Tennis
9 2 4 Cricket
10 1 5 Soccer
> dim(df)
[1] 10 3
>
> df[3,3] # Start position [1,1]
[1] Baseball
10 Levels: Baseball Basketball ... Tennis
>
 データ型はxとyがInteger、qがcharacterで、それらを統合したdfがdata.frameです。Rのデータフレームdfの始まりは1行1列からです。

 次に、このRのコードをPythonに変換すると、以下のコードになります。
import numpy as np
import pandas as pd

x = list(np.arange(10,0,-1))
y = list(np.arange(-4,6,1))
q = ["Hockey","Football","Baseball","Curling","Rugby","Lacrosse","Basketball","Tennis","Cricket","Soccer"]
list_all = [x, y, q]

df = pd.DataFrame(data=list_all).T
df.columns = ["x", "y", "q"]
print(df)

print(type(x))
print(type(y))
print(type(q))
print(type(df))

print(df.index)
print(df.columns)
print(df.head(5))
print(df.tail(5))
print(df.shape)

print(df.iloc[2,2]) # Start position [0,0]
実行すると、以下の通りです。
$ python dataframe_test1.py
x y q
0 10 -4 Hockey
1 9 -3 Football
2 8 -2 Baseball
3 7 -1 Curling
4 6 0 Rugby
5 5 1 Lacrosse
6 4 2 Basketball
7 3 3 Tennis
8 2 4 Cricket
9 1 5 Soccer
<class 'list'>
<class 'list'>
<class 'list'>
<class 'pandas.core.frame.DataFrame'>
RangeIndex(start=0, stop=10, step=1)
Index(['x', 'y', 'q'], dtype='object')
x y q
0 10 -4 Hockey
1 9 -3 Football
2 8 -2 Baseball
3 7 -1 Curling
4 6 0 Rugby
x y q
5 5 1 Lacrosse
6 4 2 Basketball
7 3 3 Tennis
8 2 4 Cricket
9 1 5 Soccer
(10, 3)
Baseball
$
 データ型はx、y、qがlistで、その3つを1つのlist変数list_allにまとめた上で、pandasのDataFrameに変換しました。この時、Rのdata.frameと比較して、行列が逆転しているので、「.T」で転置しました(コード9行目)。また、列項目名がついていないので、コード10行目の命令で追加しました。Pythonのデータフレームdfの始まりは0行0列からで、Rと異なります。

 対応表があれば、PythonでもRと同じようにデータフレームのコマンド操作ができそうです。忘れたら思い出すために何度も繰り返し復習しようと思います。
 次回こそ、Pythonでのggplotの実行のお話をします。

『RからPythonへの道』バックナンバー
(1) はじめに
(2) 0. 実行環境(作業環境)
(3) 1. PythonからRを使う方法
   2. RからPythonを使う方法

RからPythonへの道(3)

 今回は、Python環境からRを実行させたり、逆にR環境からPythonを実行させる方法についてお話しします。

1. PythonからRを使う方法
 代表的なPypeRとRpy2を試しました。
 PypeRはpipコマンドで簡単にインストールできました。condaコマンドではインストールできず。
$ pip install pyper
 Rで変数jに4を代入する例です。Rでたまに利用するassign関数を使っています。当然、j <- 4でも良いですが・・。
> # R function "assign"
> assign("j",4)
> j
[1] 4
Pythonでは以下の通り、関数がないと怒られてしまいます。
>>> assign("j",4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'assign' is not defined
そこで、pyperライブラリを使うと以下の通り、手続きは必要ですが、出力できました。
>>> import pyper
>>> r = pyper.R()
>>> r.assign("j",4)
>>> print(r("j"))
try({j})
[1] 4
>>> print(type(r("j")))
<class 'str'>
pyperライブラリ経由で使ったRの変数はstr型で中身は'try({j})\n[1] 4\n'でした。余分な情報(try({j})\nや\n)も引っ付いています。

 次に、rpy2ですが、これも同様にpipコマンドでインストールしました。
$ pip install rpy2
rpy2もpyperと似たような形でRのオブジェクトを作成して実行するタイプですが、得られた変数が'rpy2.robjects.vectors.IntVector'という型です。Int型なのでPython環境で計算もできました(9行目)。
>>>import rpy2.robjects as ro
>>> ro.r.assign("j",4)
R object with classes: ('RTYPES.INTSXP',) mapped to:
[4]
>>> print(ro.r.j)
[1] 4
>>> print(type(ro.r.j))
<class 'rpy2.robjects.vectors.IntVector'>
>>> print(ro.r.j[0]+1)
5
 もう一つ、For文で変数「y1〜y10」に値を代入する例です。
Rのコードは以下の通り。
> for(i in 1:10){
+ num <- paste("y",i,sep="")
+ assign(num,i*i)
+ }
> y1;y2;y3;y8;y9;y10
[1] 1
[1] 4
[1] 9
[1] 64
[1] 81
[1] 100
Python(pyper利用)の場合、
import pyper
r = pyper.R()
for i in range(1,11):
num = "y" + str(i)
r.assign(num, i*i)

print(r("y1"),r("y2"),r("y3"),r("y8"),r("y9"),r("y10"))
を実行すると、以下の通りです。
try({y1})
[1] 1
try({y2})
[1] 4
try({y3})
[1] 9
try({y8})
[1] 64
try({y9})
[1] 81
try({y10})
[1] 100
また、Python(rpy2)の場合、
import rpy2.robjects as ro

for i in range(1,11):
num = "y" + str(i)
ro.r.assign(num, i*i)

print(ro.r.y1, ro.r.y2, ro.r.y3, ro.r.y8, ro.r.y9, ro.r.y10)
を実行すると、以下の通りです。
 [1] 1
[1] 4
[1] 9
[1] 64
[1] 81
[1] 100
pyperは余分な情報が出力されますが、rpy2はRと同じ出力でシンプルで好感が持てます。

2. RからPythonを使う方法
 R StudioからPythonを実行することはあまりないかもしれませんが、その方法についても触れます。
 R StudioのVersion 1.2以降からだと思いますが、Fileメニュー内に「Python Script」のメニューが追加されています。R_Studio_Python_Run_191019.pngR Scriptと同様にPythonコードを書いて実行させようとすると、「reticulate」パッケージが必要と怒られましたので、インストールしました。このパッケージを読み込むと、コマンドベースでもPythonコードを実行できますので、早速確認しました。2行目は仮想環境py37で実行するためのコマンドです。
> library('reticulate')
> use_condaenv("py37")
> os = import("os")
> os$listdir()
[1] ".Rhistory" "prophet_test.R"
[3] ".DS_Store" "xxxxxxxx.csv"
[5] "test1.py" "Regression.R"
[7] "prophet_test1.R" "category_variable.R"
[9] "test.py" "datetime.R"
[11] "Regression_graph.R" ".RData"
[13] "vector.R" "Evaluate.R"
「File-Python Script」に以下のコードを作成し、
# test.py
print("Hello!")
for i in range(0,10):
print(i)
を実行すると以下の通り。
> source_python('test.py')
Hello!
0
1
2
3
4
5
6
7
8
9
R環境下でPython Scriptが実行できました。また、「repl_python()」コマンドを実行すると、Pythonのコマンドラインが起動します。exitコマンドで終了すると、Rのコマンドラインに戻ります。
> repl_python()
Python 3.7.4 (/Users/xxx/anaconda3/envs/py37/bin/python)
Reticulate 1.13 REPL -- A Python interpreter in R.
>>> print("Hello!")
Hello!
>>> for i in range(0,10):
... print(i)
...
0
1
2
3
4
5
6
7
8
9
>>> exit
>

 今回は、PythonからRを使う方法とRからPythonを使う方法をお話ししました。Pythonを今後使っていく上で、PythonにないRの関数を実行する際に便利かもしれません。次回は、Pythonでggplotを使う方法をお話しします。

RからPythonへの道(2)

 前回のブログで、Rだけでなく、Pythonでもデータ解析を行っていこうと思い立ったものの、何から着手しようかと試行錯誤していました。最終的には、手元にRの書籍が何冊かあるので、そのコードをPythonに変換して行く中で関数や書き方を勉強して行くことにしました。
 また、ネット上に「RからPythonへの変換」の関連記事もありますので、それを自分で試して確認していこうと思いました。以下のサイトを参考にさせていただきました。ありがとうございました。

Python でデータサイエンス
この中に、Chandan Routray氏の資料の和訳があります。この対比リストを元に、自分なりの対比リストを作成していこうと思います。

前置きはこの程度にして、今回は「0. 実行環境」についてです。その前に、私の作業環境は以下の通りです。
 PC : MacBook Air (11-inch, Early 2014) ・・ まだまだ現役・・
   macOS Catalina (昨日(10/13)アップデート済)
 R
  R version 3.6.1 (2019-07-05)
  RStudio Version 1.2.1335
 Python
  Python 3.7.4 (default, Aug 9 2019, 12:36:10)
  Visual Studio Code
参考サイトより、作業ディレクトリ確認、ファイル確認、コード実行時のオブジェクトの確認を行いました。リストの3、5、6番目のコマンドです。R_to_Python_ComanndList_191014.pngRの実行結果は以下の通りです。使い慣れたコマンドです。R_output_191014.pngPythonについては上記の対応表を元に実行しました。Python_output_191014.png作業ディレクトリ確認、ファイル確認はRと似たようなコマンドですね。コード実行時のオブジェクトの確認については、Pythonの方が細かく変数の中身の値まで表示されることが分かりました。

次回は、Python環境からRを実行させたり、逆に、R環境からPythonを実行させる内容についてお話しします。

BuffaloのWi-Fiルータのベタベタを取る(2)

 前回の続きです。BuffaloのWi-Fiルータ WZR-1750DHP2のボディの樹脂塗装が劣化してベタベタになった件で、Buffaloにメールした翌日にサポートセンターから電話がかかってきました。問題のWi-Fiルータを着払で送付し、モノが問題品と確認出来次第、新品の代替品を送付してくれるとのことでした。
 早速、問題品を送付し、後日、無事に新品(WSR-2533DHP2-CB)が届きました。WSR-2533DHP2-CB.png今回のボディには樹脂の塗装はなく、プラスチックの肌触りでした。New_Wi-Fi_router191012.jpgスペックを交換前後で比較すると以下の通り。Wi-Fi_router_specification191012.png通信速度が向上しています。現在、自宅で使用しているWi-Fiルータと同じスペックです。

 ベタベタ除去には大変難儀しましたが、最終的には新品に交換してもらって満足です。大事に使っていこうと思います。

BuffaloのWi-Fiルータのベタベタを取る(1)

 2015年の初めに購入したBuffalloのWi-FiルータWZR-1750DHP2を久々に使おうとした所、ボディに粘着性があり、ベタベタ状態でした。Buffalo_WZR-1750DHP2.pngこのルータは現在自宅で利用している無線ルータの先代のものです。以前、家族からネットにつながりにくいという苦情があったため引退した経緯があります。

 ゴムの劣化なんだろうなと、安易に「ウェットティッシュ」で拭くとますます表面が汚くなりました。そういえば「消しゴム」で粘着が取れると聞いたことがあるぞと思い、早速トライしましたが、ますます悪化・・。ここで万事休す。最終的にこんな感じになってしましました。
sideA_before_191006.png sideB_before_191006.png
 ネットで「ベタベタ対策」を調べていると「お酢」が良いとの情報をキャッチ。早速、ミツカン酢を拝借して、いざ擦る擦る、無心で擦る・・。酢の臭さに耐えて擦る。
 結果、こんなに綺麗になりました。恐るべし、お酢。やはりゴム等の粘着除去には、有機系の溶剤(アセトンとかもっと良さそう・・)がいいのでしょうね。>
sideA_after_191006.png sideB_after_191006.png
ただ、若干のベタベタ感はボディに残っている感じがありました。手も酢臭いし、ベタベタしています。最低ですね・・。

 その後、ネットで調べていると、似たようなトラブルに遭遇している方が数多くおられました。その中でサポート切れでも別機種に交換してもらえるとの情報を得ました。早速、Buffaloにメールしました。交換してもらえるか否かはメールの返事待ちです。結果がもらえたら、また報告します。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: