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

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

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

名字ランキングの1〜1000までをプロット

この前は200までだったのを、1000までデータをスクレイピングし、プロットしてみた。コードは代わり映えがしないので省略。

f:id:unEmployed:20170214200700p:plain

対数軸にすると:

f:id:unEmployed:20170214200704p:plain

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

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文字なのは「関」「辻」「堀」)。

Googleで1〜1000の数字を検索し、そのヒット数をグラフ化する

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

グラフ化する。

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

plt.plot(results,".",markersize=5)

f:id:unEmployed:20170206212333p:plain

対数軸にすると

plt.plot(results,".",markersize=5)
plt.yscale('log')

f:id:unEmployed:20170206212354p:plain

感想

  • 結果の取得に時間がかかりすぎ。threading?とかをすると早いようだけれど、解説を読んでも意味がわからなかった。

  • あと、検索結果の取得は、1〜3秒くらいの間隔でランダムに取得すべきだったんだろう…とあとで気づいた。

参考

https://automatetheboringstuff.com/chapter11/

CheckiOを始めた

checkio.org

簡単な問題を解かないと、そもそもアカウントも作れない、とか書いてあるのがあったけど、普通に何もせずアカウントは作れた。以前、paizaで1問目から解けずに挫折したので、戦々恐々としてたのだけど。

1問だけ、解いた。リストのうちで、ユニークな(重複のない)要素を除く、という問題。

最初、こんなふうに書いた。

def checkio(data):
    for i in data:
        if data.count(i) == 1:
            data.remove(i)
    return data

で、その後それを、リスト内包表記に書きなおして、提出した。

def checkio(data):
    return [i for i in data if not data.count(i) == 1]

問題に正解すると、他の人の書いたコードが読める。それがとても勉強になるっぽい。

広告を非表示にする

はじめに

5月半ばにPythonの勉強を始めた。何度か勉強を試みたことはあるけど、3日坊主を突破したのは今回が初。

でも最近、モチベーションが萎え気味で挫折しつつある。もう少しだけ続けたい。無職で暇だし。というわけで、モチベーションのメンテ的意味合いでブログを作ってみた次第。落書きでもしていこう。

そういえば、こんな増田を見つけたけど、お前は俺か感。GitHubって何なんですかね。自分もアカウントは作ったけど、使い方が分からんよ。

anond.hatelabo.jp

広告を非表示にする