from otree.api import * import random doc = """ 3차 설문: 정치적 양극화에 따른 인플레이션에 대한 태도 차이 - Part 1: 정치적 양극화 측정 - Part 2: 물가 인식 및 중앙은행 역할 + 앵커링 RCT 한 페이지 설문, 인플레이션 슬라이더 0.5% 단위 """ class C(BaseConstants): NAME_IN_URL = 'inflation_survey' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # ═══════════════════════════════════════ # Part 1: 정치적 양극화 # ═══════════════════════════════════════ # 1-1 이념 자기보고 (1~4, 중도 제거) (2차설문) ideology = models.IntegerField( label="1-1. 귀하의 정치 성향은 스스로 어떻다고 생각하십니까?", choices=[[1, '매우 진보'], [2, '다소 진보'], [3, '다소 보수'], [4, '매우 보수']], widget=widgets.RadioSelect ) # 1-1-1 출처 정치 성향 인식 (Bias_perceived) bias_chosun = models.IntegerField( label="1-1-1. 조선일보 / TV조선의 정치 성향은 어떻다고 생각하십니까?", choices=[[1, '매우 진보'], [2, '다소 진보'], [3, '중립'], [4, '다소 보수'], [5, '매우 보수']], widget=widgets.RadioSelect ) bias_hankyoreh = models.IntegerField( label="1-1-2. 한겨레 / 한겨레TV의 정치 성향은 어떻다고 생각하십니까?", choices=[[1, '매우 진보'], [2, '다소 진보'], [3, '중립'], [4, '다소 보수'], [5, '매우 보수']], widget=widgets.RadioSelect ) bias_bok_neutral = models.IntegerField( label="1-1-3. 한국은행은 정치적으로 중립이라고 생각하십니까?", choices=[[1, '예'], [2, '아니오']], widget=widgets.RadioSelectHorizontal ) bias_bok_direction = models.IntegerField( label="1-1-3-1. 그렇다면 어느 쪽에 가깝다고 생각하십니까?", choices=[[1, '매우 진보'], [2, '다소 진보'], [3, '다소 보수'], [4, '매우 보수']], widget=widgets.RadioSelect, blank=True ) # 1-2 지지정당 (2차설문) party = models.IntegerField( label="1-2. 귀하가 현재 지지하는 정당은 어디입니까?", choices=[ [1, '더불어민주당'], [2, '국민의힘'], [3, '조국혁신당'], [4, '개혁신당'], [5, '진보당'], [6, '기타'], [7, '지지 정당 없음'] ], widget=widgets.RadioSelect ) # 1-3 투표 (2차설문) vote = models.IntegerField( label="1-3. 2025년 대선에서 어느 후보에게 투표 하셨습니까?", choices=[ [1, '이재명 (더불어민주당)'], [2, '김문수 (국민의힘)'], [3, '이준석 (개혁신당)'], [4, '기타'], [5, '투표하지 않았다'], [6, '공개 의사 없음'] ], widget=widgets.RadioSelect ) # 1-4 뉴스 소스 news_source = models.IntegerField( label="1-4. 귀하는 정치·경제 관련 뉴스를 주로 어디서 얻으십니까?", choices=[ [1, '유튜브 (정치·시사 채널)'], [2, '조선일보 / TV조선'], [3, '한겨레 / 한겨레TV'], [4, 'KBS · MBC · SBS 등 지상파 방송'], [5, 'JTBC · YTN · 연합뉴스TV 등 케이블 뉴스'], [6, '네이버·다음 등 포털 뉴스'], [7, '온라인 커뮤니티 (디시인사이드, 에펨코리아, 블라인드, 네이트판 등)'], [8, 'SNS (페이스북, 인스타그램, X 등)'], [9, '기타'] ], widget=widgets.RadioSelect ) # 1-5 감정 온도 (2차설문) ft_ppp_pol = models.IntegerField(label="국민의힘 정치인", min=0, max=100) ft_ppp_sup = models.IntegerField(label="국민의힘 지지자", min=0, max=100) ft_dpk_pol = models.IntegerField(label="더불어민주당 정치인", min=0, max=100) ft_dpk_sup = models.IntegerField(label="더불어민주당 지지자", min=0, max=100) ft_bureau = models.IntegerField(label="전문 관료", min=0, max=100) ft_centrist = models.IntegerField(label="중도 유권자", min=0, max=100) # 1-6~1-8 정서적 양극화 (2차설문) ap_friend = models.IntegerField( label="1-6. 나와 다른 정치 성향의 사람을 친구로 삼을 수 있습니까?", choices=[[1, '예'], [2, '아니오']], widget=widgets.RadioSelectHorizontal ) ap_spouse = models.IntegerField( label="1-7. 나와 다른 정치 성향의 사람을 배우자로 삼을 수 있습니까?", choices=[[1, '예'], [2, '아니오']], widget=widgets.RadioSelectHorizontal ) ap_child_spouse = models.IntegerField( label="1-8. 나와 다른 정치 성향의 사람을 자녀의 배우자로 삼을 수 있습니까?", choices=[[1, '예'], [2, '아니오']], widget=widgets.RadioSelectHorizontal ) # 1-9 집단 특성 (다중 선택 → 쉼표 구분 문자열) (2차설문) trait_ppp = models.StringField(label="① 국민의힘 및 집권세력에 해당하는 표현", blank=True) trait_dpk = models.StringField(label="② 더불어민주당 및 야권세력에 해당하는 표현", blank=True) # ═══════════════════════════════════════ # Part 2: 물가 인식 # ═══════════════════════════════════════ # 2-1 체감 물가 (슬라이더, 0.5% 단위, -3~10) perceived_inf = models.FloatField( label="2-1. 지난 1년간 우리나라 물가가 몇 % 변화했다고 생각하십니까?", min=-3, max=10 ) # 2-1-1 물가 평가 perceived_eval = models.IntegerField( label="2-1-1. 이러한 물가 변화에 대해 어떻게 생각하십니까?", choices=[[1, '크게 하락'], [2, '소폭 하락'], [3, '변화 없음'], [4, '소폭 상승'], [5, '크게 상승']], widget=widgets.RadioSelectHorizontal ) # 2-2 가계 경제 상황 household_econ = models.IntegerField( label="2-2. 귀하의 현재 가계 경제 상황은 1년 전과 비교해서 어떻습니까?", choices=[ [1, '많이 나빠졌다'], [2, '다소 나빠졌다'], [3, '비슷하다'], [4, '다소 나아졌다'], [5, '많이 나아졌다'] ], widget=widgets.RadioSelect ) # 2-3 향후 기대 인플레이션 (슬라이더, Prior) expected_inf_1y = models.FloatField( label="2-3. 향후 1년간 우리나라 물가가 몇 % 변화할 것이라 생각하십니까?", min=-3, max=10 ) expected_inf_5y = models.FloatField( label="2-4. 향후 5년간 우리나라 물가가 연평균 몇 % 변화할 것이라 생각하십니까?", min=-3, max=10 ) # 2-4-1 향후 물가 평가 # 2-4 물가 영향 (리커트 1~5) impact_complex = models.IntegerField(label="일상적인 경제 결정이 복잡해진다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) impact_saving = models.IntegerField(label="저축 가치가 줄어들어 생활이 어려워진다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) impact_poor = models.IntegerField(label="소득이 낮은 사람들이 더 큰 피해를 본다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) impact_trust = models.IntegerField(label="정부에 대한 신뢰가 낮아진다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) impact_growth = models.IntegerField(label="경제 성장이 둔화된다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) impact_cohesion = models.IntegerField(label="사회 전반의 결속력이 약화된다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) # 2-5 충격별 물가 영향 (리커트 1~5) shock_interest = models.IntegerField(label="이자율이 오르면", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) shock_govspend = models.IntegerField(label="정부가 지출을 늘리면", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) shock_oil = models.IntegerField(label="유가가 오르면", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) shock_tech = models.IntegerField(label="기술이 발전하면", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) shock_wage = models.IntegerField(label="임금이 오르면", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) # 2-6 원인 (리커트 1~5) cause_fiscal = models.IntegerField(label="정부의 재정·조세 정책", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_bok = models.IntegerField(label="한국은행의 통화정책", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_external = models.IntegerField(label="대외 요인·생산비용 상승", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_labor = models.IntegerField(label="노동시장 변화", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_firm = models.IntegerField(label="기업의 가격 결정", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_demand = models.IntegerField(label="가계 소비 증가", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) cause_politics = models.IntegerField(label="정치적 요인", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) # 2-7 상충관계 (리커트 1~5) tradeoff_boom = models.IntegerField(label="물가 상승은 경기가 좋을 때 더 자주 발생한다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) tradeoff_growth = models.IntegerField(label="물가 상승은 경제 성장의 부산물일 수 있다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) tradeoff_unemp = models.IntegerField(label="실업률을 낮추는 정책은 물가를 올릴 수 있다", choices=range(1, 6), widget=widgets.RadioSelectHorizontal) # 2-8 정책 우선순위 priority = models.IntegerField( label="2-8. 경기부양과 물가안정 중 어느 쪽이 우선되어야 한다고 생각하십니까?", choices=[[1, '경기부양'], [2, '물가안정']], widget=widgets.RadioSelectHorizontal ) worse = models.IntegerField( # (2차설문) label="2-8-1. 물가상승과 경기침체 중 더 나쁜 것은 무엇입니까?", choices=[[1, '물가상승'], [2, '경기침체']], widget=widgets.RadioSelectHorizontal ) # 2-9 정책 찬반 (슬라이더 0~100, step 10) pol_rate_up = models.IntegerField(label="금리를 올린다", min=0, max=100) pol_rate_down = models.IntegerField(label="금리를 내린다", min=0, max=100) pol_money = models.IntegerField(label="시중에 도는 돈의 양을 줄인다", min=0, max=100) pol_forward = models.IntegerField(label="향후 금리 방향을 사전에 안내한다", min=0, max=100) pol_debt = models.IntegerField(label="나라 빚을 줄인다", min=0, max=100) pol_antitrust = models.IntegerField(label="대기업을 엄격히 규제한다", min=0, max=100) pol_corptax = models.IntegerField(label="기업에 매기는 세금을 올린다", min=0, max=100) pol_freeze = models.IntegerField(label="생필품 가격을 동결한다", min=0, max=100) pol_wage_ctrl = models.IntegerField(label="임금 인상을 억제한다", min=0, max=100) pol_import = models.IntegerField(label="수입품을 제한한다", min=0, max=100) # ═══════════════════════════════════════ # 앵커링 RCT # ═══════════════════════════════════════ treatment = models.IntegerField() # 1=한은, 2=한겨레, 3=조선 # Posterior (슬라이더, 1년+5년 — cf. Weber et al. 2022) post_inf_1y = models.FloatField( label="향후 1년간 우리나라 물가가 몇 % 변화할 것이라 생각하십니까?", min=-3, max=10 ) post_inf_5y = models.FloatField( label="향후 5년간 우리나라 물가가 연평균 몇 % 변화할 것이라 생각하십니까?", min=-3, max=10 ) # ═══════════════════════════════════════ # PAGES # ═══════════════════════════════════════ class Survey(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict( ft_fields=[ ('ft_ppp_pol', '국민의힘 정치인'), ('ft_ppp_sup', '국민의힘 지지자'), ('ft_dpk_pol', '더불어민주당 정치인'), ('ft_dpk_sup', '더불어민주당 지지자'), ('ft_bureau', '전문 관료'), ('ft_centrist', '중도 유권자'), ], traits=['애국심 있다', '지적이다', '정직하다', '개방적이다', '관대하다', '위선적이다', '이기적이다', '야비하다'], impact_fields=[ dict(name='impact_complex', label='무엇을 사고 얼마를 저축할지 등 일상적인 결정이 어려워진다'), dict(name='impact_saving', label='모아둔 돈의 가치가 줄어든다'), dict(name='impact_poor', label='소득이 낮은 사람들이 더 큰 피해를 본다'), dict(name='impact_trust', label='정부에 대한 신뢰가 낮아진다'), dict(name='impact_growth', label='경제 성장이 둔화된다'), dict(name='impact_cohesion', label='사회 전체의 화합이 약해진다'), ], shock_fields=[ dict(name='shock_interest', label='한국은행이 금리를 올리면'), dict(name='shock_govspend', label='정부가 저소득층 지원을 위해 재정 지출을 늘리면'), dict(name='shock_oil', label='기름값이 오르면'), dict(name='shock_tech', label='새로운 기술로 생산성이 좋아지면'), dict(name='shock_wage', label='임금이 오르면'), ], cause_fields=[ dict(name='cause_fiscal', label='정부가 돈을 많이 써서'), dict(name='cause_bok', label='한국은행이 금리를 올리거나 내려서'), dict(name='cause_external', label='기름값이나 환율이 올라서'), dict(name='cause_labor', label='임금이 오르거나 일할 사람이 부족해서'), dict(name='cause_firm', label='기업이 상품의 가격을 올려서'), dict(name='cause_demand', label='사람들이 소비를 많이 해서'), dict(name='cause_politics', label='정책이 잘못되어서'), ], tradeoff_fields=[ dict(name='tradeoff_boom', label='물가는 경기가 좋을 때 더 자주 오른다'), dict(name='tradeoff_growth', label='물가 상승은 경제가 성장하면서 생기는 부작용일 수 있다'), dict(name='tradeoff_unemp', label='일자리를 늘리는 정책은 물가를 올릴 수 있다'), ], policy_fields=[ dict(name='pol_rate_up', label='금리를 올린다'), dict(name='pol_rate_down', label='금리를 내린다'), dict(name='pol_money', label='시중에 도는 돈의 양을 줄인다'), dict(name='pol_forward', label='향후 금리 방향을 사전에 안내한다'), dict(name='pol_debt', label='나라 빚을 줄인다'), dict(name='pol_antitrust', label='대기업을 엄격히 규제한다'), dict(name='pol_corptax', label='기업에 매기는 세금을 올린다'), dict(name='pol_freeze', label='생필품 가격을 동결한다'), dict(name='pol_wage_ctrl', label='임금 인상을 억제한다'), dict(name='pol_import', label='수입품을 제한한다'), ], ) form_fields = [ # Part 1 'ideology', 'bias_chosun', 'bias_hankyoreh', 'bias_bok_neutral', 'bias_bok_direction', 'party', 'vote', 'news_source', 'ft_ppp_pol', 'ft_ppp_sup', 'ft_dpk_pol', 'ft_dpk_sup', 'ft_bureau', 'ft_centrist', 'ap_friend', 'ap_spouse', 'ap_child_spouse', 'trait_ppp', 'trait_dpk', # Part 2 'perceived_inf', 'perceived_eval', 'household_econ', 'expected_inf_1y', 'expected_inf_5y', 'impact_complex', 'impact_saving', 'impact_poor', 'impact_trust', 'impact_growth', 'impact_cohesion', 'shock_interest', 'shock_govspend', 'shock_oil', 'shock_tech', 'shock_wage', 'cause_fiscal', 'cause_bok', 'cause_external', 'cause_labor', 'cause_firm', 'cause_demand', 'cause_politics', 'tradeoff_boom', 'tradeoff_growth', 'tradeoff_unemp', 'priority', 'worse', 'pol_rate_up', 'pol_rate_down', 'pol_money', 'pol_forward', 'pol_debt', 'pol_antitrust', 'pol_corptax', 'pol_freeze', 'pol_wage_ctrl', 'pol_import', # RCT posterior 'post_inf_1y', 'post_inf_5y', ] @staticmethod def before_next_page(player, timeout_happened): player.treatment = random.choice([1, 2, 3]) page_sequence = [Survey]