diff --git a/tools/statistics/analyse/age.py b/tools/statistics/analyse/age.py new file mode 100644 index 0000000..182bb66 --- /dev/null +++ b/tools/statistics/analyse/age.py @@ -0,0 +1,23 @@ +from collections import Counter + +import matplotlib.pyplot as plt + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + ages_data = list(map(extract.age.extract, datas)) + + counter = Counter(ages_data) + ages_x = list(counter.keys()) + ages_y = list(counter.values()) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre de personne par âge") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/completion_per_age.py b/tools/statistics/analyse/completion_per_age.py new file mode 100644 index 0000000..ba7cb06 --- /dev/null +++ b/tools/statistics/analyse/completion_per_age.py @@ -0,0 +1,39 @@ +from collections import defaultdict + +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + ages_completion: dict[int, int] = defaultdict(lambda: 0) + ages_count: dict[int, int] = defaultdict(lambda: 0) + + for data in datas: + age = extract.age.extract(data) + ages_count[age] += 1 + + for survey, survey_data in data["surveys"].items(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + if extract.mission_completed.extract(data, survey): + ages_completion[age] += 1 + + ages_x = list(ages_completion.keys()) + ages_y = ( + np.array(list(ages_completion.values())) + / np.array(list(ages_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre moyen de mission complété par âge") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/completion_per_experience.py b/tools/statistics/analyse/completion_per_experience.py new file mode 100644 index 0000000..2522570 --- /dev/null +++ b/tools/statistics/analyse/completion_per_experience.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + experience_completion: dict[str, int] = {"yes": 0, "mixed": 0, "no": 0} + experience_count: dict[str, int] = {"yes": 0, "mixed": 0, "no": 0} + + for data in datas: + experience = extract.experience.extract(data) + experience_count[experience] += 1 + + for survey, survey_data in data["surveys"].items(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + if extract.mission_completed.extract(data, survey): + experience_completion[experience] += 1 + + ages_x = list(experience_completion.keys()) + ages_y = ( + np.array(list(experience_completion.values())) + / np.array(list(experience_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre moyen de mission complété par expérience") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/completion_per_mission.py b/tools/statistics/analyse/completion_per_mission.py new file mode 100644 index 0000000..d757cdd --- /dev/null +++ b/tools/statistics/analyse/completion_per_mission.py @@ -0,0 +1,44 @@ +import matplotlib.pyplot as plt + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + completions: dict[str] = { + "mission-language": 0, + "mission-price": 0, + "mission-community-hub": 0, + "mission-game-page": 0, + "mission-game-dlc": 0, + "mission-actuality-new": 0, + "mission-profile": 0, + "mission-game-discussion": 0, + "mission-gift-card": 0, + "mission-workshop": 0, + } + + # NOTE : séparé avant / après grosse mise à jour pour carte cadeau ? + + for data in datas: + for survey in data["surveys"].keys(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + if extract.mission_completed.extract(data, survey): + completions[survey] += 1 + + completions_x = list(completions.keys()) + completions_y = list(completions.values()) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre de personne ayant réussi par mission") + + # bar chart + axes.bar(completions_x, completions_y) + axes.set_xticks(completions_x) + axes.set_xticklabels(completions_x, rotation=45) + + plt.show(block=True) diff --git a/tools/statistics/analyse/completion_per_usage.py b/tools/statistics/analyse/completion_per_usage.py new file mode 100644 index 0000000..f9224e2 --- /dev/null +++ b/tools/statistics/analyse/completion_per_usage.py @@ -0,0 +1,41 @@ +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + usage_completion: dict[str, int] = {"always": 0, "often": 0, "sometime": 0, "rarely": 0, "never": 0} + usage_count: dict[str, int] = {"always": 0, "often": 0, "sometime": 0, "rarely": 0, "never": 0} + + for data in datas: + usage = next(filter( + lambda it: it[1]["checked"], + data["surveys"]["question-usage-steam"]["choices"].items() + ))[0] + + usage_count[usage] += 1 + + for survey in data["surveys"].keys(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + if extract.mission_completed.extract(data, survey): + usage_completion[usage] += 1 + + usages_x = list(usage_completion.keys()) + usages_y = ( + np.array(list(usage_completion.values())) + / np.array(list(usage_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre moyen de mission complété par niveau") + + # bar chart + axes.bar(usages_x, usages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/duration_per_age.py b/tools/statistics/analyse/duration_per_age.py new file mode 100644 index 0000000..24cebae --- /dev/null +++ b/tools/statistics/analyse/duration_per_age.py @@ -0,0 +1,40 @@ +from collections import defaultdict + +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + ages_duration: dict[int, int] = defaultdict(lambda: 0) + ages_count: dict[int, int] = defaultdict(lambda: 0) + + # TODO: faire des tranches d'âges ? + + for data in datas: + age = extract.age.extract(data) + ages_count[age] += 1 + + for survey in data["surveys"].keys(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + ages_duration[age] += extract.mission_duration.extract(data, survey) + + ages_x = list(ages_duration.keys()) + ages_y = ( + np.array(list(ages_duration.values())) + / np.array(list(ages_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Temps moyen passé par âge") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/duration_per_experience.py b/tools/statistics/analyse/duration_per_experience.py new file mode 100644 index 0000000..8d99114 --- /dev/null +++ b/tools/statistics/analyse/duration_per_experience.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + experience_duration: dict[str, int] = {"yes": 0, "mixed": 0, "no": 0} + experience_count: dict[str, int] = {"yes": 0, "mixed": 0, "no": 0} + + for data in datas: + experience = extract.experience.extract(data) + experience_count[experience] += 1 + + for survey, survey_data in data["surveys"].items(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + if extract.mission_completed.extract(data, survey): + experience_duration[experience] += extract.mission_duration.extract(data, survey) + + ages_x = list(experience_duration.keys()) + ages_y = ( + np.array(list(experience_duration.values())) + / np.array(list(experience_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Temps moyen passé par expérience") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/duration_per_mission.py b/tools/statistics/analyse/duration_per_mission.py new file mode 100644 index 0000000..1d7989a --- /dev/null +++ b/tools/statistics/analyse/duration_per_mission.py @@ -0,0 +1,45 @@ +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + durations: dict[str] = { + "mission-language": 0, + "mission-price": 0, + "mission-community-hub": 0, + "mission-game-page": 0, + "mission-game-dlc": 0, + "mission-actuality-new": 0, + "mission-profile": 0, + "mission-game-discussion": 0, + "mission-gift-card": 0, + "mission-workshop": 0, + } + + # NOTE : séparé avant / après grosse mise à jour pour carte cadeau ? + # NOTE : marqué en rouge la durée d'abandon ? + + for data in datas: + for survey in data["surveys"].keys(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + durations[survey] += extract.mission_duration.extract(data, survey) + + durations_x = list(durations.keys()) + durations_y = np.array(list(durations.values())) / len(datas) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Temps moyen passé par test") + + # bar chart + axes.bar(durations_x, durations_y) + axes.set_xticks(durations_x) + axes.set_xticklabels(durations_x, rotation=45) + + plt.show(block=True) diff --git a/tools/statistics/analyse/duration_per_usage.py b/tools/statistics/analyse/duration_per_usage.py new file mode 100644 index 0000000..7228329 --- /dev/null +++ b/tools/statistics/analyse/duration_per_usage.py @@ -0,0 +1,38 @@ +import matplotlib.pyplot as plt +import numpy as np + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + usage_completion: dict[str, int] = {"always": 0, "often": 0, "sometime": 0, "rarely": 0, "never": 0} + usage_count: dict[str, int] = {"always": 0, "often": 0, "sometime": 0, "rarely": 0, "never": 0} + + # TODO: faire des tranches d'âges ? + + for data in datas: + usage = extract.usage.extract(data) + usage_count[usage] += 1 + + for survey in data["surveys"].keys(): + # only scan survey mission + if not survey.startswith("mission-"): + continue + + usage_completion[usage] += extract.mission_duration.extract(data, survey) + + ages_x = list(usage_completion.keys()) + ages_y = ( + np.array(list(usage_completion.values())) + / np.array(list(usage_count.values())) + ) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Temps moyen passé par niveau") + + # bar chart + axes.bar(ages_x, ages_y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/experience.py b/tools/statistics/analyse/experience.py new file mode 100644 index 0000000..2730e67 --- /dev/null +++ b/tools/statistics/analyse/experience.py @@ -0,0 +1,26 @@ +from collections import Counter + +import matplotlib.pyplot as plt + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + experiences: dict[str, int] = {"yes": 0, "mixed": 0, "no": 0} + for data in datas: + experience = extract.experience.extract(data) + experiences[experience] += 1 + + counter = Counter(experiences) + x = list(counter.keys()) + y = list(counter.values()) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Nombre de personne par expérience") + + # bar chart + axes.bar(x, y) + + plt.show(block=True) diff --git a/tools/statistics/analyse/hardest_mission.py b/tools/statistics/analyse/hardest_mission.py new file mode 100644 index 0000000..e55f07a --- /dev/null +++ b/tools/statistics/analyse/hardest_mission.py @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + missions = { + "mission-language": 0, + "mission-price": 0, + "mission-community-hub": 0, + "mission-game-page": 0, + "mission-game-dlc": 0, + "mission-actuality-new": 0, + "mission-profile": 0, + "mission-game-discussion": 0, + "mission-gift-card": 0, + "mission-workshop": 0 + } + + for data in datas: + missions[extract.hardest_mission.extract(data)] += 1 + + x = list(missions.keys()) + y = list(missions.values()) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Mission la plus difficile des personnes sondées") + + # bar chart + axes.bar(x, y) + axes.set_xticks(x) + axes.set_xticklabels(x, rotation=45) + + plt.show(block=True) diff --git a/tools/statistics/analyse/usage.py b/tools/statistics/analyse/usage.py new file mode 100644 index 0000000..af61abc --- /dev/null +++ b/tools/statistics/analyse/usage.py @@ -0,0 +1,24 @@ +import matplotlib.pyplot as plt + +from tools.statistics import extract + + +def analyse(datas: list[dict]): + usage_data = list(map(extract.usage.extract, datas)) + + usages: dict[str, int] = {"always": 0, "often": 0, "sometime": 0, "rarely": 0, "never": 0} + for usage in usage_data: + usages[usage] += 1 + + usages_x = list(usages.keys()) + usages_y = list(usages.values()) + + # prepare plotting + figure: plt.Figure = plt.figure() + axes = figure.add_subplot(1, 1, 1) + axes.set_title("Expérience des personnes sondées") + + # bar chart + axes.bar(usages_x, usages_y) + + plt.show(block=True) diff --git a/tools/statistics/extract/__init__.py b/tools/statistics/extract/__init__.py new file mode 100644 index 0000000..980fe61 --- /dev/null +++ b/tools/statistics/extract/__init__.py @@ -0,0 +1,6 @@ +from . import usage +from . import age +from . import mission_duration +from . import mission_completed +from . import experience +from . import hardest_mission diff --git a/tools/statistics/extract/age.py b/tools/statistics/extract/age.py new file mode 100644 index 0000000..157676b --- /dev/null +++ b/tools/statistics/extract/age.py @@ -0,0 +1,2 @@ +def extract(data: dict) -> int: + return data["surveys"]["question-age"]["value"] diff --git a/tools/statistics/extract/experience.py b/tools/statistics/extract/experience.py new file mode 100644 index 0000000..62fd367 --- /dev/null +++ b/tools/statistics/extract/experience.py @@ -0,0 +1,5 @@ +def extract(data: dict) -> str: + return next(filter( + lambda it: it[1]["checked"], + data["surveys"]["question-experience"]["choices"].items() + ))[0] diff --git a/tools/statistics/extract/hardest_mission.py b/tools/statistics/extract/hardest_mission.py new file mode 100644 index 0000000..da47c0c --- /dev/null +++ b/tools/statistics/extract/hardest_mission.py @@ -0,0 +1,5 @@ +def extract(data: dict) -> str: + return next(filter( + lambda it: it[1]["checked"], + data["surveys"]["question-hardest-mission"]["choices"].items() + ))[0] diff --git a/tools/statistics/extract/mission_completed.py b/tools/statistics/extract/mission_completed.py new file mode 100644 index 0000000..c189b70 --- /dev/null +++ b/tools/statistics/extract/mission_completed.py @@ -0,0 +1,9 @@ +def extract(data: dict, mission: str) -> bool: + events = data["surveys"][mission]["event"] + + try: + checks = next(filter(lambda event: event["type"] == "check", events)) + except StopIteration: + return False + else: + return True diff --git a/tools/statistics/extract/mission_duration.py b/tools/statistics/extract/mission_duration.py new file mode 100644 index 0000000..bcbc92a --- /dev/null +++ b/tools/statistics/extract/mission_duration.py @@ -0,0 +1,2 @@ +def extract(data: dict, mission: str) -> float: + return data["surveys"][mission]["event"][-1]["time"] diff --git a/tools/statistics/extract/usage.py b/tools/statistics/extract/usage.py new file mode 100644 index 0000000..6cd98c0 --- /dev/null +++ b/tools/statistics/extract/usage.py @@ -0,0 +1,5 @@ +def extract(data: dict) -> str: + return next(filter( + lambda it: it[1]["checked"], + data["surveys"]["question-usage-steam"]["choices"].items() + ))[0] diff --git a/tools/statistics/main.py b/tools/statistics/main.py index 1117f12..d07362b 100644 --- a/tools/statistics/main.py +++ b/tools/statistics/main.py @@ -1,38 +1,31 @@ from pathlib import Path +from tools.statistics.analyse import (age, usage, completion_per_mission, duration_per_mission, completion_per_age, + completion_per_usage, duration_per_age, duration_per_usage, + completion_per_experience, duration_per_experience, experience, hardest_mission) + if __name__ == "__main__": from source.utils import compress - directory = Path(r"C:\Users\RC606\Downloads\résultats étude") + directory = Path(r"./sondage/") # read every people survey data - for file in directory.rglob("*.rsl"): - # decompress the data - data = compress.uncompress_data(file.read_bytes()) + datas = [ + compress.uncompress_data(file.read_bytes()) # decompress the data + for file in directory.rglob("*.rsl") + ] - + # age.analyse(datas) + # usage.analyse(datas) + # experience.analyse(datas) + # hardest_mission.analyse(datas) # ! + # completion_per_mission.analyse(datas) + # completion_per_age.analyse(datas) + # completion_per_usage.analyse(datas) # ! + # completion_per_experience.analyse(datas) - ages = sorted(list(map( - lambda data: data["surveys"]["question-age"]["value"], - datas - ))) - - print(ages) - print(sum(ages) / len(ages)) - print(ages[len(ages) // 2]) - print(min(ages)) - print(max(ages)) - - print(datas[1]["surveys"]["question-usage-steam"]) - - usages = sorted(list(map( - lambda data: data["surveys"]["question-usage-steam"]["choices"], - datas - ))) - - print(usages) - print(sum(usages) / len(usages)) - print(usages[len(usages) // 2]) - print(min(usages)) - print(max(usages)) + # duration_per_mission.analyse(datas) + # duration_per_age.analyse(datas) + # duration_per_usage.analyse(datas) # ! + # duration_per_experience.analyse(datas) # !