15
0

More than 1 year has passed since last update.

pandasの紹介をしようと思います。
pandasはPythonのライブラリでデータ分析の支援をするツールです。

pandasはどんなことができるかに焦点をあてたいと思います。
各メソッドについて教科書的な解説をしないのでご容赦ください。

前提条件

PythonやPandasのインストール方法などについては割愛します。
実行はJupyter Labで行っています。
Pandasの紹介に当たってデータは厚生労働省のオープンデータからCOVID‑19に関するデータを使用させていただきます。

上記のサイトから次のデータをダウンロードしました。

  • 新規陽性者数の推移(日別)
  • PCR検査実施人数

pandas

早速pandasでダウンロードした新規陽性者数の推移(日別)のcsvファイルの中身を確認します。

import pandas as pd
df1 = pd.read_csv('newly_confirmed_cases_daily.csv')  # csv読み込み
df1  # DataFrameを表示
Date ALL Hokkaido Aomori Iwate Miyagi Akita Yamagata Fukushima Ibaraki ... Ehime Kochi Fukuoka Saga Nagasaki Kumamoto Oita Miyazaki Kagoshima Okinawa
0 2020/1/16 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 2020/1/17 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 2020/1/18 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 2020/1/19 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 2020/1/20 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1055 2022/12/6 137193 8129 1826 2159 3657 2102 1993 3321 888 ... 2032 849 4100 1230 1262 2236 964 1174 873 813
1056 2022/12/7 149383 7764 1676 1637 4179 1575 1553 3094 3600 ... 1389 712 5621 1181 1191 1830 1296 983 919 719
1057 2022/12/8 133065 6641 1609 1483 3809 1335 1433 2849 3436 ... 1548 638 5165 982 1091 1853 1130 1025 786 709
1058 2022/12/9 127090 5858 997 1520 3495 1402 1347 2768 3133 ... 1428 716 4900 1047 1046 2083 1224 1055 750 645
1059 2022/12/10 135761 5768 1803 1555 3566 1327 1440 3033 2996 ... 1571 747 5336 1144 1144 2234 1213 1184 1016 643

1060 rows × 49 columns

左側のindexには0からの連番が振られます。
列には日付、全都道府県の合計、各都道府県が並んでいるようです。
セルにはそれぞれ日付、数値が入っていることがわかります。

read_csvメソッドでCSVをDataFrameとして読み込みました。

次にPCR検査実施人数を見てみます。

df2 = pd.read_csv('pcr_tested_daily.csv')
df2.tail() # tailにより最後の5行を表示。tail(n)で最後のn行を表示します。
日付 PCR 検査実施人数(単日)
1034 2022/12/5 40598.0
1035 2022/12/6 137025.0
1036 2022/12/7 207315.0
1037 2022/12/8 303340.0
1038 2022/12/9 157763.0

dtypesで各列のデータ型を確認できます。

df2.dtypes
日付                 object
PCR 検査実施人数(単日)    float64
dtype: object

日付はobject、PCR 検査実施人数(単日)はfloat64でした。
日付は日付として扱いたいですので、to_datetimeを使うことで変換できます。
変換後の結果と状態を確認します。

df2['日付'] = pd.to_datetime(df2['日付'])  # 日付列をdatetimeに変換
df2.tail()
日付 PCR 検査実施人数(単日)
1034 2022-12-05 40598.0
1035 2022-12-06 137025.0
1036 2022-12-07 207315.0
1037 2022-12-08 303340.0
1038 2022-12-09 157763.0
df2.dtypes
日付                datetime64[ns]
PCR 検査実施人数(単日)           float64
dtype: object

日付はdatetime64[ns]という型に変換できました。
さらに、set_indexにより日付列をIndexにします。
引数drop=Trueで元の列を削除できます。デフォルトはFalseで行削除をしません。

df2 = df2.set_index('日付', drop=True)  # set_indexで指定した列をIndexに設定。
df2.tail()
PCR 検査実施人数(単日)
日付
2022-12-05 40598.0
2022-12-06 137025.0
2022-12-07 207315.0
2022-12-08 303340.0
2022-12-09 157763.0

最初に読込んだdf1と結合して一つの表にすることもできます。
indexをKeyにして結合するために、df1もDate列を日付型にしてindexに設定しておきます。

df1['Date'] = pd.to_datetime(df1['Date'])
df1 = df1.set_index('Date', drop=True)

concatにより結合が行えます。axis=1とすると横方向の結合です。
デフォルトはaxis=0で行方向の結合になります。

df = pd.concat([df2, df1], axis=1)  # join=innerとすると内部結合。デフォルトはjoin=outerで外部結合。
df.tail()
PCR 検査実施人数(単日) ALL Hokkaido Aomori Iwate Miyagi Akita Yamagata Fukushima Ibaraki ... Ehime Kochi Fukuoka Saga Nagasaki Kumamoto Oita Miyazaki Kagoshima Okinawa
2022-12-06 137025.0 137193 8129 1826 2159 3657 2102 1993 3321 888 ... 2032 849 4100 1230 1262 2236 964 1174 873 813
2022-12-07 207315.0 149383 7764 1676 1637 4179 1575 1553 3094 3600 ... 1389 712 5621 1181 1191 1830 1296 983 919 719
2022-12-08 303340.0 133065 6641 1609 1483 3809 1335 1433 2849 3436 ... 1548 638 5165 982 1091 1853 1130 1025 786 709
2022-12-09 157763.0 127090 5858 997 1520 3495 1402 1347 2768 3133 ... 1428 716 4900 1047 1046 2083 1224 1055 750 645
2022-12-10 NaN 135761 5768 1803 1555 3566 1327 1440 3033 2996 ... 1571 747 5336 1144 1144 2234 1213 1184 1016 643

5 rows × 49 columns

ここで、PCR 検査実施人数(単日)だけ小数点表示になっていることに気づいたので、
すべて整数に変換します。

df = df.fillna(0)  # 欠損値処理。0で埋める。
df = df.astype('int')  # 欠損値があるとエラーになる。
df.tail()
PCR 検査実施人数(単日) ALL Hokkaido Aomori Iwate Miyagi Akita Yamagata Fukushima Ibaraki ... Ehime Kochi Fukuoka Saga Nagasaki Kumamoto Oita Miyazaki Kagoshima Okinawa
2022-12-06 137025 137193 8129 1826 2159 3657 2102 1993 3321 888 ... 2032 849 4100 1230 1262 2236 964 1174 873 813
2022-12-07 207315 149383 7764 1676 1637 4179 1575 1553 3094 3600 ... 1389 712 5621 1181 1191 1830 1296 983 919 719
2022-12-08 303340 133065 6641 1609 1483 3809 1335 1433 2849 3436 ... 1548 638 5165 982 1091 1853 1130 1025 786 709
2022-12-09 157763 127090 5858 997 1520 3495 1402 1347 2768 3133 ... 1428 716 4900 1047 1046 2083 1224 1055 750 645
2022-12-10 0 135761 5768 1803 1555 3566 1327 1440 3033 2996 ... 1571 747 5336 1144 1144 2234 1213 1184 1016 643

5 rows × 49 columns

列数が多くてうるさくなってしまうので、PCR 検査実施人数(単日)とALLの列だけに絞りたいと思います。
locで指定した行、列だけ抽出することができます。

df_sub = df.loc[:, ['PCR 検査実施人数(単日)', 'ALL']]  # :とすると全て
df_sub.tail()
PCR 検査実施人数(単日) ALL
2022-12-06 137025 137193
2022-12-07 207315 149383
2022-12-08 303340 133065
2022-12-09 157763 127090
2022-12-10 0 135761

日付をdatetimeに変換したメリットは日付で絞り込みや週ごとの集計などしやすくなることです。
たとえば2022年だけの表にしたい場合は次のようにします。

df_sub["2022"]
PCR 検査実施人数(単日) ALL
2022-01-01 7002 466
2022-01-02 11365 432
2022-01-03 5605 788
2022-01-04 87417 1094
2022-01-05 85750 2788
... ... ...
2022-12-06 137025 137193
2022-12-07 207315 149383
2022-12-08 303340 133065
2022-12-09 157763 127090
2022-12-10 0 135761

344 rows × 2 columns

2022年4月以降の場合は次のようにします。

df_sub[df_sub.index > "2022-04"]
PCR 検査実施人数(単日) ALL
2022-04-02 100759 49567
2022-04-03 39539 39160
2022-04-04 125517 19865
2022-04-05 180421 55949
2022-04-06 127534 57634
... ... ...
2022-12-06 137025 137193
2022-12-07 207315 149383
2022-12-08 303340 133065
2022-12-09 157763 127090
2022-12-10 0 135761

253 rows × 2 columns

Grouperで集計を行います。
次に月ごとの合計を12か月分表示します。

df_sub.groupby(pd.Grouper(freq='M')).sum().tail(12)
PCR 検査実施人数(単日) ALL
2022-01-31 4185842 1082695
2022-02-28 5281949 2106113
2022-03-31 4242537 1475036
2022-04-30 5073537 1249639
2022-05-31 3570499 940734
2022-06-30 3960079 469555
2022-07-31 6102935 3463299
2022-08-31 8939761 6173065
2022-09-30 5159538 2322438
2022-10-31 3109065 1031036
2022-11-30 4161858 2486760
2022-12-31 1605870 1157680

最後に2022年の新規陽性者数の推移(日別)の列ごとの相関係数を確認します。
相関係数はcorrを使って計算します。
地理的に近い県は相関が大きく、遠い県は相関が小さくなる気がしますがどうでしょうか。

df1_corr = df1['2022'].corr()  # 相関係数
df1_corr
ALL Hokkaido Aomori Iwate Miyagi Akita Yamagata Fukushima Ibaraki Tochigi ... Ehime Kochi Fukuoka Saga Nagasaki Kumamoto Oita Miyazaki Kagoshima Okinawa
ALL 1.000000 0.717784 0.891098 0.767939 0.840150 0.779766 0.715148 0.771207 0.894457 0.915933 ... 0.899295 0.889060 0.957462 0.922166 0.911519 0.937740 0.944658 0.915092 0.893831 0.704811
Hokkaido 0.717784 1.000000 0.817712 0.914364 0.896070 0.887780 0.917489 0.916765 0.721881 0.838727 ... 0.671796 0.623444 0.545176 0.593745 0.593622 0.549407 0.611312 0.568530 0.490232 0.220473
Aomori 0.891098 0.817712 1.000000 0.906691 0.892421 0.878192 0.858531 0.896222 0.852927 0.897350 ... 0.873929 0.859468 0.797894 0.833150 0.842774 0.816585 0.850210 0.821223 0.782323 0.533182
Iwate 0.767939 0.914364 0.906691 1.000000 0.933444 0.947235 0.938562 0.968587 0.757437 0.890184 ... 0.789533 0.738490 0.613435 0.698778 0.691071 0.660868 0.717663 0.677699 0.601694 0.321581
Miyagi 0.840150 0.896070 0.892421 0.933444 1.000000 0.935053 0.905655 0.949006 0.810472 0.946765 ... 0.839243 0.774730 0.697649 0.777957 0.738033 0.739312 0.792283 0.723332 0.662895 0.405382
Akita 0.779766 0.887780 0.878192 0.947235 0.935053 1.000000 0.950503 0.954115 0.718903 0.914849 ... 0.847746 0.787533 0.621089 0.756042 0.721347 0.700550 0.754326 0.702415 0.642022 0.329620
Yamagata 0.715148 0.917489 0.858531 0.938562 0.905655 0.950503 1.000000 0.960751 0.706228 0.843392 ... 0.781056 0.735974 0.538614 0.649817 0.674898 0.602274 0.672703 0.633082 0.567904 0.196844
Fukushima 0.771207 0.916765 0.896222 0.968587 0.949006 0.954115 0.960751 1.000000 0.783400 0.899624 ... 0.810988 0.766845 0.609747 0.697224 0.717126 0.652322 0.726145 0.691202 0.614898 0.279904
Ibaraki 0.894457 0.721881 0.852927 0.757437 0.810472 0.718903 0.706228 0.783400 1.000000 0.845102 ... 0.774043 0.792746 0.830887 0.757382 0.803787 0.754663 0.803562 0.786469 0.758979 0.490970
Tochigi 0.915933 0.838727 0.897350 0.890184 0.946765 0.914849 0.843392 0.899624 0.845102 1.000000 ... 0.875981 0.818229 0.806803 0.846623 0.797450 0.834543 0.861182 0.803815 0.759042 0.532585
Gunma 0.931932 0.847433 0.919207 0.898673 0.947350 0.919529 0.866205 0.908965 0.864516 0.978320 ... 0.885845 0.842102 0.815531 0.853170 0.813521 0.837475 0.865130 0.806379 0.763229 0.511536
Saitama 0.949682 0.672041 0.824941 0.703743 0.749850 0.668847 0.617008 0.689993 0.896579 0.842916 ... 0.749519 0.754630 0.908880 0.798737 0.792206 0.837307 0.826762 0.813266 0.777436 0.623490
Chiba 0.952929 0.656637 0.826540 0.692732 0.756459 0.678875 0.615355 0.679690 0.881288 0.854465 ... 0.754590 0.755003 0.914355 0.819250 0.783359 0.852140 0.831742 0.796217 0.773642 0.633720
Tokyo 0.938815 0.555475 0.735839 0.576070 0.675974 0.580471 0.490408 0.556090 0.798165 0.792618 ... 0.737210 0.722763 0.935475 0.834748 0.778615 0.881396 0.842963 0.805265 0.795662 0.733294
Kanagawa 0.920387 0.624331 0.760765 0.637664 0.716379 0.614074 0.549132 0.613451 0.839771 0.814328 ... 0.705296 0.684839 0.885816 0.795242 0.723474 0.812462 0.795984 0.743495 0.732458 0.619196
Niigata 0.860041 0.885053 0.930054 0.940552 0.929376 0.899783 0.905725 0.949462 0.876968 0.911214 ... 0.828849 0.809024 0.742344 0.758495 0.797068 0.741444 0.797966 0.782350 0.714145 0.427647
Toyama 0.892779 0.808417 0.931900 0.899065 0.913906 0.915726 0.894757 0.915406 0.831546 0.911114 ... 0.917881 0.903820 0.782859 0.839958 0.875813 0.822496 0.868909 0.850694 0.800538 0.481688
Ishikawa 0.883475 0.796736 0.924522 0.865907 0.827705 0.810049 0.827552 0.869900 0.867524 0.840119 ... 0.833639 0.860642 0.813131 0.776893 0.873137 0.782003 0.830798 0.854639 0.798296 0.514883
Fukui 0.903478 0.755764 0.900367 0.836279 0.844928 0.786618 0.785250 0.840257 0.907166 0.867954 ... 0.841723 0.849426 0.848289 0.809698 0.860533 0.819005 0.867837 0.862289 0.826756 0.587220
Yamanashi 0.925965 0.850168 0.911404 0.889602 0.950895 0.903164 0.860360 0.899474 0.849235 0.958010 ... 0.902118 0.852349 0.818240 0.863448 0.841212 0.851858 0.885837 0.833486 0.783229 0.549257
Nagano 0.747033 0.912479 0.833350 0.901108 0.951189 0.912268 0.926328 0.940922 0.754484 0.884556 ... 0.763475 0.695500 0.581021 0.672333 0.657126 0.627813 0.698340 0.633744 0.566720 0.269810
Gifu 0.923079 0.778748 0.895219 0.850435 0.910623 0.910874 0.835603 0.868005 0.804960 0.948767 ... 0.956990 0.916894 0.828008 0.918979 0.883717 0.882696 0.920721 0.869830 0.848704 0.580830
Shizuoka 0.961911 0.664467 0.855437 0.725012 0.830778 0.775010 0.702808 0.748793 0.851291 0.899783 ... 0.917398 0.909105 0.916616 0.919229 0.908827 0.937777 0.952013 0.919721 0.905452 0.709372
Aichi 0.980066 0.677395 0.859472 0.733152 0.823597 0.785022 0.694154 0.744523 0.829048 0.910184 ... 0.910705 0.893841 0.930181 0.930370 0.898245 0.941223 0.939524 0.898939 0.885149 0.704869
Mie 0.921540 0.667177 0.857804 0.739633 0.814761 0.744074 0.722485 0.781066 0.893204 0.843222 ... 0.885677 0.901778 0.869553 0.850114 0.917594 0.870352 0.914334 0.917414 0.884020 0.619667
Shiga 0.962190 0.703166 0.874338 0.761287 0.814798 0.778197 0.730168 0.769284 0.892690 0.888098 ... 0.887882 0.899355 0.910908 0.891742 0.901012 0.878746 0.907533 0.883074 0.878485 0.611842
Kyoto 0.956596 0.589744 0.797106 0.629059 0.691738 0.618076 0.567675 0.629997 0.853849 0.793971 ... 0.796857 0.827028 0.953301 0.850102 0.881297 0.888940 0.886444 0.893341 0.875498 0.732100
Osaka 0.924773 0.490046 0.705150 0.516303 0.639536 0.578872 0.473347 0.520946 0.736754 0.770666 ... 0.792432 0.785307 0.928033 0.867227 0.823218 0.904041 0.868892 0.828961 0.841459 0.749999
Hyogo 0.969687 0.577215 0.797906 0.618996 0.707743 0.632868 0.573072 0.629148 0.857541 0.810939 ... 0.843347 0.863155 0.970494 0.886120 0.905972 0.917885 0.915766 0.903993 0.905560 0.734951
Nara 0.928707 0.622302 0.824037 0.679896 0.719531 0.653464 0.630231 0.676421 0.885325 0.786575 ... 0.803479 0.840778 0.907295 0.836251 0.859678 0.828968 0.848166 0.835940 0.837719 0.588007
Wakayama 0.941548 0.691522 0.856980 0.748379 0.809290 0.755906 0.736970 0.775000 0.865304 0.852302 ... 0.908578 0.910699 0.911901 0.895791 0.941459 0.894744 0.935931 0.929014 0.907498 0.656482
Tottori 0.890519 0.785997 0.898038 0.889142 0.924705 0.892693 0.860298 0.896711 0.823071 0.916880 ... 0.928934 0.880913 0.804639 0.881079 0.865133 0.852488 0.903235 0.854085 0.811684 0.551625
Shimane 0.808228 0.660570 0.826361 0.783890 0.819686 0.823960 0.761890 0.771182 0.638471 0.840522 ... 0.888417 0.796008 0.737678 0.877892 0.774865 0.870769 0.867109 0.783001 0.766193 0.615337
Okayama 0.929422 0.764347 0.908773 0.823807 0.846205 0.822148 0.814409 0.859147 0.898736 0.876555 ... 0.906143 0.933664 0.866898 0.860842 0.931698 0.847413 0.908447 0.911746 0.879364 0.567174
Hiroshima 0.836433 0.719557 0.841748 0.771618 0.809215 0.741730 0.774109 0.832794 0.880185 0.793668 ... 0.837325 0.861942 0.774919 0.752138 0.874841 0.742648 0.826484 0.840320 0.798819 0.480949
Yamaguchi 0.913602 0.681295 0.875982 0.779463 0.809834 0.807729 0.778268 0.803312 0.822211 0.841419 ... 0.960015 0.960900 0.871974 0.896705 0.972604 0.895065 0.944369 0.952393 0.924802 0.640063
Tokushima 0.816114 0.601491 0.842787 0.725557 0.711539 0.721703 0.728177 0.756795 0.789374 0.722890 ... 0.870721 0.924195 0.775600 0.784302 0.921055 0.772959 0.835949 0.869464 0.850547 0.506673
Kagawa 0.927844 0.712174 0.892026 0.791283 0.828209 0.834055 0.779014 0.808638 0.834645 0.866602 ... 0.955781 0.961511 0.873055 0.913296 0.950363 0.894430 0.940866 0.939072 0.915905 0.632597
Ehime 0.899295 0.671796 0.873929 0.789533 0.839243 0.847746 0.781056 0.810988 0.774043 0.875981 ... 1.000000 0.958582 0.843916 0.935098 0.942667 0.913786 0.949937 0.924745 0.908811 0.640960
Kochi 0.889060 0.623444 0.859468 0.738490 0.774730 0.787533 0.735974 0.766845 0.792746 0.818229 ... 0.958582 1.000000 0.850517 0.905483 0.963762 0.886052 0.935731 0.936056 0.934222 0.637328
Fukuoka 0.957462 0.545176 0.797894 0.613435 0.697649 0.621089 0.538614 0.609747 0.830887 0.806803 ... 0.843916 0.850517 1.000000 0.911112 0.911113 0.944998 0.933684 0.920873 0.926885 0.818947
Saga 0.922166 0.593745 0.833150 0.698778 0.777957 0.756042 0.649817 0.697224 0.757382 0.846623 ... 0.935098 0.905483 0.911112 1.000000 0.911778 0.950758 0.962883 0.917351 0.922442 0.749447
Nagasaki 0.911519 0.593622 0.842774 0.691071 0.738033 0.721347 0.674898 0.717126 0.803787 0.797450 ... 0.942667 0.963762 0.911113 0.911778 1.000000 0.915760 0.951688 0.972516 0.960525 0.722418
Kumamoto 0.937740 0.549407 0.816585 0.660868 0.739312 0.700550 0.602274 0.652322 0.754663 0.834543 ... 0.913786 0.886052 0.944998 0.950758 0.915760 1.000000 0.969850 0.942808 0.935426 0.834614
Oita 0.944658 0.611312 0.850210 0.717663 0.792283 0.754326 0.672703 0.726145 0.803562 0.861182 ... 0.949937 0.935731 0.933684 0.962883 0.951688 0.969850 1.000000 0.967961 0.959969 0.776256
Miyazaki 0.915092 0.568530 0.821223 0.677699 0.723332 0.702415 0.633082 0.691202 0.786469 0.803815 ... 0.924745 0.936056 0.920873 0.917351 0.972516 0.942808 0.967961 1.000000 0.970454 0.786351
Kagoshima 0.893831 0.490232 0.782323 0.601694 0.662895 0.642022 0.567904 0.614898 0.758979 0.759042 ... 0.908811 0.934222 0.926885 0.922442 0.960525 0.935426 0.959969 0.970454 1.000000 0.804014
Okinawa 0.704811 0.220473 0.533182 0.321581 0.405382 0.329620 0.196844 0.279904 0.490970 0.532585 ... 0.640960 0.637328 0.818947 0.749447 0.722418 0.834614 0.776256 0.786351 0.804014 1.000000

48 rows × 48 columns

北海道と東北は相関係数が大きい。
北海道と九州は相関係数が小さい。
東北と九州は相関係数が大きい。
ような気がします。
本格的にデータ分析するには様々な知識が必要です。
前処理や評価の手法などpandasの紹介からは脱線しますのでこのあたりで終わろうと思います。

15
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
0