02 / 18 · 카이제곱

원래7수준에서도 정당 정체성과 예상 투표의 연관은 유지된다

기대빈도·관측빈도·표준화 잔차를 함께 비교합니다. 범주를 합치면 검정의 질문과 자유도도 바뀝니다.

원래7수준 · 944 respondents · ANES96

원래7수준에서도 정당 정체성과 예상 투표의 연관은 유지된다
이 미리보기는 기존 16:9 장표입니다. 아래 Pele 관계도가 이 통계 그래프 전체를 생성한 것은 아닙니다.

이 관계도는 분석의 변수·설계·검정 관계를 설명하는 보조 도식입니다. 단독 HTML 발표 장표의 통계 그림과 구분합니다.

분석 관계도
Counts are observed. E = expected counts. Residual color is descriptive; no cellwise significance claim.
Pele 관계도 원문
flowchart LR
 P["Party identification"] --- V["Expected vote"]
 P --> C["Observed × expected counts"]
 V --> C
 C --> R["Residuals + Cramer V"]

공개된 추정치를 받아 축·선·구간·라벨을 직접 배치하는 실제 제작 분기입니다. 생략한 공용 함수와 전체 파일도 확인할 수 있습니다.

SVG 제작 분기 · JavaScript
if (v.kind === "chi") {
  a.push(
    T(10, 35, "A  Expected vote within each party group", 30, C.ink, 700),
    T(1000, 35, "B  Deviation from independence", 30, C.ink, 700),
    T(1135, 82, "Clinton", 24, C.muted, 600, "middle"),
    T(1425, 82, "Dole", 24, C.muted, 600, "middle"),
  );
  let rh = v.rows.length > 3 ? 65 : 145,
    top = 105;
  v.rows.forEach((r, i) => {
    let yy = top + i * rh,
      cs = v.cells.filter((c) => c.i === i);
    a.push(
      T(
        10,
        yy + 24,
        v.rows.length > 3
          ? [
              "0 Strong Dem.",
              "1 Weak Dem.",
              "2 Lean Dem.",
              "3 Independent",
              "4 Lean Rep.",
              "5 Weak Rep.",
              "6 Strong Rep.",
            ][+r]
          : r,
        26,
        C.ink,
        600,
      ),
      T(10, yy + 56, "n = " + cs.reduce((n, c) => n + c.obs, 0), 23, C.muted),
    );
    let xx = 230;
    for (const c of cs) {
      let width = c.pct * 6.4,
        col = c.j === 0 ? C.blue : C.teal;
      a.push(
        G(
          [
            R(xx, yy, Math.max(1, width), 46, col),
            ...(width > 112
              ? [
                  T(
                    xx + width / 2,
                    yy + 31,
                    fmt(c.pct, 1) + "%",
                    25,
                    "#FFFFFF",
                    600,
                    "middle",
                  ),
                ]
              : []),
          ],
          c.key,
        ),
      );
      xx += width;
      let cx = 1000 + c.j * 290;
      let strength = Math.min(1, Math.abs(c.residual) / 15),
        fill = c.residual > 0 ? "#DCE9F3" : "#EFF2F4";
      a.push(
        G(
          [
            R(cx, yy, 270, 65, fill),
            T(cx + 10, yy + 27, c.obs + " / E " + fmt(c.expected, 1), 25),
            T(
              cx + 260,
              yy + 54,
              "res " + signed(c.residual, 1),
              23,
              C.muted,
              400,
              "end",
            ),
          ],
          c.key,
        ),
      );
    }
  });
  a.push(
    R(12, 587, 18, 18, C.blue),
    T(40, 605, "Clinton", 25),
    R(180, 587, 18, 18, C.teal),
    T(208, 605, "Dole", 25),
    T(
      450,
      605,
      "χ²(" + v.df + ") = " + fmt(v.stat, 1) + " · " + pv(v.p),
      28,
      C.ink,
      650,
    ),
    G(
      [
        T(
          1000,
          605,
          "V " +
            fmt(v.effect, 3) +
            "  [" +
            v.effectCI.map((x) => fmt(x, 3)).join(", ") +
            "]",
          30,
          C.ink,
          700,
        ),
      ],
      v.key,
    ),
  );
  note =
    "Counts are observed. E = expected counts. Residual color is descriptive; no cellwise significance claim.";
  source =
    'flowchart LR\n P["Party identification"] --- V["Expected vote"]\n P --> C["Observed × expected counts"]\n V --> C\n C --> R["Residuals + Cramer V"]';
  map = { P: v.key, V: v.cells[0].key, C: v.cells[1].key, R: v.key };
}

이 소스는 실행 가능한 편집기가 아니라 원문을 보존한 참고 코드입니다.

데이터
해당 조건의 데이터 파일을 먼저 확인하고, 표본·단위·계수·신뢰구간을 함께 교체합니다. 표본이나 측정 수준이 다른 분석을 같은 척도로 합치지 않습니다.
그림
축 범위·라벨 폭·서체·색상은 실제 삽입 영역에 맞춥니다. 신뢰구간이 0을 포함하는지에 따라 의미를 보존하고, 화면을 줄인 뒤 다시 읽어 봅니다.
해석
관계도의 화살표와 통계 모형의 경로는 인과의 증거가 아닙니다. 평균 반응의 구간과 개별 예측구간, 점별 구간과 동시 구간을 구분합니다.