import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from pivot_chart import pivot_chart
sns.set_theme(style="whitegrid")
df_input = pd.read_excel("dane_ankieta.xlsx", header=1)
df_input["licznik"] = 1
df_input["Grupa"] = df_input["czy_instruktor"].replace({"NIE": "Wędrownicy", "TAK": "Instruktorzy"})
# df_input.info()
df_test = df_input[["choragiew", "Grupa"]].value_counts(sort="choragiew").rename("Liczba Odpowiedzi")
df_top5 = pd.pivot_table(pd.DataFrame(df_test), index="choragiew", columns="Grupa", fill_value=0).droplevel(level=0, axis=1).sort_values("Wędrownicy", ascending=False).eval("Suma=`Wędrownicy`+`Instruktorzy`").head(5)
choragiew_top5 = df_top5.index.to_list()
df_test = df_input[["choragiew", "Grupa"]].value_counts(sort="choragiew").rename("Liczba Odpowiedzi")
df_top5 = pd.pivot_table(pd.DataFrame(df_test), index="choragiew", columns="Grupa", fill_value=0).droplevel(level=0, axis=1).sort_values("Wędrownicy", ascending=False).eval("Suma=`Wędrownicy`+`Instruktorzy`").head(5)
choragiew_top5 = df_top5.index.to_list()
df_input["top_choragiew"] = df_input.choragiew.map(lambda x: x if x in choragiew_top5 else "POZOSTAŁE CHORĄGWIE")
choragiew_top5_order = choragiew_top5 + ["POZOSTAŁE CHORĄGWIE"]
Analiza odpowiedzi wędrowników bez naramienników¶
W toku analizy wyników należy wpierw odnotować, że ponad 25 respondentów jest czynnymi wędrownikami zdobywającymi naramiennik. Kolejnych 10 nie zdobywa naramiennika.
g = sns.catplot(
data=df_input.query("czy_naramiennik == 'NIE'"),# .query("czy_naramiennik == 'NIE'"), #.query("wstapienie_wiek != 'Nie wstąpiłem nigdy do drużyny/patrolu'"),
y="czy_zdobywasz",
hue="czy_instruktor",
hue_order=["TAK", "NIE"],
col="czy_instruktor",
col_order=["TAK", "NIE"],
order=["TAK", "NIE"],
kind="count",
stat="count",
# palette="pastel6",
palette=sns.color_palette("blend:#FFC30F,#165110", 2),
legend=False,
orient="v",
)
g.axes[0, 0].set(title="Instruktorzy", ylabel="", xlabel="Liczba odpowiedzi")
g.axes[0, 1].set(title="Wędrownicy", xlabel="Liczba odpowiedzi")
plt.suptitle("Czy zdobywasz naramiennik?", y=1.05)
plt.show()
plt.close()
g = sns.catplot(
data=df_input.query("czy_naramiennik == 'NIE'"), #.query("wstapienie_wiek != 'Nie wstąpiłem nigdy do drużyny/patrolu'"),
y="czy_zdobywasz",
# hue="czy_instruktor",
col="top_choragiew",
# order=["TAK", "NIE"],
col_order=choragiew_top5_order,
col_wrap=3,
kind="count",
# stat="percent",
# palette="pastel6",
legend=False,
orient="v",
color="#165110",
)
# g.axes[0, 0].set(title="Instruktorzy", ylabel="Etap harcerski", xlabel="procent")
# g.axes[0, 1].set(title="Wędrownicy", xlabel="procent")
g.set_titles(col_template="{col_name}")
g.set(ylabel="", xlabel="liczba odpowiedzi")
plt.suptitle("Czy zdobywasz naramiennik?", y=1.05)
plt.show()
plt.close()
Duża większość respondentów bez naramiennika jest w drużynach wędrowniczych, co pokazuje poniższy wykres.
g = sns.catplot(
data=df_input.query("czy_naramiennik == 'NIE'"),# .query("czy_naramiennik == 'NIE'"), #.query("wstapienie_wiek != 'Nie wstąpiłem nigdy do drużyny/patrolu'"),
y="czy_jestes_w_druzynie",
hue="czy_instruktor",
hue_order=["TAK", "NIE"],
col="czy_instruktor",
col_order=["TAK", "NIE"],
order=["TAK", "NIE"],
kind="count",
stat="count",
# palette="pastel6",
palette=sns.color_palette("blend:#FFC30F,#165110", 2),
legend=False,
orient="v",
)
g.axes[0, 0].set(title="Instruktorzy", ylabel="", xlabel="Liczba odpowiedzi")
g.axes[0, 1].set(title="Wędrownicy", xlabel="Liczba odpowiedzi")
plt.suptitle("Czy jesteś w drużynie/patrolu wędrowników?", y=1.05)
plt.show()
plt.close()
Przyglądając się długości stażu w drużynie wędrowników wśród respondentów nie posiadających naramiennika, można dostrzec, że istnieje znacząca grupa wędrowników, która jest w drużynie od ponad roku, a nadal nie ma naramiennika. Z wyników usunięto trzy wyniki, których wartości wynosiły ponad 30 miesięcy i można je potraktować jako prawdobodne błędne (lub są to skrajnie patologiczne przypadki).
g = sns.catplot(
df_input.query("wstapienie_wiek != 'Nie wstąpiłem nigdy do drużyny/patrolu'").query("czas_od_wstapienia < 30"),
y="czas_od_wstapienia",
col="czy_zdobywasz",
kind="swarm",
color='#FFC30F',
s=100,
)
g.axes[0, 0].set(title="Zdobywający naramiennik")
g.axes[0, 1].set(title="Niezdobywający naramiennik")
g.set(xlabel="", ylabel="liczba miesięcy")
plt.suptitle("Ile miesięcy minęło od wstąpienia Ciebie\ndo drużyny wędrowników w miesiącach?", y=1.10)
plt.show()
plt.close()
Przyglądając się znajomości zasad zdobywania naramienników, to około 1/3 wędrowników nie zna zasad.
g = sns.catplot(
data=df_input.query("czy_naramiennik == 'NIE'"),# .query("czy_naramiennik == 'NIE'"), #.query("wstapienie_wiek != 'Nie wstąpiłem nigdy do drużyny/patrolu'"),
y="czy_znasz_naramiennik",
# hue="czy_instruktor",
# hue_order=["TAK", "NIE"],
col="czy_zdobywasz",
col_order=["TAK", "NIE"],
order=["TAK", "NIE", "NIE DOTYCZY"],
kind="count",
stat="count",
color="#165110",
# palette="pastel6",
legend=False,
orient="v",
)
# g.axes[0, 0].set(title="Instruktorzy", ylabel="", xlabel="Liczba odpowiedzi")
# g.axes[0, 1].set(title="Wędrownicy", xlabel="Liczba odpowiedzi")
g.axes[0, 0].set(title="Zdobywający naramiennik")
g.axes[0, 1].set(title="Niezdobywający naramiennik")
g.set(ylabel="", xlabel="Liczba odpowiedzi")
plt.suptitle("Czy znasz zasady i tradycje zdobywania naramiennika w Twojej drużynie?", y=1.05)
plt.show()
plt.close()
stopien_order = [
'Bez stopnia',
'Młodzik',
'Wywiadowca',
'Ćwik',
'Harcerz Orli',
'Harcerz Rzeczypospolitej',
]
stopien_order_simple = [
'Bez stopnia',
'Młodzik',
'Wywiadowca',
'Ćwik',
'HO',
'HR',
]
kiedy_stopien_order = [
'mniej niż pół roku',
'pół roku do roku',
'ponad rok',
'wyżej się nie da, mam HR :)',
]
df_stopnie = df_input.query("czy_naramiennik == 'NIE'")[["stopien", "kiedy_stopien", "czy_zdobywasz"]]
key_stopnie = lambda col: col.apply(lambda x: stopien_order.index(x) + 1 if x in stopien_order else kiedy_stopien_order.index(x) + 1)
df_stopnie = (df_stopnie
.value_counts()
.rename("Odpowiedzi")
.reset_index()
.sort_values(["stopien", "kiedy_stopien"], key=key_stopnie)
.replace({"Harcerz Orli": "HO", "Harcerz Rzeczypospolitej": "HR"})
)
# df_stopnie
df_stopnie["stopien"] = pd.Categorical(df_stopnie.stopien, stopien_order_simple)
from matplotlib import transforms
Większość respondentów zdobywających naramiennik ma stopień wywiadowcy lub ćwika. Poniższy wykres jednak trzeba traktować jako dodatek na koniec tzn. z dużą rezerwą. Można dostrzeć, że Ci co nie zdobywają naramienników generalnie mają wyższe stopnie harcerskie i są późniejszym etapie harcerskim, ale ze względu na małą liczbę odpowiedzi trudno jednoznacznie potwierdzić czy to zjawisko jest prawdziwe.
g = sns.JointGrid(
data=df_stopnie,
y="kiedy_stopien",
x="stopien",
height=7,
)
df_stopnie_yes = df_stopnie.query("czy_zdobywasz == 'TAK'")
df_stopnie_no = df_stopnie.query("czy_zdobywasz == 'NIE'")
trans_yes = g.ax_joint.transData + transforms.ScaledTranslation(-0.1, 0, g.figure.dpi_scale_trans)
trans_no = g.ax_joint.transData + transforms.ScaledTranslation(.1, 0, g.figure.dpi_scale_trans)
g.plot_joint(sns.scatterplot,
data=df_stopnie,
s=0.01,
alpha=1,
hue=df_stopnie["czy_zdobywasz"],
palette=sns.color_palette("blend:#165110,#B80C09", 2),
edgecolor=".7",
legend=True,
)
g.plot_joint(sns.scatterplot,
data=df_stopnie.query("czy_zdobywasz == 'TAK'"),
size=df_stopnie_yes["Odpowiedzi"],
alpha=.7,
sizes=(100, 500),
color="#165110",
edgecolor=".7",
transform=trans_yes,
legend=False,
)
g.plot_joint(sns.scatterplot,
data=df_stopnie.query("czy_zdobywasz == 'NIE'"),
size=df_stopnie_no["Odpowiedzi"],
alpha=.7,
sizes=(100, 500),
color="#B80C09",
edgecolor=".7",
transform=trans_no,
legend=False,
)
g.plot_marginals(sns.histplot, weights=df_stopnie["Odpowiedzi"], kde=False, hue=df_stopnie["czy_zdobywasz"], multiple="dodge", shrink=.75, palette=sns.color_palette("blend:#165110,#B80C09", 2),)
plt.suptitle("Korelacja aktualnego stopnia z przewidywanym czasem zdobycia kolejnego", y=1.05)
g.ax_joint.set_ylabel("Przewidywany czas zamknięcia kolejnego stopnia")
g.ax_joint.set_xlabel("Aktualny stopień harcerski")
sns.move_legend(g.ax_joint, "center right", markerscale=100, bbox_to_anchor=(1.6, .5), labelspacing=1.2, labels=["Zdobywa NW", "Niezdobywa NW"], frameon=False, title="")
plt.show()
plt.close()