慶應義塾大学 #経済学のためのいろいろなデータさがし 2020夏: 1/2

慶應義塾大学 #経済学のためのいろいろなデータさがし 2020夏: 1/2

慶應義塾大学「経済学のためのいろいろなデータさがし」2020夏: 1/2
1-1. イントロダクション
1-2. スクレイピングその1; パチンコホール
1-3. スクレイピングその2; 補助金ポータル
1-4. API その1; RESAS
1-5. API その2; Twitter API

一橋大学大学院経済学研究科
原泰史
yasushi.hara@r.hit-u.ac.jp

F5f758ca2ec0de2da9781ce9391d9c6c?s=128

yasushihara

July 08, 2020
Tweet

Transcript

  1. 慶應義塾大学 「経済学のための いろいろなデータさがし」 2020夏: 1/2 1-1. イントロダクション 1-2. スクレイピングその1; Pandas

    1-3. スクレイピングその2; BeautifulSoup 1-4. API その1; RESAS 1-5. API その2; Twitter API 一橋大学大学院経済学研究科 原泰史 yasushi.hara@r.hit-u.ac.jp
  2. 今日の内容 • 16:30-16:45 • 1-1. イントロダクション「データ分析までに必要なこと」 • 16:45-17:00 • 1-2.

    スクレイピングその1; パチンコホール • 17:00-17:15 • 1-3. スクレイピングその2; 補助金ポータル • 17:15-17:30 • 1-4. API その1; RESAS • 17:30-17:45 • 1-5. API その2; Twitter API • 17:45-18:00 • 質疑応答
  3. 1.1 イントロダクション データ分析までに必要なこと

  4. データ分析の流れ なんの データ を使う か考え る 先行研 究・事 例を探 す

    データ の取得 方法を 確認す る データ をデー タベー ス or 手 入力 or 図書館 or 口コ ミ or Web ア ンケー トで入 手する 入手し たデー タの妥 当性を 確認す る データ を統計 ソフト and/or Python and/or SQL で 処理す る データ に統計 処理を 行う データ に関す る解釈 を行う 解釈さ れた データ と、そ の解釈 を Word か Jupyter Noteboo k か Tex でテキ スティ ングす る レポー トとし て先生 に送る/ 上司に 提出す る/学術 誌に投 稿する 今日メインに取り上げる内容 前回/前々回で 取り上げた内容 レポートでやって いただく内容 入手したデータに不足があれば, 別のデータソース を参照し, その入手可能性や妥当性を確認し, データ の入手作業を改めて行う
  5. データセットを 用意する方法 図書館や国会図書館で入手する データの提供元から入手する API で取得する Web アンケートで集める Web スクレイピングする/RPA

    で処理する 手入力で作成する
  6. 1. 図書館や国会図書館で入手する • 一橋大学図書館 • および, 日経BPデータベースなど, 大学が契約しているデータベース • ただし、2020年6月現在も非常にアクセスしずらい

    • 国会図書館 as known as日本最強の図書館 • デジタルデータベース • http://dl.ndl.go.jp/ • リサーチ・ナビ • https://rnavi.ndl.go.jp/rnavi/ • なにか信頼性の高いデータが必要になったら, 永田町に行けばだいたい 見つかります (学費や税金を払っている甲斐があります) • ただし、2020年6月現在もちょっとアクセスしずらい
  7. 2. データの提供元から入手する • データベースを提供する会社から入手する • JSON (グッドデザイン賞) や XML (Web

    of Science) など, その ままだと解析をそのまま行うには複雑過ぎるデータ形式で提供 される場合もあるので, 必要に応じてデータの parse 処理を行 う。 • 具体例; • Web of Science のXML データをparse してSQL に
  8. 2. データの提供元から入手する • (a.) Parsing the bibliographic data from XML

    to SQL of WoS - Pick up sufficient data to analyze - Which tag is needed? - Title? - Names Count? (as known as scientific ordering) - Publisher? - Fund information? - Name? First name? Last Name? - ID?
  9. 2. データの提供元から入手する • WoS データのSQL 化の場合 • ecrypt data from

    *.zip to *.gz format • Take 3 mins for 8.16GB • Decrypt data from *.gz to *.zip format • Take 30 mins for 20GB • Decrypt data from *.zip to *.xml format • Take 1.2 hours for 10GB • Parsing xml data into (my)sql format • Take 5.5 hours for 40.5GB • Binding separated *.sql format data into one single file for each year • Take 35 mins • Importing *sql format data into MySQL Server • Take 120 hours for 49.8GB ZIP - > GZ GZ -> ZIP ZIP -> XML XML -> SQL SQL -> SQL Server Accessin g from SQL client Finally you could get the data! Stata?R? Analyze Submissi on Revise Publis h
  10. Parsing XML-based Data to (My)SQL • Using python to parse

    XML data to SQL format. • Using generic_paser.py which distributed in Github. • https://github.com/titipata/wos_pars er • Takes 5.5 hours to parse XML data in 40.5GB into SQL format. • Then import to SQL server, it takes 1.5-3 days with 2 million entries per year.
  11. Creating Database Tables. • Write Down “Create Table” and define

    database structure. CREATE TABLE raw_data.wos_summary ( id varchar(200) NOT NULL, file_number integer NOT NULL, coll_id varchar(200), pubyear varchar(200), season varchar(200), pubmonth varchar(200), pubday varchar(200), coverdate varchar(200), edate varchar(200), vol varchar(200), issue varchar(200), voliss varchar(200), supplement varchar(200), special_issue varchar(200), part_no varchar(200), pubtype varchar(200), medium varchar(200), model varchar(200), indicator varchar(200), inpi varchar(200), is_archive varchar(200), city varchar(200), country varchar(200), has_abstract varchar(200), sortdate varchar(200), title_count varchar(200), name_count varchar(200), doctype_count varchar(200), conference_count varchar(200), language_count varchar(200), normalized_language_count varchar(200), normalized_doctype_count varchar(200), descriptive_ref_count varchar(200), reference_count varchar(200), address_count varchar(200), headings_count varchar(200), subheadings_count varchar(200), subjects_count varchar(200), fund_ack varchar(200), grants_count varchar(200), grants_complete varchar(200), keyword_count varchar(200), abstract_count varchar(200), item_coll_id varchar(200), item_ids varchar(200), item_ids_avail varchar(200), bib_id varchar(200), bib_pagecount varchar(200), bib_pagecount_type varchar(200), reviewed_language_count varchar(200), reviewed_author_count varchar(200), reviewed_year varchar(200), keywords_plus_count varchar(200), book_chapters varchar(200), book_pages varchar(200), book_notes_count varchar(200), chapterlist_count varchar(200), contributor_count varchar(200), PRIMARY KEY(`id`) ); CREATE TABLE raw_data.wos_page ( id varchar(200) NOT NULL, page_id integer NOT NULL, page_value varchar(200), page_begin varchar(200), page_end varchar(200), page_count varchar(200) ); CREATE TABLE raw_data.wos_titles ( id varchar(200) NOT NULL, title_id integer NOT NULL, title varchar(200), title_type varchar(200), lang_id varchar(200), translated varchar(200), non_english varchar(200) ); CREATE TABLE raw_data.wos_summary_names ( id varchar(200) NOT NULL, name_id integer NOT NULL, role varchar(200) NOT NULL, seq_no varchar(200), addr_no_raw varchar(200), reprint varchar(200), lang_id varchar(200), r_id varchar(200), r_id_tr varchar(200), orcid_id varchar(200), orcid_id_tr varchar(200), dais_id varchar(200), display varchar(200), display_name varchar(200), full_name varchar(200), wos_standard varchar(200), prefix varchar(200), first_name varchar(200), middle_name varchar(200), initials varchar(200), last_name varchar(200), suffix varchar(200) );
  12. 2. データの提供元から入手する • データを parse して, XML からSQL に変換 する

    • 正規化する • MySQL 上でデータを処 理可能にする • SQL の使い方は次回のモ ジュール4.2と4.3で。
  13. 3. API で取得する • Application Programming Interface • アプリケーション同士を接合するための仕組み •

    汎用的な機能を提供する. • API を経由して機能を呼び出す形でプログラムを構成することにより, 同 じAPI が実装されていれば, 別のソフトウェア上でそのまま動作できる. • データ形式にXML や JSON を利用する Web API も普及 http://e-words.jp/w/API.html
  14. 3. API で接続する • Orcid から特定の研究者の情 報をAPI 経由で取得する • 今回は

    ORCID ID 0000-0001- 9500-1150 • Orcid Public API の Client ID や Cilient secret, token を取 得し, API 経由で 原講師の最 近の論文情報を取得する
  15. 3. API で接続する • 以下の通り, 書誌情報を取得できる

  16. 3. API で接続する • 今日は3.3 で Twitter を, 第5回でRESAS API

    の使い方をご説明 する予定です。 • 参考文献 • https://github.com/ORCID/python-orcid • https://support.orcid.org/hc/en-us/articles/360006897174 • https://members.orcid.org/api/about-public-api • https://members.orcid.org/api/tutorial/read-orcid-records
  17. 4. Web アンケートでデータを集める • アンケートを Google Docs などを 使って, 集める

    • 卒論やMBA ペー パーでも見かけがち • 母集団と標本の対応 がとても曖昧になり がち • 注.まどかマギカネタ は古典
  18. 4. Web アンケートでデータを集める • 懸念点1. データの母集団が, データの収集者の想定とは異 なる可能性がある • ユースケース:

    「女性の大学生 の買うコスメの情報を集める」, 「起業への選好を調査する」 調査者が想定している母集団= ◦◦大学の女性の大学1-4年生
  19. 4. Web アンケートでデータを集める • 懸念点1. データの母集団が, データの収集者の想定とは異 なる可能性がある • アンケートのTOPページに「こ

    のアンケートは女性の大学生限 定です」と書いても, 回答者が それを守る保証はどこにもない • 記名の場合も, アンケートサイ トにBASIC なパスワードを掛 ける場合にも同様 実際のデータ集計結果= ◦◦大学の女性の大学1-4年生+α
  20. 4. Web アンケートでデータを集める • アンケート調査の段階で適切な質問票を設計出来ていないと、分 析にあたって必要な情報を入手できない可能性がある • 質問表の設計に不備があると, 質問者が欲しい結果に回答者を誘導してし まう可能性

    • 足りないデータをあとからアンケート調査しても, 調査時期が異なるので 統計的に正しい解析とは言えなくなる • 質問表の設計手法の参考文献 • 『質問紙デザインの技法[第2版]』 • 『図解 アンケート調査と統計解析がわかる本[新版]』
  21. 4. Web アンケートでデータを集める • それでも、Web アンケートじゃないとデータが集まらない場合があ る • 即時性を持つ必要のある動向調査 etc…

    • Solution • プロを使う; マクロミル市場調査レポート • https://www.macromill.com/contact/ja/reports.php?utm_source=merumaga&utm _medium=email-info&utm_campaign=HTML • ただし、この技が使えるのは可処分所得を有するMBA学生のみ • 質問の設計などに手慣れた学者を使う; • 新型コロナウィルス感染症への組織対応に関する緊急調査 : 第一報, http://pubs.iir.hit-u.ac.jp/admin/ja/pdfs/show/2390 • 著者; 原泰史:今川智美:大塚英美:岡嶋裕子:神吉直人:工藤秀雄:高永才:佐々木将人:塩谷剛:武 部理花:寺畑正英:中園宏幸:服部泰宏:藤本昌代:三崎秀央:宮尾学:谷田貝孝:中川功一:HR総研
  22. 5. Web スクレイピングする • Web スクレイピング • Python etc… でコーディングすることで,

    Web ページ上から必要な情 報を取ってくる • よくある例; Yahoo! ニュースやYahoo! ファイナンス, データを集約し ているサイトからデータを取得し, 例えば口コミ解析や時系列分析に利 用する • よく考えてみると • 株価データなどは, 実は大学図書館から「オフィシャルに」ダウンロードしてこ れる例が多い (今はできなくなってるけど) • 経済学部の卒論/修論では実はあんまり出番がない(こともないかもしれない) • 詳しくは3.2 で。
  23. 6. RPA で処理する • RPA(Robotics Process Automation; ロボティクスプロセス オートメーション)とは、現代のホワイトカラーの主要業務であ る定型的パソコン作業の効率化を図る、ルールエンジンを活用

    したソフトウェアロボットである。作業時間を圧倒的に短縮す ることができ、作業ミス無しで連続稼働が可能であるため、オ ペレーションプロセスの限界費用を低下させることができる。 • RPAはソフトウェアロボットの特徴を最大限に発揮するもので、 具体的には、定型化された表計算ソフト間のデータのやりとり、 メールのやりとり、ウェブ情報のリアルタイム収集や確認作業、 そして、それら各作業間の連携などを、プログラミングする必 要もなくマクロを作成し実行することができる. http://www.jsse.jp/~kenkyu/201631/04/20163104_115-118.pdf
  24. 7. 手入力で作成する • 人力で、雑誌や本からデータセットを作成する • 古いデータ (1980年以前) だとこの手法がどうしても中心に • 一橋大学経済研究所にはデータベース化されたデータもかなり存在

    • 極めてめんどくさいし, 入力ミスが発生する可能性
  25. 手入力すると気づくこと • 例外的な表記が, 定型なデータになっているはずなのに, とても たくさんある • 長い文章の表記 • 抜けている情報をどう表記するか

    • 「主な商品」のカッコ内をどう処理するか • 名前の姓と名の間の空白は全角にすべきか、半角にすべきか • 難しい名前をどう処理するか • 元号はデータとして起こしたほうがよいか? • 打ち込んだデータが正しく入力されているかのダブルチェック が必要
  26. データベース設計の重要性 • データをどういった形式で, どう分割して保存するか • SQL の場合; データの形式を細かく指定 (次回講義のモジュール 4.2

    と 4.3 参照) • 文字起こしの場合も, スクレイピングやRPA でデータを取得す る場合も, • 1. 元データからどのデータを取得するか • 2. 取得する場合, どういった形式でデータを取得するか • 3. 例外的なデータ/データが入力されていない場合, どう処理するか それぞれ検討する必要がある
  27. 今日のまとめ: データ分析はデータ設計・収 集までの作業で70-80%

  28. 1.2&1.3 Web からデータを集める

  29. Web からデータを集める • 2020年7月時点も、大学の図書館や国会図書館の機能が限定さ れているので、Web からデータを集めて分析出来る方法をご紹 介したいと思います • 秋や冬のタイミングで再び大学がクローズした場合も、卒論 etc..

    が作 成出来るように • まずは、Web スクレイピングと, Twitter API からデータ取得を 取り扱います。次回は個別のケースについてご説明出来ればと 思います
  30. Web スクレイピングする • 食べログのレ ビュー情報を取得 して, 東京のラー メン店/フレンチ レストランなラン キングを作成する

    引用; https://qiita.com/toshiyuki_tsutsui/items/f143946944a428ed105b?fbclid=IwAR1xYwmpS0xGbmbyAz7SVlETwhyguMFEYsgdg- Niap27Mj3XurUHjJoG-Bk
  31. Web スクレイピングする • 取ってきたいデータ • 店舗名:store_name • 食べログ点数:score • 口コミ件数:review_cnt

    • 口コミ文章:review
  32. Web スクレイピングする • 店名の一覧を取得する

  33. Web スクレイピングする • 引数として, self, list_url, mode を指定 する •

    requests.get で当該URL からデータが 取得できるか確認する • BeautifulSoup を用い, html の parse を行う. • soup_a_list で店名のリストを一括して 取得する • A タグの list-rst__rst-name-target 部 分からデータを取得する
  34. Web スクレイピングする • (Google Chromeの場合) F12 を押して, ソースコードを参照する • タグを確認する

  35. Web スクレイピングする 店舗名称の部分のソースコードを確認し, store_name_tag に, データの取得範囲を指定し, store_name で span内のstring を取

    得することを指定する
  36. Web スクレイピングする • 得点に関連するソースコードを確認する

  37. Web スクレイピングする • 評価点数の部分のソースコードを確認し, rating_score_tag に, データの取得範囲を指定 (bタグの, c-rating_val クラスから取

    得する) し, rating_score で span内のstring を取得することを 指定する
  38. Web スクレイピングする Tabelog 関数にラーメンのお店一覧のURLを渡す

  39. Web スクレイピングする 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4

    4.05 4.1 4.15 中華そば しば田 麺尊 RAGE 饗 くろ喜 ラーメン屋 トイ・ボックス ほっこり中華そば もつけ らーめん改 中華ソバ 伊吹 八雲 真鯛らーめん 麺魚 本店 Japanese Soba Noodles 蔦 麺 みつヰ 純手打ち だるま らぁ麺やまぐち 麺屋吉左右 中華そば屋 伊藤 中華蕎麦 蘭鋳 中華蕎麦にし乃 MENSHO 迂直 煮干鰮らーめん 圓 はつね 中華そば 満鶏軒 町田汁場 しおらーめん進化 町田駅前店 麺処 びぎ屋 らぁ麺やまぐち 辣式
  40. 麺尊RAGE

  41. Web スクレイピングする ※. 著作権の都合上、口コミ内容は薄消しで

  42. Web スクレイピン グする • Wordcloud を作成 • 作り方はテキスト分析回で • マスク画像を用意

  43. 5. Web スクレイピングする • Web スクレイピングの注意 • データをダウンロードするとき • 目的は下記のものに限る。

    • * 個人や家族間で使用する * Web検索サービスを提供する * 情報解析をする ※参考:著作権法第30条・著作権法第 47条(6,7) • 対象コンテンツは下記のものに限る。 • * 文章(データベースのコンテンツの場 合はコンテンツの一部のみに留めてお く) * 画像(同上) * 音声(パブリックドメイン等のオープ ンなライセンスの物に限る) * 映像(同上) ※参考:著作権法第30条・著作権法第 47条(7) • Webサイトへアクセスする時は下 記の制限を守る。 • * robots.txt/robotsメタタグのアク セス制限内容を守る。 * robots.txtがない場合でも、サー バアクセスの間隔を1秒以上空けるよ うにする。 * Pragma:No-cacheメタタグが設 定されているページはダウンロード しない。 * rel=”nofollow”が設定されている リンクはクローラーで辿らない。 * 会員のみが閲覧できるページの場 合は利用規約を守る。 * 情報収集を禁止する措置(ex.ア クセス制限)がクローリング時に取 られていた場合は、既に取得してい た情報を含めて削除する。 ※参考:著作権法第47条(6) https://qiita.com/nezuq/items/c5e827e1827e7cb29011
  44. 5. Web スクレイピングする • その2; Panda の機能を用いて Web サイト上の表を取得する #女性アイドルのキャパ数

    url = ‘https://wasteofpops.hatenablog.com/entry/2019/05/01/000000' dfs3 = pd.read_html(url) print(dfs3) URLを指定する Web ページ上のテーブルを取得する
  45. 5. Web スクレイピングする • Panda の機能を用いて Web サイト上の表を取得する

  46. import seaborn as sns sns.jointplot(followers,cd) sns.jointplot(followers, cd, xlim=(0,10000), ylim=(0,10000), kind="scatter")

  47. equation_df=pd.concat([cd, followers], axis=1) sns.heatmap(equation_df, vmax=5000) filtered = cd[(cd >= 0)

    & (cd < 10000)] ax = sns.distplot(filtered, kde=False);
  48. パチンコホール分析 • 最寄り駅前にはパチンコ屋がふたつ • ひとつは、4/12 日急に人がいなく なった • どうやら倒産したらしい •

    もうひとつは、その後も営業 • その後、4/21 日まで営業 • 「寡占だったローカルな市場が独占 になるから、百合子に怒られても継 続して独占利潤を獲得する!これ進 研ゼミでやったやつだ!」
  49. データ収集用 Notebook • https://www.dropbox.com/s/dywtbaquu46ipty/%E3%83%91 %E3%83%81%E3%83%B3%E3%82%B3%E3%83%9B%E3%83% BC%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF_%E3 %82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94 %E3%83%B3%E3%82%B0%E7%94%A8_forDS2020.ipynb?dl= 0

  50. やったこと(データセットの選定) 1. 全国47都道府県のパチンコホールの営業/休業情報を探す 1. ググったり 2. Twitter のパチンコ垢なひとがどう情報を探しているのか確認 2. 自分で探すのは面倒なので、データベースサイトを探す

    3. 5ちゃんねるまとめサイトのうち、パチンコにフォーカスした サイトで、「営業中のパチンコホール」を教えてくれるサイ トを見つける 4. ひとつのデータソースだけだとデータの完備性に不安がある ので、複数ソースを辿れるようにする
  51. データソースの選定 • ひとつめ • ここって昔はパチンコ屋?(ここパチ?) • http://koko-pachi.com/htm/korona.index.htm • 全国のパチンコホールの営業・休業情報を掲載している •

    二つ目の、P-world に掲載されていないパチンコホールの情報も掲載してい る • ふたつめ • P-World • https://www.p-world.co.jp/index.html • パチンコホール・パチンコ機種情報が掲載 • このふたつでカバーされていない店舗情報は、Twitter 検索で取得
  52. データソースの取得 • Web スクレイピングで、まとめてデータを取ってくる • Python 3.x + Jupyter な環境で、20行くらいのコードを書く

    • 今日はここの解説がメイン • そのままだと、不必要な情報がたくさん入っているので、適宜 除去する (データクリーニング and/or データクレンジング) • データソースを確認すると、休業後の再開日が明記されている 場合がある。緊急事態宣言が延長した場合に、パチンコホール が休業要請に従わず再開するケースを想定して、定期的にデー タソースからサンプリングすることにする • 4/16 日から開始。ほぼ毎日データを16:00 時に取得する
  53. パチンコの営業/休業データを持ってくるコード • 前回の講義で解説した, Panda と Numpy を使います • 取得元の Web

    サイトの構造を確認し, 47都道府県のローマ 字表記をリストとして指定します。 • “list“として指定します • “URL” に、URL のうち変動しない部分を記載します。
  54. パチンコの営業/休業データを持ってくるコード • len 関数を使って, list の長さを取得して, それを range に放り 込み,

    for 文を廻します (前回講義参照) • Data3 という DataFrame 方式の空の箱を準備します • データの取得元のURL を、文字列を結合して作成します. • Panda の read_html 機能を用いて, url3 内にある Table タグの データをまとめて取得します. 取得したデータを data3 に放り 込みます.
  55. パチンコの営業/休業データを持ってくるコード • 作業用にラベルを付与します • .dropna を用いて, 不要なデータ部 分を削除します. • 同様に,

    B と E と F 列も不必要な データなので削除します. • その後, データが不完備なエントリ を削除します. • Label として, ファイル名を作成し ます. • data3 を to_csv メソッドを用いて 出力します. • これにより、各都道府県ごとのパチ ンコホール情報を掲載した csv ファ イルが作成されます
  56. 得られた素材 • ひとつひとつコピペするよりは全然楽 • ここから先はさらなるクリーニングが必要であります。

  57. 累計休業店舗 累計開店中店舗 1. 2020/4/8; 緊急事態宣言公布 2. 2020/4/8: 大阪府遊技業協同組合、組合員に休業を要請 3. 2020/4/11;

    東京都, パチンコ店に対する休業要請 4. 2020/4/14; 大阪府, パチンコ店に対する休業要請 7. 2020/4/24; 大阪府、休業要請に応じないパチンコ店を公表 6. 2020/4/17; パチンコホールで初の倒産公表 5. 2020/4/16; 緊急事態宣言, 全国に拡大 全国パチンコホール(7,950店) の開店/休業率の推移[2020/4/28 16:00時点] 出所: P-world, ここって昔はパチンコ屋? 休業開始日
  58. 2020/4/8; 緊急事態宣言公布 2020/4/11; 東京都, パチンコ店に対する休業要請 2020/4/8: 大阪府遊技業協同組合、組合員に休業を要請 2020/4/24; 大阪府、休業要請に応じないパチンコ店を公表 2020/4/27;

    東京都, パチンコホールの 店名公表予定を発表 出所: P-world, ここって昔はパチンコ屋? パチンコホール休業率 2020/4/24; 東京都遊協、最後通告および「除名手続き」検討 2020/4/16; 愛知県、パチンコホールに休業要請 2020/4/17; パチンコホールで初の倒産公表 2020/4/16; 緊急事態宣言, 全国に拡大 2020/4/20; 北海道、パチンコホールに休業要請 2020/4/28; 北海道、パチンコホー ルに休業再要請
  59. パチンコホール営業/休業/閉店数推移 (2020/4/2-2020/5/6) 出所: P-world, ここって昔はパチンコ屋? 大手パチンコホール数= 1219 非大手パチンコホール数= 6608

  60. Web スクレイピングその2; 補助金ポータル • 政府/地方自治体の補助金情報が網羅されたポータル • https://hojyokin-portal.jp/

  61. 補助金ポータル • 取得できそうな情報 • 補助金名 • 概要 • 地域 •

    実施機関 • 公募期間 • 上限金額・助成額 • 補助率 • 利用目的 • 対象経費 • 公式公募ページ
  62. スクレイピングの方法 1. そもそも、スクレイピングをしてもOKか確認する 2. Web の遷移構造を確認する 3. データを取得したい Web ページの構造を確認する

    コーディングする
  63. Step1. 規約を読んでみよう • ⑧IDやパスワードを不正に使用する行為 • ⑨第三者に成りすます行為 • ⑩当社が事前に許諾しない本サービス上での宣伝、広告、 勧誘、又は営業行為 •

    ⑪本サービスの他の利用者又はその他の第三者に不利益、 損害、不快感を与える行為 • ⑫本サービスの他の利用者の情報の収集 • ⑬反社会的勢力等への利益供与 • ⑭前各号の行為を直接又は間接に惹起し、又は容易にす る行為 • ⑮前各号の行為を試みること • ⑯その他、当社が不適切と合理的に判断する行為 • 第7条(禁止事項) • 登録ユーザーは、本サービスの利用にあたり、以下の各 号のいずれかに該当する行為又は該当するおそれがある と当社が合理的に判断する行為をしてはならないものと します。 • ①本サービスにより提供する情報(全部、一部を問いま せん。)を、当社の事前の同意なしに、複写もしくはそ の他の方法により再生、複製、送付、譲渡、頒布、配布、 転売又はこれらの目的で使用するために保管する行為 • ②本規約に違反する行為 • ③法令に違反する行為または犯罪行為に関連する行為 • ④公序良俗に反する行為 • ⑤当社、本サービスの他の利用者又はその他の第三者の 知的財産権、肖像権、プライバシー権、名誉、その他の 権利又は利益を侵害する行為 • ⑥当社や本サービスの運営を妨げたり、信用を毀損する 行為 • ⑦当社のシステムに対するリバースエンジニアリングそ の他の解析行為 https://hojyokin-portal.jp/rule 6や7 に抵触しない形で進めればよい?
  64. Step2 補助金の情報が掲載されているURL の構 造を確認すると、補助金ごとにID が割り 当てられており、それがURL になってい ることが確認できる URL の末尾を変更させることで、補助金

    の情報をまとめて取得することにする
  65. Step3 • Google Chrome でF12 を押して、サイトの論理構造を確認する

  66. Step3 (cont.) • 補助金 • H1タグ • class=p-subsidy__heading • 補助金の概要は

    • div タグ • Class=p-subsidy__text が指定されていることがわか る。
  67. Step3(cont.) • Table タグ • Class=“p- subsidy__table“ に、地域や実施機関や公募 期間などの情報が含まれて いることが確認出来る

  68. コーディングの流れ • 必要なパッケージをインポートする • URL を指定する • ID 分繰り返し作業を行う (for

    文) • データを取得するURL を作成する • URL にアクセス出来るか確認し、存在しない場合例外処理を行う • Panda でtable タグを一括して取得する • データを接合するために、table タグを転置する • Beautifulsoup で h1 タグと div タグから必要な情報を取得する • 次のループに行くタイミングで、20秒待つ • データを保存する
  69. コーディングの流れ(1) • 必要なパッケージをイン ポートする • URL を指定して、それを url1 に保存する •

    空の DataFrame を data4 として作成する • 今回は、新しい補助金情 報から古い順にたどる • Numpy で連番を作成する
  70. コーディングの流れ(2) • ID 分データの取得を繰り返すため、list の長さを len 関数で取得し、その回数分 繰り返す (for 文)

    • リストのうち, j 番目の値をlist から取り出 し, それを文字列にして, URL に指定する • request.urlopen(url3)で、指定したURLが 開くかテストする (try文) もしうまく動作 しない場合には, 例外処理を行う (後述) • url3 上にある table タグから、データを 取得し, dfs に保存する • 続いて, data3 にそれを追記する • 次のID にデータが接合出来るように, 取 得したテーブルを転置する (行と列を入れ 替える)
  71. コーディングの流れ(3) • Response に指定したURL から, Web ページを parse する •

    H1 タグのクラスが、p- subsidy__heading になっているもの を探し出し、それを hojyokin_namae という変数に代入 する • DIV タグのクラスが p-subsidy__text になっているものを探しだし、それ を hojyokin_shousai という変数に代 入する • 取り出したデータから、テキスト情 報を取り出す • Data3 に新しい列名 “補助金名”を作 成し、そこにtest2 を代入する • Data3 に新しい列名 “補助金概要”を 作成し、そこにtest3 を代入する
  72. コーディングの流れ(4) • 取得したデータdata3 を data4 にappend する • 次のループに動く前に、time 関数を使って20秒待つ

    • Response を閉じる • URL が開かない場合 (HTTPError)、not available と表示する • これをID 分繰り返す • データをCSV に保存する
  73. 取得結果

  74. まとめ • Web はデータの宝箱や~ (引用: 彦麻呂) • ただし, 取ってきていいデータとそうではないデータがあります •

    Web 上で「正規化されていない」データセットはたくさん眠っ ています。ご自身の業務ニーズやリサーチクエスチョンに沿っ てデータセットの種を探せば案外見つかります • こうしたデータセットと、公的なデータソースを組み合わせれ ばいろいろなことが出来ます
  75. 1.4 地域情報(RESAS)の探し方

  76. 今回利用するNotebook • Jupyter Notebook 版 • https://www.dropbox.com/s/a eu6bk2img5wg1z/RESAS%20A PI%20%E3%81%8B%E3%82%8 9%E3%83%87%E3%83%BC%E

    3%82%BF%E3%82%92%E5%8 F%96%E5%BE%97%E3%81%9 9%E3%82%8B%28ver%202019. 10.05%29.ipynb?dl=0 • Google Colaboratory 版 • https://colab.research.google. com/drive/1Tqe2LmituEjA96V jFW0EyPqOTxpXa_k7
  77. RESAS • https://resas.go.jp • 地域経済分析システム(2015年4月~) • ~Regional Economy Society Analyzing

    System~ • 地方創生のデータ利用の「入口」として、地域経済に関する官民の 様々 なデータを、地図やグラフ等で分かりやすく「見える化」してい るシステム • 各地域が、自らの強み・弱みや課題を分析し、その解決策を検討する ことを後押しするツール • Evidence Based Policy Making を目指した活動 引用; http://www.kantei.go.jp/jp/singi/sousei/resas/pdf/h31-01-07- newinfo.pdf
  78. RESAS の収録データ http://www.kantei.go.jp/jp/singi/sousei/resas/pdf/h31-02-28-data.pdf

  79. 実習2; RESAS API からデータを取得する • https://opendata.resas- portal.go.jp/ • API経由でデータを取得する •

    右上の “RESAS-API 利用登 録・ログイン” からアカウン ト登録を行い, API キーを取 得する
  80. 実習2; RESAS API からデータを取得する • 取得したAPI キーを, などの形式で保存する(このとき, 文字コード utf-8

    で保存すること) {“X-API-KEY”:“API 登録画面に表示されたAPI キー"}
  81. 実習2; RESAS をAPI で利用する • Notebook 上で必要なライブラリをインポートする

  82. 実習2; RESAS をAPI で利用する • API キーを取得できるか確認する.

  83. 実習2; RESAS をAPI で利用する • 都道府県のコード情報 を取り込む • データを読み込む先の URL

    情報を指定 • URL とともに, APIキー を指定する • データを取り込み, 中身 を確認する
  84. 実習2. RESAS をAPI で利用する • データを取得できる

  85. 実習2. RESAS をAPI で利用する • Panda Dataframe に変換する

  86. 実習2. RESAS をAPI で利用する • 東京都の市町村コードを取得する

  87. 実習2. RESAS をAPI で利用する • 指定したURL にAPI キーを渡す • 東京23区の地域コードが取得できる

  88. 実習2. RESAS をAPI で利用する • 出力結果

  89. 実習2. RESAS を API で利用する • Panda Dataframe 形式に変換する

  90. 実習2. RESAS を API で利用する • 出力結果

  91. 実習2. RESAS をAPI で利用する • 一人あたりの固定資産税を取得する • 今回は東京都 (prefCode =

    13) 国立市 (cityCode = 13215) の データをまとめて取り出す.
  92. 実習2. RESAS をAPI で利用する • 出力結果

  93. 実習2. RESAS をAPI で利用する • Panda DataFrame 形式に変換する

  94. 実習2. RESAS をAPI で利用する • 都道府県ごとの集計値 を取得する • For 文で47都道府県分

    のデータを取得する • 創業比率のデータ • https://opendata.res as- portal.go.jp/docs/api /v1/municipality/foun dation/perYear.html
  95. Tips: For 文 • 同じ作業を繰り返すときの構文 • - Python の場合, Range

    関数 を利用することで, その範囲内 で作業を繰り返すことができる • - たとえば, for i in range (1, 48) は, 1 から48 まで i という数 字をひとつずつ増やしなながら 作業することを可能にする • For 変数名 in (繰り返す範囲): • 実行する内容
  96. 実習2. RESAS を API で利用する • データの取得結果

  97. 実習2. RESAS を API で利用する • 市町村コードを Dataframe で保存し, コードのみ取り出す

  98. 実習2. RESAS をAPI で利用する • 出力結果 • 東京都の市町村コードのみ取得 できる

  99. 実習2. RESAS を API で利用する • 先程取得した東京 都の区別コードリ ストを用い, 各区ご

    との創業比率を取 得する • DataFrame 形式に 変換し, 保存する
  100. 実習2. RESAS を API で利用する • 出力結果

  101. 実習2. RESAS をAPI で利用する • 全都道府県の市区町村コードを取得し, DataFrame として保存する

  102. 実習2. RESAS を API で利用する • データの取得結果

  103. 実習2. RESAS をAPI で利用する • 市町村レベルの企業数のデー タを取得する • https://opendata.resas- portal.go.jp/docs/api/v1/muni

    cipality/company/perYear.htm l • 必要あらば, 産業分類のデータ も取得できる • 先程作成した city_list を利用し て, 全市区町村+特別区の企業 数データを取得する
  104. 実習2. RESAS を API で利用する • 細かな解説(1) • 取得するAPIのURL を指定する

    • 後ほどデータを放り込む空の DataFrame を用意する • Zip 関数を使って, city_list.prefCode および city_list.cityCode ごとに 繰り返しの処理を行う • 今回の場合は, prefCode=1 の北海道から, 取得した cityCode ごとにデータを取 得する
  105. 実習2. RESAS をAPI で利用する • 細かな解説(2) • データが存在しない市 区町村があるため, そ

    の場合 “not available” と表示させる • 企業数 (result), 市区町 村名/コード, 都道府県 名/コードを取得する • JSON からDataFrame 形式に変換して, それ をs に追記していく
  106. Tips: zip と try 関数 • Zip 関数: • 複数の要素を同時に取得すること

    を可能にする • 例外処理 (try except): • 実行中にエラーが起きた場合, 例外 処理を指定することができる 引用; https://note.nkmk.me/python-try-except-else-fina
  107. 実習2. RESAS をAPI で利用する • 出力結果 • データが取得できなかった市区 町村は not

    available と表示さ れる • それ以外のデータがリストとし て表示される
  108. 実習2. RESAS をAPI で利用する • 都道府県ごとの累計企業数を 集計する • 出力結果 s.groupby('prefName')['value'].sum()

  109. 実習2. RESAS をAPI で利用する • 都道府県ごとに平均値と総数を導出する import numpy as np

    s.groupby('prefName').agg({'value' : [np.sum, np.mean]}) graph_s=s.groupby('prefName').agg({'value' : [np.sum, np.mean]}) print(graph_s)
  110. 実習2. RESAS を API で利用する • 出力結果

  111. 実習2. RESAS を API で利用する • 棒グラフをプロットする import matplotlib import

    pandas as pd from matplotlib import pylab as plt # matplotlibのデフォルトフォントをKozuka Gothic Pro に設定 font = {'family' : 'Kozuka Gothic Pro'} matplotlib.rc('font', **font) graph_s graph_s.plot.bar(y=['value'], alpha=0.6, figsize=(15,4)) • デフォルトのplot は日本語に対応していないため, フォントを指定する作業を行う
  112. 実習2. RESAS を API で利用する • 出力結果

  113. やってみよう • RESAS のAPI を使って, 都道府県や市区町村, 産業分 類ごとにデータを取得し, 基礎統計の確認などを行う •

    たぶん(卒論や修論や博論に)使えそうなところ • Difference in Difference なモデルの設定 • Treated Group と Control Group を設定
  114. やってみよう(2) • データリストはこちら; • https://opendata.resas-portal.go.jp/docs/api/v1/index.html • 別のAPIセット: • 法人インフォ: https://hojin-info.go.jp/hojin/TopPage

    • 科研費: https://support.nii.ac.jp/ja/kaken/api/api_outline • SPARQL Endpoint については次回
  115. 1.5 SNS データをAPI で処理

  116. 利用する Notebook • Jupyter Notebook • https://www.dropbox.com/s/nl78z6nql0kx d71/Twitter%20%E3%81%AE%E3%83%87 %E3%83%BC%E3%82%BF%E3%82%92%E 5%8F%96%E5%BE%97%E3%81%99%E3%8

    2%8B_fords2020.ipynb?dl=0
  117. ユースケース; 顧客動向をオフラインではなくオンラインで把握する • あなたはオフラインマーケティングのスペシャリストです • フィジカルなマーケティング手法を用いて、これまで数々の実績を 残してきました • ところが、COVID-19 の流行により、これまでの顧客エンドポイン

    トの多くが利用できなくなりました • これまでやっていた販促物の配布ではなく、オンラインにあるデー タを用いて顧客動向を把握することにしました • まずは、自社に関連する言葉を、ソーシャルメディア上から検索す ることに • Twitter からデータを取得することにしました • ツイート数やリツイート数, Favorite 数、それから、実際のツイートの中身 も観察することにしました
  118. B2Bマーケティングフローの変化 https://note.com/shintakai/n/n39f60de2701e

  119. B2B マーケティングフローの変化 https://note.com/shintakai/n/n39f60de2701e

  120. 作業フロー 1. Twitter APIを利用するための手続きをする 2. Twitter API 経由からデータを取得するために, コーディング する

    3. 取得したデータを観察し、妥当性を検証する (4. データを整理し、レポーティングする) (とりあえず、今日は1. から 3. まで)
  121. Twitter のAPI を申請する • https://developer.twitter.com にアクセスする

  122. Twitter の API を申請する • Apply for a developer account

    をクリックする
  123. Twitter の API を申請する • 利用目的を選択する

  124. Twitter の API を申請する 必要事項を入力し, Next をクリックする

  125. Twitter の API を申請する • なぜ API を利用したいのか記入する

  126. Twitter の API を申請する • 内容を確認し, Looks Good! をクリックする

  127. Twitter の API を申請する • Submit Application をクリックする

  128. Twitter の API を申請する • E-mail でメッセージが届くので Confirmation をする

  129. Twitter の API を申請する • E-mail での Confirm を終えると, Developer

    ページに遷移する
  130. Twitter の API キーを取得する • Create an App をクリックする

  131. Twitter の API キーを取得する • “Create an App” をクリックする

  132. Twitter の API キーを取得する • Application の詳細を記入する

  133. Twitter の API キーを取得する • Create をクリックする

  134. Twitter の API キーを取得する • Keys and Tokens をクリックする

  135. Twitter の API キーを取得する • Access Token & access token

    secret の Create をクリックする
  136. Twitter の API キーを取得する • Access Token が生成される

  137. 練習. 自分のタイムライン情報を取得する • Twitter パッケージをインストールする

  138. 練習. 自分のタイムライン情報を取得する • 先程取得したAPI キー情報を指定する • Twitter に Oauth 経由でアクセスする

    • 自分のタイムライン情報を取得する
  139. 自分のタイムライン情報を取得する • 自分がフォローしているユーザーのツイートが取得される

  140. 特定のキーワードに基づきツイートを取得する(1) • 必要なパッケージ (tweppy, datetime, codecs, csv) をイン ポートする •

    API 認証に必要な Consumer Key や Access Token を指定 する • Auth に鍵を渡し, tweepy 経由でTwitter のAPI をノックする
  141. 特定のキーワードに基づきツイートを取 得する(2) • 検索キーワードをq に指定する • 別途、ツイートを取得するリスト tweets_data を作成する

  142. 特定のキーワードに基づきキーワードを 取得する • tweepy.Curserを 用い関連するツ イートを一件ずつ 取得する • ツイートのID •

    ツイートをした ユーザ名 • ツイートをした 場所 • ツイートをした 時間 • ツイートがふぁ ぼられた回数 • ツイートがリツ イートされた回 数 が取得できる
  143. 特定のキーワードに基づきツイートを取 得する • Waseda.csv というテキストファイルに書き出す • エンコーディングはutf-8 • tweets_data の内容を一行ずつ書き込んでいく

  144. 特定のキーワードに基づきツイートを取得する • 出力結果

  145. e. 取得したデータを解析する (wordcloud) • 早稲田大学 • 慶應大学

  146. e. 取得したデータを解析する(wordcloud; cont.) • 甲南大学 一橋大学

  147. SNS データは何に使える? • 消費者行動 (マーケティングっぽい) • 特定企業や産業のレピュテーションの変化 • 研究{者}の社会的なインパクトの測定 ->

    特定の研究者の名前 を含むツイートの回数, リツイートの回数, Fav 数 etc… • 具体的なテキストデータの処理技法は数回後の講義で。
  148. Tips; データが使える/使えないSNS • Mixi • Mixi graph api; http://developer.mixi.co.jp/conn ect/mixi_graph_api/

    • Twitter • API でデータを取得可能, 過去デー タに関しては要課金 • Instagram • API 提供, 審査あり; • https://developers.facebook.com /docs/instagram-api • Facebook • Graph API; https://developers.facebook.com /docs/graph-api?locale=ja_JP • スクレイピングは全面的に禁止; https://www.octoparse.jp/blog/5 -things-you-need-to-know- before-scraping-data-from- facebook/ • Tiktok • Unofficial API は発見; https://github.com/szdc/tiktok- api
  149. API を用いたデータ取得のまとめ • 鍵を手に入れる作業がまず必要です(これが意外に面倒) • データの提供方式がAPIごとに異なるので、この講義でも何回 か別のパターンをご紹介出来ればと考えています • 具体的にはRESAS •

    Web からコピペするよりも、一つ一つ画面を追いかけるよりも 複雑なデータを取得することができます
  150. THANKS yasushi.hara@r.hit-u.ac.jp