Udemyでプログラミングを教えていますUdemy

Pythonでのスクレイピングとデータ分析のやり方

  • URLをコピーしました!
目次

Pythonのインストール

ネット上には、いろいろな情報が公開されています。プログラムを使うと自 動で集めることをクローリングといいます。さらに収集したデータを解析し て、必要なデータを取り出すことをスクレイピングといいます。

Pythonはネットへアクセスするライブラリが充実していて、「クローリン グ」や「スクレイピング」をしやすい言語になっています。

Pythonをインストール

https://www.python.org/downloads/

からインストールします。 自動的に自分のOSに合わせたiページが表示されます。

windowsの方は、「Add Python 3.x to PATH」は必ずチェックを入れる ようにしてください。

Macの方へPython3.6以降では、インストール後にネットワーク通信に使用 するSSL証明書をインストールする必要があります。Python3.xフォルダを 開き、「install Certificates.command」ファイルをダブルクリックしてく ださい。ターミナルが自動的に起動して、証明書のインストールが実行され ます。[プロセスが完了しました]と表示されたら、表示されたターミナルを 終了してください。

VSCodeの導入

requestsでアクセスしてみる

requests

インターネットにアクセスする命令としては、Pythonの標準ライブラリに 「urllib request」があります。しかし、もっと簡単に使える「requests」 という外部ライブラリがあるので、これを使います。

ライブラリのインストール方法

Windowsではコマンドプロンプトを起動

スタートメニューを開いて、[Windowsシステムツール]→コマンドプロンプ トを起動します。そして以下のpip コマンドでインストールします。

pip install requests

macOSではターミナルを起動

[アプリケーション]フォルダの中の[ユーティリティ]フォルダにあるターミナ ルをクリック、起動させます。以下pip3コマンドでインストールします。

pip3 install requests

HTMLファイルを読み込むプログラム

インストールしたrequestsを使って、ネット上のHTMLファイルを読み込ん で表示させてみます。練習用に簡単なWebページを作ったので、このHTML ファイルを読み込むプログラムを作ってみましょう。

練習用テストページ

https://creaters-you.com/

(テスト用ページには以下のコードを書いています)

<!DOCTYPE html> <html lang="ja"> <head> 
<metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width, initial- scale=1.0">
 <title>スクレイピングを学ぶ</title>
 </head>
 <body>
 <h1>寺中晴紀のスクレイピング講座</h1>
 <div id= "chap1">
 <h2>Pythonでデータをダウンロード</h2>
 <ol>
 <li>スクレイピングって何</li>
 <li>Pythonをインストール</li>
 <li>Requestsでアクセスしてみよう</li>
 </ol>
 </div><div id= "chap2">
 <h2>HTMLを解析する</h2>
 <ol>
 <li>HTMLを解析</li>
 <li>ニュースの記事を取得</li>
 <li>画像をダウンロード</li>
 </ol>
 </div>
 <p><img src="pc.png" width="50%" height="50%"></p>
 <p><img src="pc2.png" width="50%" height="50%"></p>
 <p><a href="https://creaters-you.com/index2.html">絶対URLでリンク へとぶ</a></p>
 <p><a href="index3.html">相対URLでリンクへとぶ</a></p>
 </body>
 </html> 

インターネット上のWebページには、「requests.get(URL)」という命令で 取得できます。ただし、取得したデータにはいろいろな情報が入っているの で、そこから「.text」で文字列データを取り出します。また、日本語が文字 化けしないように、

requests.encoding=response.apparent_encoding

と指定しておきます。

step/step1.py

import requests
 # Webページを取得する
 url ="https://creaters-you.com/"
 response = requests.get(url)
 # 文字化けしないようにする
 response.encoding = response.apparent_encoding # 取得した文字列データを表示する print(response.text) 

テキストファイルに書き込む:open、close

HTMLファイルを読み込めたので、これをファイルに書き込むかたちで保存します。

step/step2.py

import requests 
 # Webページを取得する
 url ="https://creaters-you.com/" 
response = requests.get(url)
 # 文字化けしないようにする
 response.encoding = response.apparent_encoding filename="download.txt"
 f=open(filename,mode="w")
 f.write(response.text)

f.close() 実行すると、step1フォルダの中に「download.txt」というテキストファイ ルが作られます。この中に、取り出したデータがしるされます。

openのいろいろなモード

r  読み込み用

w  書き込み用

a. 追加書き込み(書き足す)

t. テキストモード

HTMLを解析する

HTMLって何?という方は下の記事をご参照ください。

Beautiful Soup をインストール

HTMLを簡単に解析できるライブラリがあります。それがBeautifil Soupで す。外部ライブライなので、pipコマンドでインストールします。

windowsの方

pip install beautifulsoup4

macOSの方

pip3 install beaftifulssoup4

Beautifu Soupは、bs4というパッケージに入っているので、「from bs4 import BeautifulSoup」とします。

次にそのHTMLデータ(.content)をBeautifulSoup(HTMLデー タ,”html.parser”)に渡します。

step/step3.py

import requests
 from bs4 import BeautifulSoup
 import urllib load_url="https://creaters-you.com/index.html" html=requests.get(load_url) 
soup=BeautifulSoup(html.content,"html.parser") print(soup) 

実行結果

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>スクレイピングを学ぶ</title>
</head>
<body>
  <h1>寺中晴紀のスクレイピング講座</h1>
  <div id= "chap1">
    <h2>Pythonでデータをダウンロード</h2>
    <ol>
      <li>スクレイピングって何</li>
      <li>Pythonをインストール</li>
      <li>Requestsでアクセスしてみよう</li>
    </ol>
  </div>
  </div>
  <div id= "chap2">
  <h2>HTMLを解析する</h2>
  <ol>
    <li>HTMLを解析</li>
    <li>ニュースの記事を取得</li>
    <li>画像をダウンロード</li>
  </ol>
  </div>
<p><img src="pc.png" width="50%" height="50%"></p>
<p><img src="pc2.png" width="50%" height="50%"></p>
<p><a href="https://creaters-you.com/index2.html">絶対URLでリンクへとぶ</a></p>
<p><a href="index3.html">相対URLでリンクへとぶ</a></p></body>
</html>

読み込んだHTMLがそのまま表示されています。ここからいろいろな要素を 取り出して行きます。

ここまで達成された方は、データ分析の適正があるかもしれません。この記事を最後まで進めた後は、より楽しく学べる、Pythonと実データで遊んで学ぶデータ分析講座 [ 梅津雄一 ]の書籍がおすすめです。

タグを探して表示する

step/3-1.py

要素が3つ表示されました。ここから文字列だけを表示させます。最後 に.textをつけます。3-1.pyを次のように変えます。

step/3-1.py

import requests
 from bs4 import BeautifulSoup
 import urllib 
load_url="https://creaters-you.com/index.html" html=requests.get(load_url) 
soup=BeautifulSoup(html.content,"html.parser") 
print(soup.find("title").text) print(soup.find("h2").text) print(soup.find(“li").text) 

実行結果

スクレイピングを学ぶ

Pythonでデータをダウンロード

スクレイピングって何

全てのタグを探して表示する

.find(タグ名)で取得できるのは1つだけです。全ての要素を取得するに は、.find_all(“タグ名”)を使います。そして、見つかった要素は、for文で取り 出せます。

step/step3-2.py

import requests
 from bs4 import BeautifulSoup
 import urllib load_url="https://creaters-you.com/index.html" html=requests.get(load_url) 
 soup=BeautifulSoup(html.content,"html.parser") for element in soup.find_all("li"):
 print(element.text) 

実行結果

スクレイピングって何

Pythonをインストール

Requestsでアクセスしてみよう

HTMLを解析

ニュースの記事を取得

画像をダウンロード

idやクラスで検索範囲を絞り込む

BeutifulSoupでは、id属性やclass属性の名前を使い、範囲を搾り混んで検 索することができます。

※classはPythonの予約語(最初から使い方が決められている言葉)で、その まま使えないので、「class_」と書きます。

もう一度テストWebページの構成を見ておきます。

<!DOCTYPE html>
 <html lang="ja">
 <head>
 <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width, initial- scale=1.0"> 
<title>スクレイピングを学ぶ</title> </head>
 <body> <h1>寺中晴紀のスクレイピング講座</h1> 
<div id= "chap1">
 <h2>Pythonでデータをダウンロード</h2>
 <ol> 
<li>スクレイピングって何</li> <li>Pythonをインストール</li> <li>Requestsでアクセスしてみよう</li> </ol> 
</div>
<div id= "chap2">
 <h2>HTMLを解析する</h2>
 <ol>
 <li>HTMLを解析</li> 
<li>ニュースの記事を取得</li> 
<li>画像をダウンロード</li> </ol> 
</div>
 <p><img src="pc.png" width="50%" height="50%"></p>
 <p><img src="pc2.png" width="50%" height="50%"></p>
 <p><a href="https://creaters-you.com/index2.html">絶対URLでリンク へとぶ</a></p>
 <p><a href="index3.html">相対URLでリンクへとぶ</a></p>
 </body>
 </html> 

この中の<div id=”chap1>の要素を取り出します。

step/3-3.py

import requests
 from bs4 import BeautifulSoup
 import urllib load_url="https://creaters-you.com/index.html" html=requests.get(load_url) soup=BeautifulSoup(html.content,"html.parser") chap1=soup.find(id="chap1")
 print(chap1) 

実行結果

<div id=”chap1″>

<h2>Pythonでデータをダウンロード</h2>

<ol>

<li>スクレイピングって何</li>

<li>Pythonをインストール</li>

<li>Requestsでアクセスしてみよう</li>

</ol>

</div>

id=“chap2”の要素が取得できました。

リストタグのみを表示させる

step/3-4.py

import requests 
from bs4 import BeautifulSoup 
load_url="https://creaters-you.com/" 
html=requests.get(load_url) 
soup=BeautifulSoup(html.content,"html.parser") 
#IDで検索 中身のliタグを表示 
chap1=soup.find(id="chap1") 
for element in chap1.find_all("li"): 
print(element.text) 

リンク一覧をファイルに書き出す

リンクのURLは、タグの中に「href=”URL”」と書かれています。これを取 り出すには、「get(属性名)」を使います。また、imgタグの「src=”URL”」 も同じように「.get(属性名)」を使います。

全てのaタグ(アンカータグといって、リンクさせるためのタグです)は、 for element in soup.find_all(“a”):

で、1つずつ取り出せます。

さらにリンクはhref属性なので、

url=element.get(“href”) と指定すれば取り出せます。

step/3-5.py

import requests
from bs4 import BeautifulSoup
import urllib load_url="https://creaters-you.com/index.html" html=requests.get(load_url) soup=BeautifulSoup(html.content,"html.parser") 
for element in soup.find_all("a"): 
print(element.text) url=element.get("href") print(url) 

相対URLでリンクへとぶ

index3.html

リンクが2つ表示されました。

絶対URLのhttps://creaters-you.com/index2.htmlと相対URLの index3.htmlです。

絶対URLはこのまま使えますが、相対URLは、絶対URLに直さないと、使え ません。絶対URLに変換していきましょう。

・・・疲れましたね。少し休憩しましょう。作業を進めていくと、目が疲れきませんか?

PCメガネはつけておいた方がいいですよ。

《5%OFFクーポン発行中!!》【圧倒的レビュー数3,000件!!楽天89冠】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 99.9% UV420 紫外線カット PCメガネ PC パソコン 眼鏡 メンズ レディース 度なし 伊達メガネ プレゼント

相対URLを絶対URLに変換する

ベースURLはどのページから見たURLなのかのURLです。今回の場合は、 https://creaters-you.com/になります。urllibをimportして、URLの変換 処理を追加します。

step/3-6.py

mport requests
from bs4 import BeautifulSoup
import urllib 
load_url="https://creaters-you.com/index.html" html=requests.get(load_url) soup=BeautifulSoup(html.content,"html.parser") 
for element in soup.find_all("a"): 
print(element.text) url=element.get("href") link_url=urllib.parse.urljoin(load_url , url) print(link_url)

絶対URLでリンクへとぶ

https://creaters-you.com/index2.html

相対URLでリンクへとぶ

https://creaters-you.com/index3.html

どちらも絶対URLで表示させることができました。

step/step3-7.py

import requests
from bs4 import BeautifulSoup
import urllib load_url="https://creaters-you.com/index.html" html=requests.get(load_url) soup=BeautifulSoup(html.content,"html.parser") filename="linklist.txt"
with open(filename , "w") as f:
        for element in soup.find_all("a"):
        url=element.get("href") link_url=urllib.parse.urljoin(load_url ,      url) f.write(element.text +"\n")
        f.write(link_url+"\n")

f.write(“\n”) 実行すると、リンク一覧ファイルの「link.txt」が作られます。

画像を一括ダウンロードしよう

画像をダウンロードするには、画像の絶対URLが必要になります。その方法 は後で解説するので、まずは用意したURLで画像をダウンロードしてみてく ださい。

画像ファイルを1枚だけダウンロード

https://creaters-you.com/

から、https://creaters- you.com/pc.pngというURLのサンプル画像をダウンロードします。3-8.py というファイルを作ってください。

ダウンロードの方法は、requestsでインターネットからデータを取得して、 ファイルに書き込むだけです。ただし、画像はバイナリーファイルなので、 開くときは、mode=”wb”を指定します。

保存する時には、ファイル名が必要なので、URLからファイル名を取り出し ます。

https://creaters-you.com/pc.png 

「/」で区切っているURLをバラバラにします。バラバラにした1番最後が ファイル名です。後ろから1番目なので、[ -1 ]と表します。

step/step3-8.py

import requests imge_url="https://creaters-you.com/pc.png" 
imgdata=requests.get(imf_url)
 filename=imge_url.split("/")[-1] with open(filename , mode="wb") as f: 
         f.write(img,data.content) 

そうすると pc.pngの画像がstepフォルダに保存されます。
慣れてきたら、後は、数をこなせば、より早く欲しいデータを収集することができます。
Python 実践データ分析 100本ノック 第2版 [ 下山輝昌 ]を読んで、数をこなしましょう。

ダウンロード用のフォルダを作って保存する

パソコン上にフォルダを作ったり、そのフォルダにいろいろアクセスしたり するには、「Path」を使います。 Pathはpathlibというパッケージに入っているので、

from pathlib import Path

と指定するだけで、importできます。

フォルダ名を指定して、Pathを作ったら、

.mkdir(exist_ok=True)

と命令すると、フォルダが作られます。また、その中のファイルにアクセスする ときは、「フォルダ.joinpath(“ファイル名”)」と、フォルダとファイル名を つなぐだけで、アクセスできるパス(道)が作れます。このパスに画像データ を書き出せば、フォルダ内に画像ファイルが作られます。

フォルダを作る書式

フォルダ=Path(“フォルダ名”) フォルダ.mkdir(exist_ok=True)

フォルダ.joinpath(“ファイル名”) 「download」というフォルダを作って、そこに「pc.png」という画像ファ イルを保存してみます。

step/3-9.py

import requests
 from pathlib import Path
 #保存フォルダを作る out_folder=Path("download") out_folder.mkdir(exist_ok=True) #画像ファイルを取得する image_url="https://creaters-you.com/pc.png" imgdata=requests.get(image_url) #フォルダ名にファイル名をつける filename=image_url.sprit("/")[-1] out_path=out_folder.joinpath(filename) #画像ファイルをファイルに書き出す
 with open(out_path , mode="wb") as f: 
         f.write(imgdata.content) 

実行すると、「step」フォルダの中に「dowload」フォルダが作られ、その 中に「pc.ong」という画像ファイルが書き出されます。

すべてのimgタグの画像ファイルURLを表示する

srep/3-10.py

import requests
 from bs4 import BeautifulSoup
 import urllib load_url="https://creaters-you.com" html=requests.get(load_url) soup=BeutifulSoup(html.content,"html.parser") #全てのimgタグを検索し、リンクを取得する
 for element in soup.find_all("img") 
     src=element.get("src") #絶対URLとファイルを表示する       
image_url=urllib.parse.urljoin(load_url)         
filename=image_url.split("/")[-1] 
print(image_url , ">>" , filename) 

実行結果

https://creaters-you.com/pc.png >> pc.png

https://creaters-you.com/pc2.png >> pc2.png

画像を一括ダウンロードするプログラム

アクセスし過ぎて相手のサーバーに負担をかけないようにするために「1回 アクセスしたら、1秒待つ」time.sleep(1)というプログラムをを追加してい ます。

srep/3-11.py

import requests
from bs4 import Beautiful Soup from pathlib import Path
 import urllib import time
 load_url="https://creaters-you.com/" html=requests.get(load_url) 
soup=BeautifulSopup(html.content,"html.parser)" out_folder=Path("download2") out_folder.mkdir(exist_ok=True)
for element in soup.find_all("img") 
       src=elenent.get("src")                            image_url=urllib.parse.urljoin(load_url,src)                                              imgdata=requests.get(image_url) 
filename=image_url.split("/")[-1]
out_path=out_folder.joinpath(filename) 
  with open(out_path , mode="wb") as f: 
        f.write(imgdata.content) 
        time.sleep(1) 

実行すると、download2というフォルダが作られ、その中に、pc.pngと pc2.pngという画像ファイルが書き込まれます。

データ分析の準備

名前,国語,数学,英語,理科,社会 
Aさん,75,89,76,97,77 
Bさん,65,100,75,82,76 
Cさん,90,84,96,82,94 
Dさん,70,73,63,56,79 
Eさん,82,91,84,80,78 
Fさん,86,92,92,92,95 

padasは、表データを読み込んで、データの追加や抽出、集計、書き出しなどを行える外部ライブラリです。

windowsにインストールするときはコマンドプロンプト

pip install pandas

macOSにインストールするときは、ターミナル

pip3 install pandas

表データは、テーブルと呼ばれます。横方向に並んでいる行と、縦方向に並 んでいる列でできています。

行は、レコードやロウとも呼ばれます。

列は、カラムや項目とも呼ばれます。

表データをファイルに保存するときに、CSVファイルがよく使われます。

CSVファイルとは、カンマで区切られたデータが何行も入ったテキストファイルです。ファイルの一行が1件のデータで、カンマで区切られた1つ1つが 要素です。1番左に数字が並んでいます。これをインデックスといいます。

pandasで表データの情報を表示

1-1.py

import pandas as pd 
#csvファイルを読み込む 
df=pd.read_csv("test.csv") 
#表データの情報を表示 
print("データの件数=",len(df)) 
print("項目名=" ,df.columns.values) 
print(“インデックス”,df.index.values) 

列データ、行データを表示する

df[“列名”]と指定すると、その1列のデータを取得できます。複数列のデー タは、df[“列名2” , “列名2”]と、リストで指定して取得します。test.csvの国 語と数学の列データを表示させます。

1行のデータは、df.loc[行番号]と指定するとその1行のデータを取得できます。複数行のデータは、df.loc[[行番号1,行番号2]]と、リストで指定して取 得できます。また、1つの要素は、df.loc[行番号][“列名”]と、行と列を指定 することで所得できます。

1-2.py

import pandas as pd 
#csvファイルを読み込む 
df=pd.read_csv("test.csv") 
#国語のデータを表示 
print("国語の列データ\n",df["国語"]) 
#国語と数学のデータを表示 
print("国語と数学のデータ\n",df[["国語","数学"]]) 
#Cさんのデータを表示 
print("Cさんのデータ\n",df.loc[2]) 
#CさんとDさんのデータ 
print("CさんとDさんのデータ\n",df.loc[[2,3]]) 
#指定した行の指定した列データを表示 
print(“Cさんの国語のデータ\n”,df.loc[2]["国語"]) 

表データの追加と削除

df.drop(“列名”,axis=1)

指定した行を削除するには、

df.drop(行番号,axis=0)

と指定します。

1-3.py

import pandas as pd 
#CSVファイルを読み込む 
df=pd.read_csv("test.csv") 
#1列のデータ(技術)を追加 
df["技術"]=[68,73,82,77,94,96] 
print("列データを追加",df) 
#1行のデータを追加 
df.loc[6]=["Gさん",90,89,70,97,77,84] 
print("行データを追加\n",df) 
#名前の列を削除 
print("名前の列を削除\n",df.drop("名前",axis=1)) 
#インデックス2の行を削除 
print(“インデックス2の行を削除\n",df.drop(2,axis=0)) 

条件に合うデータを抽出することができます。例えば、国語の王もくが90点 以上の行データを抽出したいときは、

df[df[“国語”]>=90]

と指定します。

データの加工と抽出

1-4.py

import pandas as pd 
df=pd.read_csv("test.csv") 
#条件に合うデータを抽出する 
data_s=df[df["国語"]>=90] 
print("国語が90点以上\n",data_s) 
data_c=df[df["数学"]<80] 
print("数学が80点未満\n",data_c) 

データを集計する

表データを集計することができます。最大値はdf[“列名”].max()、最小値は

df[“列名”].min()、平均値はdf[“列名”].mean()、

中央値はdf[“列名”].median()、合計値はdf[“列名”].sum()で求めることができます。

行と列を入れ替える

表データの行と列を入れ替えることができます。例えば、DataFrameに

「.T」をつけるだけで入れ替わります。またDataFrameを、Pythonで使う

リストに変換することもできます。「.values」とつけるだけです。

1-5.py

import pandas as pd 
df=pd.read_csv("test.csv") 
print("数学の最高点 =",df["数学"].max()) 
print("数学の最低点 =",df["数学"].min()) 
print("数学の平均値 =",df["数学"].mean()) 
print("数学の中央値 =",df["数学"].median()) 
print("数学の合計 =",df["数学"].sum()) 
kokugo=df.sort_values("国語",ascending=False) 
print("国語の点数が高いもの順で並び替え\n",kokugo) 
#行と列を入れ替える 
print("行と列を入れ替える\n",df.T) 
#リスト化 
print("Pythonのリストデータ化\n",df.values) 

データを並び替える

項目を指定して並び替えをすることができます。df.sort_values(“列名”)と命 令します。

昇順(1、2、3……)

df=df.sort_values(“列名”)

降順

df=df.sort_values(“列名”,ascending=False)

CSVファイルに出力する

DataFrame.to_csv(ファイル名.csv”)とします。インデックスやヘッダーを

削除して出力したいときには、=Falseとします。

国語の点数で並び替えて、CSVファイルに出力してみます。

1-6.py

import pandas as pd 
df=pd.read_csv("test.csv") 
#国語の点数が高いもの順 
kokugo=df.sort_values("国語",ascending=False) 
#CSVファイルに出力 
kokugo.to_csv(“export3.csv",index=False,header=False) 

グラフで表示する

import matplotlib

pyplot as pltと指定すると「plt」という省略名が使えるようになります。た だしそのままではグラフ内の日本語が文字化けしてしまうのですが、最初に1行 japanize_matplotlib をimportしておくと、これだけで文字化けしない ようになります。

pandasで読み込んだ表データは、pandasの「plot機能」でグラフ化することができます

(実際には、pandas内部からmatplotlibの機能を呼び出して利用していま す。このおかげで簡単に連携ができます)。

Pandasで読み込んだ表データは、DataFrameに「plot()」を追加して、DataFrame.plot()と命令するだけでグラフ化されます。できたグラフは、 plt.show()と命令することで表示されます。

折れ線グラフを作る

DataFrame.plot()

作ったグラフを表示する

plt.show()

1-7.py

mport pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
#CSVを読み込む 
df=pd.read_csv("test.csv") 
#グラフを作って表示する 
df.plot() 
plt.show() 

いろいろなグラフの種類の表示させる

棒グラフ(水平) df.plot.barh()

積み上げ棒グラフ df.plot.bar(stacker=True)

箱ひげグラフ df,plot.box()

麺グラフ df.plot.area()

円グラフ df.plot.pie(labeldistance=0.6)

凡例を表示させる場所

plt.legend(loc=“lower right)

rightの部分を場所によって変える

1-8.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
#CSVを読み込む(名前の列を表示) 
df=pd.read_csv("test.csv",index_col=0) 
#棒グラフを作って表示する 
df.plot.bar() 
plt.legend(loc="lower left") 
plt.show() 
#水平の棒グラフ 
df.plot.barh() 
plt.legend(loc="lower left") 
plt.show() 
#積み上げグラフを作って表示する 
df.plot.bar(stacked=True) 
plt.legend(loc="lower left") 
plt.show() 
#箱ひげグラフ 
df.plot.box() 
plt.legend(loc="lower left") 
plt.show() 
#面グラフ 
df.plot.area() 
plt.legend(loc="lower left") 
plt.show() 

個別のデータをグラフで表示する

1列のデータは、df[“列名”]と指定すれば、1行のデータは、df.loc[行番号]と 指定すれば取得できます。その取得したデータをDataFrameとして指定する だけで、個別のグラフが 作れます。「国語」だけの棒グラフ、「国語と数学」だけの棒グラフ、「C さん」だけの棒グラフ作ります。

index(行の表示名)の変更

CSVファイルを読み込むとき、index_col=0と指定すると、一番左の列をインデックスとして読み込むことができます。

1-9.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
#CSVを読み込む(名前の列を表示) 
df=pd.read_csv("test.csv",index_col=0) 
#国語の棒グラフを作って表示する 
df["国語"].plot.bar() 
plt.legend(loc="lower left") 
plt.show() 
#国語と数学の棒グラフ 
df[["国語","数学"]].plot.barh() 
plt.legend(loc="lower left") 
plt.show() 
#Cさんの棒グラフ 
df.loc["Cさん"].plot.barh() 
plt.legend(loc="lower left") 
plt.show() 
#Cさんの円グラフ 
df.loc["Cさん"].plot.pie(labeldistance=0.6) 
plt.legend(loc="lower left") 
plt.show() 
#教科ごとの棒グラフ 
df.T.plot.bar() 
plt.legend(loc="lower right") 
plt.show() 

グラフを好きな色に変える

Df.plot.bar(color=色名リスト)

1-10.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
#CSVファイルを読み込む 
df=pd.read_csv("test.csv",index_col=0) 
#好きな色のついた棒グラフ 
colorlist=["skyblue","steelblue","tomato","cadetblue","orange","sienna"] 
df.T.plot.bar(color=colorlist) 
plt.legend(loc="lower right") 
plt.show() 

グラフを画像ファイルに出力する

plt.savefig(“ファイル名”)と命令します。

1-11.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
#CSVファイルを読み込む 
df=pd.read_csv("test.csv",index_col=0) 
#好きな色のついた棒グラフ 
colorlist=["skyblue","steelblue","tomato","cadetblue","orange","sienna"] 
df.T.plot.bar(color=colorlist) 
plt.legend(loc="lower right") 
plt.savefig(“bargraph.png") 

Excelファイルを読み書きする

openpyxlをインストール

openpyxIIは、Excelファイルを扱えるようになる外部ライブラリです。ファイルを読むxlrd、ファイルを書くxIntも一緒にインストールします。

Windowsにインストールするときは、コマンドプロンプト pip install openpyxl xlrd xlwt macOSにインストールするときは、ターミナル

pip3 install openpyxl xlrd xlwt

Excelファイルに出力する

まず、openpyxlライブラリをimport openpyxlとしてimportします。

Excelファイルとして出力するには、df.to_excel(“ファイル名.xlsx”)と命令し ます。また、インデックスを削除して書き出すときは、df.to_excel(“ファイ ル名.xlsx”, index=False)と命令します。

Excel ファイルに出力する

df.to_excel(“ファイル名.xlsx”)

Excel ファイルに出力する(インデックスを削除)

df.to_excel(“ファイル名.xlsx”, index=False)

「test.csv」を読み込んで、Excelファイル (csv_to_excelt.にxlsx)に出力

Excelファイルに出力する(シート名を指定)

df.to_excel(“ファイル名.xlsx”, sheet_name=“シート名”)

2-1.py

import pandas as pd 
import openpyxl 
df=pd.read_csv("test.csv") 
kokugo=df.sort_values("国語",ascending=False) 
#Excelファイルに出力 
kokugo.to_excel("csv_to_excel.xlsx") 

国語の点数で分類して、出力

2-2.py

import pandas as pd 
import openpyxl 
df=pd.read_csv("test.csv") 
kokugo=df.sort_values("国語",ascending=False) 
#Excelファイルに出力 
kokugo.to_excel("csv_to_excel2.xlsx",index=False,sheet_name="国語で 分類") 

2つのシートを1つのブックに保存

2-3.py

import pandas as pd 
import openpyxl 
df=pd.read_csv("test.csv") 
kokugo=df.sort_values("国語",ascending=False) 
#1つのExcelファイルに複数のシートで出力 
with pd.ExcelWriter("csv_to_excel3.xlsx") as writer: 
df.to_excel(writer,index=False,sheet_name="元のデータ") 
kokugo.to_excel(writer,index=False,sheet_name="国語で分類") 
Excelファイルを表データとして読み込む 
pd.read_Excel(ファイル名)で命令 

2-4.py

import pandas as pd 
import openpyxl 
#Excelファイルを読み込む 
df=pd.read_excel("csv_to_excel2.xlsx") 
print(df) 

複数のシートを読み込む場合は、sheet_nameを読み込む

2-5.py

import pandas as pd 
import openpyxl 
#Excelファイルを読み込む 
df=pd.read_excel("csv_to_excel3.xlsx") 
print(df) 
df=pd.read_excel("csv_to_excel3.xlsx",sheet_name="国語で分類") 
print(df) 

オープンデータを解析する

https://www.post.japanpost.jp/zipcode/download.html

CSVファイルを読み込んで、データの件数と、項目名を表示させます。

1-1.py

import pandas as pd 
df=pd.read_csv("13TOKYO.CSV",header=None,encoding="shift_jis") 
print(len(df)) 
print(df.columns.values) 

郵便番号から住所を抽出させます。

1-2.py

import pandas as pd 
df=pd.read_csv("13TOKYO.CSV",header=None,encoding="shift_jis") 
#2の列が1600006の住所を抽出して表示 
results=df[df[2]==1600006] 
print(results[[2,6,7,8]]) 

四谷の住所を抽出します。

1-3.py

import pandas as pd 
df=pd.read_csv("13TOKYO.CSV",header=None,encoding="shift_jis") 
#8の列が四谷の住所を抽出 
results=df[df[8]=="四谷"] 
print(results[[2,6,7,8]]) 
#8の列に四谷の文字が含まれている住所を抽出 
results=df[df[8].str.contains("四谷")] 
print(results[[2,6,7,8]]) 

E-Stat(政府統計の総合窓口)を分析

データ件数と項目名を表示させます。

2-1.py

import pandas as pd 
df=pd.read_csv("FEH_00200524_220203185821.csv",index_col="全 
国・都道府県",encoding="shift_jis") 
print(len(df)) 
print(df.columns.values) 

実行結果

48

[‘表章項目’ ‘男女別’ ‘人口’ ‘/時間軸(年)’ ‘平成22年’ ‘平成27年’ ‘平成28年’ ‘平成29年’ ‘平成30年’]

都道府県の人口データをグラフ化

df.drop(“全国”,axis=0)で全国の行データを削除

Figsizeでグラフの大きさを指定

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
df=pd.read_csv("FEH_00200524_220203185821.csv",index_col="全 
国・都道府県",encoding="shift_jis") 
df=df.drop("全国",axis=0) 
df["平成30年"]=pd.to_numeric(df["平成30年"].str.replace(",","")) 
print(df["平成30年"]) 
#棒グラフで表示 
df["平成30年"].plot.bar(figsize=(10,6)) 
plt.show() 

2-3.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
df=pd.read_csv("FEH_00200524_220203185821.csv",index_col="全 
国・都道府県",encoding="shift_jis") 
#人口の多い順の棒グラフ 
df=df.drop("全国",axis=0) 
df["平成30年"]=pd.to_numeric(df["平成30年"].str.replace(",","")) 
df=df.sort_values("平成30年",ascending=False) 
#棒グラフで表示 
df["平成30年"].plot.bar(figsize=(10,6)) 
plt.show() 

2つの年を比較して、その差を調べます。

2-4.py

import pandas as pd 
import matplotlib.pyplot as plt 
import japanize_matplotlib 
df=pd.read_csv("FEH_00200524_220203185821.csv",index_col="全 
国・都道府県",encoding="shift_jis") 
df=df.drop("全国",axis=0) 
df["平成29年"]=pd.to_numeric(df["平成29年"].str.replace(",","")) df["平成30年"]=pd.to_numeric(df["平成30年"].str.replace(",","")) 
df["人口増減"]=df["平成30年"]-["平成29年"] 
df=df.sort_values("人口増減",ascending=False) 
df["人口増減"].plot.bar(figsize=(10,6)) 
plt.show

きっずスタットのサイトでデータを取得

複数のデータをグラフで表示

foliumで地図データを表示

データシティ鯖江のサイト(https://data.city.sabae.lg.jp/opendata-list/)から消火栓のデータと店舗のデータをダウンロードして調べます。

消火栓のCSVファイルからデータの件数と項目名を取り出します。

1-1.py

import pandas as pd 
df=pd.read_csv("200.csv",encoding="shift-jis") 
print(len(df)) 
print(df.columns.values) 

実行結果

2568

[‘消火栓名’ ‘消火栓名(英語)’ ‘消火栓分類’ ‘消防団’ ‘管理番号’ ‘都道府

県名’ ‘市区町村名’ ‘行政区名’ ‘住所’

‘対象範囲の直径(m)’ ‘配水管口径(mm)’ ‘貯水量(t)’ ‘緯度’ ‘経度’ ‘分

離器(有、無)’ ‘標準地域コード’]

消火栓のある緯度と経度をリスト化します。

1-2.py

import pandas as pd 
df=pd.read_csv("200.csv",encoding="shift-jis") 
#消火栓のある緯度と経度をリスト化 
hydrant=df[["緯度","経度"]].values 
print(len(hydrant)) 
print(hydrant) 

実行結果

2568

[[ 35.95601513 136.17586812]
 [ 35.95604482 136.17658386]
[ 35.95503636 136.17700608]

[ 35.9483618  136.17772603]
[ 35.96552294 136.19271827]
[ 35.97665545 136.20202291]]

foliumは、地図を表示したり、地図上にマーカーをつけたりできる外部ライブラ リです。

windowsにインストールするときは、コマンドプロンプト pip install folium

macOSにインストールするときは、ターミナル pip3 install folium

地図上に消火栓を表示

地図を表示するには、import foliumと、foliumライブラリをimport します。

指定した地点の地図は、m = folium.Map([緯度,経度1, 200m_start= ズーム倍率)と命令して作ります。ここで作った地図は、ブラウザを 使って表示します。そのため、m.save(“ファイル名.html”)と命令し てHTMLファイルを書き出します。

指定した地点の地図を作る

folium.Map([緯度, 経度], zoom_start=ズーム倍率)

地図を表示するHTMLファイルを書き出す m.save(“ファイル名.html”) まずは、「ある地点の地図のHTMLファイル」を作ってみましょ う。鯖江市の緯度、経度を指定します。

1-3.py

import folium 
#地図を作って書き出す 
m=folium.Map(location=[35.95601513,136.17586812],zoom_start=1 
6) 
m.save("sabae.html") 

次は地図上にマーカーを1つ表示させます。

1-4.py

import folium 
#地図を作って書き出す 
m=folium.Map(location=[35.95601513,136.17586812],zoom_start=1 
folium.Marker([35.95601513,136.17586812]).add_to(m) 
m.save(“mark.html") 

消火栓のリストデータを使って、全ての消火栓をマークします。

1-5.py

import pandas as pd

import folium 
df=pd.read_csv("200.csv",encoding="shift-jis") 
#消火栓のある地点のリスト化 
hydrant=df[["緯度","経度"]].values 
#地図を作って書き出す 
m=folium.Map(location=[35.95601513,136.17586812],zoom_start=1 
6) 
for data in hydrant: 
folium.Marker([data[0],data[1]]).add_to(m) 
m.save(“hydrant.html”) 

次は店舗のデータ数と項目名を取得します。

2-1.py

import pandas as pd 
df=pd.read_csv("898.csv") 
print(len(df)) 
print(df.columns.values)

実行結果

72

[‘店舗名(日本語)’ ‘店舗名(英語)’ ‘カテゴリー’ ‘郵便番号’ ‘都道府県名’

‘市区町村名’ ‘行政区名’ ‘住所’ ‘緯度’ ‘経度’

‘電話番号’ ‘webサイト’ ‘営業開始時間’ ‘営業終了時間’ ‘営業時間’ ‘定休

日’ ‘駐車可能台数’ ‘男子トイレの数’

‘女子トイレの数’ ‘男女兼用トイレの数’ ‘説明(日本語)’ ‘説明(英語)’ ‘更

新日’ ‘登録日’ ‘自治体コード’]

店舗のある地点と店舗名をリスト化します。

2-2.py

import pandas as pd 
df=pd.read_csv("898.csv") 
#店舗のある地点と店舗名をリスト化 
store=df[["緯度","経度","店舗名(日本語)"]].values 
print(len(store)) 
print(store) 

実行結果

72

[[35.956477 136.184073 ‘鯖江市役所’]

[35.938552 136.183866 ‘地域事業主 わどう’]

[35.945618 136.185107 ‘佐野蕎麦 塩だけで食べる異次元そば’]…….

2-3.py

import pandas as pd 
import folium 
df=pd.read_csv("898.csv") 
#店舗のある地点と店舗名をリスト化 
store=df[["緯度","経度","店舗名(日本語)"]].values 
#地図を作って書き出す 
m=folium.Map(location=[35.95601513,136.17586812],zoom_start=1 
6) 
for data in store: 
folium.Marker([data[0],data[1]],tooltip=data[2]).add_to(m) 
m.save(“store.html") 

APIの学習 OpenWeatherMap

世界中の天気情報を公開しているオンラインサービスを利用するた めの進備OpenWeatherMapというサイトのWeb API OpenWeatherMapは、世界中の天気情報を取得できる海外のオン ラインサービスです。 指定した場所の天気や気温、湿度、気圧、風速などを取得できま す。 無料版と有料版があり、有料版は細かい情報を取得できますが、無料版でも「現在の天気」の取得ができますので、これを試してみましょう。

※OpenWeatherMapの利用条件は16歳以上です。

OpenWeatherMapのWeb APIを利用するには、以下の手順で進めま す。

1アカウントを作成する

2APIキーを取得する

3APIを利用する

1アカウントを作成する

トップページの0 [Sign Up] ボタンをクリックすると、新規アカウン トを作るページ

(Create New Account)が表示されます。 2氏名(Username)、メールアドレス(Enteremail)、パスワード (Password、Repeat Password)を入力

3「I am 16 years old andover] = [I agree with Privacy Policy, Terms and conditions of sale and Websites terms and conditions of use」 と「私はロボットではありません」にチェックを入れ、

[CreateAccount] ボタンをクリックしてアカウントを作ります。す ると「How and where will you use our API」のダイアログが出るの で、「Companyに会社名を、OPirposeから目的を選択 して、[Save]ボタンをクリックします。

1 APIキーを取得する アカウントを作成するとAPIキーが発行されます。「ログインして (アカウント作成直後はログインは不要です)

2 [API keys] をクリックします。

3 Key (APIキー)の文字列を確認することができます。

現在の天気を調べる方法

都市名で指定 (By city name)

: city は国コードも指定

http://api.openweathermap.org/data/2.5/weather?q={city}&appi d={key &lang=ja&units=metric

都市 IDで指定 (By city ID) http://api.openweathermap.org/data/2.5/weather?id={cityID}&a

ppid={key}&lang=ja&units=metric

緯度経度で指定

(By geographic coordinates) http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon= {lon}&appid={key}&lang=ja&units=metric

郵便番号で指定 (By ZIP code) :zipCodeは国コードも指定

http://api.openweathermap.org/data/2.5/weather?zip={zipCode} &appid%3Dlkeyl&lang=ja&units=metric

海外のサイトなので、そのままでは天気は英語表示に、気温の単位 もケルビンで表示されてしまいます。天気の詳細が日本語 (lang=ja) で表示されるようにして、 気温の単位を摂氏(units=metric)にしています。

都市名で発起して、天気を取得

まずは、「都市名で指定して、天気を取得する」を試してみます。

以下が、都市名で指定するときの書き方です。この{city}を都市名

に、{key}をAPIキーに置き換えてリクエストします。

http://api.openweathermap.org/data/2.5/weather?q={city}

&appid={ke

y}&lang=ja&units=metric

Pythonでは、このように「文字列のある部分を別の文字列で置き換 えたいとき」は、format文を使うのが便利です。

文字列の1ヶ所を別の文字列で置き換える:format 文 ans = “文字列{キー1}文字列” ans=ans.format(キー1=”文字列1″)

文字列の複数ヶ所を別の文字列で置き換える:format 文 ans=”文字列{キー1}文字列{キー2}文字列” ans=ans.format(キー1=”文字列1″, キー2=”文字列2″)

例えば、変数ansに”今日は{キー1}です。”という文字列を用意して おきます。この{キー1}の部分を“晴れ”に置き換えたいときは、

ans = ans.format(キー1=“晴れ”)

と命令します。 すると文字列が置き換えられて、”今日は晴れです。”に変わりま す。 置き換えたい部分が複数ある場合は、キーの数を増やすことで対応 できます。

ans=”今日は{key1}です。明日は{key2}です。 ans = ans.format(key1=”晴れ”), key2=“曇り”)

このformat文を使って、神戸の天気を取得してみましょう。{city}を “Kobe,JP” に、{key}を”取得したAPIキー”に置き換えてリクエスト します。 requests.get(url)を使います。

1-1.py

 import requests
 import json
 #現在の天気を取得 url="http://api.openweathermap.org/data/2.5/weather?q={city} &appid={APIkey}&lang=ja&units=metric" url=url.format(city="Kobe,JP",APIkey="506048bbb545f1086e7ce1d8 75e2f659")
 jsondata=requests.get(url).json()
 print(jsondata) 

実行結果

{'coord': {'lon': 135.183, 'lat': 34.6913}, 'weather': [{'id': 500, 'main': 'Rain', 'description': '小雨', 
'icon': '10d'}], 'base': 'stations', 'main': {'temp': 5.1, 'feels_like': 1.64, 'temp_min': 4.64, 'temp_max': 6.28, 'pressure': 1017, 'humidity': 77}, 'visibility': 10000, 'wind': {'speed': 4.63, 'deg': 60}, 'rain': {'1h': 0.27}, 'clouds': {'all': 75}, 'dt': 1644725852, 'sys': {'type': 1, 'id': 7963, 'country': 'JP', 'sunrise': 1644702459, 'sunset': 1644741572}, 'timezone': 32400, 'id': 1859171, 'name': '神戸市', 'cod': 200} 

処理結果はJSON形式で返ってきます。JSONを扱えるように標準 ライブラリを「import json」とimportして、getした値に「json)」 と命令して取り出します。取得できたデータを表示させてみます。

JSONデータの書式 JSONでは、キーと値を「キー・値」というペアにしたものをオブ ジェクトと呼んでいます。このオブジェクトを「{}(波括弧)」で囲 み、「,(カンマ)」で区切って複数のデータを記述していきます。 書式

{ キー :値 }

{ キー : 値,キー : 値,… }

キーは、文字列で指定します。このキーを使って値にアクセスしま す。値は、「数値」「文字列値」「真偽値」「配列値」「オブジェ クト値」「ヌル値(値が空っぽであることを表すnull)」が使えます。

JSONデータを読み込む方法 JSONデータを読み込む方法には、「1. ファイルから読み込む方 法」と「2. ネットから直接読み込む方法」があります。

ファイルから読み込む方法 JSONファイルを読み込むときは、「open(ファイル名, mode=“r”)」 でファイルを読み込みモードにして読み込み、

json.loads (f.read())

と指定してJSONデータで読み込みます。 JSON ファイルを読み込む

with open(“ファイル名”, mode=”r”) as f:

jsondata = json.loads(f.read())

ネットから直接読み込む方法

ネットか直接ら読み込むときは、

requests.get(url).json() と、URLにリクエストして、

JSONデータに変換して受け取ります。 JSONデータを読み込む

jsondata = requests.get(url).json()

JSONファイル (test2.json)を読み込んで表示 標準ライブラリのpprint (pretty-print) を使うと、きれいに整形して 表示させることができます。

from pprint import pprint

1-2.py

 import json
 from pprint import pprint
 with open("test.json",mode="r") as f: 
jsondata=json.loads(f.read()) pprint(jsondata) 

実行結果

[{'coord': {'lat': 35.69, 'lon': 139.69}, 'name':
'Tokyo'},
 {'coord': {'lat': 35.02, 'lon': 135.75}, 'name':
'Kyoto'}]

最初のオブジェクトは、配列の最初(インデックス0) の値なので 「jsondata[0]」と指定します。インデックス0のnameの値を取得す るには「jsondata[0][‘name”]」と指定し、インデックス0のcoordの latの値を取得するには「jsondata[0][‘coord”][“lat*]と指定します。

1-3.py

 import json
 from pprint import pprint
 with open("test.json",mode="r") as f: 
jsondata=json.loads(f.read()) print("1つ目のオブジェクト=",jsondata[0]) print("都市名= ",jsondata[0]["name"]) print("緯度= ",jsondata[0]["coord"]["lat"]) print("経度= ",jsondata[0]["coord"]["lon"]) 

実行結果

1つ目のオブジェクト= {‘name’: ‘Tokyo’, ‘coord’: {‘lat’: 35.69, ‘lon’: 139.69}}

都市名= Tokyo 緯度= 35.69 経度= 139.69

神戸とニューヨークの天気を整形して表示

1-4.py

 import requests
 import json
 from pprint import pprint
 #現在の天気を取得 url="http://api.openweathermap.org/data/2.5/weather?q={city} &appid={APIkey}&lang=ja&units=metric" url=url.format(city="Kobe,JP",APIkey="506048bbb545f1086e7ce1d8 75e2f659")
 jsondata=requests.get(url).json() 
pprint(jsondata) 

実行結果

1つ目のオブジェクト= {'name': 'Tokyo', 'coord': {'lat': 35.69, 'lon': 139.69}} 
都市名= Tokyo 緯度= 35.69 経度= 139.69 
(base) user@MacBook-Pro step6 % python3 1-4.py
{'base': 'stations',
 'clouds': {'all': 75},
 'cod': 200,
 'coord': {'lat': 34.6913, 'lon': 135.183},
 'dt': 1644725852,
 'id': 1859171,
 'main': {'feels_like': 1.64,
          'humidity': 77,
          'pressure': 1017,
          'temp': 5.1,
          'temp_max': 6.28,
          'temp_min': 4.64},
'name': '神戸市', 
 'rain': {'1h': 0.27},
 'sys': {'country': 'JP',
         'id': 7963,
         'sunrise': 1644702459,
         'sunset': 1644741572,
         'type': 1},
'timezone': 32400,
 'visibility': 10000,
 'weather': [{'description': '小雨', 'icon': '10d', 'id': 
500, 'main': 'Rain'}],
 'wind': {'deg': 60, 'speed': 4.63}}

1-5.py

import requests
 import json
 #現在の天気を取得 url="http://api.openweathermap.org/data/2.5/weather?q={city} &appid={APIkey}&lang=ja&units=metric" url=url.format(city="Kobe,JP",APIkey="506048bbb545f1086e7ce1d8 75e2f659") 
jsondata=requests.get(url).json() 
print("都市名=",jsondata["name"]) print("気温=",jsondata["main"]["temp"]) print("天気=",jsondata["weather"][0]["main"]) print("天気詳細=",jsondata["weather"][0]["description"]) 

実行結果

都市名= 神戸市 気温= 5.07 天気= Rain 天気詳細= 小雨 

1-6.py

 import requests
 import json
 #現在のニューヨークの天気を取得 url="http://api.openweathermap.org/data/2.5/weather?q={city} &appid={APIkey}&lang=ja&units=metric" url=url.format(city="New York,US",APIkey="506048bbb545f1086e7ce1d875e2f659") jsondata=requests.get(url).json() 
print("都市名=",jsondata["name"]) print("気温=",jsondata["main"]["temp"]) 
print("天気=",jsondata["weather"][0]["main"]) print(“天気詳細=",jsondata["weather"][0]["description"]) 

実行結果

都市名= ニューヨーク 気温= 5.79

天気= Clouds 天気詳細= 厚い雲

ここまで達成された方は、世界最大級のオンライン学習プラットフォームUdemy で学習されることをおすすめします。

さらに副業へ進みたい方は、ココナラ でスクレイピングのお仕事を探してみるのよいと思います。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次