05 / 18 · 상관

연령과 뉴스 이용은 함께 움직이지만 인과를 뜻하지 않는다

실제 관측값을 빈도 크기로 묶고, 행렬에 계수와 점별 신뢰구간을 함께 표시합니다. 교육 코드는 등간척도로 가정하지 않습니다.

Pearson 수치 · 944 respondents · ANES96

연령과 뉴스 이용은 함께 움직이지만 인과를 뜻하지 않는다
이 미리보기는 기존 16:9 장표입니다. 아래 Pele 관계도가 이 통계 그래프 전체를 생성한 것은 아닙니다.

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

분석 관계도
Pearson intervals use Fisher-z. Numeric-coded education is not an equal-interval measurement.
Pele 관계도 원문
flowchart LR
 A["Age"] --- N["TV news"]
 E["Education"] --- N
 U["Urban scale"] --- N
 N --> R["Association + uncertainty"]

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

SVG 제작 분기 · JavaScript
if (v.kind === "correlation") {
  a.push(
    T(0, 35, "A  Observed age × TV-news frequency", 30, C.ink, 700),
    T(1000, 35, "B  " + v.label + " correlation", 30, C.ink, 700),
    T(1000, 62, (v.id === "pearson" ? "r" : "ρ") + " [95% CI]", 20, C.muted),
  );
  let pp = plotFrame({
    x: 80,
    y: 100,
    w: 760,
    h: 395,
    xRange: [15, 95],
    yRange: [0, 7],
    xTicks: [20, 40, 60, 80],
    yTicks: [0, 2, 4, 6],
    xLabel: "Age (years)",
    yLabel: "TV news (times/week)",
  });
  a.push(...pp.a);
  for (const b of v.bubbles)
    a.push(
      G(
        [
          node("circle", {
            cx: pp.X(b.x),
            cy: pp.Y(b.y),
            r: Math.sqrt(b.count) * 3.6,
            fill: C.blue,
            "fill-opacity": 0.38,
            stroke: C.blue,
            "stroke-width": 0.6,
          }),
        ],
        b.key,
      ),
    );
  let labs = ["Age", "News", "Educ.", "Urban"];
  for (let i = 0; i < 4; i++) {
    a.push(
      T(1000 + i * 150 + 65, 90, labs[i], 25, C.ink, 650, "middle"),
      T(970, 153 + i * 100, labs[i], 23, C.muted, 400, "end"),
    );
    for (let j = 0; j < 4; j++) {
      let r =
        i === j
          ? 1
          : v.pairs.find((p) => p.i === Math.min(i, j) && p.j === Math.max(i, j));
      let val = i === j ? 1 : r.r;
      a.push(
        G(
          [
            R(
              995 + j * 150,
              110 + i * 100,
              140,
              90,
              i === j ? C.wash : val > 0 ? "#DCE9F3" : "#EAF2F1",
            ),
            T(1065 + j * 150, 153 + i * 100, fmt(val, 2), 32, C.ink, 650, "middle"),
            ...(i === j
              ? []
              : [
                  T(
                    1065 + j * 150,
                    184 + i * 100,
                    "[" + r.ci.map((x) => fmt(x, 2)).join(", ") + "]",
                    21,
                    C.muted,
                    400,
                    "middle",
                  ),
                ]),
          ],
          i === j ? undefined : r.key,
        ),
      );
    }
  }
  a.push(
    T(995, 557, "All pairs n = 944 · point area = observed count", 25, C.muted),
    T(
      10,
      622,
      "No jitter or fabricated observations. Correlation does not identify a causal relation.",
      26,
      C.muted,
    ),
  );
  note =
    v.id === "spearman"
      ? "Ordinal sensitivity:rank-pair percentile bootstrap, 2000 draws. Matrix intervals are pointwise,not simultaneous."
      : "Pearson intervals use Fisher-z. Numeric-coded education is not an equal-interval measurement.";
  source =
    'flowchart LR\n A["Age"] --- N["TV news"]\n E["Education"] --- N\n U["Urban scale"] --- N\n N --> R["Association + uncertainty"]';
  map = {
    A: v.key,
    N: v.key,
    E: v.pairs.find((x) => x.i === 1 && x.j === 2)?.key,
    U: v.pairs.find((x) => x.i === 1 && x.j === 3)?.key,
    R: v.key,
  };
}

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

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