再考: お買い得物件を機械学習で見つける方法
@ill-identified
2019/6/29
1
自己紹介
• Twitter: @ill_identified
• ブログ: http://ill-identified.hatenablog.com/
• LinkedIn: https:
//www.linkedin.com/in/satoshi-katagiri/
• Twitter: https://twitter.com/ill_Identified
• github: https://github.com/Gedevan-Aleksizde
• 現在の勤務先: Web 広告の会社
2
イントロダクション
• Morishita (2019) https://speakerdeck.com/
morishita/rdeomai-ide-wu-jian-wotan-se
(Tokyo.R 77 回)
• shokosaka (2017) (個人ブログ) http://www.
analyze-world.com/entry/2017/11/09/061023
• 本当に機械学習でお買い得物件を求められるのか?
3
「マサカリ」を投げに来たわけではない
Figure 1: Decapitation of Pedro I, public domain; Nicholas of Myla at the Council of
Nicaea, public domain
• 機械学習が何をしているのか, どうやったら活用できるの
かを建設的に議論したい
4
異常検知の教科書
• 今回は異常検知 (anomaly detection) のなかでも, 特に外れ
値検出 (outlier detection) 分野の話
5
そもそも何がお買い得物件?
• 家賃が高いよりも安いほうがいい
• ただし留保条件もある
• 広さはどれくらい
• トイレと風呂は, ガスコンロはあるか, 電気調理器はあるか,
• 条件を満たすもののなかで, なるべく安いものが欲しい
6
どうやって求めるか
• 冒頭の 2 人は不動産情報を特徴量に, 賃料を目的変数にし
て機械学習を適用
• それぞれランダムフォレストと XGBoost
• 賃料を目的変数 y, 物件情報による特徴量を x とおいて, 条
件付き確率を仮定
y ∼p(y | x)
• x に対する平均的な y を条件付き期待値関数
y = µ(x) :=Ey | x
• 機械学習で µ(x) を近似した予測モデル ˆy = ˆµ(x) を作り,
残差の大きいものが外れ値 = お買得物件
ri :=yi − ˆµ(x)
7
本当に?
本当に?
8
機械学習のしくみ再考
• 線形・3 次関数 + ノイズの疑似データ作成
9
単回帰と決定木で当てはめる
• 単回帰/3 次多項式回帰と決定木 (ランダムフォレスト) で
当てはめる.
• ノイズがあるのでどうやっても一致しない
• ノイズのなかのどれが外れ値なのかわからない
10
モデルが先か外れ値が先か
• 外れ値検出は正常状態を数式で正確に表せるのが前提
• 数式は機械学習でデータに当てはめて求める
• データの外れ値は機械学習の数式から判定する
• 数式は機械学習でデータに当てはめて求める
• データの外れ値は機械学習の数式から
・数式は機械学習でデータに当ては
・データの外れ値は機械学習の
・数式は機械学習でデータ
・データの外れ値は機械学
・数式は機械学習でデ
・データの外れ値は機
・数式は機械学習
・データの外れ値
11
ここまでのまとめ
• 機械学習はデータの数値に当てはめているだけ
• 単回帰でも XGBoost でも深層学習でも同じ
• 交差検証 (CV) をやるのはそのため
• 検証データにも未知の外れ値があるとどうしようもない
• 正常値・外れ値のラベルがないまま予測残差を見ても仕方
がない
• MSE・RMSE・MAE とにかく意味がない
• 比較検証が難しい
12
補足: Morishita (2019) の方法
• 訓練データは物件を見つけたい地域以外の場所
• 訓練データを標準的な物件の情報とみなしていると明記し
ている.
• 偏りによる共変量シフトを Importance Weight で補正
• 訓練データにも外れ値はある
• 地域によって重点される特徴量は違う. 共変量シフトの前
提に疑問
13
論点
• もっと正確にお買得物件を見つける方法はないか?
• 個人にとって実用的なものか?
• 不動産情報サイトにとって実用的か?
• 検証方法はどうすべきか?
14
代替手法
•「データだけドリブン」でやっても無理
• お買得物件に対する何らかの「仮説」がないと動けない
• 以下の 2 通りを考えた
1. 偏差の大きなものを外れ値と考える
2. 正常値と外れ値が異なる分布に従うと考える
15
代替手法 1: Quantile Regression Forest
• Random forest はいくつもの決定木のアンサンブル学習
• R では ranger か randomForest パッケージで可能 (前
者がおすすめ)
• 簡単な解説は自分のブログ (ここ) とか
• Meinshausen (2006) による qunatile regression forest
• 平均ではなく分位点 (中央値) に合わせる
• 分散の大きな外れ値ならこれで検知できる?
• R では ranger または quantregForest パッケージ
で可能
16
代替手法 2: Gaussian Finite Mixture Model
• ガウシアン有限混合回帰モデル
• 複数の分布の合成でモデルを表現する.
• データが K 個の分布のどれかから発生している:
y =
K∑
k=1
πkµk(y | x)
• 各個体が k のどの分布に属したかの確率を計算できる.
• おおざっぱに言うと本質的にはクラスタリングと同じ
•「無限」混合はいわゆるノンパラベイズ
• flexmix パッケージで可能
• 使い方は Leisch (2004) 参照
• 日本語なら ここ の解説が実用的でくわしい
17
どう検証するか
• 正例/負例のラベルがない
• 定量的な評価のしようがない
• 疑似データを作るか
• 生データと違う分布. 実用的ではない
• 苦肉の策
• 生データの一部を修正した疑似データを検出できるか判
定する
18
処理の流れ
• ソース: https://github.com/Gedevan-Aleksizde/
20190615_bargain_detect
1. スクレイピング: rvest で suumo.jp からスクレイピング
2. 整然化 (tidying): tidyverse で整形
3. 予測モデル作成: mlr, mlrCPO で前処理 & 学習のフロ
ー作成
3.1 quantile regression forest
3.2 gaussian mixture model
4. 疑似データを外挿して評価
19
I. 内容解説: スクレイピング (1/4)
• fetch_data.R の部分
• shokosaka, 2017 は Python なので rvest で書き直す
• robots.txt も確認
1 install.packages(
2 setdiff("pacman", installed.packages())
3 )
4 pacman::p_load(
5 tidyverse,
6 robotstxt,
7 rvest,
8 stringr
9 )
10 pacman::p_load_gh("franapoli/pbarETA")
20
I. 内容解説: スクレイピング (2/4)
• rvest は xml データ (木構造) をフィルタで抽出できる
• タグ, 属性, CSS セレクタ, XML Path などを知っていれば
簡単
• %>% も使える
• 以下の関数で tidyr, purrr も駆使して tibble に収める
1 build_wise_page_to_tb <- function(query_result){
2 # 「建物ごと表示」の結果を tibble にする. 部屋情報は入れ子
3 data_html <- query_result %>% html_nodes("div.cass
4 casset_info <- data_html %>% html_nodes("div.casse
5 casset_items <- data_html %>% html_nodes("div.cass
6 parse_items_to_tb <- function(casset_items){
7
8 }
9 tb <- tibble( 21
I. 内容解説: スクレイピング (3/4)
• これを suumo の検索結果ページから取得.
• 取得したのは, 物件名, 間取り, 専有面積, 家賃, 管理費, 階
数, 住所, 最寄り駅, 築年数など
• 物件個別ページはスクレイピングしていない
• ページ内から検索結果の全ページ数も取得
• これを 23 区それぞれの検索クエリ結果に対して実行
• 進捗がわかりづらいのでプログレスバーを使うと良い
(pbarETA がおすすめ)
22
I. 内容解説: スクレイピング (4/4)
Figure 2: スクレイピングしたデータ
Figure 3: 入れ子部分の部屋別情報
23
II. 内容解説: 整然化 - tidying (1/2)
• modeling.R の前半部分
• スクレイピングの処理で結構整形してしまったのであまり
やることがない
• 本来は分けて書くほうがのちのちの改修で楽
• 整然化というより特徴量抽出の話
• 数値は「X.X 万円」「X 階」のような文字列で表されている
ので数値を取り出す (stringi, stringr が便利)
• 階数はたまに地下 1 階とかあるので, cut() 関数で細かく
離散化
1 cut(floor_int, breaks=c(-Inf, 1, 2, 4, ..., Inf))
24
II. 内容解説: 整然化 - tidying (2/2)
• 間取りは L, D, K などそれぞれでダミー変数を立てる
• 住所などテキストは feature hashing (hash tricking) で強制
的に多次元の数値列にする (FeatureHashing が便利)
• スコア勝負じゃないのでこの辺は手抜き
25
III. 内容解説: 予測モデル作成 (1/4)
• mlr, mlrCPO を使う
• mlr の日本語の解説は以下を参照
• @nozma によるチュートリアル翻訳 + 補足説明
•『mlr パッケージチュートリアル - Quick Walkthrough 編』
•『R の機械学習パッケージ mlr のチュートリアル 3 (ベンチマ
ーク試験から可視化まで)』
• kanamichi による『mlr チュートリアルの写経(その 1)』
(2015 年)
• 『モデルを跨いでデータを見たい』(第 76 回 Tokyo.R)
26
III. 内容解説: 予測モデル作成 (2/4)
• mlr では
1. データフレームと目的変数情報をタスク (task) オブジェ
クトとして作成 tsk <- makeRegrTask( id="hoge",
data=df, target="rent_price")
2. 学習器オブジェクト (learner) を作成
(listLearners() で使用できるものを一覧できる)
3. MODEL <- train(LEARNER, TASK) で学習結果を得る.
4. predict(MODEL, [DATA/TASK]) で予測値出力
27
III. 内容解説: 予測モデル作成 (3/4)
• 登録されていないものは自作するしかない
(resgist_mlr_learners.R の部分).
• 今回は flexmix も renger (quantreg バージョン) も登録
されていなかった.
• 以下を見れば作り方はだいたいわかる (たぶん)
•『Integrating Another Learner』
• XGBoost の登録例
28
III. 内容解説: 予測モデル作成 (4/4)
• mlrCPO (Composable Preprocessing Operators for MLR)
は名前通り前処理関係の機能を強化する
• 前処理クラスは mlr にもあるけど数が少ない
• cpoScale() %>>% makeLearner() のように %>>% で
learner オブジェクトに前処理フローを付加できる
• scikit-learn の PipeLine っぽい
• ただしこちらもそこまで種類は豊富ではない tidyverse だけ
でいいんじゃね?
• 目的変数を変換して, predict() 時に逆変換する
cpoLogTrafoRegr() は便利
• さあいくぞ
29
しかしここでタイムアップ
• 結果までまとめきれませんでした…
30
敗因分析
• 単純に作業量が多い
• 未知の分野の先行研究の調査, モデリング, 検証を全部やろ
うとした
• モデリングまでの作業でどのパッケージが使いやすいか比
較しながら進めていた
• caret と mlr と tidymodels + parsnip どれが使いや
すいかとか
• これを全部 //1 ///週///間///でやろうとした
31
いかがでしたか?
• いかがでしたか? お買得物件を正確に発見する方法を調べ
てみましたが残念ながらよく分かりませんでした!
• ill_identified 先生の今後の挽回に期待ですね!
32
次は時間内に終わる手堅いテーマを選ぶので許してください.
Figure 4: Saint Peter of Verona, by Vecchietta, public domain
33
今回のまとめ
• 教師のない教師あり機械学習が行き場を見失う
• 予測モデルの適切な評価をして使おう
• tidyverse, mlr, mlrCPO あたりを組み合わせるととて
も便利
• 研究は計画的に
34
参考文献 i
Aggarwal, Charu C. (2017) Outlier Analysis, Cham: Springer
International Publishing, DOI: 10.1007/978-3-319-47578-3,
DOI: 10.1007/978-3-319-47578-3.
Chandola, Varun, Arindam Banerjee, and Vipin Kumar (2009)
“Anomaly Detection: A Survey,” ACM Computing Surveys,
Vol. 41, No. 3, pp. 1-58, July, DOI:
10.1145/1541880.1541882.
Leisch, Friedrich (2004) “FlexMix: A General Framework for
Finite Mixture Models and Latent Class Regression in R,”
Journal of Statistical Software, Vol. 11, No. 8, DOI:
10.18637/jss.v011.i08.
35
参考文献 ii
Meinshausen, Nicolai (2006) “Quantile Regression Forests,”
Journal of Machine Learning Research, Vol. 7, pp. 983-999.
Morishita, Gota (2019) 「R でお買い得物件を探せ」,4 月.
shokosaka (2017) 「機械学習を使って東京 23 区のお買い得賃
貸物件を探してみた」,11 月.
井出剛 (2015) 『入門機械学習による異常検知 - R による実践
ガイド -』,コロナ社.
36

再考: お買い得物件を機械学習で見つける方法

  • 1.
  • 2.
    自己紹介 • Twitter: @ill_identified •ブログ: http://ill-identified.hatenablog.com/ • LinkedIn: https: //www.linkedin.com/in/satoshi-katagiri/ • Twitter: https://twitter.com/ill_Identified • github: https://github.com/Gedevan-Aleksizde • 現在の勤務先: Web 広告の会社 2
  • 3.
    イントロダクション • Morishita (2019)https://speakerdeck.com/ morishita/rdeomai-ide-wu-jian-wotan-se (Tokyo.R 77 回) • shokosaka (2017) (個人ブログ) http://www. analyze-world.com/entry/2017/11/09/061023 • 本当に機械学習でお買い得物件を求められるのか? 3
  • 4.
    「マサカリ」を投げに来たわけではない Figure 1: Decapitationof Pedro I, public domain; Nicholas of Myla at the Council of Nicaea, public domain • 機械学習が何をしているのか, どうやったら活用できるの かを建設的に議論したい 4
  • 5.
    異常検知の教科書 • 今回は異常検知 (anomalydetection) のなかでも, 特に外れ 値検出 (outlier detection) 分野の話 5
  • 6.
    そもそも何がお買い得物件? • 家賃が高いよりも安いほうがいい • ただし留保条件もある •広さはどれくらい • トイレと風呂は, ガスコンロはあるか, 電気調理器はあるか, • 条件を満たすもののなかで, なるべく安いものが欲しい 6
  • 7.
    どうやって求めるか • 冒頭の 2人は不動産情報を特徴量に, 賃料を目的変数にし て機械学習を適用 • それぞれランダムフォレストと XGBoost • 賃料を目的変数 y, 物件情報による特徴量を x とおいて, 条 件付き確率を仮定 y ∼p(y | x) • x に対する平均的な y を条件付き期待値関数 y = µ(x) :=Ey | x • 機械学習で µ(x) を近似した予測モデル ˆy = ˆµ(x) を作り, 残差の大きいものが外れ値 = お買得物件 ri :=yi − ˆµ(x) 7
  • 8.
  • 9.
    機械学習のしくみ再考 • 線形・3 次関数+ ノイズの疑似データ作成 9
  • 10.
    単回帰と決定木で当てはめる • 単回帰/3 次多項式回帰と決定木(ランダムフォレスト) で 当てはめる. • ノイズがあるのでどうやっても一致しない • ノイズのなかのどれが外れ値なのかわからない 10
  • 11.
    モデルが先か外れ値が先か • 外れ値検出は正常状態を数式で正確に表せるのが前提 • 数式は機械学習でデータに当てはめて求める •データの外れ値は機械学習の数式から判定する • 数式は機械学習でデータに当てはめて求める • データの外れ値は機械学習の数式から ・数式は機械学習でデータに当ては ・データの外れ値は機械学習の ・数式は機械学習でデータ ・データの外れ値は機械学 ・数式は機械学習でデ ・データの外れ値は機 ・数式は機械学習 ・データの外れ値 11
  • 12.
    ここまでのまとめ • 機械学習はデータの数値に当てはめているだけ • 単回帰でもXGBoost でも深層学習でも同じ • 交差検証 (CV) をやるのはそのため • 検証データにも未知の外れ値があるとどうしようもない • 正常値・外れ値のラベルがないまま予測残差を見ても仕方 がない • MSE・RMSE・MAE とにかく意味がない • 比較検証が難しい 12
  • 13.
    補足: Morishita (2019)の方法 • 訓練データは物件を見つけたい地域以外の場所 • 訓練データを標準的な物件の情報とみなしていると明記し ている. • 偏りによる共変量シフトを Importance Weight で補正 • 訓練データにも外れ値はある • 地域によって重点される特徴量は違う. 共変量シフトの前 提に疑問 13
  • 14.
    論点 • もっと正確にお買得物件を見つける方法はないか? • 個人にとって実用的なものか? •不動産情報サイトにとって実用的か? • 検証方法はどうすべきか? 14
  • 15.
    代替手法 •「データだけドリブン」でやっても無理 • お買得物件に対する何らかの「仮説」がないと動けない • 以下の2 通りを考えた 1. 偏差の大きなものを外れ値と考える 2. 正常値と外れ値が異なる分布に従うと考える 15
  • 16.
    代替手法 1: QuantileRegression Forest • Random forest はいくつもの決定木のアンサンブル学習 • R では ranger か randomForest パッケージで可能 (前 者がおすすめ) • 簡単な解説は自分のブログ (ここ) とか • Meinshausen (2006) による qunatile regression forest • 平均ではなく分位点 (中央値) に合わせる • 分散の大きな外れ値ならこれで検知できる? • R では ranger または quantregForest パッケージ で可能 16
  • 17.
    代替手法 2: GaussianFinite Mixture Model • ガウシアン有限混合回帰モデル • 複数の分布の合成でモデルを表現する. • データが K 個の分布のどれかから発生している: y = K∑ k=1 πkµk(y | x) • 各個体が k のどの分布に属したかの確率を計算できる. • おおざっぱに言うと本質的にはクラスタリングと同じ •「無限」混合はいわゆるノンパラベイズ • flexmix パッケージで可能 • 使い方は Leisch (2004) 参照 • 日本語なら ここ の解説が実用的でくわしい 17
  • 18.
    どう検証するか • 正例/負例のラベルがない • 定量的な評価のしようがない •疑似データを作るか • 生データと違う分布. 実用的ではない • 苦肉の策 • 生データの一部を修正した疑似データを検出できるか判 定する 18
  • 19.
    処理の流れ • ソース: https://github.com/Gedevan-Aleksizde/ 20190615_bargain_detect 1.スクレイピング: rvest で suumo.jp からスクレイピング 2. 整然化 (tidying): tidyverse で整形 3. 予測モデル作成: mlr, mlrCPO で前処理 & 学習のフロ ー作成 3.1 quantile regression forest 3.2 gaussian mixture model 4. 疑似データを外挿して評価 19
  • 20.
    I. 内容解説: スクレイピング(1/4) • fetch_data.R の部分 • shokosaka, 2017 は Python なので rvest で書き直す • robots.txt も確認 1 install.packages( 2 setdiff("pacman", installed.packages()) 3 ) 4 pacman::p_load( 5 tidyverse, 6 robotstxt, 7 rvest, 8 stringr 9 ) 10 pacman::p_load_gh("franapoli/pbarETA") 20
  • 21.
    I. 内容解説: スクレイピング(2/4) • rvest は xml データ (木構造) をフィルタで抽出できる • タグ, 属性, CSS セレクタ, XML Path などを知っていれば 簡単 • %>% も使える • 以下の関数で tidyr, purrr も駆使して tibble に収める 1 build_wise_page_to_tb <- function(query_result){ 2 # 「建物ごと表示」の結果を tibble にする. 部屋情報は入れ子 3 data_html <- query_result %>% html_nodes("div.cass 4 casset_info <- data_html %>% html_nodes("div.casse 5 casset_items <- data_html %>% html_nodes("div.cass 6 parse_items_to_tb <- function(casset_items){ 7 8 } 9 tb <- tibble( 21
  • 22.
    I. 内容解説: スクレイピング(3/4) • これを suumo の検索結果ページから取得. • 取得したのは, 物件名, 間取り, 専有面積, 家賃, 管理費, 階 数, 住所, 最寄り駅, 築年数など • 物件個別ページはスクレイピングしていない • ページ内から検索結果の全ページ数も取得 • これを 23 区それぞれの検索クエリ結果に対して実行 • 進捗がわかりづらいのでプログレスバーを使うと良い (pbarETA がおすすめ) 22
  • 23.
    I. 内容解説: スクレイピング(4/4) Figure 2: スクレイピングしたデータ Figure 3: 入れ子部分の部屋別情報 23
  • 24.
    II. 内容解説: 整然化- tidying (1/2) • modeling.R の前半部分 • スクレイピングの処理で結構整形してしまったのであまり やることがない • 本来は分けて書くほうがのちのちの改修で楽 • 整然化というより特徴量抽出の話 • 数値は「X.X 万円」「X 階」のような文字列で表されている ので数値を取り出す (stringi, stringr が便利) • 階数はたまに地下 1 階とかあるので, cut() 関数で細かく 離散化 1 cut(floor_int, breaks=c(-Inf, 1, 2, 4, ..., Inf)) 24
  • 25.
    II. 内容解説: 整然化- tidying (2/2) • 間取りは L, D, K などそれぞれでダミー変数を立てる • 住所などテキストは feature hashing (hash tricking) で強制 的に多次元の数値列にする (FeatureHashing が便利) • スコア勝負じゃないのでこの辺は手抜き 25
  • 26.
    III. 内容解説: 予測モデル作成(1/4) • mlr, mlrCPO を使う • mlr の日本語の解説は以下を参照 • @nozma によるチュートリアル翻訳 + 補足説明 •『mlr パッケージチュートリアル - Quick Walkthrough 編』 •『R の機械学習パッケージ mlr のチュートリアル 3 (ベンチマ ーク試験から可視化まで)』 • kanamichi による『mlr チュートリアルの写経(その 1)』 (2015 年) • 『モデルを跨いでデータを見たい』(第 76 回 Tokyo.R) 26
  • 27.
    III. 内容解説: 予測モデル作成(2/4) • mlr では 1. データフレームと目的変数情報をタスク (task) オブジェ クトとして作成 tsk <- makeRegrTask( id="hoge", data=df, target="rent_price") 2. 学習器オブジェクト (learner) を作成 (listLearners() で使用できるものを一覧できる) 3. MODEL <- train(LEARNER, TASK) で学習結果を得る. 4. predict(MODEL, [DATA/TASK]) で予測値出力 27
  • 28.
    III. 内容解説: 予測モデル作成(3/4) • 登録されていないものは自作するしかない (resgist_mlr_learners.R の部分). • 今回は flexmix も renger (quantreg バージョン) も登録 されていなかった. • 以下を見れば作り方はだいたいわかる (たぶん) •『Integrating Another Learner』 • XGBoost の登録例 28
  • 29.
    III. 内容解説: 予測モデル作成(4/4) • mlrCPO (Composable Preprocessing Operators for MLR) は名前通り前処理関係の機能を強化する • 前処理クラスは mlr にもあるけど数が少ない • cpoScale() %>>% makeLearner() のように %>>% で learner オブジェクトに前処理フローを付加できる • scikit-learn の PipeLine っぽい • ただしこちらもそこまで種類は豊富ではない tidyverse だけ でいいんじゃね? • 目的変数を変換して, predict() 時に逆変換する cpoLogTrafoRegr() は便利 • さあいくぞ 29
  • 30.
  • 31.
    敗因分析 • 単純に作業量が多い • 未知の分野の先行研究の調査,モデリング, 検証を全部やろ うとした • モデリングまでの作業でどのパッケージが使いやすいか比 較しながら進めていた • caret と mlr と tidymodels + parsnip どれが使いや すいかとか • これを全部 //1 ///週///間///でやろうとした 31
  • 32.
  • 33.
  • 34.
    今回のまとめ • 教師のない教師あり機械学習が行き場を見失う • 予測モデルの適切な評価をして使おう •tidyverse, mlr, mlrCPO あたりを組み合わせるととて も便利 • 研究は計画的に 34
  • 35.
    参考文献 i Aggarwal, CharuC. (2017) Outlier Analysis, Cham: Springer International Publishing, DOI: 10.1007/978-3-319-47578-3, DOI: 10.1007/978-3-319-47578-3. Chandola, Varun, Arindam Banerjee, and Vipin Kumar (2009) “Anomaly Detection: A Survey,” ACM Computing Surveys, Vol. 41, No. 3, pp. 1-58, July, DOI: 10.1145/1541880.1541882. Leisch, Friedrich (2004) “FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R,” Journal of Statistical Software, Vol. 11, No. 8, DOI: 10.18637/jss.v011.i08. 35
  • 36.
    参考文献 ii Meinshausen, Nicolai(2006) “Quantile Regression Forests,” Journal of Machine Learning Research, Vol. 7, pp. 983-999. Morishita, Gota (2019) 「R でお買い得物件を探せ」,4 月. shokosaka (2017) 「機械学習を使って東京 23 区のお買い得賃 貸物件を探してみた」,11 月. 井出剛 (2015) 『入門機械学習による異常検知 - R による実践 ガイド -』,コロナ社. 36