In [165]:
# Wczytanie potrzebnych modułów, wyłączenie ostrzeżeń
import pandas as pd
import numpy as np
import seaborn as sns
from pandas import DataFrame,Series
%matplotlib inline
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import chi2
import statsmodels.api as sm
import warnings
warnings.filterwarnings('ignore')

Efekt Knobe'a, wiedza o obowiązku i istnienie obowiązku

Ignacy Szczeniowski, Sławomir Mijas

In [3]:
data = pd.read_csv('cleanDataIgnacySlawek169464.csv').dropna(thresh=11)

Pytanie o intencjonalność - tabela wyników

In [4]:
intentionality_x_table = pd.crosstab(data['Grupa'], data['Odpowiedź'])
intentionality_x_table
Out[4]:
Odpowiedź Nie Tak
Grupa
Harm 11 55
Help 56 7

Pytanie o wiedzę o obowiązku - tabela wyników

In [5]:
obligation_knowledge_x_table = pd.crosstab(data['Grupa'], data['Wiedza o obowiązku'])
obligation_knowledge_x_table
Out[5]:
Wiedza o obowiązku Nie Tak
Grupa
Harm 36 30
Help 50 13

Pytanie o istnienie obowiązku - tabela wyników

In [6]:
obligation_existence_x_table = pd.crosstab(data['Grupa'], data['Istnienie obowiązku'])
obligation_existence_x_table
Out[6]:
Istnienie obowiązku Nie Tak
Grupa
Harm 32 34
Help 47 16

Pytanie o intencjonalność - procentowa tabela wyników

In [9]:
intentionality_x_table_percent = intentionality_x_table.apply(lambda r: r/r.sum(), axis=1)
intentionality_x_table_percent.round(3) * 100
Out[9]:
Nie Tak
Grupa
Harm 16.7 83.3
Help 88.9 11.1

Pytanie o wiedzę o obowiązku - procentowa tabela wyników

In [10]:
obligation_knowledge_x_table_percent = obligation_knowledge_x_table.apply(lambda r: r/r.sum(), axis=1)
obligation_knowledge_x_table_percent.round(3)*100
Out[10]:
Nie Tak
Grupa
Harm 54.5 45.5
Help 79.4 20.6

Pytanie o istnienie obowiązku - procentowa tabela wyników

In [11]:
obligation_existence_x_table_percent = obligation_existence_x_table.apply(lambda r: r/r.sum(), axis=1)
obligation_existence_x_table_percent.round(3) * 100
Out[11]:
Nie Tak
Grupa
Harm 48.5 51.5
Help 74.6 25.4
In [12]:
i_df_percent = DataFrame(intentionality_x_table_percent.unstack()).reset_index().rename(columns={0:'Freq'})
sns.factorplot(y='Freq', x='Odpowiedź', data=i_df_percent, kind='bar', col = 'Grupa');
In [13]:
o_k_df_percent = DataFrame(obligation_knowledge_x_table_percent.unstack()).reset_index().rename(columns={0:'Freq'})
sns.factorplot(y='Freq', x='Wiedza o obowiązku', data=o_k_df_percent, kind='bar', col = 'Grupa');
In [14]:
o_e_df_percent = DataFrame(obligation_existence_x_table_percent.unstack()).reset_index().rename(columns={0:'Freq'})
sns.factorplot(y='Freq', x='Istnienie obowiązku', data=o_e_df_percent, kind='bar', col = 'Grupa');

Siatka korelacji między zmiennymi - grupa Harm

In [29]:
data_corr = data[['Odpowiedź', 'Wiedza o obowiązku', 'Istnienie obowiązku', 'Grupa']]
data_corr = data_corr[data_corr['Grupa'] == 'Harm']
r = {'Tak' : 1, 'Nie' : 0}
data_corr.replace({'Odpowiedź':r, 'Wiedza o obowiązku':r, 'Istnienie obowiązku':r}, inplace=True)
corr = data_corr.corr()
sns.heatmap(corr, square=True);

Siatka korelacji między zmiennymi - grupa Help

In [22]:
data_corr = data[['Odpowiedź', 'Wiedza o obowiązku', 'Istnienie obowiązku', 'Grupa']]
data_corr = data_corr[data_corr['Grupa'] == 'Help']
r = {'Tak' : 1, 'Nie' : 0}
data_corr.replace({'Odpowiedź':r, 'Wiedza o obowiązku':r, 'Istnienie obowiązku':r}, inplace=True)
corr = data_corr.corr()
sns.heatmap(corr, square=True);

Regresja logistyczna

In [23]:
data_logit = data[['Odpowiedź', 'Wiedza o obowiązku', 'Istnienie obowiązku', 'Grupa']]
r = {'Tak' : 1, 'Nie' : 0}
data_logit.replace({'Odpowiedź':r, 'Wiedza o obowiązku':r, 'Istnienie obowiązku':r}, inplace=True)

data_logit_harm = data_logit[data_logit['Grupa'] == 'Harm']
data_logit_help = data_logit[data_logit['Grupa'] == 'Help']
logit = LogisticRegression(C=100000)
logit_harm = LogisticRegression(C=10000)
logit_help = LogisticRegression(C=10000)

#Logit na całości
X = data_logit[['Istnienie obowiązku', 'Wiedza o obowiązku']]
Y = data_logit['Odpowiedź']
logit.fit(X,Y)
coeff_df = DataFrame(list(zip(X.columns,np.transpose(logit.coef_),list(chi2(X,Y)[1]))))

#Logit na HARM
X = data_logit_harm[['Istnienie obowiązku', 'Wiedza o obowiązku']]
Y = data_logit_harm['Odpowiedź']
logit_harm.fit(X,np.ravel(Y))
coeff_df_harm = DataFrame(list(zip(X.columns,np.transpose(logit_harm.coef_),list(chi2(X,Y)[1]))))

#Logit na HELP
X = data_logit_help[['Istnienie obowiązku', 'Wiedza o obowiązku']]
Y = data_logit_help['Odpowiedź']
logit_help.fit(X,Y)
coeff_df_help = DataFrame(list(zip(X.columns,np.transpose(logit_help.coef_),list(chi2(X,Y)[1]))))
In [24]:
coeff_df_total = pd.concat([coeff_df, coeff_df_harm, coeff_df_help], keys=['Całość', 'Harm', 'Help'])
coeff_df_total.columns = ['Predyktor', 'Współczynnik', 'P-value (test Chi^2)']
coeff_df_total
Out[24]:
Predyktor Współczynnik P-value (test Chi^2)
Całość 0 Istnienie obowiązku [0.733956781668] 0.024092
1 Wiedza o obowiązku [0.914041484088] 0.010973
Harm 0 Istnienie obowiązku [2.04700053497] 0.091541
1 Wiedza o obowiązku [-0.440837430987] 0.624206
Help 0 Istnienie obowiązku [-8.67521741404] 0.157299
1 Wiedza o obowiązku [1.90895902334] 0.169811

Regresja logistyczna dla całości danych

In [27]:
data_logit[['IstOb', 'WiedzoOb']] = data_logit[['Istnienie obowiązku', 'Wiedza o obowiązku']]
log_reg = sm.formula.logit(formula = 'Odpowiedź ~ IstOb * WiedzoOb', data=data_logit)
log_reg.fit().summary()
Optimization terminated successfully.
         Current function value: 0.641664
         Iterations 5
Out[27]:
Logit Regression Results
Dep. Variable: Odpowiedź No. Observations: 129
Model: Logit Df Residuals: 125
Method: MLE Df Model: 3
Date: Sun, 07 Feb 2016 Pseudo R-squ.: 0.07327
Time: 03:28:24 Log-Likelihood: -82.775
converged: True LL-Null: -89.319
LLR p-value: 0.004449
coef std err z P>|z| [95.0% Conf. Int.]
Intercept -0.6702 0.262 -2.557 0.011 -1.184 -0.156
IstOb 0.7655 0.510 1.502 0.133 -0.233 1.764
WiedzoOb 0.9578 0.600 1.596 0.111 -0.219 2.134
IstOb:WiedzoOb -0.0881 0.851 -0.104 0.918 -1.756 1.580

Regresja logistyczna dla grupy Harm

In [28]:
data_logit_harm[['IstOb', 'WiedzoOb']] = data_logit_harm[['Istnienie obowiązku', 'Wiedza o obowiązku']]
log_reg = sm.formula.logit(formula = 'Odpowiedź ~ IstOb + WiedzoOb', data=data_logit_harm)
l = log_reg.fit()
l.summary()
Optimization terminated successfully.
         Current function value: 0.401038
         Iterations 7
Out[28]:
Logit Regression Results
Dep. Variable: Odpowiedź No. Observations: 66
Model: Logit Df Residuals: 63
Method: MLE Df Model: 2
Date: Sun, 07 Feb 2016 Pseudo R-squ.: 0.1099
Time: 03:29:22 Log-Likelihood: -26.469
converged: True LL-Null: -29.737
LLR p-value: 0.03806
coef std err z P>|z| [95.0% Conf. Int.]
Intercept 1.0417 0.443 2.354 0.019 0.174 1.909
IstOb 2.0472 0.924 2.216 0.027 0.236 3.858
WiedzoOb -0.4410 0.804 -0.549 0.583 -2.016 1.134

Regresja logistyczna dla grupy Help

In [30]:
data_logit_help[['IstOb', 'WiedzoOb']] = data_logit_help[['Istnienie obowiązku', 'Wiedza o obowiązku']]
log_reg = sm.formula.logit(formula = 'Odpowiedź ~ IstOb + WiedzoOb', data=data_logit_help)
l = log_reg.fit()
l.summary()
Warning: Maximum number of iterations has been exceeded.
         Current function value: 0.282281
         Iterations: 35
Out[30]:
Logit Regression Results
Dep. Variable: Odpowiedź No. Observations: 63
Model: Logit Df Residuals: 60
Method: MLE Df Model: 2
Date: Sun, 07 Feb 2016 Pseudo R-squ.: 0.1908
Time: 03:30:01 Log-Likelihood: -17.784
converged: False LL-Null: -21.976
LLR p-value: 0.01510
coef std err z P>|z| [95.0% Conf. Int.]
Intercept -2.1972 0.527 -4.169 0.000 -3.230 -1.164
IstOb -29.7534 1.22e+06 -2.44e-05 1.000 -2.39e+06 2.39e+06
WiedzoOb 1.9095 0.928 2.058 0.040 0.091 3.728
In [ ]: