乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

可視化


今回はウラムの螺旋についてです。 
ドラマ「危険なビーナス」を見ていて
気になってしまったので
これを作るプログラムを
作成してみようと思います。

解説動画はこちら



まずウラムの螺旋とは
数学者のウラムさんが発見と言うか作った
素数をとある法則に従って並べた図形です。

uram
1から渦巻状に数値を配置する際に
素数だけ残すと、対角線状に素数が残ります。

まずは1から数値を並べるところを
考えていきましょう。


def uram(N=7):
    # 箱を用意
    data = [ [0 for n1 in range(N)] for n2 in range(N)]

    # 入れる値を生成
    nums,tmp,c = [],[],1
    for num in range(1,N*N+1):
        tmp.append(num)
        if num==c*c:
            nums.append(tmp)
            tmp,c=[],c+1
            #c+=1

    # 起点位置決め
    c_y,c_x = N//2,N//2 if N%2==0 else N//2+1

    # 値の代入
    for i,tmp in enumerate(nums,start=1):
        for j,n in enumerate(tmp):
            sub = 1 if i%2==0 else -1
            if j==0:
                c_y,c_x=c_y,c_x + sub*1
            elif j>len(tmp)//2:
                c_y,c_x=c_y,c_x - sub*1
            else:
                c_y,c_x=c_y - sub*1,c_x
            data[c_y][c_x]=n
    return data

data = uram(5)
for row in data:
    for t in row:
        print('{0:}'.format(t),end='\t')
    print()
17 16 15 14 13
18 5 4 3 12
19 6 1 2 11
20 7 8 9 10
21 22 23 24 25


最初にN*Nの箱を作ります。

次に入れる数値の生成ですね。
こんな感じでN*Nの数値のリストを作ります。
N = 5
nums,tmp,c = [],[],1
for num in range(1,N*N+1):
    tmp.append(num)
    if num==c*c:
        nums.append(tmp)
        tmp,c=[],c+1
print(nums)
[[1],
[2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16],
[17, 18, 19, 20, 21, 22, 23, 24, 25]]

ここでは螺旋状に数値を入れる際に
折り返しがあるので
入れる数値のリストの半分のところで
折り返すようにしています。

Nが偶数の時はその前の数値から
右に一つずれ、そこから上
真ん中のところで左に折り返し

Nが奇数の時はその前の数値から
左に一つずれ、そこから下
真ん中のところで右に折り返す
ように数値を入れていくと
螺旋状に数値が並んだ
リストが生成できます。

次に素数だけを
残すようにしてみましょう。

sympyのisprimeと言うメソッドで
素数判定ができます。

これを使って素数の部分だけを
残すように変えてみます。


from sympy import isprime

def uram2(N=7):
    # 箱を用意
    data = [ [0 for n1 in range(N)] for n2 in range(N)]

    # 入れる値を生成
    nums,tmp,c = [],[],1
    for num in range(1,N*N+1):
        tmp.append(num)
        if num==c*c:
            nums.append(tmp)
            tmp=[]
            c+=1

    # 起点位置決め
    c_y,c_x = N//2,N//2 if N%2==0 else N//2+1

    # 値の代入
    for i,tmp in enumerate(nums,start=1):
        for j,n in enumerate(tmp):
            text = ' | '
            sub = 1 if i%2==0 else -1
            if j==0:
                c_y,c_x=c_y,c_x + sub*1
            elif  j>len(tmp)//2:
                text = ' - '
                c_y,c_x=c_y,c_x - sub*1
            else:
                c_y,c_x=c_y - sub*1,c_x
            # 素数判定
            if isprime(n):
                data[c_y][c_x]=n
            else:
                data[c_y][c_x]=text
    return data

data = uram2(5)
for row in data:
    for t in row:
        print('{0:}'.format(t),end='\t')
    print()

17 - - - 13
 | 5 - 3 |
19 | | 2 11
 | 7 - - |
 | - 23 - -


はいこれで素数だけ残りましたね。

次は塗りつぶしですが
数値を文字列に変えるだけでできます。

     
     
   
       
       

これだと使いづらいので
画像にするようにしてみましょう。

matplotlibではリストを投入すると
そのまま画像化できます。

素数を0,他は255を入れた
リストを作ってplotするだけです。

せっかくなので1000x1000
100万までの素数で
ウラムの螺旋を作ってみましょう。

from sympy import isprime
import matplotlib.pyplot as plt
%matplotlib inline

def uram4(N=7):
    # 箱を用意
    data = [ [255 for n1 in range(N)] for n2 in range(N)]

    # 入れる値を生成
    nums,tmp,c = [],[],1
    for num in range(1,N*N+1):
        tmp.append(num)
        if num==c*c:
            nums.append(tmp)
            tmp=[]
            c+=1

    # 起点位置決め
    c_y,c_x = N//2,N//2 if N%2==0 else N//2+1

    # 値の代入
    for i,tmp in enumerate(nums,start=1):
        for j,n in enumerate(tmp):
            sub = 1 if i%2==0 else -1
            if j==0:
                c_y,c_x=c_y,c_x + sub*1
            elif  j>len(tmp)//2:
                c_y,c_x=c_y,c_x - sub*1
            else:
                c_y,c_x=c_y - sub*1,c_x
            if isprime(n):
                data[c_y][c_x]=0

    return data

data = uram4(1000)
plt.figure(figsize=(10,10))
plt.imshow(data)
plt.axis("off")
plt.show()
download

メモリとCPUが強力であれば
もっと大きな螺旋も描けると思います。

これ以上はなかなかに痺れますね。

素数の法則は見つかっていないと
思いますが、なんかロマンがある図形ですね。

お暇な方は試してみてください。
それでは。


最近見ているドラマでフラクタル図形が
取り上げられていたので
気になっちゃいました。

今回は色々なフラクタル図形を作図します。

解説動画はこちら




さてフラクタル図形と言うものは
どう言う図形でしょうか?

フランスの数学者ブノワ・マンデルブロが
導入した幾何学の概念で
図形の一部が全体と
自己相似な構造を持っている
図形のことです。

結構たくさんの種類があります。

Python言語では作図の方法が沢山あります。

最もメジャーな方法としては
matplotlibを用いた作図です。

x,y座標を計算してプロットするものです。


マンデルブロ集合
まず最初はマンデルブロ集合です。
数学者ブノワ・マンデルブロの
名に因む集合体の図形です。

次のようなコードで試すことができます。
from ipywidgets import interact,IntSlider
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

h,w = 1000,1000 
y,x = np.ogrid[ -1.4:1.4:h*1j, -2:0.8:w*1j ]
c = x+y*1j

def mandelbro_plt(rate=30):
    z = c
    times = rate + np.zeros(z.shape, dtype=int)
    for i in range(rate):
        z = z**2 + c
        diverge = z*np.conj(z) > 2**2
        div = diverge & (times==rate)
        times[div] = i
        z[diverge] = 2
    return times

mdb_rate = IntSlider(min=1, max=30, step=1, value=1)
@interact(mdb_rate=mdb_rate)
def plot(mdb_rate):
    plt.figure(figsize=(10,10))
    plt.imshow(mandelbro_plt(mdb_rate))
    plt.show()
download-2

スライダーを上げていくと
より細かい感じになっていきます。

一部を見ると貝のような感じにも
見受けられる図形です。


シェルピンスキーのギャスケット
ポーランドの数学者
ヴァツワフ・シェルピンスキに
因んで名づけられた

自己相似的な無数の
三角形からなる図形です。

matplotlib.patchesの
Polygonで三角形を描画できるので
これを使っていきます。

patches.Polygon(xy = [座標1, 座標2, 座標2])
少し複雑なプログラムですが
スライダーで三角形の
深さを変えることができます。
from ipywidgets import interact,IntSlider
import matplotlib.pyplot as plt
import matplotlib.patches as pat
import numpy as np
%matplotlib inline

def dist(p1,p2):
    return np.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)

def points(p, tri):
    d1,d2,d3 = dist(p, tri[0]),dist(p, tri[1]),dist(p, tri[2])
    if d1 > d2:
        return [p, tri[1], tri[2]] if d1 > d3 else [p, tri[0], tri[1]]
    else:
        return [p, tri[0],tri[2]] if d2 > d3 else [p, tri[0],tri[1]]

def make_tri(tri):
    x1,y1 = (tri[0][0] + tri[1][0])/2,(tri[0][1] + tri[1][1])/2
    x2,y2 = (tri[1][0] + tri[2][0])/2,(tri[1][1] + tri[2][1])/2
    x3,y3 = (tri[2][0] + tri[0][0])/2,(tri[2][1] + tri[0][1])/2
    return [(x1,y1),(x2,y2),(x3,y3)]

def make_fractal(ax,bef, ite):
    if ite == 0: return 0
    p1,p2,p3 = bef[0],bef[1],bef[2]
    tri = make_tri(bef)
    ax.add_patch(pat.Polygon(xy = tri,fc = "white", ec = "black"))
    make_fractal(ax,points(p1,tri), ite-1)
    make_fractal(ax,points(p2,tri), ite-1)
    make_fractal(ax,points(p3,tri), ite-1)

tri_rate = IntSlider(min=0, max=7, step=1, value=0)
@interact(tri_rate=tri_rate)
def plot(tri_rate):
    tri = [(0.2, 0.2), (0.8, 0.2), (0.5, 0.8)]
    fig = plt.figure(figsize=(10, 10))
    ax = fig.add_subplot(1,1,1)
    ax.add_patch(pat.Polygon(xy = tri,fc = "white", ec = "black"))
    make_fractal(ax,tri,tri_rate)
    plt.show()
download-1


コッホ曲線
スウェーデンの数学者
ヘルゲ・フォン・コッホが考案した
線分を3等分し分割した2点を
頂点とする正三角形の作図を
無限に繰り返すことによって
得られる図形です。

PythonのPILのImage.drawを用いて
座標を結ぶ直線を描くことができるので
これを使っていきます。

最初は直線を引き
それを分割するような点を求め
三角形の頂点を求め・・・

と言うのを繰り返すことで
描画する座標を求めて
その点同士を直線で結んでいきます。

from PIL import Image,ImageDraw
from math import cos,sin,radians
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

def divine(num,tp):
     if num>0:
        (Ax,Ay),ind=tp[0],1
        for (Bx,By) in tp[1:]:
            ABx,ABy= Bx - Ax , By - Ay
            ACx,ACy= ABx / 3,ABy / 3
            Cx,Cy = Ax + ACx,Ay + ACy
            Dx,Dy = Ax + ACx*2,Ay + ACy*2
            Ex,Ey = cos(r)*ACx - sin(r)*ACy + Cx,sin(r)*ACx + cos(r)*ACy + Cy
            tp.insert(ind,  (Cx,Cy))
            tp.insert(ind+1,(Ex,Ey))
            tp.insert(ind+2,(Dx,Dy))
            ind,Ax,Ay=ind+4,Bx,By
        divine(num-1,tp)

def calc_cell(n,t):
    divine(n,t)
    return t

n1_rate = IntSlider(min=0, max=5, step=1, value=0)
n2_rate = IntSlider(min=3, max=12, step=1, value=3)
@interact(n1_rate=n1_rate,n2_rate=n2_rate)
def plot(n1_rate,n2_rate):
    white,black=(255,255,255),(0,0,0)
    w,h = 2000,2000
    img=Image.new('RGB',(h,w), white)
    draw=ImageDraw.Draw(img)
    x,y,r=[],[],w//2
    for _x in np.linspace(-180,180,361):
        if _x%(360//n2_rate)==0:
            x.append(int(sin(radians(_x))*r*3//4)+r)
            y.append(int(cos(radians(_x))*r*3//4)+r)
    x.append(x[0])
    y.append(y[0])
    poslist = []
    xys = [(xx,yy) for xx,yy in zip(x,y)]
    tmps = [[xys[b],xys[b+1]]for b in range(len(xys)-1)]
    for tmp in tmps:
        poslist += calc_cell(n1_rate,tmp)
    (Ax,Ay)=poslist[0]
    for (Bx,By) in poslist[1:]:
        draw.line((Ax,Ay, Bx,By),fill=black,width=5)
        Ax,Ay = Bx,By
    plt.figure(figsize=(10,10))
    plt.imshow(img)
    plt.show()

download

スライダーで分割数と
多角形の辺の数を定義できます。

より深くしていくと
曲線に近くなりますね。

ドラマ
「危険なビーナス」では
このフラクタル図形と言うのが
物語の鍵になっているようです。

人間が描こうとすると
かなり至難の技ですが
コンピューターであれば
描く点の座標さえ計算できれば
どんな複雑な図形であっても
描くことができます。

ドラマのフラクタル図形は
もっと複雑でしたね。

これを作るのは大変そう・・・
興味がある方は
作ってみてください。

それでは。

まだまだ、コロナが収まる気配は有りませんねー

東京都の感染者のデータを見てみましょう。

解説動画はこちら

 
まずはライブラリとデータの読み込みです。

このコードでオンラインからデータを
引っ張ってくることができます。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter('ignore')

%matplotlib inline

url = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv'
# データ読み込み
df = pd.read_csv(url)

これでデータフレームにデータが取り込まれました。

データを見てみましょう。
# 先頭行
df.head(3)
# 末尾
df.tail(3)

データ量やカラムの確認も行いましょう。
# データ量
df.shape
(15107, 16)
# カラム名
df.columns
Index(['No', '全国地方公共団体コード', '都道府県名', '市区町村名', '公表_年月日', '曜日', '発症_年月日', '患者_居住地', '患者_年代', '患者_性別', '患者_属性', '患者_状態', '患者_症状', '患者_渡航歴の有無フラグ', '備考', '退院済フラグ'], dtype='object')

今日現在は2020/8/8ですが
8/7までのデータがあるようです。

使えそうなデータを見てみると
年代や、日付などが使えそうです。

年代別で集計してみましょう。
# カテゴリ別で集計
df['患者_年代'].value_counts()
20代 5169
30代 3297
40代 2041
50代 1554
60代 947
70代 768
80代 489
10代 369
10歳未満 232
90代 227
100歳以上 6
不明 6
- 2
Name: 患者_年代, dtype: int64

データ上では少し不備があり
不明なども見受けられますね。

少しだけみやすくまとめてみます。
# 年代をまとめる
df['age'] = (
    df['患者_年代'].replace(['10歳未満', '10代'], '0-19')
    .replace(['20代', '30代'], '20-39')
    .replace(['40代', '50代'], '40-59')
    .replace(['60代', '70代'], '60-79')
    .replace(['80代', '90代'], '80-99')
    .replace(['100歳以上'], '100-')
    .replace(['不明', "'-",'-'], '不明')
)

# 結果
df['age'].value_counts()
20-39    8466
40-59    3595
60-79    1715
80-99     716
0-19      601
不明          8
100-        6
Name: age, dtype: int64

感染者の多くは20,30代のようですね。

日別でも見ていきましょう。
日別でのデータ操作を行うには
日の部分の文字列を
data型に直してあげる必要があります。
# 日付をdatatime型にしてカラム追加
df['date'] = pd.to_datetime(df['公表_年月日'])

# 結果
df['date'].head()
0   2020-01-24
1   2020-01-25
2   2020-01-30
3   2020-02-13
4   2020-02-14
Name: date, dtype: datetime64[ns]

これで準備ができたので
日別での集計をしてみましょう。
# 年代別日別の感染者数集計を行う
date_df = pd.crosstab(df['date'], df['age'])

# 週別で集計し直す
day_df = date_df.resample('D', label='left').sum()
day_df.index = day_df.index.strftime('%Y-%m-%d')

# 結果
day_df.head()

# 棒グラフで描画する
day_df.plot(kind='bar',stacked=True,figsize=(12, 6))
plt.show()
download


これだとデータが細かすぎて
わけわからないですね。

週別でまとめてみます。
# 年代別日別の感染者数集計を行う
date_df = pd.crosstab(df['date'], df['age'])

# 週別で集計し直す
week_df = date_df.resample('W', label='left').sum()
week_df.index = week_df.index.strftime('%Y-%m-%d')

# 結果
week_df.head()

# 棒グラフで描画する
week_df.plot(kind='bar',stacked=True,figsize=(12, 6))
plt.show()
download-1

割とみやすくなりましたね。

続いて割合で見てみましょう。

# 割合に直したデータフレームの作成
week_rate_df = (week_df.T / week_df.sum(axis=1)).T

# 棒グラフで描画
week_rate_df.plot(kind='bar',stacked=True,figsize=(12, 6))
plt.show()
download

最初は年齢が高めの方の感染が多かったようですが
現在の主流は2-30代のようです。



ついで前週比です。
# 前週比に直したデータフレームの作成
week_df_ratio = week_df / week_df.shift()

# 折れ線グラフで描画
week_df_ratio['2020-06-07':].plot(grid=True,figsize=(12, 4))
plt.show()

download-1



ヒートマップもみてみましょう。
# 年代をまとめたカラムを追加する
df['age2'] = df['患者_年代'].replace(
    {'10歳未満': '0-9', '10代': '10-19', '20代': '20-29', '30代': '30-39', 
     '40代': '40-49', '50代': '50-59', '60代': '60-69', '70代': '70-79', 
     '80代': '80-89', '90代': '90-', '100歳以上': '90-'}
)

# 日別、年代別でヒートマップ用のデータフレームを作成する
heat_df = pd.crosstab(df['公表_年月日'], df['age2']).T[::-1]
plt.figure(figsize=(15, 4))

# seabornでヒートマップを可視化する
sns.heatmap(heat_df, cmap='nipy_spectral')
plt.show()
download-2

20代の感染が濃いですね。
やはり活動が活発な年代ほど
接触しやすくなるのでしょうか?

続いて退院フラグがあるので
それをみてみましょう。
# 退院フラグを追加
df['flg'] = df['退院済フラグ'].fillna(0).astype('int')

# 日別、フラグ別で集計したデータフレームを作成
disch_df = pd.crosstab(df['date'], df['flg'])

# 週別でリサンプリング
disch_df2 = disch_df.resample('W', label='left').sum()
disch_df2.index = disch_df2.index.strftime('%Y-%m-%d')

# 棒グラフで可視化
disch_df2.plot(kind='bar',stacked=True,figsize=(16, 5))
plt.show()
download

これでみると、早ければ2週間ほどで
退院できているようです。

中には1ヶ月以上退院できていない人もいるようなので
長期の治療を要することを
念頭に置いておかないといけませんね。


最後に移動平均です。
# 日付のデータフレームを作成
mean_df = df['date'].value_counts().sort_index()
mean_df = mean_df[30:]
fig, ax = plt.subplots(figsize=(16, 5))

# 二軸でグラフ作成
ax.bar(mean_df.index, mean_df, width=1, color='silver', edgecolor='black')
ax.plot(mean_df.index, mean_df.rolling(7).mean(), color='blue')
plt.show()
download-1


移動平均でならしても
増加傾向にあるのが分かりますね。

まだまだ油断はできません。

まあ、自分はリモートワーカーなんで
ほぼ人には接触しませんので
自粛しまくり状態ではあります。

早くワクチンなどが
開発されることを願っております。

前回作った関数を進化させてみました。


解説動画はこちら




前回はこちら
動くおっぱい関数

さて
Python言語ではmatplotlibというライブラリで
作図、可視化を行うことができます。

ということなので
曲線を描くことなどが出来てしまうわけです。

前回は黒い曲線で可視化しましたが
それだと味気ないので
色を塗ってみました。

ただし、これは静止画ではありません。
動くんです!!!

なので毎回色ぬりする範囲を
計算しないといけません。

うまく塗る範囲を考えてみました。

出来上がった関数はこちら
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from ipywidgets import interact, FloatSlider, IntSlider
import warnings
warnings.simplefilter('ignore')
%matplotlib inline

def oppai(y,t):
    x_1 = (1.5 * np.exp((0.12*np.sin(t)-0.5) * (y + 0.16 *np.sin(t)) ** 2)) / (1 + np.exp(-20 * (5 * y + np.sin(t))))
    x_2 = ((1.5 + 0.8 * (y + 0.2*np.sin(t)) ** 3) * (1 + np.exp(20 * (5 * y +np.sin(t)))) ** -1)
    x_3 = (1+np.exp(-(100*(y+1)+16*np.sin(t))))
    x_4 = (0.2 * (np.exp(-(y + 1) ** 2) + 1)) / (1 + np.exp(100 * (y + 1) + 16*np.sin(t)))
    x_5 = (0.1 / np.exp(2 * (10 * y + 1.2*(2+np.sin(t))*np.sin(t)) ** 4))
    x = x_1 + (x_2 / x_3) + x_4 + x_5
    return x
 
t = FloatSlider(min=0.1, max=5.0, step=0.1, value=0)
y = np.arange(-3, 3.01, 0.01)
 
@interact(t=t)
def plot_oppai(t):
    x = oppai(y,t)
    plt.figure(figsize=(10,9))
    plt.axes().set_aspect('equal', 'datalim')
    plt.grid()
    b_chiku = (0.1 / np.exp(2 * (10 * y + 1.2*(2+np.sin(t))*np.sin(t)) ** 4))
    b_index = [i for i ,n in enumerate(b_chiku>3.08361524e-003) if n]
    x_2,y_2 = x[b_index],y[b_index]
    plt.axes().set_aspect('equal', 'datalim')
    plt.plot(x, y, '#F5D1B7')
    plt.fill_between(x, y, facecolor='#F5D1B7', alpha=1)
    plt.plot(x_2, y_2, '#F8ABA6')
    plt.fill_between(x_2, y_2, facecolor='#F8ABA6', alpha=1)
    plt.show()
スクリーンショット 2020-07-18 14.54.46

いやー素晴らしい曲線ですよね。

x,y座標に描く曲線
これは前回と一緒です。

色ぬりの指定は
#F5D1B7
のように16進数のwebカラー表記で
書いて指定します。

デフォルトは黒いようなので
肌色を指定しています。

webで検索すれば好みの色に該当する
数値がわかるはずです。

次のポイントは
色ぬりの範囲指定です。

plt.fill_between

これで色ぬりができるんですが
範囲はxの最小値からxの最大値のようですね。

まず全体を肌色で塗り込みます。

後はB地区の計算です。

B地区の範囲を計算している部分は
def oppaiのx_5を計算している部分です。

これが曲線全体における
一番の盛り上がりの部分を
計算しているところです。

このdef oppaiではyの値を元に
x座標を計算して出力していますので
盛り上がり部分の数値がわかれば
塗る範囲も決まります。

この数値を計算すると盛り上がり部分が
ある一定の数以上の値になる部分でした。

ここを
x,yそれぞれをインデックスで取り
その部分だけピンク色を指定して
塗っています。

ようやく完成です。

tの値を変えると
プルンプルン動きます。
タイトルなし

いやー今年一番の感動です。
暇でよかった!!!!

matplotlibであれば
あなたの夢も可視化できるかもしれませんね

今回はこれまでです
それでは。

米失業保険申請者数のデータがあったので
可視化してみました。


解説動画はこちら



データはここにあります。

データソース:2020年03/28までの統計データ

米国労働省:

https://www.dol.gov/ui/data.pdf

アメリカ合衆国 労働省雇用管理局

https://oui.doleta.gov/unemploy/wkclaims/report.asp

これをcsvファイルにしておきます。
列は「N.S.A(日付)」「S.F.(申請数)」の2列分を用意します。




pandas を使ってデータを読み込みします。
import pandas as pd

df = pd.read_table("米失業申請者数データ20200328.csv")
df['day'] = pd.to_datetime(df['N.S.A'], format='%m/%d/%Y')
「N.S.A」列が日付の部分の文字列「m/d/y」形式になっているので
日付のデータに直します。

次に可視化ツールのplotlyの方ですが
普通はインストールされていないと思うので
インストールしていない方はpip install plotly
などでインストールしてください。

以下のコードがこのデータを可視化するコードです。
import plotly
plotly.offline.init_notebook_mode(connected=False)
data = [
    plotly.graph_objs.Scatter(x=df["day"], y=df["S.F."], name="Claims")
]
layout = plotly.graph_objs.Layout(
    width=1000, height=600,
    title="title",
    xaxis={"title":"Years"},
    yaxis={"title":"Claims"},
)
fig = plotly.graph_objs.Figure(data=data, layout=layout)
plotly.offline.iplot(fig, show_link=False) 

日付を横軸(x) , 申請者数を縦軸(y)にあてて
線グラフを作ります。

可視化の結果は・・・
スクリーンショット 2020-04-05 15.56.29

右上にplotlyのツール類が表示され、ズームインアウトや
選択など色々選んで操作できます。

一般的なpandas、matplotlibの可視化では
動かすことができないので
可視化された図表を動かして見ることのできる
plotlyはかなりの優れものです。

データの方を見てみると
1982年とリーマンショックのあった2009年に
かなり多くの申請があったことが見えました。

しかし2020年3月になると
ドーンと跳ね上がって・・・

スクリーンショット 2020-04-05 16.01.20

爆増しているのが見えます。
レポートの数値から見ると
失業申請者数は600万人を超えているみたいですね。

リーマンの時でさえ100万人に満たなかった訳で
今回の影響がどれだけヤバイのかがすぐにわかります。

このデータは3/28のデータ
今日は4/5なのでそこから1週間経ってるいるため
さらに倍増している可能性もあります。

一説によると
アメリカの労働人口の2割ほどが影響を受けているそうで
もし、日本でも同様の事態となると
数十万人 - 100万人単位で
影響を受ける方が増えると予想されます。

特にレストランやバー、映画館、ホテル、スポーツジム
などは営業停止しており
特定の製造業も工場の稼働停止をしています。

リーマンの時は稼働停止までは至っていなかったと思うので
10年前の大不況に比べると
はるかに大きな不況が目の前に来ています。

前回の余波は、自分も食らったので2年くらい
まともな仕事が無かったです。

今回、それを超えるようなことに
ならないことを願うばかりです。

エンジニアの対策としては
現状新規案件が白紙、撤回されたり
内定も取り消されるケースが増えているようです。

フリーランスになったり、転職活動は
かなり厳しくなると予想されるので
今雇用があるなら、そこでじっと騒動が収まるまで
耐えるしかないかなと思います。

頑張って乗り切れば
明るい未来が待っていると思いたい。

それでは。



 

このページのトップヘ