1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
install.packages("SnowballC")   #단어의 어근만을 추출 wordstem, stem document 참조.
install.packages("tm")
install.packages("RWeka")       # n-gram관련 패키지.
install.packages("koNLP")      
 
library(ggplot2)
library(dplyr)
library(stringr)   #문자열 처리 패키지.
library(tm)
library(SnowballC)
library(RWeka)
library(rJava)
library(KoNLP)
library("wordcloud")
library(RColorBrewer)
 
 
#미국 트위터 글 데이터 마이닝.
 
teens = read.csv("sns.csv")
str(teens)
 
table(teens$gender , useNA = "ifany")   #NA 표시
summary(teens$age)
boxplot(teens$age)
 
teens$age = ifelse(teens$age >= 13 & teens$age <= 20 ,  teens$age ,NA)
 
summary(teens$age  )
boxplot(teens$age  )
 
 
#teens$female = ifelse(teens$gender == "F" , 1, 0) #NA는 수식에 들어가지 않는다.
 
#꼭 NA를 포함시켜서 전처리 해야 한다.
teens$female   = ifelse(teens$gender == "F" & !is.na(teens$gender) , 10)
teens$noGender = ifelse( is.na(teens$gender) , 10 )
 
table(teens$female   , useNA = "ifany"#female인 경우만 1
table(teens$noGender , useNA = "ifany"#NA 갯수 출력
 
 
#나이의 평균
mean(teens$age, na.rm = T)  #NA때문에 평균 구하기 불가.
 
#졸업년도
table(teens$gradyear)
 
#aggregate는 결과가 df로 나온다.
aggregate(data = teens, age~gradyear , mean) # data = 를 꼭 넣어줘야 한다.
aggregate(data = teens, age~gradyear , mean , na.rm = T )  #NA빼고 계산.
"data.frame으로 출력."
 
 
#tapply와 비슷. 벡터를 리턴한다. 각 컬럼에는 그 해당 학생 졸업년도 그룹의 평균 나이가 들어간다.
ave_avg = ave(teens$age, teens$gradyear, FUN = function(x){ #졸업 년도에 따라 묶고. age에 대한 평균을 구하기.
  mean(x, na.rm = T)
})
 
#벡터로 출력.바로 컬럼에 대입할수가 있다.
teens$age = ifelse(is.na(teens$age), ave_avg, teens$age )
 
interests =  teens[ , 5:40]
 
str(interests)
lapply(interests, scale)               #표준화. (컬럼값 - 평균) / 표준 편차 
 
interests_z = as.data.frame(lapply(interests, scale))
 
interests_z
 
#정규화 : 0~1로 설정.
#표준화 : 토익 / 토플점수, 즉 직접적으로 비교할수 없는 두 값에 대해서 비교하기 위해서 표준화 한다.
 
 
#5개의 랜덤 좌표 생성
set.seed(2345)
 
#클러스터링 <데이터> <클러스터 수>
teen_clusters = kmeans(interests_z, 5)
 
str(teen_clusters)
 
# $ cluster     : int [1:30000] 1 5 1 1 3 5 1 1 1 2 ...                      #각 행이 속한 클러스터의 번호수 
# $ centers     : num [1:5, 1:36] -0.1549 0.6373 0.3663 -0.0862 -0.0326 ...  #각 행별 좌표값 36개 
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr [1:5] "1" "2" "3" "4" ...
# .. ..$ : chr [1:36] "basketball" "football" "soccer" "softball" ...
# $ totss       : num 1079964
# $ withinss    : num [1:5] 273957 392272 187913 35945 61586
# $ tot.withinss: num 951673
# $ betweenss   : num 128291
# $ size        : int [1:5] 21667 4844 1039 596 1854                         #각 클러스터별 포함된 행수.         
# $ iter        : int 6
# $ ifault      : int 0
# - attr(*, "class")= chr "
 
 
teen_clusters$size     #각 그룹에 속한 obj 수
teen_clusters$centers  #5개의 센터의 좌표
 
interests_z = cbind(interests_z, cluster = teen_clusters$cluster)
 
teens$cluster = teen_clusters$cluster
 
 
#클러스터별 나이의 평균
tapply( teens$age , teens$cluster ,mean)
aggregate(data = teens , age~cluster, mean)
 
 
#클러스터별 female의 평균 
aggregate(data = teens , female~cluster, mean)
 
#클러스터별 friends의 평균
aggregate(data = teens , friends~cluster, mean)
 
 
cs


+ Recent posts