05-02 06:32
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Data Mining with R Programming] 동문회 기부금액 분석 본문

Data Science/Data Mining with R Programming

[Data Mining with R Programming] 동문회 기부금액 분석

cinema4dr12 2014. 5. 27. 23:28

이번 글에서는 한 대학의 동문들이 기부한 기부금에 대한 데이터 마이닝 연습을 해보도록 한다.


[데이터 준비하기]

우선 다음 CSV 파일을 다운받고 R의 working directory에 저장한다: 

contribution.csv


그래픽 처리를 위한 lattice 라이브러리를 임포트하고 위에 첨부한 CSV 파일의 데이터를 불러내어 don이라는 변수에 저장한다.

> library("lattice") > don = read.csv("contribution.csv")


우선 don의 항목을 살펴보자:

> names(don) [1] "Gender" "Class.Year" "Marital.Status" "Major" "Next.Degree" [6] "FY04Giving" "FY03Giving" "FY02Giving" "FY01Giving" "FY00Giving" [11] "AttendenceEvent"

Gender: 동문의 성, 즉 남성인지 여성인지 나타낸다.

Class.Year: 동문의 입학년도를 의미한다.

Marital.Status: 결혼 여부를 나타낸다. "D"는 이혼(Divorced), "M"은 결혼(Married), "S"는 미혼(Single), "W"는 나도 모르겠다.

Major: 동문의 전공을 의미한다.

Next.Degree: 졸업 후 학위를 의미한다.

FY04Giving: 회계년도(Fiscal Year) 04년도의 기부금액이다.

FY03Giving: 회계년도(Fiscal Year) 03년도의 기부금액이다.

FY02Giving: 회계년도(Fiscal Year) 02년도의 기부금액이다.

FY01Giving: 회계년도(Fiscal Year) 01년도의 기부금액이다.

FY00Giving: 회계년도(Fiscal Year) 00년도의 기부금액이다.

AttendanceEvent: 모금행사에 참여한 횟수이다.


don의 차원을 살펴보자:

> dim(don) [1] 1230 11

총 1230행을 가지며 조사된 동문의 수가 총 1230명임을 알 수 있다.


유실 데이터가 있는지 확인해 보도록 하자:

> sum(is.na(don)) [1] 0

위의 결과 "0"은 유실 데이터가 없음을 의미한다.




[Class Year 별 동문 수 조사]

Class Year 별로 동문의 수를 조사해 보면 다음과 같다:

> table(don$Class.Year) 1957 1967 1977 1987 1997 127 222 243 277 361

본 데이터는 생존해 있는 동문을 중심으로 조사된 것이므로 당연히 오래된 해의 동문일 수록 숫자가 적어진다.

이를 한 눈에 보기 위해 bar chart를 활용하여 시각화 해보자.

> barchart(table(don$Class.Year),horizontal=FALSE, xlab="Class Year",col="red")





[총 기부금액 계산]

회계년도 00년부터 04년까지의 총 기부금액을 계산한 결과를 TGiving이라는 변수명으로 저장한다:

> don$TGiving = don$FY00Giving + don$FY01Giving + don$FY02Giving + don$FY03Giving + don$FY04Giving


이 변수는 자동으로 don의 마지막 열에 삽입된다:

> names(don) [1] "Gender" "Class.Year" "Marital.Status" "Major" "Next.Degree" [6] "FY04Giving" "FY03Giving" "FY02Giving" "FY01Giving" "FY00Giving" [11] "AttendenceEvent" "TGiving"




[기부자 비율 조사]

전혀 기부를 하지 않은 동문이 전체의 어느 정도 비율을 차지하는지 살펴보자. 우선 전혀 기부하지 않은 동문의 수는 다음과 같이 계산할 수 있다:

> sum(don$TGiving == 0) [1] 422


총 422명이므로 전체 동문수 1230명을 고려하면,

> 422/1230 * 100 [1] 34.30894

약 34% 정도가 전혀 기부를 하지 않은 동문의 비율이다.


$1050 이하를 기부한 동문의 비율은,

> sum(don$TGiving <= 1050) [1] 1109 > 1109/1230 * 100 [1] 90.1626

약 90%이며, $5000 이상을 기부한 동문의 비율은

> sum(don$TGiving > 5000)/1230 * 100 [1] 2.926829

약 3%이다.


가장 큰 기부 금액은,

> max(don$TGiving) [1] 171870.1

$171,870이다.


기부를 하지 않은 동문을 제외한 평균 기부금액은,

> mean(don$TGiving[don$TGiving != 0]) [1] 1491.898

약 $1,500이며 이에 대한 표준편차는,

> sd(don$TGiving[don$TGiving != 0]) [1] 8185.618

약 8,200이다.


기부를 한 금액 중 최소 기부금액은,

> min(don$TGiving[don$TGiving != 0]) [1] 5

$5이다.


총 기부금액에 대한 히스토그램을 나타내보자:

> hist(don$TGiving, col="red")



기부금액의 범위가 매우 넓기때문에 히스토그램이 그다지 효과적으로 보이지 않는다.

좀 더 범위를 좁혀 $0 초과 $1000 이하의 범위로 히스토그램을 나타내면 다음과 같다:

> hist(don$TGiving[don$TGiving > 0 & don$TGiving <= 1000], col="cyan")



위의 히스토그램을 살펴보면 대다수의 기부금액이 $0에서 $100 사이에 몰려있는 것을 알 수 있다.$300 이상에서는 대부분의 기부금액 빈도수가 고르다.

이번에는 Box Plot을 통해 전체 기부금액의 평균, 퀀타일을 한 눈에 확인해 보자:

> boxplot(don$TGiving,outline=FALSE,horizontal=TRUE, xlab="Total Contribution", col="cyan")




[전공 별 총 기부금액 분석]

각 기부자의 전공(Major)을 중심으로 기부금액의 순서대로 나열해 보자. 우선 전공과 기부금액의 데이터만 추출한다:

> maj = don[,c(4,12)] > maj[1:5,] Major TGiving 1 History 30460 2 Physics 30000 3 Music 30000 4 History 5500 5 Biology 5005

order 함수를 이용하여 TGiving에 대한 순위를 출력한다:

> rank = maj[order(maj$TGiving, decreasing = TRUE),] > rank[1:10,] Major TGiving 99 Mathematics-Physics 171870.06 123 Economics-Business 90825.88 132 Speech (Drama, etc.) 72045.31 105 History 51505.84 135 History 42500.00 486 Economics 36360.90 471 Economics 31500.00 1 History 30460.00 2 Physics 30000.00 3 Music 30000.00

위의 결과를 살펴보면 가장 많은 기부를 한 기부자의 전공은 수리물리학(Mathematics-Physics)이며, 그 다음은 경제-경영학(Economics-Business) 순이다.

그러면 각 전공 별로 기부금액의 합이 궁금할 수 있다. tapply 함수를 이용하면 don$TGivingdon$Major별로 분류하여 sum을 구할 수 있다:

> t1 = tapply(don$TGiving, don$Major, sum, na.rm = TRUE) > t1 American Studies Anthropology Art Biology 13087.25 7227.00 6399.00 63365.28 Chemistry Chemistry-Zoology Chinese Classics 26575.72 33250.00 265.00 6903.00 Comparative Literature Computer Science Economics Economics-Business 0.00 2948.00 101521.60 104031.88 Economics-Regional Stds. Education Engineering English 700.00 2842.00 100.00 48853.90 English-Journalism French General Science General Science-Biology 1897.44 6143.00 2435.00 1684.00 General Science-Chemistry General Science-Math General Science-Physics General Science-Psycho 996.00 0.00 0.00 954.00 German History Independent Mathematics 3373.00 240616.53 7300.00 22055.00 Mathematics-Physics Music Philosophy Philosophy-Religion 172710.06 36657.00 4474.00 2201.00 Physical Education Physics Pol. Sci.-Regional Stds. Political Science 9430.00 38685.00 0.00 58243.19 Psychology Religious Studies Russian Sociology 43806.90 3210.00 4940.00 35734.54 Sociology-Anthropology Spanish Speech (Drama, etc.) Speech Correction 4134.00 5710.00 74895.31 225.00 Theatre Zoology 4819.00 55.00


tapply의 마지막 인자인 na.rm = TRUE는 유실 데이터인 NA를 제거한다는 의미이다. tapply 함수는 가장 많이 사용되는 함수 중 하나이므로 반드시 기억해야 한다.

이 결과를 barchart로 살펴보자:

> barchart(sort(t1), col="cyan")



계산된 결과는 변수 t1에 저장하였으며, sort 함수를 이용하여 각 전공의 기부금액 순위를 출력해보자:

> sort(t1, decreasing = TRUE) History Mathematics-Physics Economics-Business Economics 240616.53 172710.06 104031.88 101521.60 Speech (Drama, etc.) Biology Political Science English 74895.31 63365.28 58243.19 48853.90 Psychology Physics Music Sociology 43806.90 38685.00 36657.00 35734.54 Chemistry-Zoology Chemistry Mathematics American Studies 33250.00 26575.72 22055.00 13087.25 Physical Education Independent Anthropology Classics 9430.00 7300.00 7227.00 6903.00 Art French Spanish Russian 6399.00 6143.00 5710.00 4940.00 Theatre Philosophy Sociology-Anthropology German 4819.00 4474.00 4134.00 3373.00 Religious Studies Computer Science Education General Science 3210.00 2948.00 2842.00 2435.00 Philosophy-Religion English-Journalism General Science-Biology General Science-Chemistry 2201.00 1897.44 1684.00 996.00 General Science-Psycho Economics-Regional Stds. Chinese Speech Correction 954.00 700.00 265.00 225.00 Engineering Zoology Comparative Literature General Science-Math 100.00 55.00 0.00 0.00 General Science-Physics Pol. Sci.-Regional Stds. 0.00 0.00


대망의 1위는 역사(History) 전공이 차지했으며, 2위는 수리물리학(Mathematics-Physics) 전공, 3위는 경제경영(Economics-Business)이 차지했다.

그러면 각 전공 별 평균 기부금액은 어떤지 알아보자:

> t2 = tapply(don$TGiving, don$Major, mean, na.rm = TRUE) > t2 American Studies Anthropology Art Biology 451.2845 164.2500 164.0769 551.0024 Chemistry Chemistry-Zoology Chinese Classics 421.8368 11083.3333 132.5000 767.0000 Comparative Literature Computer Science Economics Economics-Business 0.0000 737.0000 1166.9149 4334.6617 Economics-Regional Stds. Education Engineering English 350.0000 473.6667 100.0000 397.1862 English-Journalism French General Science General Science-Biology 1897.4400 267.0870 608.7500 210.5000 General Science-Chemistry General Science-Math General Science-Physics General Science-Psycho 199.2000 0.0000 0.0000 477.0000 German History Independent Mathematics 259.4615 1782.3447 347.6190 501.2500 Mathematics-Physics Music Philosophy Philosophy-Religion 57570.0200 1221.9000 203.3636 244.5556 Physical Education Physics Pol. Sci.-Regional Stds. Political Science 1886.0000 1842.1429 0.0000 719.0517 Psychology Religious Studies Russian Sociology 554.5177 139.5652 380.0000 626.9218 Sociology-Anthropology Spanish Speech (Drama, etc.) Speech Correction 344.5000 211.4815 10699.3300 56.2500 Theatre Zoology 229.4762 27.5000 > sort(t2, decreasing = TRUE) Mathematics-Physics Chemistry-Zoology Speech (Drama, etc.) Economics-Business 57570.0200 11083.3333 10699.3300 4334.6617 English-Journalism Physical Education Physics History 1897.4400 1886.0000 1842.1429 1782.3447 Music Economics Classics Computer Science 1221.9000 1166.9149 767.0000 737.0000 Political Science Sociology General Science Psychology 719.0517 626.9218 608.7500 554.5177 Biology Mathematics General Science-Psycho Education 551.0024 501.2500 477.0000 473.6667 American Studies Chemistry English Russian 451.2845 421.8368 397.1862 380.0000 Economics-Regional Stds. Independent Sociology-Anthropology French 350.0000 347.6190 344.5000 267.0870 German Philosophy-Religion Theatre Spanish 259.4615 244.5556 229.4762 211.4815 General Science-Biology Philosophy General Science-Chemistry Anthropology 210.5000 203.3636 199.2000 164.2500 Art Religious Studies Chinese Engineering 164.0769 139.5652 132.5000 100.0000 Speech Correction Zoology Comparative Literature General Science-Math 56.2500 27.5000 0.0000 0.0000 General Science-Physics Pol. Sci.-Regional Stds. 0.0000 0.0000


전공 별 평균 기부금액 1위는 수리물리학 전공이다. 기부금액 합산에서는 역사 전공이 차지했지만 평균 기부금액에서는 많이 뒤쳐져 있는데, 아마도 역사 전공자의 기부금액에 대한 편차가 크기 때문일 것으로 추정된다.

전공자가 10명을 초과하는 학과에 대해서만 기부금액의 평균을 구해보자. 우선 변수 t4에 전체 전공에 대한 평균을 구한다:

> t4 = tapply(don$TGiving, don$Major, mean, na.rm=TRUE) > t4 American Studies Anthropology Art Biology 451.2845 164.2500 164.0769 551.0024 Chemistry Chemistry-Zoology Chinese Classics 421.8368 11083.3333 132.5000 767.0000 Comparative Literature Computer Science Economics Economics-Business 0.0000 737.0000 1166.9149 4334.6617 Economics-Regional Stds. Education Engineering English 350.0000 473.6667 100.0000 397.1862 English-Journalism French General Science General Science-Biology 1897.4400 267.0870 608.7500 210.5000 General Science-Chemistry General Science-Math General Science-Physics General Science-Psycho 199.2000 0.0000 0.0000 477.0000 German History Independent Mathematics 259.4615 1782.3447 347.6190 501.2500 Mathematics-Physics Music Philosophy Philosophy-Religion 57570.0200 1221.9000 203.3636 244.5556 Physical Education Physics Pol. Sci.-Regional Stds. Political Science 1886.0000 1842.1429 0.0000 719.0517 Psychology Religious Studies Russian Sociology 554.5177 139.5652 380.0000 626.9218 Sociology-Anthropology Spanish Speech (Drama, etc.) Speech Correction 344.5000 211.4815 10699.3300 56.2500 Theatre Zoology 229.4762 27.5000


그 다음 전공별 기부자의 수를 테이블로 저장한다:

> t5 = table(don$Major) > t5 American Studies Anthropology Art Biology 29 44 39 115 Chemistry Chemistry-Zoology Chinese Classics 63 3 2 9 Comparative Literature Computer Science Economics Economics-Business 2 4 87 24 Economics-Regional Stds. Education Engineering English 2 6 1 123 English-Journalism French General Science General Science-Biology 1 23 4 8 General Science-Chemistry General Science-Math General Science-Physics General Science-Psycho 5 1 3 2 German History Independent Mathematics 13 135 21 44 Mathematics-Physics Music Philosophy Philosophy-Religion 3 30 22 9 Physical Education Physics Pol. Sci.-Regional Stds. Political Science 5 21 1 81 Psychology Religious Studies Russian Sociology 79 23 13 57 Sociology-Anthropology Spanish Speech (Drama, etc.) Speech Correction 12 27 7 4 Theatre Zoology 21 2


변수 t4(전공 별 평균 기부금액)와 변수 t5(전공 별 기부자 수)를 cbind 함수를 이용하여 합친 후 변수 t6에 저장한다:

> t6 = cbind(t4, t5) > t6 t4 t5 American Studies 451.2845 29 Anthropology 164.2500 44 Art 164.0769 39 Biology 551.0024 115 Chemistry 421.8368 63 Chemistry-Zoology 11083.3333 3 Chinese 132.5000 2 Classics 767.0000 9 Comparative Literature 0.0000 2 Computer Science 737.0000 4 Economics 1166.9149 87 Economics-Business 4334.6617 24 Economics-Regional Stds. 350.0000 2 Education 473.6667 6 Engineering 100.0000 1 English 397.1862 123 English-Journalism 1897.4400 1 French 267.0870 23 General Science 608.7500 4 General Science-Biology 210.5000 8 General Science-Chemistry 199.2000 5 General Science-Math 0.0000 1 General Science-Physics 0.0000 3 General Science-Psycho 477.0000 2 German 259.4615 13 History 1782.3447 135 Independent 347.6190 21 Mathematics 501.2500 44 Mathematics-Physics 57570.0200 3 Music 1221.9000 30 Philosophy 203.3636 22 Philosophy-Religion 244.5556 9 Physical Education 1886.0000 5 Physics 1842.1429 21 Pol. Sci.-Regional Stds. 0.0000 1 Political Science 719.0517 81 Psychology 554.5177 79 Religious Studies 139.5652 23 Russian 380.0000 13 Sociology 626.9218 57 Sociology-Anthropology 344.5000 12 Spanish 211.4815 27 Speech (Drama, etc.) 10699.3300 7 Speech Correction 56.2500 4 Theatre 229.4762 21 Zoology 27.5000 2


기부자 수가 10명을 초과하는 전공을 추출한다:

> t7 = t6[t6[,2]>10,] > t7 t4 t5 American Studies 451.2845 29 Anthropology 164.2500 44 Art 164.0769 39 Biology 551.0024 115 Chemistry 421.8368 63 Economics 1166.9149 87 Economics-Business 4334.6617 24 English 397.1862 123 French 267.0870 23 German 259.4615 13 History 1782.3447 135 Independent 347.6190 21 Mathematics 501.2500 44 Music 1221.9000 30 Philosophy 203.3636 22 Physics 1842.1429 21 Political Science 719.0517 81 Psychology 554.5177 79 Religious Studies 139.5652 23 Russian 380.0000 13 Sociology 626.9218 57 Sociology-Anthropology 344.5000 12 Spanish 211.4815 27 Theatre 229.4762 21


이들에 대하여 평균 기부금액의 순서대로 나열하면:

> t7[order(t7[,1], decreasing=TRUE),] t4 t5 Economics-Business 4334.6617 24 Physics 1842.1429 21 History 1782.3447 135 Music 1221.9000 30 Economics 1166.9149 87 Political Science 719.0517 81 Sociology 626.9218 57 Psychology 554.5177 79 Biology 551.0024 115 Mathematics 501.2500 44 American Studies 451.2845 29 Chemistry 421.8368 63 English 397.1862 123 Russian 380.0000 13 Independent 347.6190 21 Sociology-Anthropology 344.5000 12 French 267.0870 23 German 259.4615 13 Theatre 229.4762 21 Spanish 211.4815 27 Philosophy 203.3636 22 Anthropology 164.2500 44 Art 164.0769 39 Religious Studies 139.5652 23


이를 barchart로 시각화하면:

> barchart(t7[order(t7[,1], decreasing=TRUE),], col="cyan")




[졸업 후 학위 별 총 기부금액 분석]

전공 별 조사와 마찬가지 방식으로 졸업 후 학위 별로 조사해보자.

우선 졸업 후 학위(degree)와 총 기부금액에 대한 데이터만 분류한다:

> deg = don[,c(5,12)] > deg[1:5,] Next.Degree TGiving 1 LLB 30460 2 MS 30000 3 NONE 30000 4 NONE 5500 5 MD 5005

이를 각 개인별로 총 기부금액에 대해 많은 순으로 1위에서 10위까지 출력해보자:

> rank = deg[order(deg$TGiving, decreasing = TRUE),] > rank[1:10,] Next.Degree TGiving 99 NONE 171870.06 123 MBA 90825.88 132 JD 72045.31 105 PHD 51505.84 135 JD 42500.00 486 MBA 36360.90 471 JD 31500.00 1 LLB 30460.00 2 MS 30000.00 3 NONE 30000.00

졸업 후 학위를 하지 않은 어느 졸업생(NONE)을 제외하고는 MBA 학위를 받은 어느 졸업생이 가장 많은 기부를 하였다. 아마도 이 졸업생은 MBA 학위를 수여했으니 CEO가 되지 않았을까 생각해 본다.

이제 개인이 아닌 각 졸업 후 학위 별로 그룹화하여 졸업 후 학위 별 총 기부금액을 계산해보자:

> t1 = tapply(don$TGiving, don$Next.Degree, sum, na.rm = TRUE) > t1 AA BA BAE BD BFA BN BS BSE2 BSN DC 250.00 1150.00 0.00 250.00 25.00 115.00 1455.00 357.00 1882.57 50.00 DDS DMD DO DO2 DP JD LLB LLD MA MA2 150.00 450.00 646.00 55.00 30.00 219143.23 31342.00 25.00 50189.00 0.00 MAE MALS MAT MBA MCP MD MD2 ME ME2 MFA 20.00 660.00 8137.00 148804.78 513.00 61961.38 2056.00 17380.00 150.00 3394.00 MHA ML MLS MM MPA MPH MS MSE MSM MSW 762.00 11000.00 9120.00 100.00 2807.00 910.00 87733.00 780.00 125.00 14779.00 NDA NONE PHD STM TC UBDS UDDS UMD UMDS UNKD 8690.02 341875.28 127989.34 500.00 27838.00 2361.00 1131.00 11728.00 1157.00 3427.00

사실 대부분 약자로 적혀있어 몇가지를 제외하고는 어떤 학위인지 잘 모르겠다. 

어찌됐던 졸업 후 학위 별로 총 기부금액의 순서를 출력해보자:

> t1[order(t1, decreasing = TRUE)] NONE JD MBA PHD MS MD MA LLB TC ME 341875.28 219143.23 148804.78 127989.34 87733.00 61961.38 50189.00 31342.00 27838.00 17380.00 MSW UMD ML MLS NDA MAT UNKD MFA MPA UBDS 14779.00 11728.00 11000.00 9120.00 8690.02 8137.00 3427.00 3394.00 2807.00 2361.00 MD2 BSN BS UMDS BA UDDS MPH MSE MHA MALS 2056.00 1882.57 1455.00 1157.00 1150.00 1131.00 910.00 780.00 762.00 660.00 DO MCP STM DMD BSE2 AA BD DDS ME2 MSM 646.00 513.00 500.00 450.00 357.00 250.00 250.00 150.00 150.00 125.00 BN MM DO2 DC DP BFA LLD MAE BAE MA2 115.00 100.00 55.00 50.00 30.00 25.00 25.00 20.00 0.00 0.00

졸업 후 학위 별 총 기부금액 순위는 더 이상 학위를 하지 않은(NONE) 그룹이 가장 많은 기부를 하였는데 이는 졸업 후 학위를 하지 않은 졸업생 수가 학위를 한 졸업생들보다 훨씬 많기 때문일 것으로 예상된다. 따라서 졸업 후 학위에 대해서는 총합보다는 평균으로 계산하여 가장 많은 기여를 한 그룹을 알아보는게 더 의미있을 것 같다.

각 졸업 후 학위 별 평균을 계산해보자:

> t2 = tapply(don$TGiving, don$Next.Degree, mean, na.rm = TRUE)

> t2[order(t2, decreasing = TRUE)] LLB ML MBA JD UMD MS MD PHD MSW 15671.0000 11000.0000 3460.5763 2127.6042 1954.6667 1349.7385 1290.8621 1279.8934 985.2667 TC ME MLS MSE MHA NONE MAT MALS STM 927.9333 869.0000 829.0909 780.0000 762.0000 743.2071 678.0833 660.0000 500.0000 UNKD BSN DMD UMDS MA BS BSE2 MPA BA 489.5714 470.6425 450.0000 385.6667 371.7704 363.7500 357.0000 311.8889 287.5000 UDDS UBDS MCP AA DO MD2 MFA MPH DDS 282.7500 262.3333 256.5000 250.0000 215.3333 205.6000 188.5556 151.6667 150.0000 ME2 BD MSM NDA BN DO2 DC MM DP 150.0000 125.0000 125.0000 120.6947 57.5000 55.0000 50.0000 50.0000 30.0000 BFA LLD MAE BAE MA2 25.0000 25.0000 20.0000 0.0000 0.0000

LLB가 어떤 학위인지는 모르겠으나 평균적으로 가장 많은 기여를 하였다. CEO들이 되어있을 가능성이 가장 높은 MBA 학위자들도 예상대로 비교적 상위 랭킹을 차지하였다. BAE와 MA2는 아무런 기여를 하지 않았다. 아마도 이 학위를 받은 졸업생 수가 매우 적을 수도 있기 때문인 것으로 풀이된다.

따라서 졸업 후 학위 별로 5명 이상인 그룹만을 대상으로 평균 기부금액의 순위를 알아보자. 이를 위해 우선 각 졸업 후 학위 별 빈도수를 테이블로 출력해보자:

> t3 = table(don$Next.Degree) > t3 AA BA BAE BD BFA BN BS BSE2 BSN DC DDS DMD DO DO2 DP JD LLB LLD MA MA2 1 4 1 2 1 2 4 1 4 1 1 1 3 1 1 103 2 1 135 1 MAE MALS MAT MBA MCP MD MD2 ME ME2 MFA MHA ML MLS MM MPA MPH MS MSE MSM MSW 1 1 12 43 2 48 10 20 1 18 1 1 11 2 9 6 65 1 1 15 NDA NONE PHD STM TC UBDS UDDS UMD UMDS UNKD 72 460 100 1 30 9 4 6 3 7

각 그룹 별 졸업생 수가 궁금하다:

> t3[order(t3, decreasing = TRUE)] NONE MA JD PHD NDA MS MD MBA TC ME MFA MSW MAT MLS MD2 MPA UBDS UNKD MPH UMD 460 135 103 100 72 65 48 43 30 20 18 15 12 11 10 9 9 7 6 6 BA BS BSN UDDS DO UMDS BD BN LLB MCP MM AA BAE BFA BSE2 DC DDS DMD DO2 DP 4 4 4 4 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 LLD MA2 MAE MALS ME2 MHA ML MSE MSM STM 1 1 1 1 1 1 1 1 1 1

예상대로 졸업 후 학위를 하지 않은 졸업생 수가 460명으로 압도적으로 많다. 다음 학위를 한 졸업생 중에서는 MA(석사학위)가 그 다음으로 많고 JD(법학박사), PHD(공학박사) 등이 그 뒤를 이었다.

각 졸업 후 학위 그룹과 이에 대한 졸업생 수를 cbind 함수를 이용하여 묶어보자:

> t4 = cbind(t2,t3) > t4[1:10,] t2 t3 AA 250.0000 1 BA 287.5000 4 BAE 0.0000 1 BD 125.0000 2 BFA 25.0000 1 BN 57.5000 2 BS 363.7500 4 BSE2 357.0000 1 BSN 470.6425 4 DC 50.0000 1

cbind 함수를 이용하여 결합된 데이터의 형식은 matrix이다:

> class(t4) [1] "matrix"

변수 t4matrix 형식이므로 각 열에 대한 이름을 설정할 수 없다. 이를 data frame 형식으로 변환하면 각 열에 대해 이름을 정할 수 있다:

> t5 = as.data.frame(t4) > names(t5) = c("Donation", "Freq") > t5[1:10,] Donation Freq AA 250.0000 1 BA 287.5000 4 BAE 0.0000 1 BD 125.0000 2 BFA 25.0000 1 BN 57.5000 2 BS 363.7500 4 BSE2 357.0000 1 BSN 470.6425 4 DC 50.0000 1

이제 각 졸업 후 학위그룹의 졸업생 수인 Freq를 기준으로 졸업생 수가 10명 초과인 그룹을 추출해 보자:

> t6 = t5[t5$Freq > 10 , ] > t6 Donation Freq JD 2127.6042 103 MA 371.7704 135 MAT 678.0833 12 MBA 3460.5763 43 MD 1290.8621 48 ME 869.0000 20 MFA 188.5556 18 MLS 829.0909 11 MS 1349.7385 65 MSW 985.2667 15 NDA 120.6947 72 NONE 743.2071 460 PHD 1279.8934 100 TC 927.9333 30

이제 평균 기부금액에 대한 순서를 출력한다:

> t6[order(t6$Donation) , ] Donation Freq NDA 120.6947 72 MFA 188.5556 18 MA 371.7704 135 MAT 678.0833 12 NONE 743.2071 460 MLS 829.0909 11 ME 869.0000 20 TC 927.9333 30 MSW 985.2667 15 PHD 1279.8934 100 MD 1290.8621 48 MS 1349.7385 65 JD 2127.6042 103 MBA 3460.5763 43

복잡한 과정을 거쳐왔지만 위의 결과는 다음과 같이 정의될 수 있다:

"졸업 후 학위를 한 졸업생 집단 중 10명을 초과하는 집단에 대한 평균 기부금액의 순위"

1위는 NDA가 차지했다. NDA가 어떤 학위인지 검색을 해 보았으나 찾기 어려웠다. 궁금하신 분들은 직접 검색해 보기 바란다. 흥미로운 것은 졸업 후 더 이상 학위를 하지 않은 집단의 기부금액 평균이 꽤 상위랭킹을 차지하고 있다는 것과 CEO가 될 가능성이 높아보이는 MBA 학위를 받은 졸업생들이 평균 기부금액에서는 꼴찌(물론 10명 초과인 집단에서)를 차지하고 있다는 점이다. 반드시 CEO가 다른 학위보다 많은 연봉을 받는다고 장담하기는 어려우나 이들이 평균적으로 다른 학위 집단에 비해 기부금액이 적다는 사실에 대해서는 약간 의아했다. 물론 자신들이 받는 연봉도 연봉이지만 기부는 애교심 또는 명예적 차원이 더 클 것이다.

위의 결과를 시각하기 위해 matrix 형태인 변수 t4로 돌아가자.

> t4 t2 t3 AA 250.0000 1 BA 287.5000 4 BAE 0.0000 1 BD 125.0000 2 BFA 25.0000 1 BN 57.5000 2 BS 363.7500 4 BSE2 357.0000 1 BSN 470.6425 4 DC 50.0000 1 DDS 150.0000 1 DMD 450.0000 1 DO 215.3333 3 DO2 55.0000 1 DP 30.0000 1 JD 2127.6042 103 LLB 15671.0000 2 LLD 25.0000 1 MA 371.7704 135 MA2 0.0000 1 MAE 20.0000 1 MALS 660.0000 1 MAT 678.0833 12 MBA 3460.5763 43 MCP 256.5000 2 MD 1290.8621 48 MD2 205.6000 10 ME 869.0000 20 ME2 150.0000 1 MFA 188.5556 18 MHA 762.0000 1 ML 11000.0000 1 MLS 829.0909 11 MM 50.0000 2 MPA 311.8889 9 MPH 151.6667 6 MS 1349.7385 65 MSE 780.0000 1 MSM 125.0000 1 MSW 985.2667 15 NDA 120.6947 72 NONE 743.2071 460 PHD 1279.8934 100 STM 500.0000 1 TC 927.9333 30 UBDS 262.3333 9 UDDS 282.7500 4 UMD 1954.6667 6 UMDS 385.6667 3 UNKD 489.5714 7

상기하는 바, t2는 졸업 후 학위 그룹 별 평균 기부금액을, t3는 각 그룹 별 졸업생 수이다.

t2에 대해 10을 초과하는 데이터를 추출한다:

> t7 = t4[t4[,2]>10 , ] > t7 t2 t3 JD 2127.6042 103 MA 371.7704 135 MAT 678.0833 12 MBA 3460.5763 43 MD 1290.8621 48 ME 869.0000 20 MFA 188.5556 18 MLS 829.0909 11 MS 1349.7385 65 MSW 985.2667 15 NDA 120.6947 72 NONE 743.2071 460 PHD 1279.8934 100 TC 927.9333 30

bar chart를 이용하여 이를 시각화한다:

> barchart(t7[order(t7[,1], decreasing=TRUE),], col=c("cyan","red"), xlab = "Donation / Number of Donators")


출력 순서는 평균 기부금액을 기준으로 한 것이며, 컬러 cyan은 평균 기부금액을, red는 기부자의 수를 나타낸다.




[남녀 별 총 기부금액 분석]

이번에는 남녀별 기부금액의 합계를 계산해보자:

> gender = tapply(don$TGiving, don$Gender, sum, na.rm=TRUE) > gender F M 364151.2 841302.4

남학생 졸업자가 여학생 졸업자보다 훨씬 많은 금액을 기부했다. 이는 남성의 사회활동이 훨씬 많기 때문일 것이다. 사실 졸업생 중 남학생과 여학생의 수는 615명으로 정확히 같다:

> table(don$Gender) F M 615 615

평균을 구해봐도 남학생 졸업자가 여학생 졸업자보다 2배 이상의 많은 금액을 기부했다:

> tapply(don$TGiving, don$Gender, mean, na.rm=TRUE) F M 592.1158 1367.9713

 



[년도별 졸업생 그룹별 기부 비율 분석]

이번에는 년도별 졸업생 그룹에 대한 기부자와 비기부자에 대한 비율을 확인해보자.

본격적으로 들어가기 전에 범위를 설정하여 레벨을 정하는 cut 함수에 대해 우선 알아본다. 예를 들어 다음과 같은 벡터가 있다고 가정하자.

> tmp = c(1:10) > tmp [1] 1 2 3 4 5 6 7 8 9 10

이 벡터의 범위를 (1,3], (3,7], (7,9], (9,100]으로 나누기 위해 cut 함수를 이용하면 다음과 같다:

> cut(tmp, c(1,3,7,9,100)) [1] <NA> (1,3] (1,3] (3,7] (3,7] (3,7] (3,7] (7,9] (7,9] (9,100] Levels: (1,3] (3,7] (7,9] (9,100]

레벨 1은 (1,3], 레벨 2는 (3,7], 레벨 3은 (7,9], 레벨 4는 (9,100]로 지정된다. 1은 (1,3]에 속하며, 2는 (1,3], 3은 (3,7], ... , 10은 (9,100]에 속한다.

범위에 대한 명시 대신 레벨로 표현하려면 labels=FALSE 옵션을 지정한다:

> cut(tmp, c(1,3,7,9,100), labels = FALSE) [1] NA 1 1 2 2 2 2 3 3 4

이제 기부자와 비기부자를 구분해 본다. TGiving 값이 범위 (0,0.5]에 속하면 비기부자, (0.5,10000000]에 속하면 기부자로 분류한다:

> don$TGivingIND = cut(don$TGiving, c(-1,0.5,10000000), labels = FALSE) > don$TGivingIND [1] 2 2 2 2 2 1 1 2 2 1 1 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 2 1 2 2 2 1 2 2 2 2 2 2 2 [44] 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 1 2 2 1 2 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 [87] 2 1 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 1 1 2 2 2 2 2 1 1 [130] 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 2 1 1 1 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 2 [173] 1 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 1 1 2 1 2 1 2 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 2 1 2 2 2 [216] 2 1 1 2 2 2 2 1 2 1 1 2 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 2 1 1 2 2 2 2 2 1 1 2 1 2 1 2 2 [259] 2 1 2 1 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 1 2 2 2 1 2 2 2 2 2 2 1 1 2 2 2 2 1 1 1 2 2 2 2 [302] 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 1 1 [345] 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 1 1 2 2 2 2 2 1 1 1 2 2 1 1 2 2 1 2 2 2 1 2 2 2 2 1 1 [388] 1 1 2 2 2 2 1 2 1 2 1 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 1 1 1 2 1 2 1 [431] 2 2 1 2 1 1 1 2 1 2 2 1 2 2 1 1 2 2 2 2 2 1 2 2 2 1 2 1 2 2 2 1 1 1 1 2 2 2 1 2 2 1 2 [474] 1 1 1 2 2 2 2 2 1 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 [517] 2 2 2 1 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 2 1 2 2 [560] 2 2 2 1 2 2 1 1 1 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 2 2 1 2 2 2 2 2 1 1 1 [603] 2 2 2 2 1 2 1 2 1 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 1 1 1 2 2 2 2 1 2 [646] 2 1 2 2 2 1 1 2 1 2 1 2 2 2 1 2 1 2 2 2 2 1 2 2 1 2 1 2 2 1 2 2 1 2 1 2 2 2 2 2 2 1 1 [689] 1 2 2 2 2 1 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 1 1 2 2 2 1 1 1 1 2 2 2 2 1 2 1 1 1 2 2 2 [732] 1 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 1 1 2 1 1 2 2 1 1 2 2 [775] 2 2 1 1 2 1 2 2 2 2 2 1 2 1 1 2 2 2 1 1 2 1 1 1 2 2 2 2 1 1 2 1 1 1 2 1 1 1 1 2 2 1 2 [818] 1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 2 2 1 2 1 1 1 1 1 1 2 1 1 2 2 2 2 1 1 2 2 1 2 1 2 1 2 2 [861] 1 1 2 1 2 2 2 2 2 1 1 1 2 1 1 2 1 2 2 2 1 1 1 2 1 1 2 2 2 1 1 2 2 1 1 2 1 1 1 2 1 2 1 [904] 2 1 1 1 2 2 2 1 2 1 1 2 2 1 2 2 2 1 2 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 2 2 2 2 2 1 2 2 1 [947] 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1 1 2 1 1 2 1 2 1 1 2 1 2 2 2 2 2 1 2 2 2 2 2 1 1 1 2 2 [990] 1 2 1 1 1 1 1 1 2 2 2 1 2 1 2 2 1 1 2 1 2 2 1 2 1 2 1 2 2 2 1 2 1 1 2 2 2 2 2 2 1 2 1 [1033] 1 2 2 2 2 2 1 2 2 1 2 2 2 2 1 1 2 1 1 1 1 2 1 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 [1076] 1 1 2 1 1 2 2 2 2 2 2 2 2 1 1 1 2 2 2 1 2 1 2 2 1 2 2 2 2 2 1 2 2 1 2 2 2 2 1 1 2 2 2 [1119] 2 2 2 1 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 1 1 2 1 2 2 1 1 1 2 2 1 1 1 1 [1162] 2 1 2 2 2 1 2 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 1 1 1 2 1 2 2 [1205] 2 1 2 1 2 1 1 2 1 2 2 2 2 2 2 2 2 1 2 1 2 1 1 2 2 2

위와 같이 레벨 1과 2로 구분되는데, 비기부자를 0, 기부자를 1로 구분하려면 don$TGivingIND의 각 값에서 1을 뺀다:

> don$TGivingIND = don$TGivingIND - 1 > don$TGivingIND [1] 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 [44] 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 [87] 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 [130] 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 [173] 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 [216] 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 1 1 [259] 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 [302] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 [345] 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 [388] 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 [431] 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 0 1 [474] 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 [517] 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 [560] 1 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 0 [603] 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 1 1 1 1 0 1 [646] 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 0 0 [689] 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 1 1 [732] 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 1 [775] 1 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 [818] 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 [861] 0 0 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 0 [904] 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 [947] 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 [990] 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 0 [1033] 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 [1076] 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 [1119] 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 [1162] 1 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 [1205] 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1

이들의 평균을 내보면 기부율을 알 수 있다:

> mean(don$TGivingIND) [1] 0.6569106

즉, 전체 인원 중 기부를 한 사람의 비율을 65% 정도임을 알 수 있다.

그러면 해당 년도의 졸업생에 대한 기부비율을 알아보자. 우선 기부자와 비기부자의 해당 년도별 졸업생 수를 확인한다:

> t8 = table(don$TGivingIND, don$Class.Year) > t8 1957 1967 1977 1987 1997 0 31 71 75 105 140 1 96 151 168 172 221

역시 숫자로만 봐서도 한 눈에 확 들어오지 않는다. 이를 시각화 해보자.

> barplot(t8, beside=TRUE, col = c("black","gray"))


검정색 바(bar)는 비기부자를, 회색 바는 기부자 숫자를 나타낸다. 이것은 절대적인 숫자를 나타내는 것으로, 비율을 한 눈에 알아보기는 쉽지 않다.

따라서 비율을 한 눈에 보려면 mosaicplot을 이용한다:

> mosaicplot(factor(don$Class.Year)~factor(don$TGivingIND), main="Rate of Contributions for Each Year", col=c("black","gray"))


위의 플롯을 관찰해 보면 졸업년도가 진행될 수록 기부 비율이 조금씩 떨어지는 것을 알 수 있으며, 1967과 1977년도의 기부 비율은 유사함을 알 수 있다.

이는 평균 기부율을 구해도 확연히 알 수 있다:

> t9 = tapply(don$TGivingIND, don$Class.Year, FUN=mean, na.rm=TRUE) > t9 1957 1967 1977 1987 1997 0.7559055 0.6801802 0.6913580 0.6209386 0.6121884

혹시 tapply 함수를 용도가 머리 속에서 삭제되신 분들을 위해 의미를 짚고 넘어가면, 이 함수는 데이터의 어떠한 대상(don$TGivingIND)을 어떠한 그룹(don$Class.Year)으로 분류하여 각 그룹에 대해 일괄적으로 어떠한 대상 함수(FUN=mean)를 계산하는 것이며, 옵션 na.rm=TRUE는 유실 데이터를 제외한다는 뜻이다. 다시 한 번 정리하자면 변수 t9는 기부자 및 비기부자에 대한 데이터를 각 해당 졸업년도에 대해 유실 데이터를 제외하고 평균을 구한다는 뜻이다.

t9에 대해 역시나 숫자는 한 눈에 들어오지 않으므로 bar chart를 이용해 시각화하면:

> barchart(t9, horizontal=FALSE, col="gray", main="Rate of Contributions")



대체적으로 해가 거듭될 수록 기부율이 감소하고 있으며 1977년은 1967년보다 근소하게 기부율이 높은 것을 관찰할 수 있다. 물론 1987년과 1997년은 거의 차이를 구분하지 못할정도로 유사하다.




[각 회계년도 별 기부금액 상관관계 분석]

이번에는 기부금액의 합산이 아닌 각 회계년도 별 기부금액에 대해 분석해 보자. 예를 들어, 2000년도의 기부금액과 2001년도의 기부금액이 어떠한 상관관계가 있는지를 살펴보는 것이다. 단지 두 개의 년도가 아닌 전체 년도에 대한 상관관계를 알아보도록 할 것이다.

먼저 각 회계년도의 기부금액에 대한 데이터를 저장한다:

> Data = data.frame(don$FY04Giving,don$FY03Giving,don$FY02Giving, don$FY01Giving,don$FY00Giving) > names(Data) [1] "don.FY04Giving" "don.FY03Giving" "don.FY02Giving" "don.FY01Giving" "don.FY00Giving"

이들에 대한 상관관계를 알아보려면 함수 cor을 이용한다:

> correlation = cor(Data) > correlation don.FY04Giving don.FY03Giving don.FY02Giving don.FY01Giving don.FY00Giving don.FY04Giving 1.0000000 0.5742938 0.8163331 0.1034995 0.6831861 don.FY03Giving 0.5742938 1.0000000 0.5867497 0.1385288 0.3783280 don.FY02Giving 0.8163331 0.5867497 1.0000000 0.2105597 0.8753492 don.FY01Giving 0.1034995 0.1385288 0.2105597 1.0000000 0.2528295 don.FY00Giving 0.6831861 0.3783280 0.8753492 0.2528295 1.0000000

숫자만으로 표현된 값들은 한 눈에 들어오지 않으므로 이를 시각화하자:

> plot(Data, main="Correlation", col="blue")



숫자에 비해서 plot이 어느 정도 눈에 잘 들어오기는 하지만 확실한 상관관계를 파악하기는 쉽지 않다. 함수 plotcorr를 이용하면 보다 쉽게 상관관계를 파악하는데 도움이 된다. 이 함수는 lattice 패키지에는 없으며 ellipse 패키지에 포함되어 있으므로 이 패키지를 로딩한다:

> library(ellipse)

만약 패키지를 찾을 수 없다는 메시지가 나오면 패키지를 다운로드 한다:

> install.packages("ellipse")

이제 상관관계를 그래프로 나타내보자:

> plotcorr(correlation, main="Correlation")


그래프의 의미는 다음과 같이 해석될 수 있다. 원형에 가까울수록 상관관계가 약하며 타원형의 장축과 단축 차이가 클수록(찌그러진 모양일수록) 상관관계가 강해진다. 타원형의 모양이 왼쪽 아래에서 오른쪽 위로 향할수록 양의 상관관계를, 왼쪽 위에서 오른쪽 아래로 향할수록 음의 상관관계를 나타낸다.

위의 그림을 살펴보면, FY00Giving과 FY02Giving 및 FY02Giving와 FY04Giving 이 두가지 세트가 가장 강한 양의 상관관계를 보여주고 있다고 할 수 있다. 즉, 예를 들어 2000년도에 기부자는 2002년도에도 기부를 많이 했을 가능성이 높다. 2002년도와 2004년도 사이에도 마찬가지 해석이 가능하다.



[이번 글을 마무리하며...]

이외에도 자신만의 기준을 만들어 데이터를 분석하거나 의미있는 정보를 발견하는 이른 바 데이터 마이닝을 시도해 볼 수 있다. 그야말로 금광을 캐내는 듯한 심정으로 데이터를 대해야만 데이터에서 새로운 의미를 찾는 것이 가능할 것이다.

다시 한 번 강조하지만 데이터를 다루는 테크닉을 중심으로 스토리를 만들어왔지만 이보다 중요한 것은 데이터를 바라보는 인사이트를 키워야만 진정한 데이터 과학자의 길이 될 것이다.

Comments