Données anonymisées¶
Links: notebook
, html, PDF
, python
, slides, GitHub
Ces données ont été générées par une quarantaine de personnes et sont mises à disposition une fois anonymisées.
from jyquickhelper import add_notebook_menu
add_notebook_menu()
%matplotlib inline
Observations brutes¶
import pandas
df = pandas.read_csv("logs/qcm100.txt", encoding="utf-8")
df.head()
-a0 | -a1 | -a2 | events | game | ml_french_qcm-0-a0 | ml_french_qcm-0-a2 | ml_french_qcm-0-a3 | ml_french_qcm-0-b | ml_french_qcm-0-duration | ... | simple_french_qcm-7-a1 | simple_french_qcm-7-a2 | simple_french_qcm-7-b | simple_french_qcm-7-duration | simple_french_qcm-7-nbvisit | simple_french_qcm-8-ANS | simple_french_qcm-8-b | simple_french_qcm-8-duration | simple_french_qcm-8-nbvisit | time | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2018-12-12 17:56:29.989 |
1 | NaN | NaN | NaN | -a0,on | simple_french_qcm | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2018-12-12 17:56:34.255 |
2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2018-12-12 17:56:34.302 |
3 | NaN | NaN | NaN | -a2,on | simple_french_qcm | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2018-12-12 17:56:37.645 |
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2018-12-12 17:56:37.677 |
5 rows × 168 columns
Préparation des données¶
df2 = df[df.qtime == 'end'].copy()
df2.head().T.head()
1 | 3 | 5 | 7 | 9 | |
---|---|---|---|---|---|
-a0 | NaN | NaN | NaN | NaN | NaN |
-a1 | NaN | NaN | NaN | NaN | NaN |
-a2 | NaN | NaN | NaN | NaN | NaN |
events | -a0,on | -a2,on | -a2,on | -a2,on-a2,on-a3,on-a2,on | -a2,on |
game | simple_french_qcm | simple_french_qcm | simple_french_qcm | simple_french_qcm | simple_french_qcm |
Premier jeu : simple_french_qcm¶
person_id = ['person_id']
cols = person_id + [c for c in df2.columns if "simple_french_qcm" in c and '-a' in c]
df_question = df2[cols]
cols = person_id + [c for c in df2.columns if "simple_french_qcm" in c and '-b' in c]
df_bouton = df2[cols]
cols = person_id + [c for c in df2.columns if "simple_french_qcm" in c and '-nb' in c]
df_visit = df2[cols]
cols = person_id + [c for c in df2.columns if "simple_french_qcm" in c and '-ANS' in c]
df_ans = df2[cols]
cols = person_id + [c for c in df2.columns if "simple_french_qcm" in c and '-dur' in c]
df_dur = df2[cols]
df_question.shape
(465, 31)
df_dur.head().T
1 | 3 | 5 | 7 | 9 | |
---|---|---|---|---|---|
person_id | c241c15008614ea67480 | 32606f02fa0df6aac111 | 32606f02fa0df6aac111 | 32606f02fa0df6aac111 | 32606f02fa0df6aac111 |
simple_french_qcm-0-duration | 0 days 00:00:04.266000000 | NaN | NaN | NaN | NaN |
simple_french_qcm-1-duration | NaN | 0 days 00:00:03.343000000 | NaN | NaN | NaN |
simple_french_qcm-2-duration | NaN | NaN | 0 days 00:00:06.750000000 | NaN | NaN |
simple_french_qcm-3-duration | NaN | NaN | NaN | 1 days 00:00:00.000000000 | NaN |
simple_french_qcm-4-duration | NaN | NaN | NaN | NaN | 0 days 00:00:09.688000000 |
simple_french_qcm-5-duration | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-6-duration | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-7-duration | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-8-duration | NaN | NaN | NaN | NaN | NaN |
import numpy
def aggnotnan_serie(values):
res = []
for v in values:
if isinstance(v, float) and numpy.isnan(v):
continue
if pandas.isnull(v):
continue
if v in ('ok', 'on'):
v = 1
elif v == 'skip':
v = 1000
res.append(v)
if len(res) > 0:
if isinstance(res[0], str):
r = ",".join(str(_) for _ in res)
else:
if len(res) == 1:
r = res[0]
else:
try:
r = sum(res)
except:
r = 0
else:
r = numpy.nan
return r
def aggnotnan(values):
if isinstance(values, pandas.core.series.Series):
r = aggnotnan_serie(values)
return r
else:
res = []
for col in values.columns:
val = list(values[col])
res.append(aggnotnan_serie(val))
df = pandas.DataFrame(res, columns)
return df
gr_ans = df_ans.groupby("person_id").agg(aggnotnan)
gr_ans
simple_french_qcm-8-ANS | |
---|---|
person_id | |
0c3a2f07b272478e4cd8 | Thalès ! |
0cf4e678b9586d5b0e37 | Pythagore |
0fa2c1f9be1abc2c1d0b | Thalès |
10fb62c55bc7a6a5cda2 | |
14db30224001f714a266 | Thales |
26310ba7a08a6b652fad | T |
2c987776b9f528f4eeec | Pythagore |
2f2bc77792dacadebd46 | NaN |
30035b23562d5b2df36f | |
32606f02fa0df6aac111 | NaN |
33e5a65b534574acfb6e | |
33eada5fee0e4231d402 | Pythagore |
3747fb5233006d3805da | |
43637590b1591346cfc7 | Pythagore |
4a09796a11ccc59ef66a | |
4b2cc1988785a7526ca1 | Astérix et Cléopâtre |
50670df89db35a7ae946 | Pythagore |
5102d6da7b6ed2c2690c | Thales |
5a24afa1f3a84660b6d7 | Pythagore |
5a617c2783baa779527f | NaN |
69fc4cf871b5db6fca3a | NaN |
6a5bf88f39630d05d66c | Thales |
753a507a9205e4c196fa | Prout |
75a639141c325f39a368 | |
75b801f977bc69f8a34b | |
8a8c40ad28eb1206efd5 | |
8e09880e917ca37a12dd | Pythagore, il était pété et il s'est exclamé ... |
8f84e052a4513ed0dd80 | Pythagore |
93087555ec15d71b0da1 | euler |
afe4be0559208b09e577 | Thalès |
b0316cecc64ba1c1bd87 | Thales |
b07297f205b22a5d42d5 | Pythagore |
b0d3a8fd2b67439fba05 | Pythagore |
c241c15008614ea67480 | thalès |
c25deb2067e5a89b0223 | Pythagore |
d084aaa43b1793c01dd2 | Pythagore |
d228121baddcfea28ec2 | Pythagore |
d36d229a6a41414c6b26 | Pythagore |
dc1f7980a1e746469861 | |
e2cf842295864a4d2620 | Pytagore |
eed744add9c2737812ad | Foucault |
gr_dur = df_dur.groupby("person_id").agg(aggnotnan)
gr_dur.head().T
person_id | 0c3a2f07b272478e4cd8 | 0cf4e678b9586d5b0e37 | 0fa2c1f9be1abc2c1d0b | 10fb62c55bc7a6a5cda2 | 14db30224001f714a266 |
---|---|---|---|---|---|
simple_french_qcm-0-duration | 0 days 00:00:05.094000000 | 1 days 00:00:00.000000000,1 days 00:00:00.0000... | 0 days 00:00:03.546000000 | 0 days 00:00:04.912000000,0 days 00:00:07.5230... | 0 days 00:00:08.688000000 |
simple_french_qcm-1-duration | 0 days 00:00:04.359000000 | 0 days 00:00:09.323000000 | 0 days 00:00:04.949000000 | 1 days 00:00:00.000000000,1 days 00:00:00.0000... | 1 days 00:00:00.000000000 |
simple_french_qcm-2-duration | 0 days 00:00:26.656000000 | 0 days 00:00:05.733000000 | 0 days 00:00:58.690000000 | 0 days 00:00:31.779000000,0 days 00:00:34.1990... | 0 days 00:00:15.349000000 |
simple_french_qcm-3-duration | 0 days 00:00:08.125000000 | 0 days 00:00:05.321000000 | 0 days 00:00:24.203000000 | 0 days 00:00:26.622000000,0 days 00:00:28.4660... | 1 days 00:00:00.000000000 |
simple_french_qcm-4-duration | 0 days 00:01:29.203000000 | 0 days 00:00:07.680000000 | 0 days 00:00:09.975000000 | 0 days 00:00:13.814000000,0 days 00:00:15.0330... | 0 days 00:01:08.922000000 |
simple_french_qcm-5-duration | 0 days 00:00:08.047000000 | 0 days 00:00:08.045000000 | 0 days 00:00:16.402000000 | 0 days 00:00:14.796000000,0 days 00:00:15.8870... | 1 days 00:00:00.000000000 |
simple_french_qcm-6-duration | 0 days 00:00:18.359000000 | 0 days 00:00:04.377000000 | 0 days 00:01:13.287000000 | 0 days 00:00:26.275000000,0 days 00:00:28.6000... | 0 days 00:00:34.538000000 |
simple_french_qcm-7-duration | 0 days 00:00:23.953000000 | 0 days 00:00:11.580000000 | 0 days 00:00:10.718000000 | 0 days 00:00:01.156000000 | 0 days 00:00:22.348000000 |
simple_french_qcm-8-duration | 0 days 00:00:07.641000000 | 0 days 00:00:06.796000000 | 0 days 00:00:08.438000000 | 0 days 00:00:01.813000000 | 0 days 00:00:47.971000000 |
gr_question = df_question.groupby("person_id").agg(aggnotnan)
gr_question.head().T
person_id | 0c3a2f07b272478e4cd8 | 0cf4e678b9586d5b0e37 | 0fa2c1f9be1abc2c1d0b | 10fb62c55bc7a6a5cda2 | 14db30224001f714a266 |
---|---|---|---|---|---|
simple_french_qcm-0-a0 | 1.0 | NaN | NaN | 1.0 | NaN |
simple_french_qcm-0-a1 | NaN | NaN | 1.0 | NaN | 1.0 |
simple_french_qcm-0-a2 | NaN | 2.0 | NaN | NaN | NaN |
simple_french_qcm-1-a1 | NaN | NaN | NaN | NaN | 1.0 |
simple_french_qcm-1-a2 | 1.0 | 1.0 | 1.0 | NaN | NaN |
simple_french_qcm-2-a0 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-2-a1 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-2-a2 | NaN | NaN | 1.0 | 1.0 | 1.0 |
simple_french_qcm-2-a3 | 1.0 | 1.0 | NaN | NaN | NaN |
simple_french_qcm-3-a0 | NaN | 1.0 | NaN | NaN | 1.0 |
simple_french_qcm-3-a2 | NaN | NaN | 1.0 | NaN | NaN |
simple_french_qcm-3-a3 | 1.0 | NaN | NaN | NaN | NaN |
simple_french_qcm-3-a4 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-4-a0 | NaN | NaN | NaN | 1.0 | 1.0 |
simple_french_qcm-4-a1 | NaN | NaN | 1.0 | NaN | NaN |
simple_french_qcm-4-a2 | 1.0 | 1.0 | NaN | NaN | NaN |
simple_french_qcm-4-a3 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-5-a0 | 1.0 | NaN | 1.0 | NaN | 1.0 |
simple_french_qcm-5-a1 | 1.0 | 1.0 | 1.0 | 1.0 | NaN |
simple_french_qcm-5-a2 | 1.0 | 1.0 | 1.0 | NaN | NaN |
simple_french_qcm-5-a4 | 1.0 | NaN | NaN | NaN | NaN |
simple_french_qcm-6-a0 | 1.0 | NaN | NaN | NaN | NaN |
simple_french_qcm-6-a1 | NaN | 1.0 | NaN | NaN | NaN |
simple_french_qcm-6-a2 | 1.0 | NaN | NaN | 1.0 | 1.0 |
simple_french_qcm-6-a3 | NaN | NaN | 1.0 | NaN | NaN |
simple_french_qcm-6-a4 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-6-a5 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-7-a0 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-7-a1 | NaN | NaN | NaN | NaN | NaN |
simple_french_qcm-7-a2 | 1.0 | 1.0 | 1.0 | NaN | 1.0 |
gr_question.shape
(41, 30)
gr_bouton = df_bouton.groupby("person_id").agg(aggnotnan)
gr_bouton.head().T
person_id | 0c3a2f07b272478e4cd8 | 0cf4e678b9586d5b0e37 | 0fa2c1f9be1abc2c1d0b | 10fb62c55bc7a6a5cda2 | 14db30224001f714a266 |
---|---|---|---|---|---|
simple_french_qcm-0-b | 1.0 | 1001.0 | 1.0 | 1001.0 | 1.0 |
simple_french_qcm-1-b | 1.0 | 1.0 | 1.0 | 2000.0 | 1.0 |
simple_french_qcm-2-b | 1.0 | 1.0 | 1.0 | 2000.0 | 1.0 |
simple_french_qcm-3-b | 1.0 | 1.0 | 1.0 | 2000.0 | 1.0 |
simple_french_qcm-4-b | 1.0 | 1.0 | 1.0 | 2000.0 | 1.0 |
simple_french_qcm-5-b | 1.0 | 1.0 | 1.0 | 1001.0 | 1.0 |
simple_french_qcm-6-b | 1.0 | 1.0 | 1.0 | 2000.0 | 1.0 |
simple_french_qcm-7-b | 1.0 | 1.0 | 1.0 | 1000.0 | 1.0 |
simple_french_qcm-8-b | 1.0 | 1.0 | 1.0 | 1000.0 | 1.0 |
gr_visit = df_visit.groupby("person_id").agg(aggnotnan)
gr_visit.head().T
person_id | 0c3a2f07b272478e4cd8 | 0cf4e678b9586d5b0e37 | 0fa2c1f9be1abc2c1d0b | 10fb62c55bc7a6a5cda2 | 14db30224001f714a266 |
---|---|---|---|---|---|
simple_french_qcm-0-nbvisit | 1.0 | 2.0 | 1.0 | 3.0 | 1.0 |
simple_french_qcm-1-nbvisit | 1.0 | 2.0 | 1.0 | 4.0 | 1.5 |
simple_french_qcm-2-nbvisit | 1.0 | 1.0 | 1.0 | 3.0 | 1.0 |
simple_french_qcm-3-nbvisit | 1.0 | 1.0 | 1.0 | 3.0 | 1.5 |
simple_french_qcm-4-nbvisit | 1.0 | 1.0 | 1.0 | 3.0 | 1.0 |
simple_french_qcm-5-nbvisit | 1.0 | 1.0 | 1.0 | 3.0 | 1.5 |
simple_french_qcm-6-nbvisit | 1.0 | 1.0 | 1.0 | 3.5 | 1.0 |
simple_french_qcm-7-nbvisit | 1.0 | 1.0 | 1.0 | 1.5 | 1.0 |
simple_french_qcm-8-nbvisit | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
Histogrammes¶
nonan_question = gr_question.fillna(0)
nonan_question.shape
(41, 30)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nonan_question.shape[0], 1,
figsize=(8, nonan_question.shape[0]))
for i in range(0, nonan_question.shape[0]):
ax[i].set_ylabel(nonan_question.index[i])
ax[i].bar(list(range(nonan_question.shape[1])),
nonan_question.iloc[i,:])
ACP¶
nonan_question.shape
(41, 30)
from sklearn.decomposition import PCA
acp = PCA(n_components=2, svd_solver="arpack")
acp.fit(nonan_question)
PCA(n_components=2, svd_solver='arpack')
coord = acp.transform(nonan_question)
data = pandas.DataFrame(data=coord, columns=['X1', 'X2'], index=nonan_question.index)
data["cluster"] = 0
data.head()
X1 | X2 | cluster | |
---|---|---|---|
person_id | |||
0c3a2f07b272478e4cd8 | 0.151681 | 0.892031 | 0 |
0cf4e678b9586d5b0e37 | 0.809105 | 0.267815 | 0 |
0fa2c1f9be1abc2c1d0b | -0.243414 | 0.005855 | 0 |
10fb62c55bc7a6a5cda2 | -0.830133 | -0.506903 | 0 |
14db30224001f714a266 | -0.433964 | -1.207925 | 0 |
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
colors = ['red', 'blue', 'orange', 'green']
for i in range(0, 1):
data[data.cluster==i].plot(x="X1", y="X2",
kind="scatter",
ax=ax, label="c%d" % i,
color=colors[i])
data["weight"] = 10
# Plot miles per gallon against horsepower with other semantics
fig, ax = plt.subplots(1, 1, figsize=(14, 4))
ax.plot(data.loc[data.cluster == 0, 'X1'].values,
data.loc[data.cluster == 0, 'X2'].values, "ro", label="c0")
ax.plot(data.loc[data.cluster == 1, 'X1'].values,
data.loc[data.cluster == 1, 'X2'].values, "bo", label="c1")
ind = list(data.index)
for i in range(0, data.shape[0]):
ax.text(data.iloc[i, 0], data.iloc[i, 1], ind[i])
ax.legend();
Second jeu de données¶
df2 = df[df.qtime == 'end'].copy()
person_id = ['person_id']
cols = person_id + [c for c in df2.columns if "ml_french" in c and '-a' in c]
df2_question = df2[cols]
import missingno as msno
msno.matrix(df2_question, figsize=(15,3));
cols = person_id + [c for c in df2.columns if "ml_french" in c and '-b' in c]
df2_bouton = df2[cols]
cols = person_id + [c for c in df2.columns if "ml_french" in c and '-nb' in c]
df2_visit = df2[cols]
cols = person_id + [c for c in df2.columns if "ml_french" in c and '-dur' in c]
df2_dur = df2[cols]
gr2_question = df2_question.groupby("person_id").agg(aggnotnan)
gr2_question.T
person_id | 0c3a2f07b272478e4cd8 | 0cf4e678b9586d5b0e37 | 0fa2c1f9be1abc2c1d0b | 10fb62c55bc7a6a5cda2 | 14db30224001f714a266 | 26310ba7a08a6b652fad | 2c987776b9f528f4eeec | 2f2bc77792dacadebd46 | 30035b23562d5b2df36f | 32606f02fa0df6aac111 | ... | b07297f205b22a5d42d5 | b0d3a8fd2b67439fba05 | c241c15008614ea67480 | c25deb2067e5a89b0223 | d084aaa43b1793c01dd2 | d228121baddcfea28ec2 | d36d229a6a41414c6b26 | dc1f7980a1e746469861 | e2cf842295864a4d2620 | eed744add9c2737812ad |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ml_french_qcm-0-a0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-0-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-0-a3 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-1-a1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-1-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-1-a3 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-10-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-10-a1 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-10-a3 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-11-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-11-a1 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-11-a2 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | 2.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-11-a3 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-12-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-12-a1 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-12-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-12-a3 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-13-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-13-a2 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-13-a3 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-14-a1 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-14-a3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-2-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-2-a2 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-2-a3 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-3-a1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-3-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-3-a3 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-3-a4 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-3-a5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-4-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-4-a1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-4-a2 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-4-a4 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-5-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-5-a1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-5-a2 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-5-a4 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-6-a0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-6-a1 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-6-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-6-a3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-7-a3 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-7-a4 | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-7-a5 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-7-a6 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-8-a1 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-8-a2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-8-a3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-9-a0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-9-a1 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-9-a2 | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
ml_french_qcm-9-a3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
53 rows × 41 columns
msno.matrix(gr2_question, figsize=(10,4));
ACP¶
gr2_question.shape
(41, 53)
nonan2_question = gr2_question.fillna(0)
from sklearn.decomposition import PCA
acp = PCA(n_components=2, svd_solver="arpack")
acp.fit(nonan2_question)
PCA(n_components=2, svd_solver='arpack')
coord = acp.transform(nonan2_question)
data = pandas.DataFrame(data=coord, columns=['X1', 'X2'], index=nonan_question.index)
data["cluster"] = 0
data
X1 | X2 | cluster | |
---|---|---|---|
person_id | |||
0c3a2f07b272478e4cd8 | 2.887376 | 0.633808 | 0 |
0cf4e678b9586d5b0e37 | -0.453284 | -0.002668 | 0 |
0fa2c1f9be1abc2c1d0b | 2.192238 | 2.514812 | 0 |
10fb62c55bc7a6a5cda2 | -0.453284 | -0.002668 | 0 |
14db30224001f714a266 | -0.453284 | -0.002668 | 0 |
26310ba7a08a6b652fad | -0.453284 | -0.002668 | 0 |
2c987776b9f528f4eeec | -0.453284 | -0.002668 | 0 |
2f2bc77792dacadebd46 | 2.600291 | -1.841381 | 0 |
30035b23562d5b2df36f | -0.344912 | 0.188055 | 0 |
32606f02fa0df6aac111 | -0.453284 | -0.002668 | 0 |
33e5a65b534574acfb6e | -0.453284 | -0.002668 | 0 |
33eada5fee0e4231d402 | -0.453284 | -0.002668 | 0 |
3747fb5233006d3805da | -0.453284 | -0.002668 | 0 |
43637590b1591346cfc7 | -0.453284 | -0.002668 | 0 |
4a09796a11ccc59ef66a | 1.761605 | -1.720518 | 0 |
4b2cc1988785a7526ca1 | -0.453284 | -0.002668 | 0 |
50670df89db35a7ae946 | 2.517077 | 1.622700 | 0 |
5102d6da7b6ed2c2690c | -0.453284 | -0.002668 | 0 |
5a24afa1f3a84660b6d7 | -0.453284 | -0.002668 | 0 |
5a617c2783baa779527f | -0.105955 | 0.247710 | 0 |
69fc4cf871b5db6fca3a | -0.453284 | -0.002668 | 0 |
6a5bf88f39630d05d66c | -0.453284 | -0.002668 | 0 |
753a507a9205e4c196fa | -0.453284 | -0.002668 | 0 |
75a639141c325f39a368 | -0.453284 | -0.002668 | 0 |
75b801f977bc69f8a34b | -0.453284 | -0.002668 | 0 |
8a8c40ad28eb1206efd5 | -0.453284 | -0.002668 | 0 |
8e09880e917ca37a12dd | -0.453284 | -0.002668 | 0 |
8f84e052a4513ed0dd80 | -0.453284 | -0.002668 | 0 |
93087555ec15d71b0da1 | 2.753499 | -1.265432 | 0 |
afe4be0559208b09e577 | 0.243858 | -0.294390 | 0 |
b0316cecc64ba1c1bd87 | -0.453284 | -0.002668 | 0 |
b07297f205b22a5d42d5 | -0.453284 | -0.002668 | 0 |
b0d3a8fd2b67439fba05 | -0.453284 | -0.002668 | 0 |
c241c15008614ea67480 | -0.453284 | -0.002668 | 0 |
c25deb2067e5a89b0223 | -0.453284 | -0.002668 | 0 |
d084aaa43b1793c01dd2 | -0.453284 | -0.002668 | 0 |
d228121baddcfea28ec2 | -0.453284 | -0.002668 | 0 |
d36d229a6a41414c6b26 | -0.453284 | -0.002668 | 0 |
dc1f7980a1e746469861 | -0.453284 | -0.002668 | 0 |
e2cf842295864a4d2620 | -0.453284 | -0.002668 | 0 |
eed744add9c2737812ad | -0.453284 | -0.002668 | 0 |
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
colors = ['red', 'blue', 'orange', 'green']
for i in range(0, 1):
data[data.cluster==i].plot(x="X1", y="X2",
kind="scatter",
ax=ax, label="c%d" % i,
color=colors[i])