Rstudioでjobsを停止したときのTEMPフォルダのゴミ掃除方法

  • タスクマネージャでjobsを停止させると途中の演算結果がTEMPフォルダに保存されっぱになる
  • jobsの停止を何度もやっているとそのうちTEMPフォルダがパンパンになる
  • なのでTEMPフォルダのお掃除が定期的に必要
  • TEMPフォルダの中身は基本捨てても問題ない
  • TEMPフォルダは大体以下のディレクトリにある
    • C:\WINDOWS\Temp
    • C:\Users\(ユーザ名)\AppData\Local\Temp
  • TEMPフォルダの中身は全部削除しても大丈夫? - ぼくんちのTV 別館

japanmeshでメッシュコードから緯度経度を出す

  • japanmesh でメッシュコードから緯度経度をだしたい
  • その作業を tibble でやりたいとき
data  %>% 
  mutate(
    latitude = map_dbl(
      .x = mesh_code,
      .f = ~ {jpgrid::grid_to_coords(jpgrid::grid_auto(.x))[[2]]}
    ),
    longitude = map_dbl(
      .x = mesh_code,
      .f = ~ {jpgrid::grid_to_coords(jpgrid::grid_auto(.x))[[1]]}
    )
  ) 


data  %>% 
mutate(
     latitude = map_dbl(
       .x = mesh_code_3rd,
       .f = ~ {japanmesh::mesh_to_XY(japanmesh::mesh_auto(.x))[[2]]}
     ),
     longitude = map_dbl(
       .x = mesh_code_3rd,
       .f = ~ {japanmesh::mesh_to_XY(japanmesh::mesh_auto(.x))[[1]]}
     )
   ) 

ポアソン過程について

  • 無限長の時間軸を用意
  • サンプルサイズ n の点を時間軸上にランダム配置
  • 時間軸を有限の長さの区間に分割し、ある区間について考える
  • ある区間内に各点が含まれる確率を p とする
  • 区間内の点の個数が k のとき、 k ~ Bionomial(N, p) となるので、 P(N = k) は以下のように書ける。
  • P(N = k) = nCk * p^k * (1-p)^(n-k)

  • 区間内の個数kの期待値は np であり、これを np := λ とする

  • n→∞p→0 の極限をとってポアソンの極限定理を用いると、 k ~ Poisson(λ) となる
  • このとき P(N = k) は以下のように書けなおせる。
  • P(N = k) = exp(-λ) * λ^k / k!

  • maxentは生物の発見データがポアソン過程で生成されたときの個体数に関するモデル

  • 時間軸を平面空間に拡張している
  • n→∞p→0 の極限は、対象生物の個体数が十分大きく、平面上の区間は十分小さいことに対応
  • となると、区間内の発見個体数はせいぜい0か1となるため、発見個体数はベルヌーイ試行だといえる
  • となると、区間内の個体数の期待値は p になる(ベルヌーイ分布)
  • と同時に、区間内の個体数の期待値は λ でもある(ポアソン分布)
  • よって、在データのみから λ を推定して、これを生物の生息確率とみなしてよい
  • ただし、各発見点はポアソン過程から生成されると仮定できれば、の話。

住所を都道府県と市区町村で切り分けたいとき

  • zipangu::separate_address を使うと便利
  • コードの例
fread('hogehoge.csv', encoding = 'UTF-8') %>% 
  mutate(address = zipangu::separate_address(都道府県市区町村)) %>%
 mutate(
    pref = unlist(map(.x = address, .f = ~ {flatten(.x)[[1]]})),
    city = unlist(map(.x = address, .f = ~ {flatten(.x)[[2]]}))
  )

決定木とは

  • データを特徴量空間上で矩形分割するモデル
    • 分割は「ある特徴量がある値と一致するか」「ある特徴量がある値より大きいか小さい」などのルールに従って行う
    • 分割ルール(分割対象となる特徴量と閾値の組)をどう見つけるかが大切
  • 情報利得を目的関数とし、これを最大化する分割ルールを見つけることで、最適な決定木を構築
    • 情報利得とは、親ノードでの不純度から子ノードの不純度の加重平均を引いたもの
    • 情報利得が大きいことは、親ノードに比べて子ノード内のデータが「均一」になることを意味

不純度の種類

  • 分類タスクだとジニ不純度やlogloss、回帰タスクだと平均誤差がよく用いられる
  • texで数式かきてえええ)

目的関数をどう計算するか

  • 理想的な方法
    1. 考えられる全ての決定木をあらかじめ構築
    2. それら決定木の目的関数の値をすべて計算
    3. 目的関数が最大化される決定木を採用
  • 特徴量の数やデータのサンプルサイズが大きくなると、この方法は現実的な時間で解けきれない
  • 代替案として貪欲法を使う
    1. 決定木の根から一段階だけ葉を生やす
    2. 目的関数を計算して、最適な特徴量とルールの組を探す
    3. 2の決定木を採用して、ほかの決定木は捨てる
    4. さらに一段階だけ葉を生やす
    5. 2~4を繰り返す
  • 貪欲法は全ての決定木をあらかじめ構築するのはあきらめて、逐次的に最適な決定木を見つけていこうやという方法
  • 理想的な方法と貪欲法でそれぞれ求まる決定木は一致する保証がない(らしい)
  • まあでも、現実的に解けるからええやんっていうスタンスなのかな?

地理空間データのwkt形式について

  • 地理空間データの形式として .shp 形式をよく利用してた
  • .shp はどうも重い?
  • wkt はオブジェクトとそのオブジェクトの頂点座標の集合を1つのデータセットとしてもつ形式
  • ファイルの形式そのものは .csv になる
  • あとでちゃんと調べよう

python基礎お勉強

ライブラリ

import pandas as pd
import numpy as np

データロード

from sklearn.datasets import load_iris
iris = load_iris()

X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = pd.Series(iris.target)

# X = pd.DataFrame(iris['data'], columns=iris['feature_names']) でも可
# y = pd.Series(iris['target']) でも可

データの確認

  • head columns keys type describe をよく使う
  • head tail いわずもがな
  • columns keys データの列名やキー名を表示
  • type データの型を表示
  • describe データの要約値を表示

列名変更

  • renameset_axis がある
  • rename
    • 特定列だけ列名変更 する仕様
    • 変更前と変更後の列名 を明示する必要アリ
X.rename(columns={'sepal length (cm)':'sepal_length'})
  • set_axis
    • 全列で列名変更 する仕様
    • 変更後の列名だけ を明示する必要アリ
    • 注意点
      • labels 通りに列名変更されるため、 columns であらかじめ列順を確認せよ
      • 列名変更のほか行名変更もできてしまうので 、 axis=1で列方向を指定せよ
X.set_axis(labels=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], axis=1)
  • 一部の列名だけ変更したいなら rename
  • まとめて全列名を変更したいなら set_axis

列選択

  • [ ] loc iloc drop del がある
  • [ ]
    • かっこ内で選択したい列名を記入
    • 1つ変数を列選択する場合
      • data['row_name'] (Seriesとして出力)
      • data[['row_name']] (DataFrameとして出力)
    • 2つ以上の列選択の場合
      • data[ ['row_names1', 'row_names2', etc] ] (DataFrameとして出力)
x1 = x['sepal_length']
x2 = x[['sepal_length']]
x3 = x[['sepal_length', 'sepal_width']]

type(x1)
type(x2)
type(x3)
  • loc
    • 行と列の両方で選択範囲を指定
      • 行:行名 or 行番号で指定
        • 行番号はスライス start:end で指定可能
        • 行番号を : と書くと全行指定となる
      • 列:列名で指定
        • 列番号で指定できない
        • `loc[:, ['column']] とするとSeriesとして出力
        • `loc[:, 'column'] とするとData.Frameとして出力
    • よくある書き間違い
      • 行指定を忘れる
      • loc[] ではなく loc() と書いてしまう
x1 = x.loc[:, 'sepal_length']
x2 = x.loc[:, ['sepal_length']]
x3 = x.loc[:, ['sepal_length', 'sepal_width']]

type(x1)
type(x2)
type(x3)
  • iloc

    • loc と違うのは、列番号で列選択する点のみ
  • drop

    • 削除したい列を列名で選択
    • 行番号で削除したいときは、 columns を利用して削除したい列番号の列名を取り出す
X.drop(['sepal_length'], axis=1)
X.drop(X.columns[[1]], axis=1)
  • del

    • こいつはいったんパス
  • 正規表現で列名選択は可能?

行選択

  • [ ] query loc がある
  • [ ]
    • 条件式でブール値を返して、そのブール値で行選択
    • 条件式間は & | でつなぐ
    • between表現はないので、betweenと同等の条件式を書くしかない
X[X.sepal_length >= 5.0]
x[(x.sepal_length >= 1) & (x.sepal_length <= 5)]
X[(X.sepal_length >= 5.0) & (X.pelat_width> 2.0)]
  • query
    • 条件式内は == != < > = でつなぐ
    • 条件式間は and or でつなぐ
    • between条件は num < column < num などの書き方でOK
X.query('sepal_length >= 5.0')
X.query('1 <= sepal_length <= 5.0')
X.query('sepal_length >= 5.0' and 'petal_width >= 2.0')
  • loc
    • 条件式を行成分に書けばよい
    • 条件式間は & | でつなぐ
    • between表現はないので、betweenと同等の条件式を書くしかない
X.loc['sepal_length >= 5.0']
X.loc[('sepal_length' >= 5.0) & ('petal_width' >= 1)]
  • 正規表現で文字列の行選択は可能?
  • 欠損値のみ/以外の行選択は可能?

列追加

  • [ ]assign がある
  • [ ]
    • data[colname] = 数式で新しい列を生成
x['new_col1'] = x['sepal_length']
  • assign
    • 列名 = 数式 で新しい列を生成(dplyr::mutateとほどんど同じ)
    • lamda式を数式に使用可能
    • maskで処理の条件変化を数式に組込可能(dplyr::case_whenとほとんど同じ)
x.assign(new_col1=x.sepal_length,
         new_col2=lambda x: x.sepal_length.round(),
         new_col3=lambda x: x.sepal_length.mask(x.sepal_width < 1, np.nan))
  • ** if_elsecase_when のFALSEのときに処理は?
  • 正規表現を用いた列追加は可能?

結合

  • concatmerge がある
  • concat

  • merge

raw_data2 = pd.DataFrame(
    [[1, 2, 3], [3, 4, 5], [4, 5, 6]],
     columns = ['a', 'b', 'c']
)

d_assigned = raw_data2.assign(d = pd.Series([2, 3, 5]))
print(tmp2)
raw_data1 = pd.DataFrame(
    [[1, 2, 3], [3, 4, 5], [4, 5, 6]],
     columns = ['a', 'b', 'c']
)
print(raw_data1)

raw_data1['d'] = [2, 3, 5]
print(raw_data1)

データの並べ替え

X.sort_values('sepal length (cm)', ascending=True)
X.sort_values('sepal length (cm)', ascending=False)

データの結合

  • merge のデフォルトは inner_join
    • 引数 howleft right outer 指定可能
# %%
d_score = pd.DataFrame(
    {
        'user':[1, 2, 3],
        'score':[100, 20, 55]
    }
)

d_user = pd.DataFrame(
    {
        'user':[1, 2, 3, 4, 5],
        'name':['a', 'b', 'c', 'd', 'e'],
        'class':['A', 'A', 'A', 'B', 'B']     
     },
    columns=['user', 'name', 'class']
)

d_score_user = pd.merge(d_score, d_user, on = 'user')
  • joinするkeyがデータフレーム間で違う場合
    • 引数 left_onright_on でそれぞれのデータフレームのjoin keyを指定
    • あらかじめ rename でjoin keyを同じ名前にしておく
# %%
d_score = pd.DataFrame(
    {
        'user_id':[1, 2, 3],
        'score':[100, 20, 55]
    }
)

d_user = pd.DataFrame(
    {
        'user':[1, 2, 3, 4, 5],
        'name':['a', 'b', 'c', 'd', 'e'],
        'class':['A', 'A', 'A', 'B', 'B']     
     },
    columns=['user', 'name', 'class']
)

d_score_user_2 = pd.merge(d_score, d_user, 
                        left_on = 'user_id', 
                        right_on = 'user')
# %%
d_score_rename = d_score.rename(columns={'user_id':'user'})

d_score_user_3 = pd.merge(d_score_rename, d_user, on = 'user')

グループごとで集計

# %%
df = pd.concat([X, y], axis=1)
df = df.rename(columns={0:'species_id'})
df.groupby('species_id').mean()