名古屋市のデータ解析練習

oku.edu.mie-u.ac.jp

twilog.org

Pandasで試してみたけど後半はやり方がわからない

こんなのができるようになりたい

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

df = pd.read_csv("Nagoya-HPVV-data.csv", index_col=0, header=None, dtype="object")

df.columns += 1

df = df.rename(columns=lambda x: str(x))

len(df)

df.head()
# 子宮頸がん予防接種(HPVV)の有無

df["233"].value_counts().sort_index()
# 例:「身体が自分の意思に反して動く」

df["145"].value_counts().sort_index()
# HPVV有無とクロス集計

df0 = pd.crosstab(df["233"], df["145"])
df0
# Fisherの正確検定

import scipy.stats as stats
import numpy as np

oddsratio, pvalue = stats.fisher_exact(df0.iloc[1:3, 1:3].values)

print(f"p-value = {pvalue}")
print(f"odds ratio = {oddsratio}")
# 生まれた年度とHPVV接種率

# 生まれた年度の分布
df1 = df.loc[:, "5":"11"].copy().astype("int64")
df1.columns = range(6, 13)

birth = df1[df1.sum(axis=1) == 1].idxmax(axis=1)
birth = birth.reindex(df1.index)

birth.value_counts(dropna=False).sort_index()

# 生まれた年度とHPVV接種率
df2 = pd.crosstab(df["233"], birth)
df2

df2t = df2.iloc[1:3, :].T
s1 = df2t["2"] / (df2t["1"] + df2t["2"]) * 100

ax = s1.plot(xlim=(5.5, 12.5), ylim=(0, 100), marker="o")
ax.set_xlabel("生まれた年度(平成)")
ax.set_ylabel("接種率(%)")
plt.show()
# 生まれた年度と「身体が自分の意思に反して動く」のクロス集計
pd.crosstab(df["145"], birth)