読者です 読者をやめる 読者になる 読者になる

30代無職のプログラミング入門

暇つぶしにプログラミングを独学してみる

名字ランキングのスクレイピング、プロット等

Python

名字のランキングと、Googleのヒット数に相関とかあるのだろうか、と思って調べてみた。

まず、名字のランキングをスクレイピングで取得する。

サイトはここ。

myoji-yurai.net

上位200位の名字のデータを取得する(上位200なのは、最初のページが200までというだけの理由)。

import requests, bs4

res = requests.get('https://myoji-yurai.net/prefectureRanking.htm')
soup = bs4.BeautifulSoup(res.text, 'lxml')

a = soup.find_all("tr", class_="odd")

# ランキング部だけを選択(かなりアド・ホックな仕方)
b = [i for i in a][16:216]

ranking = []
myouji = []
num = []

count = 0
while count < 200:
    x = [i.string for i in b[count]]
    ranking.append(x[1])
    myouji.append(x[3])
    num.append(x[5])
    count += 1

# ランキングの数字の後に付いている「位」を除去
ranking_2 = []
for i in ranking:
    ranking_2.append(i[:-1])

# 人口の数字の前の「およそ」を除去。コンマを除去。数値に変換
num_2 = []
for i in num:
    num_2.append(int(i[3:-1].replace(',','')))

上記で作成したリストを、pandas のDataFrameにする。

import pandas as pd
df = pd.DataFrame({'ranking':ranking_2, 'myouji':myouji, 'population':num_2})
df = df.set_index('ranking')

こんな感じになる。

df[:5]

f:id:unEmployed:20170210201022p:plain

次は、名字ごとのGoogleのヒット件数を取得する。これは、前回の記事のコードとだいたい同じ。

def google_results(word_list):
    import requests, bs4
    
    url = 'https://www.google.co.jp/search?q='
    results = []
    
    for i in word_list:
        res = requests.get(url + i)
        soup = bs4.BeautifulSoup(res.text, 'lxml')
        
        # ソースの中の、id="resultStats"の部分がヒット件数なのでそこを抜き出す
        text = soup.find(id="resultStats").getText()
        
        # 数字部分だけ抜き出して、コンマを除去
        results.append(int(text[2:-2].replace(',','')))
        print(i)
    return results
results = google_results(myouji)

データフレームに追加。

df['google_results'] = results

df[:5]

f:id:unEmployed:20170210201402p:plain

取得したデータをプロットしてみる。まずは名字の人口。

import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

df.population.plot()

f:id:unEmployed:20170210201530p:plain

次は、Googleのヒット件数。

df.google_results.plot()

f:id:unEmployed:20170210201623p:plain

相関なんて全然なかった。Googleのヒット件数がスパイクしているもの(4億件以上)を拾ってみると、こんな感じ。

df[df.google_results > 400000000]

f:id:unEmployed:20170210201918p:plain

林、森、原、東、南。一文字の方が、検索の限定が弱い分、ヒット件数は増えるわなあ…。こんな結果になるとは、調べてみるまで思いもしなかった。ぼんやりと相関するんじゃないかとだけ思ってたので。(ちなみに、上位200の名字のうち他に漢字1文字なのは「関」「辻」「堀」)。