방명록

  1. BINA1 2018.01.19 16:57 신고  수정/삭제  댓글쓰기

    안녕하세요 선생님.
    파이썬으로 api사용하여 데이터를 수집해서 저장해보는걸 1차적인 목표로 하고 있는데요.
    짧게는 일주일 정도 데이터를 수집해보려고 합니다.
    받은 데이터를 list에 append로 차곡차곡 저장해볼까 생각을 해보니, 아마 메모리가 부족한 사태가 오지 않을까 싶은데요..
    수집한 데이터를 누적한 리스트로 메모리에 올려놓지 않고, 파일에 계속해서 추가해버리는 방법은 없는지 궁금합니다.
    어떤 방식이든, 수집한 데이터가 메모리상에 누적해서 올라가지 않고 저장할 수 있는 방법이 있으면 추천 부탁드려요!

  2. 이상규 2018.01.15 02:35 신고  수정/삭제  댓글쓰기

    안녕하세요 선생님 ! 현재 저는 R에서 텍스트 분석을 공부하고 있습니다.
    하고싶은게 있는데 오랫동안 생각해봐도 방법이 떠오르지 않아 도움을 청하러 왔습니다.

    영어로된 text와 그걸 번역한 text가 있습니다

    영어로된 text에는 'rat'와 'mouse'라는 단어가 나오는데 번역된 text에는 둘다 '쥐'로 번역되어 집니다.

    번역된 text에서 rat에 해당하는 쥐는 '랫'으로 mouse에 해당하는 쥐는 '마우스'변경하고 싶습니다.
    그러려면 영문 text에서 rat과 mouse를 찾고 그 순서에 맞게 쥐라는 텍스트를 변형해야 할 것 같은데 방법을 잘 모르겠습니다.. ㅠㅜㅠ

    혹시 생각나시는게 있으시다면 알려주세요 ㅜ!!

    • R Friend R_Friend 2018.01.15 23:38 신고  수정/삭제

      안녕하세요 이상규님,
      문의하신 내용을 짧은 예제로 해서 R로 짜봤습니다. 코드가 좀 지저분한데요 ^^;, 함수랑 흐름 참고하시기 바랍니다.

      # making 2 sample datasets in English and in Korean respectively
      eng <- c("This is a rat. I don't like a rat. That is a mouse. I like a mouse. It is not easy to differentiate between rat and mouse.")
      kor <- c("이것은 쥐입니다. 나는 쥐가 싫어요. 저것은 쥐입니다. 나는 쥐가 좋아요. 쥐와 쥐를 구별하는 것은 쉽지 않습니다.")

      #----------
      # searching the location where the 'rat' are appeared
      eng_rat_index <- gregexpr("rat", eng)
      eng_rat_index # 11 31 109

      eng_rat_index_tbl <- data.frame()
      for (i in 1:length(eng_rat_index[[1]])){
      eng_rat_index_tbl[i,1] <- c("rat")
      eng_rat_index_tbl[i,2] <- eng_rat_index[[1]][i]
      }
      names(eng_rat_index_tbl) <- c("gubun", "loc_idx")


      # searching the location where the 'mouse' are appeared
      eng_mouse_index <- gregexpr("mouse", eng)
      eng_mouse_index # 46 62 117

      eng_mouse_index_tbl <- data.frame()
      for (i in 1:length(eng_mouse_index[[1]])){
      eng_mouse_index_tbl[i,1] <- c("mouse")
      eng_mouse_index_tbl[i,2] <- eng_mouse_index[[1]][i]
      }
      names(eng_mouse_index_tbl) <- c("gubun", "loc_idx")


      # rbind the two location index table
      eng_index_tbl <- rbind(eng_rat_index_tbl, eng_mouse_index_tbl)


      # sort by loc_idx
      library(dplyr)
      eng_index_tbl_sort <- arrange(eng_index_tbl, loc_idx)

      # mapping the right english and korean in order
      eng_index_tbl_sort <- transform(eng_index_tbl_sort,
      kor_origin = "쥐",
      kor_change = ifelse(gubun == "rat", "랫", "마우스"))

      #----------
      # changing Korean step by step in order
      for (i in 1:nrow(eng_index_tbl_sort)){
      kor <- sub(eng_index_tbl_sort$kor_origin[i],
      eng_index_tbl_sort$kor_change[i],
      kor)
      }

      kor
      # [1] "이것은 랫입니다. 나는 랫가 싫어요. 저것은 마우스입니다. 나는 마우스가 좋아요. 랫와 마우스를 구별하는 것은 쉽지 않습니다."

    • 이상규 2018.01.16 11:49 신고  수정/삭제

      와.. 감사합니다. 만들어주신 코드 보면서 흐름이 어떻게 가는지 계속 공부하겠습니다!!

  3. 2017.12.21 11:27  수정/삭제  댓글쓰기

    비밀댓글입니다

  4. 2017.12.19 01:18  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2017.12.19 01:50 신고  수정/삭제

      안녕하세요. 반갑습니다.
      제가 교육 중이라 저녁에 초대장 보내드릴께요.

    • R Friend R_Friend 2017.12.19 16:14 신고  수정/삭제

      제가 이번주는 해외출장을 나와있는데요, 노트북으로 티스토리 로그인하려고 하니 "해외국가 로그인 제한을 설정하셨습니다… 라는 메시지가 뜨면서 로그인이 안되네요. 모바일로느 초대장 보내는 메뉴가 안쩌서요, 급하신거면 다른 분에게 초대장 부탁하시는게 좋겠습니다. 저는 다음주에 귀국해서 많이 늦을거 같습니다.

      멋진 블로깅 기대합니다.

    • 이진우 2017.12.20 00:51 신고  수정/삭제

      괜찮습니다. 기다릴수있습니다. 괜시리 번거롭게 하는건 아닌지 모르갰습니다.
      가능하신 날에 초대장을 보내주셔도 됩니다. 그동안 블러그 내용을 좀 더 작성해놓고있지요. 해외 일정 잘 보시고요.

    • R Friend R_Friend 2017.12.20 02:00 신고  수정/삭제

      네, 그럼 제가 다음주 귀국하자마자 초대장 보내드릴께요. ^^

    • R Friend R_Friend 2017.12.26 12:00 신고  수정/삭제

      안녕하세요 이진우님,
      티스토리 블로그 초대장 보내드렸습니다.
      쓰시려는 주제들이 저도 무척 고생했던 것들이라서 포스팅을 해주신다면 여러 사람들이 도움 많이 받을 수 있을 것 같습니다.
      멋진 블로깅 기대합니다. ^^b

    • 꼬멜라이언 2017.12.26 19:34 신고  수정/삭제

      보내주신 초대장 잘 받았습니다.
      바쁜 일정에도 잊지 않고 신경써 주셔서 대단히 감사드립니다.

      블로그를 잘 운영하도록 하겠습니다.
      즐거운 연말 되세요. ^^

  5. 2017.12.12 20:51  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2017.12.16 00:32 신고  수정/삭제

      안녕하세요.

      초대장 보내드리려고 했더니 '이미 초대된 이메일 주소입니다'라고 메시지가 뜨네요.

  6. FRYE 2017.12.07 15:30 신고  수정/삭제  댓글쓰기

    안녕하세요, 통계학 관련 질문좀 드리고 싶습니다.
    '세상에서 가장 쉬운 통계학 입문'이라는 책을 읽고 전부터 가져오던 의문이 하나 있습니다.
    모평균, 모분산 구간추정에 대한 것인데요.
    x가 정규분포를 따르고, 모평균을 안다고 할 때 모분산을 추정한다고 하면
    보통 카이제곱분포를 이용해서 구간추정을 하는걸로 알고 있습니다.
    그런데, 모분산 추정을 할 때 정규분포를 이용하는 것은 안되는 건지 궁금합니다.

    예를 들어 책에 나온 예제를 살펴보면 '어떤 나비의 몸길이 모집단은 모평균이 80mm인 정규모집단이라고 한다. 이 때 관측된 3마리의 몸길이가 76mm, 85mm, 83mm일 경우, 모분산 σ^2의 95% 신뢰구간을 구하시오.' 라는 문제가 있습니다.

    1) 원래의 방법인 카이제곱분포를 이용한다고 할 때(책에 나온 풀이)
    V = (76-80)^2 / σ^2 + (86-80)^2 / σ^2 + (83-80)^2/σ^2 = 50/σ^2
    이 V가 카이제곱분포를 따르므로, 자유도가 3인 카이제곱분포표를 통해 95% 구간을 구하면
    0.2157≤V≤9.3484 가 나오고, V에서 분산만 미지수인 것을 이용하면 분산의 구간추정을 할 수 있지요.

    2) 그런데 표본평균 = (76+85+83)/3 = 81.3 도 정규분포를 따르므로 표준화한
    Z = (표본평균-μ) / (σ / sqrt(n)) 도 표준정규분포를 따르므로 95%로 추정하면
    -1.96 ≤ Z ≤ 1.96 이 나오고 Z에서 미지수는 분산밖에 없으므로,(문제에 모평균은 주어졌으므로)
    분산의 구간을 구할 수 있는 것이 아닌가 생각합니다.
    심지어 최종 결과물의 구간 범위도 카이제곱분포를 사용한 것보다
    표준정규분포를 사용한 것이 더 좁아서 구간추정도 더 우수한 것이라고 생각되는데요..
    어떤 부분이 잘못된건지 잘 모르겠습니다 ㅠㅠ

    • R Friend R_Friend 2017.12.16 00:44 신고  수정/삭제

      안녕하세요.

      모집단이 아니라 표본집단으로 부터 모집단의 분산을 추정하는 표본분산의 분포는 말씀하신대로 카이제곱분포를 따릅니다.

      카이제곱분포는 자유도 n이 작을 때 왼쪽으로 치우친 분포 모양을 띠며, 자유도 n이 커지면 점점 정규분포로 근사해갑니다.

      예제로 제시하셨던 문제의 경우 샘플이 3개이므로 정규분포로 근사해간다고 할 수 없이 매우 작은 샘플 규모이네요.

      자유도 n에 따른 카이제곱 분포에 대해서 아래 블로그 포스팅을 참고해보시면 직감적으로 이해를 하시는데 도움이 될 듯 합니다.

      * 카이제곱 분포 소개글 => http://rfriend.tistory.com/112

  7. Yu 2017.11.29 02:39 신고  수정/삭제  댓글쓰기

    안녕하세요.
    R 공부하며 함수, 설명 등 R 관련하여 정말 유용한 정보 많이 배우고 있습니다.
    항상 감사의 말씀을 드립니다.
    다름이 아니오라, R studio를 사용하며 개인적으로 여쭙고 싶은게 있어, 혹시 도움을 받을 수 있을까 싶어서 이렇게 글을남깁니다.

    노트북에서 R studio를 이용해서 여러 데이터의 작업을 진행하고 있습니다.
    data.frame에서 varialbes 갯수가 100개가 넘어가면 View함수 이용시 끝까지 보이지가 않습니다.
    예를들어,
    변수가 a1부터 a105까지 있다고 가정할 때,
    a1부터 a100까지는 테이블형태로 표시가 됩니다.
    하지만 a101부터는 보이지가 않습니다.
    Environment 창에서는 12 obs. of 105 variables 라고 나옵니다.
    names 함수를 이용하여 확인을해도 a105까지 다 나오게 되는데요.
    View함수를 이용하여 확인하려고하면 a100까지 밖에 보이지가 않습니다.

    혹시 해결할 방법이 있을까요?
    노트북 사양 문제인건지, 아니면 따로 설정하는 방법이 있는건지..
    웹에 검색을 해도 해결이 안되어 글을 남깁니다.

    항상 유용한 정보 감사드리며 오늘도 좋은하루보내십시오.

    • R Friend R_Friend 2017.11.29 12:09 신고  수정/삭제

      안녕하세요 Yu님.

      RStudio에서 view 하시면 칼럼 100개까지만 보실수 있습니다. 분석하는데는 아무런 문제없습니다.

      100개 제한 푸는 옵션이 있는지는 저도 모르겠네요.

      예전에 5천여개 변수 가지고 분석한적이 있었는데요, 변수선택법 사용해서 모델에 유의미한 변수만 선별해서 모델링했었습니다.

  8. 샤를 2017.11.25 08:56 신고  수정/삭제  댓글쓰기

    프랑스에서 경제학 석사과정 유학 중인데, R 프로그램 사용에 대한 어려움이 많았습니다.
    여기서 많은 도움 얻고 가게 돼 감사의 말씀을 드립니다.

    종종 찾아와서 많이 배우고 가겠습니다.

    다시 한 번 감사드립니다. ^^

    • R Friend R_Friend 2017.11.25 22:35 신고  수정/삭제

      안녕하세요 샤를님,
      프랑스에서 공부하신다니 멋지십니다.
      R 블로그 포스팅을 요즘 잘 못하고 있는데요, 방명록에 남겨주신 글 보니 다시 힘내서 포스팅 해야겠구나 싶네요. ^^

  9. 김명찬 2017.11.24 08:56 신고  수정/삭제  댓글쓰기

    안녕하세요! 정리해주신 문서를 보고, 파이썬 numpy 및 pandas 에 대해서 알아가고 있는 중입니다.
    [Python NumPy] 범용 함수 (universal functions) : (1-2) 단일 배열 unary ufuncs : 합(sum), 누적합(cum_sum), 곱(product), 누적곱(cum_prod), 차분(difference), gradient 범용함수(http://rfriend.tistory.com/294)
    페이지에서 정리하신 내용중에서, 이해가 안되는 부분이 있어서 문의드립니다.
    (1-2-9) 기울기(gradient) 구하기 범용 함수 : np.gradient() 부분에서, numpy에서 1차 기울기계산은 어떻게 하는지를 이해했는데, 아래
    내용은 이해가 되지 않아서요..

    # Gradient is calculated using N-th order accurate differences at the boundaries
    # 양 옆에만 2차 차분 : 1 - (1.5 -1) = 0.5, 7 + (7-5) = 9
    In [45]: np.gradient(g, edge_order=2)
    Out[45]: array([ 0.5, 1.5, 4. , 4.5, 5. , 9. ])

    이 부분에서, 양쪽 끝에서만 2차 차분을 하면,.. 0.5(1.5-1)와 2(=7-5) 가 되는 것이 맞지 않나요?
    왜 처음은 1에서 2차 차분한 값을 빼주고, 마지막 끝에서는 1차차분값에 2차차분값을 왜 더해주는지 궁금합니다.

    어떻게 이해해야 하는지 알려주시면 좋겠습니다. 많은 가르침 부탁드립니다.

    그럼 이만..

    • R Friend R_Friend 2017.11.24 13:53 신고  수정/삭제

      안녕하세요 김명찬님, 반갑습니다.
      답변이 좀 늦어서 죄송합니다.

      먼저 블로그에 설명해드린 np.gradient(g, edge_order=2) 함수의 계산 로직은 맞습니다.

      gradient() 함수로 기울기를 계산할 때 보면 거리(distance)가 1 (default)라고 했을 때, 앞/가운데/뒤의 순서로 숫자가 있는 경우에는 {(가운데 수 - 앞의 수) + (뒤의 수 - 가운데 수)}/2 처럼 가운데 숫자를 기준으로 앞과 뒤의 숫자와의 차이의 평균으로 기울기를 계산했습니다.

      그런데 양쪽 변두리의 처음과 끝의 숫자를 보면
      - 제일 앞 자리에 있는 숫자는 뒷자리 숫자만 있을 뿐 (자기 자신이 제일 앞이므로)이며,
      - 제일 뒷 자리에 있는 숫자는 그 숫자를 기준으로 앞자리 숫자만 하나 있을 뿐 (자기 사진이 제일 뒤이므로) 입니다.

      그래서 제일 앞자리와 제일 뒷자리의 변수리 숫자의 경우 나머지 다른 위치(자기 자신을 기준으로 앞과 뒤에 다른 숫자가 있어서 숫자 3개로 기울기를 구할 수 있는 위치)의 숫자들과는 다른 로직으로 계산을 해야 합니다.

      가령
      k = np.array([1st, 2nd, 3rd, 4th, 5th]) 라는 array가 있다고 했을 때,

      (1) np.gradient(k) 함수의 경우 아래 처럼 각 위치의 숫자별 기울기를 계산합니다.

      np.array([ (2nd - 1st), {(2nd-1st) + (3rd-2nd)}/2, {(3rd-2nd) + (4th-3rd)}/2, {(4th-3rd) + (5th-4th)}/2, (5th-4th)])

      변두리에 해당하는 처음과 마지막을 유의해서 보시면 그냥 뒤의 숫자에서 앞의 숫자를 뺐는데요,
      - 제일 처음 위치의 숫자는 (2nd - 1st) 처럼 1차 차분 계산의 뒤에 빼주는 숫자로 들어갔으며,
      - 제일 마지막 위치의 숫자는 (5th - 4th) 처럼 1차 차분 계산의 앞쪽에 빼짐을 당하는 숫자의 위치에 들어갔습니다.


      (2) np.gradient(k, edge_order=2) 함수의 경우는 위의 (1) np.gradient(k) 함수에서 양 변두리에 위치한 값의 계산 방식에 조금 보정을 가한 경우라고 보면 될거 같습니다.

      np.array([ {(2nd - 1st) - (((2nd-1st) + (3rd-2nd))/2 - (2nd-1st))}, {(2nd-1st) + (3rd-2nd)}/2, {(3rd-2nd) + (4th-3rd)}/2, {(4th-3rd) + (5th-4th)}/2, {(5th-4th) + ((5th-4th) - {(4th-3rd) + (5th-4th)}/2)}])

      보정을 가할 때 인근 값들의 기울기 정보를 고려해주겠다는 것인데요, 제일 앞자리에 위치한 값과 제일 뒤에 위치한 값이 np.gradient() 구할 때 각각 빼주는 위치 혹은 빼짐을 당하는 위치가 서로 다릅니다. 그것 때문에 처음 위치 숫자에서는 기울기 1차 차분을 빼주었고, 제일 마지막 위치 숫자에서는 기울기 1차 차분을 더해준 것입니다.

      제일 앞에 위치한 숫자에 대해 np.gradient(g, edge_order=2) 를 구할 때 아래처럼 계산식을 표현해주면 이해가 더 쉬울 수도 있을 것 같습니다.
      --(3) 번 표기--
      {(2nd - 1st) + ((2nd-1st) - ((2nd-1st) + (3rd-2nd))/2)}

      블로그 본문에서는 {(2nd - 1st) - (((2nd-1st) + (3rd-2nd))/2 - (2nd-1st))} 식으로 계산을 한다고 표기를 해두었는데요, 두번째 괄호 안의 빼주는 위치를 바꾸어 주고 (마치 제일 뒤에 위치한 숫자가 빼주는 순서와 같이요) 대신 첫번째 괄호와 두번째 괄호를 빼기에서 더하기로 바꿔주면 (3)번 표기식과 같이 됩니다.

      쓰다보니 설명이 길고 헷갈리게 되어버렸는데요, 요점은 제일 처음 숫자와 제일 마지막 숫자의 경우 np.gradient() 구할 때 해당 위치를 기준으로 앞/뒤 숫자를 뺄 때 하나는 빼주는 뒤의 숫자가 되고, 하나는 빼짐을 당하는 앞의 숫자가 되기 때문에 np.gradient(g, edge_order=2)로 보정을 해줄 때 보정 방법이 달라진다는 것입니다.

  10. AS 2017.11.03 16:01 신고  수정/삭제  댓글쓰기

    안녕하세요! 항상 좋은 글 많이 참조하고 있습니다.
    각종 변수 변환을 하는 이유에 대해 궁금해서 질문드리고자 글 남기는데요..
    그 방법에 대해서는 이해가 가는데, 언제 이런 방법들을 쓰는지 잘 모르겠는 부분이 있습니다.

    예를 들어, 개수축소(샘플링)는 전체 데이터를 다 가지고 살펴보거나 학습시키기에 사이즈가 너무 크다든지 하는 등의 이유가 있을 것이고, 차원축소는 차원의 저주 등의 이유로 하는 것이라고 짐작해 볼 수 있는데요.

    의문점은..
    1. 표준화(min max normalization, standardization)이나 로그변환, 지수변환 box-cox transformation 등은 왜, 그리고 언제 하는지를 잘 모르겠습니다.
    2. 표준화를 할 때, scaling 이외의 목적이 존재하나요?
    3. 로그변환, 지수변환, box-cox 등의 변환으로 분포를 정규분포처럼 같이 만들어 주는 것이 왜 효과가 있는 건가요?

    지도 부탁드립니다!

    • R Friend R_Friend 2017.11.05 22:17 신고  수정/삭제

      안녕하세요.

      표준화는 회귀분석과 같은 parametric approach 분석(모델 가정, parameter 추정)의 경우에 정규성 가정사항을 만족시키기 위해서 (즉, 의사결정나무나 K최근접이웃과 같은 non-parametric approach를 사용한다면 표준화 불필요),

      혹은 말씀해주신 것처럼 scale 이 다른 경우 scaling 용도로 사용합니다.

      인공신경망처럼 input을 '0~1'로 표준화 해줘야 하는 경우도 있구요.

      즉, 분석 기법에 따라 좌우되는게 있습니다.

      다음으로, 무슨 변환을 쓸 지는 데이터 형태를 시각화나 통계량을 통해서 살펴보시고, 정규분포로 변환하려면 무슨 변환을 해야 하는지 결정하시면 됩니다. (가령 오른쪽으로 skewed 된 데이터는 로그를 취한다던지....)

      회귀모형에 대해 좀더 설명하자면, 모수 추정 시 모집단 회귀모형에 포함된 오차항에 대한 몇가지 가정사항이 있습니다. 오차항 epsilon i ~ iid. N(0, sigma^2) 가정인데요, 모델 진단 단계에서 잔차 정규성(N)을 만족하지 못하는 걸로 나오면, X나 Y 변수가 skewed 된 경우가 많습니다. 그럴 때 변수변환 해주고 다시 모델링하게 됩니다.

      왜 정규분포냐 하면요, 통계학 시간에 중심극한의 정리를 배우셨을 텐데요, 오차항이 정규분포를 따르면 중심극한의 정리에 의해서 잔차의 평균이 0으로 수렴하기 때문입니다. 만약 오차항의 정규성 가정을 만족하지 못하면 최소자승법(least square method)에 의해서 회귀계수를 추정한 값을 사용할 수 없게 됩니다.

      혹시 잘못된 부분 있으면 댓글 부탁드려요.

    • AS 2017.11.14 14:55 신고  수정/삭제

      답변 감사드립니다.
      일단 회귀분석에서 정규성 검정 부분을 다시 한 번 자세히 들여다 봐야겠네요.

      질문이 한 가지 더 있는데요.
      회귀분석(선형, 다중 등등)에서는 오차항에 대해 정규분포 가정이 들어가니, 위와 같은 변환을 해 줄 필요가 있다고 한다면,
      다른 모델을 사용하여 regression을 수행하는 경우는 정규성 가정과는 상관 없다는 말씀이시죠?

      예를 들어 연속값 예측을 위해서 decision tree를 쓴다든지 신경망을 사용한다든지 할 때는
      (0-1범위로 맞춰주거나 변수간 scale을 맞춰주는 이유로 변환을 할 수는 있으나)
      정규성 가정을 만족시켜주기 위해 표준화, 로그변환, 지수변환, box-cox 등등을 하는 것은 아닌게 맞는지 궁금합니다.

    • R Friend R_Friend 2017.11.14 15:13 신고  수정/삭제

      안녕하세요 AS님,
      확인차 문의하신 것처럼 decision tree 와 같은 non -parametric approach 분석 기법은 정규성 가정사항 없습니다 분석가에게는 편한 편이지요. 해석력도 높고, 모델 가정이 없으니 도메인 지식이 약해도 시작할수 있고, 비선형도 어느정도 커버되는 장점이 있지요.

    • AS 2017.11.14 15:48 신고  수정/삭제

      답변 정말 감사드립니다!!