만약에 이 세상이 일정한 수학 법칙에 따라서 움직인다면? 화산이나 태풍같은 자연 재난에도, 부동산 가격과 주식시장에도, 강과 바다, 산과 사막 등의 환경에도, 심지어는 여러분들이 내리는 모든 결정과 삶과 죽음까지 아주 정확한 수학의 법칙에 따라서 움직이고 지배당하고 있다. 진짜 수학의 신이 진짜 있나? 싶은데... 오늘의 영화 리뷰는 바로 ‘벤포드의 법칙’이다.
과학자들이 설명을 못하고 있다는 말은 잘못된 말이에요. 밴포드의 법칙은 어떤 경우든 충분히 설명가능합니다. 보통 우리가 실생활에서 접하는 숫자들은 어떤 수에 변화율을 곱해서 나타나는 숫자들이 있고, 어떤 수에 변화량을 더해서 나타나는 숫자들이 있는데, 전자의 경우가 후자의 경우보다 많고, 전자의 경우로 설명하는 것이 철학적으로 자연스러운 경우들이 많습니다. 예를 들어, 올해 연봉은 지난해 연봉에 인상률을 곱해서 현재 연봉이 됩니다. 이를 지난해 연봉에서 얼마의 액수만큼 더해서 현재 연봉이 되었다고 얘길 해도 틀린말은 아니지만, 무엇이 랜덤한 숫자인가를 따져볼 때, 더해진 연봉보다는 곱해진 인상률의 분포를 보는 것이 철학적으로 자연스럽습니다. 자세하게 설명하자면 길어지겠지만, 연봉이 천만원 늘었다 라고 하는건, 연봉이 5천인 사람과 연봉이 1억인 사람에게 동일하게 와닿지 않지만, 연봉이 10% 늘었다 라고 하는건 연봉 수준에 관계없이 비슷한 느낌으로 와닿는 예제를 생각해보면 되겠습니다. 그렇게 계속해서 어떤 값이 곱해져서 나온 값을 기준으로 보면 로그를 취해 랜덤한 숫자들이 더해져서 나왔다고 하는 것이 자연스럽고 로그를 취했을 때의 앞자리가 1~9까지 랜덤하게 11.11% 씩 나온다고 하면 로그를 취하기 전의 숫자들은 앞자리가 1일 확률이 30.10% (상용로그 2의 값이 0.3010), 1이나 2일 확률이 47.71% (상용로그 3의 값이 0.4771) 과 같이 나와 밴포드의 법칙을 설명할 수 있습니다.
생각보다 단순한 거임. 1부터 19까지 앞자리만 남기면 1은 11개 나머지는 1개 1부터 29까지 1,2는 11개 나머지는 1개 1부터 99까지 1~9전부 11개 1부터 199까지 1은 111개 나머지는 11개 1부터 299까지 1,2는 111개 나머지는 11개 1부터 250까지라고 치면 1은 111개 2는 52개 나머지는 11개 애초에 자연은 1부터 99, 1부터 99999999 이런식으로 최대치가 한정된게 아니기때문에 숫자는 작은수부터 시작되고 앞자리만 남기면 그럴수밖에 없는 구조.
1이라는 숫자가 낮다는 의미를 무시할순없지 않을까요? 반면에 9라는 숫자는 1보다 9배나 더 많은 숫자니까 우연의일치든 반복적인일이든 도달하기 드문 숫자라고 생각하네요 한마디로 로또를 1번 당첨되는 사람이 많을까요 9번 당첨되는 사람숫자가 많을까요? 차사고를 1번당하는게 많을까요 9번당하는게 많을까요? 뭐가됫든 연속의 수로 생각한다면 어떻게 보면 당연한 자연의 수치라 생각합니다.
간단한 반례 만약 cm로 측정된 어떤 데이터가 벤포드의 법칙을 따른다고 하자. 그러면 이 데이터는 인치로 변환하면 어떻게 될까? 인치 변환은 약 2.5:1이고 변환을 계산해보면 1은 2~4로 변환되고 1로 변환이 가능한 cm 값은 4, 8에 해당하는 값이다.(중요한 점은 4, 8은 1로만 변환되지 않고 2로도 변환이 가능한 값라는 점이다.) 그런데 벤포드의 법칙에 따르면 4,8에 해당하는 값은 각각 9.7%, 5.1%를 차지하고 이것을 합쳐봐야 14.8%이므로 1에 해당하는 30%를 차지할 수가 없다. 간단히 말해서 기본적인 '측도변환에 대해 보존되지 않는 값'이라는 것이다. 더 단순한 예로 사람의 키만 봐도 절대 성립하지 않는다. 2021년 기준 우리나라 인구 5100만 중 0~17세 인구가 7백만, 15%이다. 이중에 키 첫단위가 1이 아닌 인구가 과연 몇일까? 억지에 억지를 써서 17세 이하가 전부 키 100cm이 안된다고 해도 85%가 되며, 억지를 더해서 국민의 15%가 키 2미터를 넘긴다고 쳐도 70%이다. 즉, 못해도 70%의 첫 숫자는 1이 되고 이는 벤포드의 법칙을 한참 뛰어넘고 있다. 이것만 봐도 벤포드의 법칙이 성립하려면 최소한 1~9까지 분포를 그릴 수 있는 데이터여야한다는 것을 알 수 있다. 아무데나 갖다붙인다고 성립하는 법칙이 아니란거다. 영상을 만들기 전에 벤포드 논문의 '초록'만 읽어봐도 어떤 경우에 이러한 로그스케일이 나타나는지 설명이 되어있고 논문에서 예시로 든 데이터를 봐도 '정확히 일치하지 않는다'는 것을 명시하고 있다는 것을 확인할 수 있었을 것이다. (1938 벤포드 논문의 표 1을 보면 A항목부터 T까지 무려 20개 항목에서 숫자를 분석했고 '대체적으로 만족'할 뿐, 상세항목에서 오차가 매우 큰 항목도 여럿 명시해놨다.) 최소한 영문위키에서 벤포드 법칙을 한번이라도 검색해봤으면 이 법칙이 적용되지 않는 경우에 대한 설명을 볼수 있었을 것이다. 참으로 안타까운 일이 아닐 수 없다.
사실 벤포드의 법칙은 적용되는 이유는 하나씩 셀 수 있는 수여야지 적용됩니다. 가령 예시로 든 키 같은 이미 정해진 수 같은 경우는 법칙을 적용할 수가 없죠. 벤포드의 법칙이 적용되는 이유는 생각보다 간단합니다. 수를 셀때 기본적으로 1부터 9까지 차례대로 채우기때문에 1X이 가장 먼저 채워지고 9X 번째는 1~8까지 가 모두 채워져야 나오기 때문이죠. 너무 간단한 법칙이기도 하고,. 사실 이 법칙은 원리만 알면 오히려 이용할 수도 있기에 ...
숫자가 누적적으로 채워지는 경우에 이 법칙이 적용될 것 같네요. 건물의 층수나 도시의 인구는 1에서부터 시작할 수밖에 없죠. 즉, 앞자리는 랜덤으로 채워지지 않습니다. 직관적으로 봐도, 낮은 층수의 건물이 많고 높은 층수의 건물은 적습니다. 도시의 인구를 봐도 인구 규모가 클수록 도시의 숫자는 적습니다. 즉, 건물 층수나 도시 규모의 앞자리 수는 랜덤하지 않습니다. 그리고 여기서 포인트는 앞자리 숫자를 택한다는 것이죠. 경제 관련 지표들 역시 마찬가지. 오히려 예로 든 1부터 백만까지의 앞자리 수는 랜덤하게 모두 11.1%씩 나옵니다. (앞자리 수 2부터 9까지 모두 경우의 수는 111111개이며, 1은 1백만이 포함되므로 111112개)
벤포드의 법칙은 당연한 것이 아닌가요? 닫힌계에서 어떤 현상은 유한개일테고 9다음으로 넘어가는 슷자 10이 19 다음으로 넘어가는 20보다 많을수밖에 없죠. 또 30 으로 넘어가는 슷자 3은 10단위나 20단위보다 당연히 적겠죠. 유한계어서의 당연한 귀결입니다. 1~9까지를 무작위로 계속 고를때는 당연히 1/9 확률로 나옵니다. 확률과 벤포드의 법칙은 다릅니다. 벤포드의 법칙은 앞서서 태어난 놈이 나이가 더 많은 것과 같은거지요.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
@Wls 제가 배운게 없고 똑똑하지 않아서 솔직히 영상 보고도 벤포드의 법칙 이라는 이론을 정확히 이해하지 못했습니다 대충 아 저런 법칙이 있구나 저런 느낌이구나인데 초중반엔 소름이다 무섭다 이런 느낌 이였는데 다보고 조금 생각해보니 의아한 생각이 들더군요 너무 결과론적인 얘기 아닌가? 결국에 당연한 소리를 당연하게 하는 느낌? 윗분들 말처럼 결국 인간의 기준으로 정해놓은 숫자를 기반으로 숫자놀이를 했다는 느낌을 받아서 좀 안심 되더군요 물론 저 법칙을 적극 활용하고 유용한 부분도 있지만 역시 너무 한 관점에 꽂히면 안된다고 다시 생각이 드네요
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
영상의 모든 사례들은 1부터 시작해서 카운트하기 때문에 측정 시작과 동시에 1은 반드시 발생 확률을 갖게 되죠.. 숫자가 커질수록 자연스럽게 확률은 좀더 낮아지구요.. 순차적인 오름차순 안에서만 통용되는 법칙 같습니다. 1~9 까지의 숫자가 표기된 카드를 뒤집어두고 뽑는 상황에서 확률은 무조건 같을 수 밖에 없져
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
1에서 2로가려면 2배 100%증가해야 하지만 2에서 3은 50% 3에서 4는 33% 이런식으로 점점 다음 자리수로 넘어가는 게 쉬워져서 가장 다음 수로 넘어가기 힘든 1이 많고 9에서 10으로 넘어갈 땐 11%정도만 증가하면 되기에 금새 1로 돌아가니 가장 적은 것 같네요.
벤포드의 법칙은 고전 넌센스네요.. 물리학도 아니고 우리 수(리과)학 하는 애들은 다 아는 내용을 법칙으로 만들어진다니 답답하네요;; 맨처음에 예시로 든 정해진 공간에서 숫자를 고르는거는 벤포드의 법칙대로 안나옵니다~ 나머지 모든 예시들은 자료나 기록을 순서대로 숫자들을 모은거니 당연히 1이 많아지죠, 평균값보다 낮은 숫자들이 평균값 이상의 숫자보다 당연히 많잖아요~
공감합니다. 벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
숫자를 세는데 있어서 1부터 나오고 9가 마지막으로 나오기 때문에 이런 순서로 생긴 확률로 인해 저 법칙이 통하는 거 아닐까요? 처음에 예를 들은 1부터 100만 까지 무작위로 뽑기 해서 나온 숫자가 저 벤포드 법칙을 따르게 되면 우리가 학교에서 배운 주사위를 던졌을 때 나오는 확률도 1이 가장 높은 확률이 나오고 6이 가장 낮은 확률이 나온다고 배웠어야 할 거에요. 근데 1부터 6까지 나오는 확률은 모두 같죠 리뷰엉이님이 처음에 예를 드신 1부터 100만 무작위 뽑기는 잘못된 예시인 것 같네요
@@user-bp3kw3rc9k 0:31 부터 대사 -> '자 만약에 1~100만 까지의 숫자가 바닥에 쫙 깔려있다고 쳐봐요. 우리는 그 중에서 하나를 고를 거에요. 49857이 나왔어요. 또 다음 숫자를 골라보죠. 582349가 나왔네요 또 다음 숫자는 3765가 나왔어요 이런 식으로 숫자를 계속해서 뽑아요. (!)그 다음에 맨 앞자리의 숫자만 남겨두고 뒤의 숫자들은 다 지우는거에요. 그러면 1~9까지의 숫자만 남겠죠? 그렇다면 1~9까지의 숫자가 나올 확률은 어떻게 될까요?' 이 대사에 (!) 줄에서 맨 앞자리의 숫자만 남겨두고 뒤의 숫자들은 다 지우라고 했잖아요 첫 번째 숫자와 마지막 숫자를 지우고 남은 숫자로 확률을 계산한다는 말은 대체 어디서 나온다는거죠? 님이 다른 영상 보고 오신 거 아닌가요? 영상 제대로 봐보세요...
@@user-bp3kw3rc9k 영상 예시가 틀린게 맞음. 방금 직접 엑셀로 1~999999 숫자중 랜덤2000개 뽑기 해서 맨앞자리숫자만 카운팅해봄. 1~9 모두 11퍼센트 근처로 수렴함. 전문가도 아닌 사람이 만든 영상 무조건 믿지 말고 비판적인 사고 갖추셔야할듯.
@@user-bp3kw3rc9k 벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
0:33 에서 들어주신 예시는 성립되지 않습니다. 벤포드의 법칙은 Log Scale 로 표현할 수 있는 등비적 증감이 발생하는 데이터 군에서 성립되는 법칙이지, 완전 랜덤 난수 에서는 성립되는 법칙이 아닙니다. 간단하게는 엑셀로 난수 추출 해보시면 벤포드의 법칙이 성립되지 않는 다는 것을 직접 확인 할 수 있습니다. 12:40 에서는 과학자들이 설명하지 못하고 있다고 짧게 언급 하셨지만, 다른 자료에서는 꽤나 설득력있는 설명들을 찾아 볼 수 있는 것 역시 아쉽다고 생각되는 부분입니다. 매번 영상 잘 보고 있습니다만, 이번 영상은 다소 아쉽네요ㅠ 앞으로도 잘 부탁드리겠습니다~!
앞자리수는 0부터 9까지 중 0을 제외한 1부터 9까지 이죠. 뒤에 어떤수가 온다한들 같은 자릿수(자릿수n) 이라면 10^n가지로 동일하게 나오는게 정상이고 상식선에서 11.11%가 되어야 하나, 모든 분야에서 저렇게 이상한 형태로 수가 일정한 확률로 결정되면서 의아스러워 진거라고 보시면 될 거 같습니다!
사실 그것은 그냥 평균값에 회귀하는 것뿐이다. 만약 어떤 회사의 주식이 1원에 상장하였는데 그것이 점차 상승하여 9,999원이 되었을 때 그 데이터의 총량에서 매일매일의 주가 데이터를 가지고 첫 자리가 1일 나올 확률이 30%가 되는 것은 그것이 평균값이기 때문이다. 1,000원의 주가가 2,000원이 되기 위해서는 100% 상승해야 되고 2,000원의 주식이 3,000원이 되기 위해서는 50%만 상승하면 되고 3,000원의 주식이 4,000원이 되려면 33.3%만 상승하면 된다. 1,000원이었던 주식이 2,000원이 되기 위해 소요되는 시일보다 2,000원이었던 주식이 3,000원이 되기까지의 시일이 더 짧을 수밖에 없기 때문에 첫 번째 숫자가 2보다 1의 숫자가 나올 확률이 더 높고 3보다 2의 숫자가 나올 확률이 더 높을 수밖에 없다. 이렇게 평균값에 회귀하려면 충분한 데이터량이 있어야 하고 주식 가격의 처음 시작이 1부터 이어야지 5,000원부터 시작하면 다르게 나온다. 만약에 1에서 9까지 쓰여있는 주사위를 충분히 많이 던질 때 나오는 확률이 11.1%로 회귀하는 것과 같은 원리이다. 그냥 그것은 빈도수가 평균으로 회귀하는 당연한 원리이지 이상한 것이 아니다. 그렇다고 이 세상이 확률의 법칙에 의해 움직이는 것은 아니다. 그 확률도 인과의 법칙에 의해 이루어진다.
이 법칙의 신기함을 설명하려다 가정이 오해를 불러 일으킬만큼 잘못된 것 같네요. 0:31에서 '1~100만까지의 숫자가 바닥에 쫙 깔려있고 그 중에 하나씩 뽑는다'면 '벤포드의 법칙'을 따르지 않을 것입니다. 각각의 숫자는 뽑힐 확률이 '1/100만'로 이미 정해져 있으니까요. '벤포드의 법칙'은 이미 한정된 세트내에서 카드뽑기를 할 때가 아니라 자연계에 나타나는 숫자가 그러한 결과를 나타낸다는 듯하며, 이는 진법이 1,2,3,... 이런식으로 누적되기 때문에 나타나는 경향같습니다. 권투경기에서 잽을 날린 횟수를 셀 때, 1과 9만 비교하면 1이 9보다 더 유리하겠죠. 1로 끝나버리는 경우, 2로 끝나는 경우, 3으로 끝나는 경우 등을 하나하나 생각해보면, 9의 입장에선 9까지 도달하고 끝나야하니 1보다 불리합니다. 아직 감이 안온다면 십의 자리에선 더 느낌이 극명해질 수 있는데, 9를 넘어 10,11,12,...,19 등에서 끝나면 다 1의 차지가 되죠. 그런데 9의 입장에선 10~19의 케이스와 동일한 확률을 같기 위해선, 10대,20대,30대,40대,...,80대 등에서 끝날 수 있는 경우들을 다 넘어서야 겨우 90~99 에 도달할 수 있으니 더 불리합니다. 결국, 9는 1보다 확률상 불리합니다.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
@@nicezic 프로그램까지 짜주시다니! 멋집니다^.^ real_world_random() 함수는 bit수가 작은 값을 더 자주 반환하겠네요. 즉, 1, 2~3, 4~7, 8~15, 16~31, 32~63, ... 순으로 1이 가장 자주 반환되고, 우측으로 갈수록 적게 반환되는. 위키백과에서 '벤포드의 법칙'을 찾아보니 '첫째 자리가 1일 확률은 약 30%인 데 반해, 9가 첫째 자리로 등장할 확률은 5% 정도밖에 되지 않는다.'로 나오네요. 님의 프로그래밍에서 출력되는 값과 거의 유사합니다. 같은 bit수 내의 값들간의 확률도 보정하고(지금은 서로 동일한 확률(예를 들어, 32와 63이 반환될 확률은 동일함)이지만, 더 큰 값이 더 적게 나오게 보정), 64bit를 무한대에 가깝게 보정하면 '벤포드의 법칙'의 확률분포식(log로 표현된 식)이 나오는건 아닐지... 혼자 생각해봅니다^^
대부분은 맞는 말인데 영상 처음부분 비유는 틀렸음 바닥에 숫자깔고 무작위로 줍는 경우에는 앞자리가 11%로 거의 똑같이 나오는 게 맞음 벤포드의 법칙이 적용되는 건 결과에 복잡한 인자들이 많은 경우에 적용이 되는 거지 숫자 랜덤하게 뽑는 경우에는 그냥 앞자리가 거의 1/9로 같이 나오는 게 맞음
아니 근데 어찌보면 당연한거 아닌가..? 1에서 9까지가 오름차순이니간 어떤 사건이라도 1이 가장 먼저고 많을거고.. 그 뒤로 갈수록 줄어들지 않을까 물론 무한정인 경우에는 모든 확률이 동일하겠지만 어느정도 실생활에서 집계가 가능한 확률은 어쩌면 당연한 그래프 모양인거같은데??
1부터 100만까지 아무숫자를 뽑아서 앞자리만 남긴다고하잖아요 뒤로 갈수록 줄어드는게 아니라1~9까지 개수는 전부 똑같죠 범위를 1~99로 줄여보면 1은 10개, 2는 9개, 3은 9개 이렇게 개수는 똑같은데 평행한 그래프가 아니라 항상 법칙을 따른다면 당연히 가능한 이야기는 아닌거죠
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
앞자리가 작은 숫자가 더 잘 나타나는 이유 : 예를 들어 10 에 막 도달한 상태 에서 20 으 로 앞자리가 바뀌기 위해서는 100% 몸집을 불리는 것이므로 그만큼 큰 도전이고 도달하는데 오래 걸리고 한참동안 앞자리는 1 에 머물러 있게 됨. 이후 20 에서 30 으로 갈 땐 50% 불어나는 것이므로 이전보다 상대적으로 수월하고 빠르게 다음 숫자에 도달함. 이런 식으로 뒤로 갈수록 다음 앞자리수 까지 도달하는 시차가 적게 걸리고 90 에서 100 까지 도달하는 건 가장 쉽고 짧게 걸리므로 앞자리 9 의 유지 시간은 1~9 중에서 가장 짧음. 이후 다시 100 부터 다음 200 까지는 기나긴 시간이 걸림. ...(반복) 이렇게 앞자리가 작은 숫자 일수록 다음 앞자리 숫자로 도달하는 시간이 오래 걸리고 큰 숫자 일수록 짧기 때문에 앞자리가 작은 숫자에 머무르는 시간이 전체적으로 길게 나타나는 분포를 보임. 산 이나 강 같은 자연현상 들도 미시적으로 들여다보면 그것들이 생성될 때 연속된 숫자들이 유기적으로 연결되고 관여된 역학 이나 화학반응 그런 수많은 것들이 모여 거시적으로 그것을 이뤄내었을 것으로 본다면 어느정도 개연성이 있지 않을까 싶음. 이렇게 연속성을 가지는 숫자들의 경우는 그런데 사람들이 임의대로 sns 에서 사용하는 숫자들의 통계나 비밀번호 설정 그런 건 각 사용자들 간에 어떤 숫자의 연속성 그런것도 없을텐데 왜 저 분포와 비슷하게 따르는가 는 상기한 벤포드의 법칙들에 따라 우리에게 자주 노출되는 숫자를 따라 은연중에 사람들도 무의식적으로 낮은 자리의 숫자부터 선호하려는 경향을 띠는 것이 아니냐는 추측이 있다는 듯.
공감합니다. 우리가 10진법을 쓰기 때문에 10진법의 틀에 갇혀 있는게 아닐까요? 예를들어, 사람이 3자리 수를 상상으로 채워넣는다하면 [ 1/9, 1/9, 1/9 ] 의 확률이 나오게 되고 조작티가 나게 되죠. 반대로, 만약 사람이 2진수로 아주 많은 수를 임의로 생성하고 [ 1010101011, 1010101111, 1010101, 1000101, 1100111, 1110001, ... ] 3진법, 5진법, 8진법, 10진법, 16진법 등으로 변환해보면, 당연히 모든 진법에서 앞자리가 1일 확률이 제일 높지 않을까요? 즉, 조작을 하더라도 2진수로 조작한 다음 10진수로 바꾸게되면, 벤포드의 법칙을 따르기 때문에 조작한 티가 안 나겠죠? 저는 세상의 모든 수가 벤포드의 법칙을 따르는게 아니라, 단지 수를 10진법으로 표현하게 되면서 나타나는 현상 같아 보이는데 말이죠.
생각해보면 빠른 숫자가 더 많이 나오는게 당연한것인데요. 모든 자릿수의 시작은 1이기 때문이죠. 마찬가지로 10진수가 아닌 12진수나 16진수를 사용한다 하더라도 더 낮은 숫자가 맨 앞자리에 존재할 확률이 높습니다. 그걸로 데이터의 인위적 변조를 따질 수 있는 법칙이라고 생각하시면 쉽게 이해 되실겁니다. 시작 부분에서 리뷰엉이님이 최대값이 존재하는 숫자 집합 내의 랜덤한 뽑기를 예시로 드신건 잘못되었습니다. 따라서 안타깝게도 로또번호는 맞추실 수가 없습니다.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
맨 처음 질문이 1 ~ 100 만 까지의 숫자를 놓고 집어 든다고 했는데, 그러면 벤포드의 법칙이 성립되죠. 그런데 1 ~ 50 만 까지의 숫자를 놓고 집어들면 벤포드의 법칙은 깨지게 됩니다. 즉 전체의 숫자가 무한대거나 또는 10, 100, 1000 ..... 이런 경우이면 확률은 11.11 % 가 나오겠지만, 어떤 숫자들도 그 숫자가 대략 1 ~ 50 까지에 몰릴 수도 있고, 5100 만 명일 수도 있고, 10 만 평방 킬로 미터일 수도 있고.... 이렇게 전체 범위가 유한적으로 존재하죠. 그렇기 때문에 앞 숫자가 적은 1 에 가까운 숫자의 확률이 높아지는 거죠. 조금 생각해 보면 당연한 거에요.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
1부터 100만까지 바닥에 깔린 숫자를 랜덤 선택시 가장 앞자리 수는 밴포드 법칙에 해당되지 않아요. 그건 정확히 확률 분포를 따릅니다. 밴포드 법칙에 대한 초기 도입 설명은 잘못되었습니다. 우리가 수라는 개념을 도입시 낮은수부터 높은 수로 변화를 주기 때문에 낮은 수가 나오기 전 높은 수가 나올수 없고 1일이라는 가장 낮은 수의 빈도가 가장 높고 높은 수로 갈수록 줄어 들게 됩니다. 그래서 초기 도입시 언급한 100만까지의 숫자중 랜덤 선택시 가장 앞자리는 해당 밴포드를 따르지 않습니다.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
파이썬 코드 올림 무작위 숫자는 개소리임 import random mil_num = range(1, 10000001) res = dict([(i,0) for i in range(1, 10)]) for _ in range(10000000): res[int(str(random.choice(mil_num))[:1])]+=1 print(res) {1: 11.1, 2: 11.0, 3: 111, 4: 11.1, 5: 11.1, 6: 11.1, 7: 11.1, 8: 11.1, 9: 11.1} 11.1또는 11.0나옴 벤포드법칙은 로또같은 무작위 숫자는 말이 안되고 전기세나 선거같은 9이후 10으로 올라가는 숫자만 통용됨
이거 그냥 1이라는 숫자가 가장 먼저 쓰이거나, 앞에 서는 경우가 많을 수 밖에 없으니 당연한거 아니에요? 그리고 그 다음은 2일 꺼고... 그냥 너무 당연한 이유라고 생각하는 건 나 밖에 없음? 무슨 분야던, 1이 가장 먼저 쓰이고 가장 먼저 계산하니까 1이 더 많은거지, 우주가 숫자로 만들어져서가 아니라고 봄 그래서 결론은 = 뭐든지 첫번째가 일정 %가 사용되면, 2번쨰는 그만큼 적어지고, 그게 지속될 수 밖에 없는거. 그걸 법칙이라 말 할 수 있는지는 모르겠는데, 저는 법칙이라기 보다는 당연한 현상? 정도로 생각합니다. 이 우주가 컴퓨터 법칙으로 만들어져서는 아닌거 같음
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
@@junyjuny3385 그렇다면 벤포드의 법칙은 왜 성립하는 것일까. 우리 주변의 자료 중에는 일정한 배율로 증가하는 것이 많다. 예를 들어, 일정한 배율로 자라는 나무의 현재 높이를 1이라고 해보자. 높이가 2로 2배가 될 때까지 걸리는 시간을 A라고 한다면, 높이가 2에서 3으로 1.5배가 될 때까지 걸리는 시간은 A보다 짧다. 마찬가지로 3에서 4로 1.33배 늘어나는 데 걸리는 시간은 더 짧다. 결과적으로 나무의 높이는 1에서 머무르는 시간이 길고, 2에서 9로 갈수록 머무는 시간이 짧아진다. 이를 표현한 것이 바로 벤포드의 법칙에 나타나는 상용로그 식이다. 벤포드의 법칙은 자연과학 법칙처럼 항상 성립하는 절대적 진리가 아니라, 상당한 자료에서 성립하는 경향성이다. -출처 네이버 백과사전 워터메롱님이 합리적인 의문을 제기했고 저는 그에 동의했을 뿐입니다. 방구석 코난은 바로 당신이 아닐까요? 세상엔 당신의 생각보다 능력있고 똑똑한 사람들이 많습니다. 유튜버의 말이 곧 진리인 것 마냥 착각하지 마시길..
영상을 재미있게 보긴 했는데 너무나도 당연한 사실이 아닐까 해서 이 글을 쓰게 됨. 주사위만 봐도 1부터 6까지 있으니까 7이나 9같은 수는 나오는것 자체가 불가능함. 달력같은 경우에도 1월부터 12월까지 있는데 2부터 9까지는 모두 경우의 수가 같고 1로 시작하는 경우의 수는 세가지나 됨. 1부터 31까지의 수 중에서 아무꺼나 고른다고 해도 1이나 2로 시작할 가능성이 압도적으로 높음. 한 마디로 자연에 있는 대부분의 무작위 수는 1부터 9중 작은 수로 시작할 확률이 높거나 1부터 9까지 모두 동일함. 따라서 그냥 아무꺼나 뽑아서 적용하면 작은 수로 시작할 확률이 높게 됨. 그냥 1부터 1000까지 종이에 순서대로 나열해 봐도 항상 1로 시작하는 수가 2로 시작하는 수보다 많거나 같고, 2로 시작하는 수가 3으로 시작하는 수보다 많거나 같음. 그리고 모든 상황에 만능으로 적용하는건 아님. 키, 몸무게, 헬륨 원자핵의 양성자 수만 봐도 이 법칙이 작용하지 않는다는 사실이 드러남. 그냥 지수함수적인 특정한 난수 상황에서만 작용하는것 뿐임. 그리고 그래서 당연히 로그 함수 형태의 그래프가 나타나는것임. 프로그래밍을 배운 사람들 대다수가 이해할 수 있을 것임. Math.random()*100같은 경우에는 1로 시작할 확률부터 9로 시작할 확률이 모두 동일함. (0으로 시작하는 경우도 있는거 아니냐 할 수 있지만 소수점을 무시하면 해결됨.) 그런데 10**(Math.random()*100)같은 경우에는 이 법칙이 적용됨. 모든 상황에서 적용되는 마법같은 법칙이 아니라 그냥 특정 상황에서 적용되는 수학적인 법칙일 뿐임. 그리고 그런 상황을 예시로 들었기 때문에 그렇게 되는건 당연함. 좀 상황을 바꿔서 8진법을 사용한다고 하고 f(x) = 2^x라는 함수를 예시로 들면 x가 0과 1사이의 어떤 수일 때는 f(x)는 항상 1로 시작함. x가 1과 2사이일 때는 f(x)는 2로 시작하거나 3으로 시작함. x가 2와 3 사이의 수라면 f(x)는 4, 5, 6, 7중의 수로 시작함. 그 이상 x가 n+3과 n+4사이의 수인 경우, x는 n과 n+1사이의 수인 경우와 시작하는 숫자의 가능성이 같음. 그래서 실수 x가 0부터 30 사이의 공평한 난수일때 f(x)가 1로 시작할 확률은 가장 높고, 2로 시작할 확률은 두번째로 높고, 점점 줄어드는 구조가 됨. 개인적인 생각으로는 그 자체가 신기한게 아니라 인구수처럼 관련 없어 보이는 형태의 난수가 지수적으로 이루어졌다는 사실이 신기한 사실이라고 생각함. 그런데 그것도 아주 놀라운 사실은 아님. 인구수 분포라는 것 자체가 '300명 200명 400명'이런 형태인게 아니라 '1000명 10명 150명'이런 식으로 지수적인 형태에 더 가까움. 그리고 이러한 사실은 우주가 수학으로 창조된 것과는 무관하다고 생각함. 요약하자면 놀랍고 신기한게 아니라 대중에게는 알려지지 않았지만 근의 공식처럼 당연한 사실을 그렇게 보이도록 포장한것임. 그리고 적합한 상황만 예시로 들었기 때문에 빨간색 과일만 가져다 놓고 과일은 모두 빨간색인게 신기하다는 것과 비슷함. 혹시라도 이 영상을 보고 주사위를 굴렸을 때 1이 나올 확률이 가장 높다고 생각했다면 큰 오류를 범한 것이고 앞으로 많은 불이익을 겪을 확률이 높음. 악플처럼 보일수도 있지만 리뷰엉이 채널에 재미있고 흥미로운 고퀄 영상이 많이 있어서 이미 오래전에 구독했고 정기적으로 영상을 시청하고 있음. 다만 많은 사람들이 보는 영상을 만들 때는 주제를 무조건 신기하고 놀랍게 꾸며서 시청 지속시간과 재방문 상승을 유도하는것 보다는 반례같은 다양한 정보를 추가하여 사람들의 믿음을 한 방향으로 치우치지 않게 해주셨으면 함.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
오 이거 저도 고등학교 때 발견했던 법칙인데, 계산기로 아무 숫자나 계속 치면서 곱해 나가면, 제일 마지막에 나오는 숫자의 가장 높은 자리 숫자가 1이 제일 많이 나오고 그 다음 2, 3, ... 순서로 자주 나오더라고요. 저는 그 이유를 곱하는 숫자들을 A, B, C, D, ... 라고 치고 모두 곱한 숫자를 N이라 한다면 logN = logA + logB + logC + ... 가 되고 N의 최고자리 숫자는 결국 상용로그에서 지표와 가수가 있는데 소수부분인 가수에 의해서 결정되기 때문에 log1 < 가수 < log2 = 0.3010 이면 최고자리가 1이 되고 log2 < 가수 < log3 이면 17%의 확률로 최고자리가 2가 되고 이렇게 된다고 해석했었거든요. 근데 영상보니까 딱 맞는 것 같네
공감합니다. 우리가 10진법을 쓰기 때문에 10진법의 틀에 갇혀 있는게 아닐까요? 예를들어, 사람이 3자리 수를 상상으로 채워넣는다하면 [ 1/9, 1/9, 1/9 ] 의 확률이 나오게 되고 조작티가 나게 되죠. 반대로, 만약 사람이 2진수로 아주 많은 수를 임의로 생성하고 [ 1010101011, 1010101111, 1010101, 1000101, 1100111, 1110001, ... ] 3진법, 5진법, 8진법, 10진법, 16진법 등으로 변환해보면, 당연히 모든 진법에서 앞자리가 1일 확률이 제일 높지 않을까요? 즉, 조작을 하더라도 2진수로 조작한 다음 10진수로 바꾸게되면, 벤포드의 법칙을 따르기 때문에 조작한 티가 안 나겠죠? 저는 세상의 모든 수가 벤포드의 법칙을 따르는게 아니라, 단지 수를 10진법으로 표현하게 되면서 나타나는 현상 같아 보이는데 말이죠.
로그와 진법 신기하네용. ^^ 벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
첫 예시 완전히 틀렸습니다 11.11 %가 맞습니다. 무슨 말씀을 하시고 싶으셨는지, 어떤 논문을 참조하셨는지 모르겠지만 해당 자료를 이해하지 못하신 채로 잘못된 예시를 든 것 같습니다. 예시부터 틀려버리니 이번 영상은 신뢰가 가지 않아서 몰입이 안되어 중간에 껐네요.. 지수함수에서 맨 앞자리 숫자가 벤포드의 법칙을 따르긴 합니다. 그래서 지수 함수의 맨 앞자리 숫자를 예측할 때 (10진법 기준), log2 = 0.3010 (약30%) , log3=0.4771(약17%) log4 = 0.6020 (약13%) [30(+30) , 47 (+17) ,60(+13) ....] 순서로 로그의 가수(α) 값이 정해지고 이 가수가 맨 앞 자리 숫자를 지칭하죠.. 예를들어, 2의 17승의 맨 첫 숫자는 17log2 이고 이는 대략 5.1170 (지표 =5 , 가수=0.1170) / 가수(α)의 값이 0.3010 보다 작으므로 맨 앞 숫자가 1인 6자리 수(지표 +1)가 되는 것이죠. 2의 31승은 31log2 이고 이는 대략 9.3331 (지표=9 가수=0.3331) / 가수(α)의 값이 log2와 log3 사이에 있으므로 맨 앞자리 수가 2인 10자리(지표 +1) 수가 되는 것이구요. 하지만 영상의 첫 예시는 완전히 틀렸고 리뷰엉이님이 잘 이해하지 못하신 채로 예시를 든 것 같습니다 앞으로는 좀 더 퀄리티 높은 영상 기대하겠습니다.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
이건 당연한거 아닌가요…? 직관적으로 자연 법칙을 따르는 데이터들은 1-9까지의 숫자보다 10-99까지의 숫자가 나오기 더 힘들고, 100-999까지의 숫자가 나오기 더 힘든데, 특정 데이터 군에서 나오기 힘든 자릿수의 숫자는 당연하게도 맨 앞자리가 작은 숫자일 겁니다. 1,2,3 등이요. 왜? 나오기 힘든 자릿수이니까 간신히 그 자릿수를 넘기면 1이나 2정도 나오는 거죠. 수집한 데이터를 자릿수별로 나눈 후에 (0이 하나 붙는 경우, 두 개 붙는 경우,…) 각 자릿수별 첫 자리 분포를 그려보면 뒤로 갈수록 1,2가 기하급수적으로 증가할 것으로 예상합니다.
공감합니다. 벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
@@junyjuny3385 저도 그렇게 생각하네요 과학자들도 왜 그런지 모르는데 1이 처음이고 작은 숫자라 많이 나온다고 단정짓는건 아니라고 생각합니다. 애초에 그렇게 해서 쉽게 나올 결론이었으면 굳이 법칙도 아닐뿐더러 공식도 필요가 없고 지금 보고 있는 영상도 없어야 하는게 맞죠
@@ysb5397 검색해보니까 과학자들도 왜 그러는지 모른다는건 어폐가 있는거 같아요. 법칙 자체가 왜 그런지는 이미 나와있고 (log라는 점을 고려하면 왜인지 느낌 오실거에요. 아님 저처럼 검색해보면 쉽게 설명 나와있습니다), 왜 우리가 관측하는 데이터에서도 그런지가 의문점인거 같더라구요. 결론은 기하급수적으로 숫자가 커지는 형태의 경우 이렇다고 하네요. uniform 분포에서 추출되는 숫자에는 적용 안되구요
신기합니다. 그런데 길이 무게 원자 등 숫자 등이 1이나 2보다 9로 가는게 점점 더 어려워져서 1 2 3 4 쪽에 많이 배치는거 아닐까 생각해봅니다. 부동산 가격이 9억 보다는 1, 2, 3억 순으로 많고 가벼운 파레토 법칙 처럼 소수에 상위 퍼센테이지가 아래를 거느리는 것 처럼 인간이나 자연계나 무거운 숫자를 많이 가지기 힘들지 않나 하는 생각을 해보았습니다.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
당연한거 아닌가..라는 생각이 듦. 만약 1~9까지의 자연수 중에서 일의자릿수가 1일 확률은 1/9가 맞음 그러나 1~11의 자연수 중에서 일의자릿수가 1일 확률은 1,11 2개이므로 2/11, 즉 1/9보다 커지게됨 또한 어떤 무작위 자연수를 골랐을 때 그 자연수의 일의자릿수가 1~9의 각 자연수일 확률이야말로 1/9, 즉 11%임(영상에서도 0을 왜뺐는진 모르겠는데 일단 나도뺌) 그렇기때문에 당연히 일의자릿수가 1일 확률은 다른 수들에 비해 커지게되는것이 당연함 숫자가 커질수록 일의자릿수가 1일 확률은 1/9에 가까워지긴 하나, 그것은 '숫자가 커질수록' 그런것이고 우리가 살아가는 이 세상에서 거의 모두가 작은 수에서부터 시작하기때문에 (예를 들어, 복싱선수의 잽 횟수를 센다고 할 때, 1부터 점점 커지면서 세는것과같음) 그리고 정말 기하급수적으로 큰 수가 나타나는 경우는 적기 때문에 저렇게 일의자릿수가 1일 확률이 더 튀는 경향이 있다고 예상함
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
근데 그냥 새벽감성으로 떠오른 생각인데 벤포드법칙은 1000보다 2000이 나오기 힘든 환경에서만 성립하는게 아닐까요...... 그리고 우리 세상은 엔트로피가 증가한다는.. 한방향성을 갖기 때문에 그 빈도의 대소는 변하지 않는 것이 아닐까...라는 생각을 해보았고 엔트로피가 감소하는 것이 안정해지는 현상이 있다면 그 현상은 벤포드 법칙을 따르지 않지 않을까 싶기도 하네요 근데 연결했을 때 로그함수 그래프가 되는 것은 굉장히 신기하네요 ! 발표하기 딱 좋은 주제예요
십진법이여서 직관적으로 납득되지 않을 뿐이지 다른 진법으로 계산한다면 한눈에도 납득될만한 결과가 나오지 않을까? 이런 수학적인걸 볼때마다 생각이 들더라구요. 나중에 AI가 발달해서 모든 수학공식을 십진법이 아닌 다른 진법으로 바로 변환할 수 있는 시대가 온다면 지금보다 더 큰 수학적 발전이 일어날것같은 느낌
지금도 컴퓨터로 수를 다른 진법으로 변환하는데는 아무 문제 없습니다. 진법은 단지 수를 표현하는 방법일 뿐이죠. 벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할 수 있는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
이 법칙은 자세히 생각해보면 당연한 것 아닌가요? 첫째 자리 남기고 다 지울 때 남은 숫자들에서 100000,200000,300000 이런식의 숫자들을 비교하는 것인데 0에서 1000000을 쌓는 것과 0에서 2000000을 쌓는 것은 필요한 정보량이 다르기 때문에 확률이 뒤로 갈수록 낮아지는 것이 아닌가요?
조금만 침착하고 생각해보면, 만약 특정 데이터의 대역폭이 1~99인 경우, 앞자리가 1일 확률이 1/9 = 11.11% 이고, 이 때가 1이 나올 확률이 제일 낮은 대역폭 만약 특정 데이터의 대역폭이 1~199인 경우, 앞자리가 1일 확률이 11/20 = 55% 이고, 이 때가 1이 나올 확률이 제일 높은 대역폭 때문에 자연적인 데이터 대역폭에서 앞자리가 1일 확률을 대략적으로 근사해보면 (11.11% + 55%) /2 = 33.055% 이므로, 애초에 11.11%가 아님. 다시 말하면, 자연에서 뽑은 데이터들의 대역폭은 1~100, 1~1000 이렇게 백 천 만 단위로 딱딱 끊어지는게 아니기 때문에 그 다음자릿수로 넘어가버리면서 1이 나올 확률이 훨씬 높음
공감합니다. 우리가 10진법을 쓰기 때문에 10진법의 틀에 갇혀 있는게 아닐까요? 예를들어, 사람이 3자리 수를 상상으로 채워넣는다하면 [ 1/9, 1/9, 1/9 ] 의 확률이 나오게 되고 조작티가 나게 되죠. 반대로, 만약 사람이 2진수로 아주 많은 수를 임의로 생성하고 [ 1010101011, 1010101111, 1010101, 1000101, 1100111, 1110001, ... ] 3진법, 5진법, 8진법, 10진법, 16진법 등으로 변환해보면, 당연히 모든 진법에서 앞자리가 1일 확률이 제일 높지 않을까요? 즉, 조작을 하더라도 2진수로 조작한 다음 10진수로 바꾸게되면, 벤포드의 법칙을 따르기 때문에 조작한 티가 안 나겠죠? 저는 세상의 모든 수가 벤포드의 법칙을 따르는게 아니라, 단지 수를 10진법으로 표현하게 되면서 나타나는 현상 같아 보이는데 말이죠.
이번 영상도 덕분에 신기한? 공식 알아가요. 감사합니다! 보면서 궁금했던 점이 있었는데 그 1이라는 숫자가 많이 나온다고 했을 때, 그 통계를 낼 때 숫자를 나타내는 단위가 바뀌어도 같은 결과가 나올까요? 저는 1이 많이 나오는 이유는 사람들이 생각하기에 편한 만큼의 단위가 기준이 되어서 그런 것 같아서요. 실제의 1cm 를 어떤 단위로 2am 라고 해서 같은 것들을 측정해 통계를 낸다면 숫자 2가 1보다 많을 수도 있을까라는 생각이 들었어요.
리뷰엉이님 매우 유익한 영상 감사드립니다. 다른 분들처럼 저도 다른 진법에 대해 성립하는지 궁금해서 찾아보니 en.wikipedia.org/wiki/Benford%27s_law#Benford's_law_in_other_bases 에 10진법이 아닌 다른 것들에 대해서도 일반적으로 성립한다고 나오네요. 이렇게 특정한 시스템(진법)에 영향을 받지도 않고 영상에서 인간의 판단이 영향을 미치지 않는 데이터들에서도 성립하는 경우가 있다고 알려주셨네요. 특정 숫자 시스템(진법) 이나 그런 시스템을 사용해 숫자를 만들어 내는 주체들(인간)의 선호 이상의 뭔가가 있지 않을까 싶긴 하네요.
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
그 2차원 평면이 점 하나 빠진 구랑 위상 동형이라서 지구 위에 모든 지점의 (온도,압력)을 모두 표시해보면 온도 압력이 모두 같은점이 무조건 한쌍 존재한다는 법칙이 있습니다. 유튜브 제목은 "지금 이순간 지구상에는 내가 있는 곳과 정확히 같은 날씨인 곳이 존재한다고?!?!" 라고 하면 될것 같습니다. 제목까지 뽑아드렸으니 꼭 리뷰해주시면 감사하겠습니다!
10진법을 따르기 때문에 그럼 당연하게도 100에서 10%, 20%, 30%, 40%, ... 99% 까지 증가 시킨다 해도 맨 앞자리는 1임 그런데 90에서 단 12%만 증가 시켜버리면 앞자리가 1으로 변화하게됨 그래서 특정 숫자에서 무수히 많이 반복하게 된다면 1이 제일 많이 나오게 되고 그 다음은 2, 3, 순으로 되게 됨 (10진법을 따르기 때문에)
벤포드의 법칙은 우리가 수(양자, 즉 본질은 0과1)를 특정 진법, 10진수로 표현하는데서 나온 현상일 뿐입니다. 1. 0:30 영상의 1부터 백만까지 수를 랜덤으로 뽑는 예시는 명백한 오류죠. 벤포드의 법칙을 따르지 않고, 11.1% 입니다. 백만이 아닌 만 -> 천 -> 백 -> 십 이렇게 사고 실험해보면됨. 그것도 정확히는 백만-1임. 2. 실세계에서 발생할수있는 수는 무한대이다. 최대값을 정할 수 없기 때문. 예, 손흥민이 살면서 패스한 총 횟수는 최대 백만(그것도 심지어10진수의 특정 자리올림수)으로 고정되지 않습니다. 3. 사람이 수를 조작 하면 10진수 관념으로 조작하기 때문에 벤포드의 법칙을 따르지 않게 됩니다. 예를들어 휴먼이 3자리 수를 임의로 생성한다면 [ 11.1%, 10%, 10% ] 예:304 이렇게 여기[3]은 1~9까지 1/9의 11.1% 확률로 초이스 하기 때문입니다. 이는 수의 근간(2진수)가 아닌 겉포장(10진수)관념으로 바꾼 것이기 때문에 벤포드의 법칙에 벗어나게 됩니다. 4. 수를 10진법이 아닌 다른 3진법 5진법 8진법 16진법 등으로 표현해도 벤포드의 법칙은 따른다. ( 단, 일조진법에서는 샘플의 수가 조를 넘을 확률이 거의 없기에, 앞 자리가 1일 확률은 실제 하나 빼곤 거의 없겠죠? ) 5. 2진수로 임의의 수를 생성하여 10진수로 변환하면 벤포드의 법칙을 따르게 되어있습니다. ex) 1010101, 1110101111, 1101010101, 1011011000111, ( 1111 => 십진수로는 15임 ) 즉, 벤포드의 법칙은 우리 휴먼이 수를 단지 10진법으로 표현( represent as 10진법 )하는데서 나오는 현상일뿐이지, 세상 만물의 수(통계,삶과 죽음까지?)가 벤포드의 법칙에 지배 당하는 것은 아니라고 보...여...집...니...다! 아래는 파이썬으로 벤포드의 법칙을 따르는 랜덤 함수를 작성한 것. (영상 오류 예시 증명 포함) import random # 이진기반 & 랜덤한 자리수로 난수 발생. def real_world_random(): digit = random.randint(1,64) # 최대값을 무한대로 줄 수 없기 때문에 자리수를 랜덤으로 대체 value = random.getrandbits(digit) # 2진수 기반으로 랜덤 자리수의 랜덤 수 생성 if( value == 0 ): value = real_world_random() # 0 이 나오지 않을 때 까지 재귀 수행 return value # 1부터 백만까지 난수 발생. def fake_radom(): value = random.randint(1,1000000) return value def run(random_type): total = 1000000 arr = [0 for i in range(9)] # 0~9 의 배열을 0으로 초기화 for _ in range(total): value = random_type() value_str = str(value) first_digit = int(value_str[0]) arr[first_digit-1] += 1 # 카운팅 for i in range(9): avr = arr[i]/total * 100 print(f'{i+1} => {avr:2.1f} %') print("### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음") run(fake_radom) print("### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 최대 자리수는 무한으로 줄 수 없기 때문에 랜덤으로함") run(real_world_random) ### 1 ~ 백만 ### 최대값이 10진수의 특정 자리올림 수인 오류를 범하고 있음 1 => 11.1 % 2 => 11.1 % 3 => 11.1 % 4 => 11.1 % 5 => 11.1 % 6 => 11.1 % 7 => 11.1 % 8 => 11.1 % 9 => 11.1 % ### 1 ~ 무한2진법 ### 2진기반 랜덤 발생. 자리수를 무한으로 줄 수 없기 때문에 랜덤으로함 1 => 30.7 % 2 => 17.5 % 3 => 12.5 % 4 => 9.6 % 5 => 7.8 % 6 => 6.7 % 7 => 5.7 % 8 => 5.1 % 9 => 4.4 %
흠... 영상 내용만 보면 벤포드의 법칙이 마치, 수치적으로 완전 말도 안되는 현상이 계산해보니 나왔다... 라고 보여질 수 있는데 사실은 아닙니다. 수학이나 통계적 지식 혹은 감이 어느 정도 있는 사람은 오히려 맨 앞자리 숫자의 분포가 균일하게 나오는게 이상하다는 것을 알기 때문입니다. 오히려 "실제 추출해봤더니 모든 숫자의 비율이 같더라" 라는 결과가 나온다고 하면 오히려 영상 내용과 결이 맞다고 할 수 있다고 할 수 있겠죠. 즉, 벤포드법칙은, 우주가 수학적으로 설계되지 않았으면 나올 수 없는 엄청나게 신기한 현상이 아니라, 10진법을 쓰는 일상적 숫자데이터 중 특별한 조건(범위가 한정되는 등)이 없을 때 당연히 나오는 현상이라는 뜻입니다. 로또 당청번호 1000년치 통계를 뽑아보니 낮은 숫자일수록 출현빈도가 높다는 현상이 나왔다더라.. 라고 하면 엄청 신기한 현상이지만 대충 골고루 분포되어 있다고 하면 당연한 거잖아요? 그것과 마찬가지로 벤포드법칙은 상식에 반하는 신기한 현상이 아니라 자연스럽게 확률적으로 예측될 수 있는 현상입니다. 벤포드법칙이 나타나는 이유는 숫자가 커질수록 앞자리가 바뀌는 것에 대한 저항이 줄어들기 때문이라고 할 수 있구요. 이 영상과는 별개로 우주가 수학적으로 움직인다는 것에는 어느 정도 동의하지만 벤포드법칙을 그 예로 들기에는 좀 억지인거 같아서 적은 글이었습니다.
우리가 현실에서 쓰는 1이란 숫자와 9란 숫자가 같은 의미로 쓰이진 않죠. 어떤 게임의 Lv이 1~9가 있다면 1에 가장 많은 유저들이 몰려있는 것처럼 통계적으로 낮은 숫자가 더 많은 변량을 지니게 되는건 당연한 경향입니다. 마찬가지로 자연현상도 엔트로피에 따라 무질서해지는 경향이 있는데 뭔가 높은 숫자를 만들기 위해서는 질서가 필요하고 반대로 말하면 무질서한 단계가 더 많아지죠. 가령 주사위를 던졌는데 2단으로 쌓일 확률이 1단일 때보다 낮은 것처럼요.