1 Introduction

This report uses exploratory data analysis to investigate three potential relationships:

  1. monthly motor-insurance premiums and claim amounts;
  2. policyholder income and monthly insurance premiums; and
  3. the monthly returns of NAB and ANZ shares.

Exploratory data analysis combines numerical summaries with graphs. Correlation and simple linear regression are used to describe linear association, but they do not by themselves establish causation.

2 Monthly premium and claim amount

2.1 Data

motor_data <- data.frame(
  premium = c(37, 70, 98, 84, 99, 91, 88, 135, 134, 41, 57, 100),
  claim = c(2523, 6554, 7703, 5927, 2683, 2695,
            6047, 13171, 10657, 2528, 2672, 5313)
)

knitr::kable(
  motor_data,
  format = "html",
  col.names = c("Monthly premium (AUD)", "Claim amount (AUD)"),
  caption = "Motor-insurance observations",
  align = c("r", "r"),
  table.attr = 'class="table table-striped table-hover" style="width:65%; margin-left:auto; margin-right:auto;"'
)
Motor-insurance observations
Monthly premium (AUD) Claim amount (AUD)
37 2523
70 6554
98 7703
84 5927
99 2683
91 2695
88 6047
135 13171
134 10657
41 2528
57 2672
100 5313

There are 12 paired observations. Each row relates one monthly premium to its corresponding claim amount.

2.2 Descriptive statistics

motor_summary <- data.frame(
  Variable = c("Monthly premium", "Claim amount"),
  Mean = c(mean(motor_data$premium), mean(motor_data$claim)),
  Median = c(median(motor_data$premium), median(motor_data$claim)),
  `Standard deviation` = c(sd(motor_data$premium), sd(motor_data$claim)),
  Minimum = c(min(motor_data$premium), min(motor_data$claim)),
  Maximum = c(max(motor_data$premium), max(motor_data$claim)),
  check.names = FALSE
)

knitr::kable(
  motor_summary,
  format = "html",
  digits = 2,
  caption = "Descriptive statistics for premiums and claims",
  align = c("l", "r", "r", "r", "r", "r"),
  table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Descriptive statistics for premiums and claims
Variable Mean Median Standard deviation Minimum Maximum
Monthly premium 86.17 89.5 31.29 37 135
Claim amount 5706.08 5620.0 3475.97 2523 13171

The average monthly premium is $86.17, while the average claim is $5,706.08. Claim amounts are substantially more dispersed than premiums in dollar terms. The largest claim, $13,171, should be noted when interpreting the relationship.

2.3 Scatterplot and fitted relationship

motor_model <- lm(claim ~ premium, data = motor_data)

plot(
  claim ~ premium,
  data = motor_data,
  main = "Monthly Premium and Claim Amount",
  xlab = "Monthly premium ($)",
  ylab = "Claim amount ($)",
  pch = 19,
  col = "#2878B5"
)
text(
  motor_data$premium,
  motor_data$claim,
  labels = seq_len(nrow(motor_data)),
  pos = 3,
  cex = 0.75,
  col = "#444444"
)
abline(motor_model, col = "#D73027", lwd = 2)
Monthly premium and claim amount with least-squares regression line.

Monthly premium and claim amount with least-squares regression line.

The scatterplot displays a clear upward pattern. The Pearson correlation is

\[ r=0.787, \]

which indicates a strong positive linear association in this sample.

motor_coef <- summary(motor_model)$coefficients

knitr::kable(
  data.frame(
    Term = c("Intercept", "Monthly premium"),
    Estimate = motor_coef[, "Estimate"],
    `Standard error` = motor_coef[, "Std. Error"],
    `t statistic` = motor_coef[, "t value"],
    `p-value` = motor_coef[, "Pr(>|t|)"],
    check.names = FALSE
  ),
  digits = 4,
  caption = "Regression of claim amount on monthly premium"
)
Regression of claim amount on monthly premium
Term Estimate Standard error t statistic p-value
(Intercept) Intercept -1824.1390 1978.4771 -0.9220 0.3782
premium Monthly premium 87.3914 21.6877 4.0295 0.0024

The fitted equation is

\[ \widehat{\text{Claim}} =-1824.14 +87.39(\text{Premium}). \]

The slope means that a $1 increase in monthly premium is associated with an estimated average increase of $87.39 in claim amount. Equivalently, a $10 increase in premium is associated with an estimated $873.91 increase in claim amount.

The slope p-value is 0.0024, which is below 0.05. The data therefore provide evidence of a positive linear association. The model has \(R^2=0.619\), so approximately 61.9% of the observed variation in claim amounts is explained by monthly premium through this fitted linear model.

This is an association rather than proof that higher premiums cause larger claims. Insurers generally charge higher premiums to policyholders assessed as being higher risk, so underlying risk could influence both variables. The sample is also small, and observations 8 and 9 have high premiums and high claims, giving them substantial influence on the fitted line.

3 Income and monthly premium

3.1 Data

income_data <- data.frame(
  income = c(51066, 34378, 43072, 25222, 36765, 23091,
             48269, 32720, 20396, 21513, 72540),
  premium = c(76, 142, 37, 70, 98, 84, 99, 91, 88, 135, 134)
)

knitr::kable(
  income_data,
  format = "html",
  col.names = c("Income (AUD)", "Monthly premium (AUD)"),
  caption = "Policyholder income and premium observations",
  align = c("r", "r"),
  table.attr = 'class="table table-striped table-hover" style="width:65%; margin-left:auto; margin-right:auto;"'
)
Policyholder income and premium observations
Income (AUD) Monthly premium (AUD)
51066 76
34378 142
43072 37
25222 70
36765 98
23091 84
48269 99
32720 91
20396 88
21513 135
72540 134

3.2 Descriptive statistics

income_summary <- data.frame(
  Variable = c("Income", "Monthly premium"),
  Mean = c(mean(income_data$income), mean(income_data$premium)),
  Median = c(median(income_data$income), median(income_data$premium)),
  `Standard deviation` = c(sd(income_data$income), sd(income_data$premium)),
  Minimum = c(min(income_data$income), min(income_data$premium)),
  Maximum = c(max(income_data$income), max(income_data$premium)),
  check.names = FALSE
)

knitr::kable(
  income_summary,
  format = "html",
  digits = 2,
  caption = "Descriptive statistics for income and monthly premium",
  align = c("l", "r", "r", "r", "r", "r"),
  table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Descriptive statistics for income and monthly premium
Variable Mean Median Standard deviation Minimum Maximum
Income 37184.73 34378 15803.16 20396 72540
Monthly premium 95.82 91 31.44 37 142

The mean income is $37,185, and the mean premium is $95.82. The maximum income of $72,540 is well above the third quartile and may influence the analysis.

3.3 Scatterplot and fitted relationship

income_model <- lm(premium ~ income, data = income_data)

plot(
  premium ~ income,
  data = income_data,
  main = "Income and Monthly Premium",
  xlab = "Income ($)",
  ylab = "Monthly premium ($)",
  pch = 19,
  col = "#238B45"
)
abline(income_model, col = "#D73027", lwd = 2)
Policyholder income and monthly premium with least-squares regression line.

Policyholder income and monthly premium with least-squares regression line.

The points are widely scattered and the fitted line is almost flat. The correlation is

\[ r=0.13, \]

which indicates only a very weak positive linear association.

income_coef <- summary(income_model)$coefficients

knitr::kable(
  data.frame(
    Term = c("Intercept", "Income"),
    Estimate = income_coef[, "Estimate"],
    `Standard error` = income_coef[, "Std. Error"],
    `t statistic` = income_coef[, "t value"],
    `p-value` = income_coef[, "Pr(>|t|)"],
    check.names = FALSE
  ),
  digits = 5,
  caption = "Regression of monthly premium on income"
)
Regression of monthly premium on income
Term Estimate Standard error t statistic p-value
(Intercept) Intercept 86.17847 26.37862 3.26698 0.00973
income Income 0.00026 0.00066 0.39430 0.70254

The fitted equation is

\[ \widehat{\text{Premium}} =86.18 +0.0002592(\text{Income}). \]

Because a one-dollar income increase is too small to interpret conveniently, the slope can be scaled to $10,000. An additional $10,000 of income is associated with an estimated premium change of

\[ 10{,}000 \times 0.0002592 =\$2.59. \]

This estimated change is small. The slope p-value is 0.703, so the sample does not provide evidence of a statistically significant linear relationship. Furthermore, \(R^2=0.017\): income explains only about 1.7% of the observed variation in monthly premiums.

3.4 Sensitivity to the highest-income observation

income_without_highest <- income_data[-which.max(income_data$income), ]

sensitivity <- data.frame(
  Sample = c("All observations", "Highest income excluded"),
  Correlation = c(
    cor(income_data$income, income_data$premium),
    cor(income_without_highest$income, income_without_highest$premium)
  )
)

knitr::kable(
  sensitivity,
  digits = 3,
  caption = "Sensitivity of the income–premium correlation"
)
Sensitivity of the income–premium correlation
Sample Correlation
All observations 0.130
Highest income excluded -0.275

Removing the highest-income observation changes the correlation from 0.13 to -0.275. The sign reversal demonstrates that the estimated relationship is sensitive to one observation and is not robust. Overall, there is no convincing evidence in this small sample that income is an important linear predictor of monthly premium. Premiums may instead be driven by variables such as coverage, age, vehicle type, location and claims history.

4 Co-movement of NAB and ANZ monthly returns

4.1 Prices and return calculation

share_data <- data.frame(
  date = as.Date(
    c(
      "04/01/2022", "01/02/2022", "01/03/2022", "01/04/2022",
      "02/05/2022", "01/06/2022", "01/07/2022", "01/08/2022",
      "01/09/2022", "03/10/2022", "01/11/2022", "01/12/2022",
      "03/01/2023", "01/02/2023", "01/03/2023", "03/04/2023",
      "01/05/2023", "01/06/2023"
    ),
    format = "%d/%m/%Y"
  ),
  NAB = c(
    27.16, 25.53, 27.13, 29.86, 29.86, 29.82, 26.01, 28.91, 28.65,
    27.16, 30.92, 30.72, 28.53, 30.77, 28.49, 27.06, 28.30, 26.04
  ),
  ANZ = c(
    25.59, 24.24, 23.92, 24.84, 24.95, 23.76, 20.66, 21.35, 21.26,
    21.38, 24.37, 24.13, 22.25, 24.44, 23.56, 22.45, 23.71, 22.73
  )
)

share_data$NAB_return <- c(
  NA,
  diff(share_data$NAB) / head(share_data$NAB, -1) * 100
)
share_data$ANZ_return <- c(
  NA,
  diff(share_data$ANZ) / head(share_data$ANZ, -1) * 100
)

display_share_data <- transform(
  share_data,
  date = format(date, "%d %b %Y"),
  NAB_return = round(NAB_return, 2),
  ANZ_return = round(ANZ_return, 2)
)

knitr::kable(
  display_share_data,
  format = "html",
  col.names = c(
    "Date", "NAB price (AUD)", "ANZ price (AUD)",
    "NAB return (%)", "ANZ return (%)"
  ),
  caption = "Monthly share prices and calculated simple returns",
  table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Monthly share prices and calculated simple returns
Date NAB price (AUD) ANZ price (AUD) NAB return (%) ANZ return (%)
04 Jan 2022 27.16 25.59 NA NA
01 Feb 2022 25.53 24.24 -6.00 -5.28
01 Mar 2022 27.13 23.92 6.27 -1.32
01 Apr 2022 29.86 24.84 10.06 3.85
02 May 2022 29.86 24.95 0.00 0.44
01 Jun 2022 29.82 23.76 -0.13 -4.77
01 Jul 2022 26.01 20.66 -12.78 -13.05
01 Aug 2022 28.91 21.35 11.15 3.34
01 Sep 2022 28.65 21.26 -0.90 -0.42
03 Oct 2022 27.16 21.38 -5.20 0.56
01 Nov 2022 30.92 24.37 13.84 13.99
01 Dec 2022 30.72 24.13 -0.65 -0.98
03 Jan 2023 28.53 22.25 -7.13 -7.79
01 Feb 2023 30.77 24.44 7.85 9.84
01 Mar 2023 28.49 23.56 -7.41 -3.60
03 Apr 2023 27.06 22.45 -5.02 -4.71
01 May 2023 28.30 23.71 4.58 5.61
01 Jun 2023 26.04 22.73 -7.99 -4.13

Prices are not compared directly because two trending price series can appear related even when their month-to-month movements are not. Instead, the simple percentage return for month \(t\) is calculated as

\[ R_t=\frac{P_t-P_{t-1}}{P_{t-1}}\times100, \]

where \(P_t\) is the current price and \(P_{t-1}\) is the preceding month’s price. For example, NAB’s February 2022 return is

\[ \frac{25.53-27.16}{27.16}\times100 =-6\%. \]

The first month has no return because no earlier price is supplied. There are therefore 17 paired monthly returns.

4.2 Return distributions

return_summary <- data.frame(
  Bank = c("NAB", "ANZ"),
  `Mean return (%)` = c(
    mean(share_data$NAB_return, na.rm = TRUE),
    mean(share_data$ANZ_return, na.rm = TRUE)
  ),
  `Median return (%)` = c(
    median(share_data$NAB_return, na.rm = TRUE),
    median(share_data$ANZ_return, na.rm = TRUE)
  ),
  `Standard deviation (%)` = c(
    sd(share_data$NAB_return, na.rm = TRUE),
    sd(share_data$ANZ_return, na.rm = TRUE)
  ),
  `Minimum return (%)` = c(
    min(share_data$NAB_return, na.rm = TRUE),
    min(share_data$ANZ_return, na.rm = TRUE)
  ),
  `Maximum return (%)` = c(
    max(share_data$NAB_return, na.rm = TRUE),
    max(share_data$ANZ_return, na.rm = TRUE)
  ),
  check.names = FALSE
)

knitr::kable(
  return_summary,
  digits = 2,
  caption = "Descriptive statistics for monthly returns"
)
Descriptive statistics for monthly returns
Bank Mean return (%) Median return (%) Standard deviation (%) Minimum return (%) Maximum return (%)
NAB 0.03 -0.65 7.75 -12.78 13.84
ANZ -0.50 -0.98 6.53 -13.05 13.99

The sample mean monthly return is 0.03% for NAB and -0.5% for ANZ. The sample standard deviations are 7.75% and 6.53%, respectively. Standard deviation is used here as a measure of monthly volatility, so NAB was somewhat more volatile over this short period.

4.3 Returns through time

return_range <- range(
  share_data$NAB_return,
  share_data$ANZ_return,
  na.rm = TRUE
)

plot(
  share_data$date,
  share_data$NAB_return,
  type = "o",
  ylim = return_range,
  main = "Monthly Returns of NAB and ANZ",
  xlab = "Date",
  ylab = "Monthly return (%)",
  col = "#2166AC",
  pch = 19
)
lines(
  share_data$date,
  share_data$ANZ_return,
  type = "o",
  col = "#B2182B",
  pch = 17
)
abline(h = 0, lty = 2, col = "grey50")
legend(
  "topright",
  legend = c("NAB", "ANZ"),
  col = c("#2166AC", "#B2182B"),
  pch = c(19, 17),
  lty = 1,
  bty = "n"
)
Monthly simple returns of NAB and ANZ.

Monthly simple returns of NAB and ANZ.

The two lines frequently rise and fall together. Both banks experienced their lowest return in July 2022 and their highest return in November 2022. This visual co-movement is consistent with the banks being exposed to common market and economic conditions.

4.4 Correlation and regression

return_model <- lm(ANZ_return ~ NAB_return, data = share_data)

plot(
  share_data$NAB_return,
  share_data$ANZ_return,
  main = "NAB and ANZ Monthly Returns",
  xlab = "NAB monthly return (%)",
  ylab = "ANZ monthly return (%)",
  pch = 19,
  col = "#6A3D9A"
)
abline(return_model, col = "#D73027", lwd = 2)
abline(h = 0, v = 0, lty = 3, col = "grey65")
ANZ monthly returns plotted against NAB monthly returns.

ANZ monthly returns plotted against NAB monthly returns.

The return correlation is

\[ r=0.865, \]

indicating a strong positive linear association.

return_coef <- summary(return_model)$coefficients

knitr::kable(
  data.frame(
    Term = c("Intercept", "NAB monthly return"),
    Estimate = return_coef[, "Estimate"],
    `Standard error` = return_coef[, "Std. Error"],
    `t statistic` = return_coef[, "t value"],
    `p-value` = return_coef[, "Pr(>|t|)"],
    check.names = FALSE
  ),
  digits = 4,
  caption = "Regression of ANZ monthly returns on NAB monthly returns"
)
Regression of ANZ monthly returns on NAB monthly returns
Term Estimate Standard error t statistic p-value
(Intercept) Intercept -0.5191 0.8224 -0.6312 0.5374
NAB_return NAB monthly return 0.7286 0.1094 6.6627 0.0000

The fitted equation is

\[ \widehat{R}_{ANZ} =-0.519 +0.729R_{NAB}. \]

Thus, a one-percentage-point increase in NAB’s monthly return is associated with an estimated 0.729-percentage-point increase in ANZ’s monthly return on average. The slope p-value is 0.00000757, which provides strong evidence of positive co-movement.

For a simple regression with one explanatory variable, \(R^2=r^2\). Here,

\[ R^2=(0.865)^2 \approx 0.747. \]

Therefore, about 74.7% of the sample variation in ANZ monthly returns is explained by its linear association with NAB monthly returns. The remaining variation reflects company-specific information, measurement noise and other factors not represented by this one-variable model.

5 Overall conclusions

The exploratory analysis produces three main findings:

  1. Premium and claim amount: There is a strong positive association (\(r=0.787\)). Higher premiums tend to accompany higher claim amounts, although underlying risk is a plausible common cause.
  2. Income and monthly premium: There is little evidence of a relationship (\(r=0.13\)). The result is sensitive to the highest-income policyholder and income explains very little premium variation.
  3. NAB and ANZ returns: Monthly returns move closely together (\(r=0.865\)). Common banking-sector and economic factors are likely to affect both firms.

All three samples are small. Consequently, the results should be viewed as preliminary descriptions of these observations rather than definitive population-level conclusions.