10wk-2

통계와 시각화
plotnine
Author

최규빈

Published

November 9, 2022

심슨의 역설

강의영상

https://youtube.com/playlist?list=PLQqh36zP38-wB73rDChn234r4ded7tDV_

imports

import pandas as pd
import numpy as np
from plotnine import *

심슨의 역설

- 버클리대학교의 입학데이터

- 주장: 버클리대학에 gender bias가 존재한다.

  • 1973년 가을학기의 입학통계에 따르면 지원하는 남성이 여성보다 훨씬 많이 합격했고, 그 차이가 너무 커서 우연의 일치라 보기 어렵다.
df=pd.read_csv("https://raw.githubusercontent.com/guebin/DV2022/master/posts/Simpson.csv",index_col=0,header=[0,1])\
.stack().stack().reset_index()\
.rename({'level_0':'department','level_1':'result','level_2':'gender',0:'count'},axis=1)
df
department result gender count
0 A fail female 19
1 A fail male 314
2 A pass female 89
3 A pass male 511
4 B fail female 7
5 B fail male 208
6 B pass female 18
7 B pass male 352
8 C fail female 391
9 C fail male 204
10 C pass female 202
11 C pass male 121
12 D fail female 244
13 D fail male 279
14 D pass female 131
15 D pass male 138
16 E fail female 299
17 E fail male 137
18 E pass female 94
19 E pass male 54
20 F fail female 103
21 F fail male 149
22 F pass female 238
23 F pass male 224

시각화1: 전체합격률

- df1

df.groupby(['gender','result']).agg({'count':np.sum}).reset_index()
gender result count
0 female fail 1063
1 female pass 772
2 male fail 1291
3 male pass 1400

- df2

df.groupby('gender').agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1)
gender count2
0 female 1835
1 male 2691

- merge: 두개의 데이터프레임을 합친다

df.groupby(['gender','result']).agg({'count':np.sum}).reset_index()\
.merge(df.groupby('gender').agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1))
gender result count count2
0 female fail 1063 1835
1 female pass 772 1835
2 male fail 1291 2691
3 male pass 1400 2691

- 비율계산

df.groupby(['gender','result']).agg({'count':np.sum}).reset_index()\
.merge(df.groupby('gender').agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1))\
.eval('rate = count/count2')
gender result count count2 rate
0 female fail 1063 1835 0.579292
1 female pass 772 1835 0.420708
2 male fail 1291 2691 0.479747
3 male pass 1400 2691 0.520253

- 시각화

data1= df.groupby(['gender','result']).agg({'count':np.sum}).reset_index()\
.merge(df.groupby('gender').agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1))\
.eval('rate = count/count2')
ggplot(data1.query('result=="pass"'))+geom_col(aes(x='gender',fill='gender',y='rate'))

<ggplot: (8789343060161)>

- 결론: 남자의 합격률이 더 높다. \(\to\) 성차별이 있어보인다(?)

시각화2: 학과별 합격률

- df2

df.groupby(['department','gender']).agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1)
department gender count2
0 A female 108
1 A male 825
2 B female 25
3 B male 560
4 C female 593
5 C male 325
6 D female 375
7 D male 417
8 E female 393
9 E male 191
10 F female 341
11 F male 373

- merge

df.merge(df.groupby(['department','gender']).agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1))\
.eval('rate = count/count2')
department result gender count count2 rate
0 A fail female 19 108 0.175926
1 A pass female 89 108 0.824074
2 A fail male 314 825 0.380606
3 A pass male 511 825 0.619394
4 B fail female 7 25 0.280000
5 B pass female 18 25 0.720000
6 B fail male 208 560 0.371429
7 B pass male 352 560 0.628571
8 C fail female 391 593 0.659359
9 C pass female 202 593 0.340641
10 C fail male 204 325 0.627692
11 C pass male 121 325 0.372308
12 D fail female 244 375 0.650667
13 D pass female 131 375 0.349333
14 D fail male 279 417 0.669065
15 D pass male 138 417 0.330935
16 E fail female 299 393 0.760814
17 E pass female 94 393 0.239186
18 E fail male 137 191 0.717277
19 E pass male 54 191 0.282723
20 F fail female 103 341 0.302053
21 F pass female 238 341 0.697947
22 F fail male 149 373 0.399464
23 F pass male 224 373 0.600536

- 시각화

data2=df.merge(df.groupby(['department','gender']).agg({'count':np.sum}).reset_index().rename({'count':'count2'},axis=1))\
.eval('rate = count/count2')
ggplot(data2.query('result=="pass"'))+geom_col(aes(x='gender',fill='gender',y='rate'))\
+facet_wrap('department')

<ggplot: (8789343111249)>
  • 학과별로 살펴보니 오히려 A,B,F,D의 경우 여성의 합격률이 높다.

- 교재에서 설명한 이유: 여성이 합격률이 낮은 학과에만 많이 지원하였기 때문

ggplot(data2.query('result=="pass"'))+geom_col(aes(x='department',y='count2',fill='gender'),position='dodge')

<ggplot: (8789343070225)>
  • 살펴보니 합격률이 높은 A,B학과의 경우 상대적으로 남성이 많이 지원하였음. 합격률이 낮은 C,D학과는 상대적으로 여성이 많이 지원함. D,F의 지원수는 비슷

HW

df = pd.read_csv("https://raw.githubusercontent.com/guebin/DV2022/master/posts/Simpson2.csv")
df
department result gender count
0 A fail female 0
1 A fail male 100
2 A pass female 1
3 A pass male 900
4 B fail female 400
5 B fail male 1
6 B pass female 600
7 B pass male 1

- 시각화1: 남녀합격률시각화

# 시각화예시 

<ggplot: (8789342120725)>

- 시각화2: 학과별 남녀합격률 시각화

# 시각화예시 

<ggplot: (8787281515073)>
  • A학과: 쓰면 거의 붙는 학과
  • B학과: 쓰면 반정도 붙는 학과

- 시각화3: 학과별 지원자 수 시각화

# 시각화예시

<ggplot: (8787281356149)>
  • 여학생은 쓰면 붙는 A학과에는 거의 지원안함, 대신에 쓰면 반정도 붙는 B학과에 대부분 지원함