データ分析やプログラミングの力を手っ取り早く向上させる方法があります。
それは、実際のデータを使って、自分で分析することです。
そのなか大切なことは、
- 実際のデータも興味のあるデータであること
- 自分でコードを書くこと
自分で書くコードは、基本はコピペで大丈夫ですが、コードの微調整は自分で行わないといけません。
興味深いデータとして、新型コロナ(COVID19)のデータを使って、分析してみましょう。まずは、データの前処理と可視化(グラフ)をしてみましょう。
- Pyhtonの基本的なプログラムやデータ分析の方法はなんとなく理解したが実際のデータでは自信がない人
- scikit-laernにあるデータセットを使って、分析したことがある人
- 自分のデータを持っていない人
- どうせ分析するなら、興味のあるデータで分析したいを思っている人
- 新型コロナのデータの入手方法が分からない人
上記に当てはまる人は、データ分析やプログラミングの力の向上の参考になりますので、まずは、コードをコピペしながらPythonを使っていきましょう。
まったくPythonを使ったことがない人でも、Pythonによるデータ分析の一例として、参考になると思います。
いつものように、Pythonの環境構築はAnacondaからJupyter Labを使って分析していきます。


新型コロナのデータはこちらをご覧下さい。
必要なライブラリをインポート
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore')
新型コロナのデータをURLから読み込む
URLから読み込んだほうが新しいデータが手に入るので、URLを使いましょう。
オンライン環境で実行して下さい。
df = pd.read_csv('https://raw.githubusercontent.com/lisphilar/covid19-sir/master/data/japan/covid_jpn_prefecture.csv') df
データの内容を確認してみましょう。以下が、列(columns)の説明です。
- Data :日付
- Prefecture :都道府県
- Positive :PCR検査済陽性
- Tested :PCR検査済
- Discharged :退院したケース(改善した)
- Fatal :致命的なケース(死亡)
- Hosp_require :入院が必要
- Hosp_severe :PCR陽性で重度の症状で入院した/strong>
都道府県を指定してみましょう。ここでは「東京」のデータを分析します。
prefecture = 'Tokyo' # ' ' の中に都道府県名を記入します( Prefectureの文字 ) df_prefecture = df[df["Prefecture"]==prefecture] df_prefecture
データを整形する(累積から1日のデータへ)
今回は、PCR検査済陽性者の数(Positive)を可視化していきます。このデータは累積のデータなので、1日のPCR検査済陽性の数をみてみましょう。
累積データから1日のデータに変換するのは、当日の累積データから前日の累積データを引けば求められます。
まずは、index(一番左の列にある数値)の数値がとびとびなので、数値を揃える。
df_prefecture.index = range(len(df_prefecture)) df_prefecture
つぎに、「Positive_day」という変数(colunms名)を作り、そこに1日あたりのPCR検査済陽性者の数を入れます。
col = "Positive" df_prefecture[col+"_day"] = "" for i in range(len(df_prefecture)): if i == 0: df_prefecture[col+"_day"][i] = df_prefecture[col][i] else: df_prefecture[col+"_day"][i] = df_prefecture[col][i]-df_prefecture[col][i-1] df_prefecture
出力:
一番右の列に「Positive_day」という変数ができました。
「Positive_day」のデータは一日あたりのPCR検査済陽性者数が作成されています。
データの可視化
では、グラフを作成してデータを可視化してみましょう。
plt.figure(figsize=(12,3),dpi=200) plt.bar(df_prefecture.Date, df_prefecture.Positive_day) plt.xticks(df_prefecture.Date[::30], size='small') plt.show()
でも、このグラフは少し変なところがありますよね。
PCR検査済陽性者数が、0またはマイナスになっている箇所があります。その箇所の次の日には異常にPCR検査済陽性者数が多くなっています。
データを確認してみましょう。
PCR検査済陽性者数(Positive_day)が0以下がどの程度存在するか。
0以下の数値になっているデータの場所(何行目か)と、その数値を確認しましょう。
print("外れ値の個数:",sum(df_prefecture.Positive_day<=0)) for i in range(len(df_prefecture.Positive)): if df_prefecture.Positive_day[i]<=0: print("num:",i, " data:",df_prefecture.Positive_day[i])
出力:
外れ値の個数: 3
num: 136 data: 0
num: 236 data: -725
num: 274 data: 0
numは0以下の数値になっているデータの場所(何行目か)
dataは0以下の数値の実際の数値
では、この結果をグラフでも表してみましょう。上の結果から得た行数を指定して(136, 236, 274)赤い点線で目印を付けます。
plt.figure(figsize=(12,3),dpi=200) plt.bar(df_prefecture.Date, df_prefecture.Positive_day) plt.vlines(136,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.vlines(236,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.vlines(274,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.xticks(df_prefecture.Date[::30], size='small') plt.show()
出力:
0以下の数値になっている箇所に赤い点線を追加しました。(plt.vlinesのカッコ内の一番初めの数値で指定している、136 と 236 と 274)
ちょうどグラフでも異常値(外れ値)に赤い点線が合っていますね。
では、0以下の数値があった日の、次の日は大きな数値になっていますが、データから確認してみましょう。
print(df_prefecture.Positive_day[136], df_prefecture.Positive_day[136+1]) print(df_prefecture.Positive_day[236], df_prefecture.Positive_day[236+1]) print(df_prefecture.Positive_day[274], df_prefecture.Positive_day[274+1])
出力:
0 764
-725 1167
0 1486
これは、
「0」の次の日は「764」
「-725」の次の日は「1167」
「0」の次の日は「1486」
になっているという意味です。
おそらく、なんらかの理由で0以下の数値がでてしまい、次の日に0以下の数値を補正する数値になっていると仮定できます。
実際のデータでも、このようなこと(異常値や外れ値、欠損値)はよく起こります。
では、どう対処したらいいでしょうか。
とりあえず、0以下の数値とその次の日の数値を、それぞれの平均値にしましょう。
data_ave=(df_prefecture.Positive_day[136]+df_prefecture.Positive_day[137])/2 df_prefecture.Positive_day[136]=data_ave df_prefecture.Positive_day[137]=data_ave data_ave=(df_prefecture.Positive_day[236]+df_prefecture.Positive_day[237])/2 df_prefecture.Positive_day[236]=data_ave df_prefecture.Positive_day[237]=data_ave data_ave=(df_prefecture.Positive_day[274]+df_prefecture.Positive_day[275])/2 df_prefecture.Positive_day[274]=data_ave df_prefecture.Positive_day[275]=data_ave
コードが汚いですが、直感的には分かると思います。
異常値の2つの平均値をそれぞれに代入しています。
結果をさきほどのコードで確認してみます。
print(df_prefecture.Positive_day[136], df_prefecture.Positive_day[136+1]) print(df_prefecture.Positive_day[236], df_prefecture.Positive_day[236+1]) print(df_prefecture.Positive_day[274], df_prefecture.Positive_day[274+1])
出力:
382.0 382.0
221.0 221.0
743.0 743.0
小数点になっていますが、平均値が代入できていますね。
このようにデータを妥当なデータに変換することを前処理といいます。
ではあらためて、グラフで確認してみましょう。
plt.figure(figsize=(12,3),dpi=200) plt.bar(df_prefecture.Date, df_prefecture.Positive_day) plt.vlines(136,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.vlines(236,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.vlines(274,0,df_prefecture.Positive_day.max(),'r',alpha=0.7, linestyles='--',linewidth=0.7) plt.xticks(df_prefecture.Date[::30], size='small') plt.show()
このように、データだけでは割りにくいので、データをグラフなどの直感的に分かりやすくすることを可視化といいます。
データの可視化は、データの確認、異常値の発見、データから新たな発見(データに起伏がある:第1波、第2波、第3波の時期など)をするためにも、必要な作業です。
データ分析やデータサイエンティストは、データの可視化とデータの前処理に多くの時間を割きます。
機械学習や深層学習、AI開発の方が派手ですが、この前処理が適切でないと、機械学習の結果が悪くなります。
自分でもこのデータから、新たな仮説を立ててデータの確認作業をしてみましょう。データの可視化は新たな発見があるため、楽しくなってきます。データ分析を楽しんでいきましょう。
以前行った日本全体の新型コロナのデータ分析は以下の記事です。

コメント