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)