[Python]生命保険会社の苦情件数を棒グラフで表現

# 概要
- 最近、知り合いから生命保険を進められて加入しました。
- でも、その保険会社は本当に信用できるのかな？？と思い、この[サイト](https://www.seiho.or.jp/member/complaint/)で苦情件数をみてみました。
- 苦情件数がたくさんあるし、保険会社もたくさんあってわかりづらい…
- Pythonのmatplotlibを使って苦情件数を棒グラフで表現してみました。


# 苦情件数（件）を棒グラフで表現
### 棒グラフ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/b6ae9b3d-a34e-957f-dd4f-e68046c16e3f.png" width=90%>

- 株式会社かんぽ生命保険が一番苦情が多く見える！
- でも、元から契約件数が多い保険会社だったら、苦情件数も大きくなるのでは？？？

### コード
```Python
from bs4 import BeautifulSoup
import pandas as pd
import re
import matplotlib.pyplot as plt
import requests


url = requests.get("https://www.seiho.or.jp/member/complaint/")
url.raise_for_status()
bs = BeautifulSoup(url.text, "html.parser")


# 苦情件数（件）を棒グラフで表現

# 保険会社の名前
# 名前が長いので「生命保険株式会社」を消す
company_name_list = [re.sub('生命保険株式会社','',i.get_text().replace('\n','') )
                      for i in bs.select('div.headMod04.mt30')]
# 苦情件数（件）
claim_count_list = [int(((j.get_text())[:-1]).replace(',','')) 
                    for i in bs.select('table.tblMod02.tblP2.mt10') 
                    for j in i.select('td.vaM.taR')]
# グラフ作成
plt.title("苦情件数")  
plt.xlabel('生命保険株式会社の名前')
plt.ylabel('件')
plt.xticks(rotation=90, fontsize=8)
plt.bar(company_name_list,claim_count_list)
plt.show()
```

# 苦情の割合を棒グラフで表現

### 棒グラフ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/cdc0ddd6-77a0-f31b-dd79-f8ddbd9dbba3.png" width=90%>

- カーディフ生命保険株式会社が苦情の割合が多い！
- でも、契約件数も苦情件数も全体と比べて少ないから、単純に苦情の多い保険会社として決めつけるのは微妙…
- 株式会社かんぽ生命保険とライフネット生命保険株式会社の苦情の割合が結構大きい…、

### コード
```Python
from bs4 import BeautifulSoup
import pandas as pd
import re
import matplotlib.pyplot as plt
import requests


url = requests.get("https://www.seiho.or.jp/member/complaint/")
url.raise_for_status()
bs = BeautifulSoup(url.text, "html.parser")

# 苦情の割合を棒グラフで表現

# 保険会社の名前
# 名前が長いので「生命保険株式会社」を消す
company_name_list = [re.sub('生命保険株式会社','',i.get_text().replace('\n','') )
                      for i in bs.select('div.headMod04.mt30')]
# 会社に寄せられた苦情件数（件）
claim_count_list = [int(((j.get_text())[:-1]).replace(',','')) 
                    for i in bs.select('table.tblMod02.tblP2.mt10') 
                    for j in i.select('td.vaM.taR')]
# 個人保険保有契約件数（件）
guest_number_list = [int((j.get_text())[:-1].replace(',','')) 
                      for i in bs.select('table.tblMod02.tblP2.mt15') 
                      for j in i.select('td.vaM.taR')]
guest_number_list = [guest_number_list[i] for i in range(len(guest_number_list)) if i%2 == 0]

# 苦情の割合（％）
claim_rate_list = [(i/j) * 100 for i,j in zip(claim_count_list,guest_number_list)]

plt.title("苦情の割合")  
plt.xlabel('生命保険株式会社の名前')
plt.ylabel('％')
plt.xticks(rotation=90, fontsize=8)
plt.bar(company_name_list,claim_rate_list)
plt.show()
        
```

# 苦情の内訳を積み上げ棒グラフで表現

### 棒グラフ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/d9f6453e-78e9-9fb6-d28f-b134702b025e.png" width=90%>

- 苦情の内訳は、全体的に同じ感じに見える

### コード
```Python
from bs4 import BeautifulSoup
import pandas as pd
import re
import matplotlib.pyplot as plt
import requests


url = requests.get("https://www.seiho.or.jp/member/complaint/")
url.raise_for_status()
bs = BeautifulSoup(url.text, "html.parser")


# 苦情の内訳を積み上げ棒グラフで表現

# 保険会社の名前
# 名前が長いので「生命保険株式会社」を消す
company_name_list = [re.sub('生命保険株式会社','',i.get_text().replace('\n','') )
                      for i in bs.select('div.headMod04.mt30')]
# 当該項目件数の内容
claim_detail = ['新契約関係','収納関係','保全関係','保険金関係','その他']
# 苦情の内訳（当該項目件数／苦情件数）
claim_detail_list = [float((j.get_text())[:-1]) 
                      for i in bs.select('table.tblMod02.tblP2.mt10') 
                      for j in i.select('td.taR') 
                      if "%" in j.get_text()]
# claim_detail_listを当該項目件数の内容５つにわける
def list_(num):
    return [claim_detail_list[i] 
            for i in range(len(claim_detail_list)) 
            if i%5==(num - 1)]
# ５つ別のリスト
all_list = [list_(1),list_(2),list_(3),list_(4),list_(5)]

dataset = pd.DataFrame(all_list,
                        index=claim_detail,
                        columns=company_name_list)
# グラフ作成
fig, ax = plt.subplots(figsize=(10, 8))
for i in range(len(dataset)):
    ax.bar(dataset.columns, dataset.iloc[i], bottom=dataset.iloc[:i].sum())
ax.set(xlabel='生命保険株式会社の名前', ylabel='苦情の内訳')
plt.title("苦情の内訳")  
plt.xticks(rotation=90, fontsize=12)
ax.legend(dataset.index)
plt.show()
```


# まとめ
- 生命保険を選ぶときに、参考にしていただけるとありがたいです！！
- でもグラフだけで決めつけず、実際にHPを見たりして保険を決めてほしいです！（逃げの言い訳）

# 参考
[Pythonのmatplotlibで積み上げ棒グラフを作成しデータラベルを追加してみた](https://qiita.com/s_fukuzawa/items/6f9c1a3d4c4f98ae6eb1)
[生命保険各社の苦情受付情報・保険金等お支払情報について](https://www.seiho.or.jp/member/complaint/)