2023년 골프 정리

올해 초에 나는 40번 필드 라운드를 나가겠다고 공언했다. 그리고 40번 필드 라운드를 달성했다. 이 글은 2023년에 40번 필들 라운드를 정리한 글이다.

정확히는 42번 필드 라운드를 나갔다. 2번은 파3 9홀 골프장으로 18홀 정규 코스는 아니다. 그래서 18홀 정규 코스 기준으로 40번을 달성했고 9홀을 포함해서 42번이다.

골프장

멀리 있는 골프장은 나중에 많이 다니기로 하고 올해는 주로 동네에 있는 골프장을 돌아가면서 다녔다. 집에서 30분 이내에 갈 수 있는 골프장을 주로 이용했다.

총 10 곳 골프장을 가 봤다. 총 라운드 횟수가 40번이므로 평균 한 골프장 당 4번이어야 겠지만 실제 기록은 스프링밸리, 산호세 뮤니, 산타테레사 뮤니, 서니베일 뮤니 이렇게 4개 골프장에 34번 갔다. 80% 가량 라운드를 이 4 곳에서만 플레이 했다. 왜냐면 이 4곳이 집에서 가깝기 때문이다. 산타테레사 뮤니 골프장이 집에서 가장 가깝고 그 다음이 산호세 뮤니 골프장이다.

가장 멀리 갔던 골프장은 델 몬트 골프장으로 집에서 두 시간 거리다. 여기는 골프치러 갔다기보다 가족 여행으로 옆에 있는 리조트에 놀러갔다. 리조트에 골프장이 붙어 있어서 일정 중 하루 오전을 빼서 골프 쳤다.

시나바는 집에서 가까운 골프장 중 난이도가 있는 골프장이다. 예약하기가 쉽지 않다. 내년에는 시나바에 여러번 가 보고 싶다.

씨스케이프는 산타 크루즈에 있는 골프장이다. 가는데 걸리는 시간은 의외로 밀피타스에 있는 스프링밸리나 베이뷰에 가는 시간과 크게 차이 나지 않는다. 그러나 산을 넘어서 가야 한다는 심리적 느낌 때문에 더 멀게 느껴져서 잘 가지 않게 된다. 내년에는 기회가 되면 이곳도 여러번 가 보고 싶다.

내년에도 산타테레사 뮤니와 산호세 뮤니와 서니베일 뮤니는 아마 각각 5번 이상은 가게 되지 않을까 예상해 본다. 가깝고 상대적으로 그린피가 저렴하고 예약하기가 수월하기 때문이다.

Score

일년 동안 약간 미친놈처럼 골프 쳤더니 확실히 점수가 좋아지긴 했다. 열심히 많이 하면 실력이 늘긴한다. 전체적으로 봤을 때 스코어는 확실히 좋아졌다.

여전히 백돌이에 가까운 점수이긴하지만, 90 초반에 가까운 점수도 몇 번 기록했다. 물론 명랑 골프를 지향하다보니 엄격하게 스코어를 매기지 않아 다소 거품이 끼어 있는 점수다. 공 잃어 버렸을 때 벌타, 숏 퍼트 컨시드 등을 모조리 다 엄격하게 포함한다면 위 기록보다 실제로는 최소 5타이상 많게는 10타 가까이 더 많을지도 모른다. 따라서 나는 아직도 백돌이다.

내년에는 명랑골프로 보기 플레이어, PGA룰로 90초반을 기록해 보는 것이 목표다.

코스별 점수

전체적인 추세는 점수가 좋어지는 방향이긴 한데 개별 골프장 별로는 추세가 어떻게 될지 궁금했다. 한두번 간 골프장은 추세를 보는게 의미가 없으므로 가장 많이 갔던 골프장 4개를 대상으로 추세를 봤다.

기대했던 추세적 우하향 그래프가 아니라 꽤나 널뛰는 그래프다. 재미있는것은 산호세 뮤니를 제외하고 나머지 3개 골프장은 3번째 방문때 스코어가 안좋았다는 것이다. 산호세 뮤니도 4번째 방문에서 점수가 나빠졌다. 3번째나 4번째 갔을 때에는 어느정도 익숙한 골프장이라고 생각하고 공을 대충 쳤나보다.

산호세 뮤니는 나중으로 갈 수록 오히려 점수가 나빠졌다. 서니베일 뮤니와 스프링밸리는 마지막 방문이 직전 방문했을 때보다 점수가 나빴다. 산타테레사 뮤니는 최근 방문일 수록 그나마 점수가 나아졌다.

왜 그럴까를 생각해 봤다. 아무래도 실제 실력을 반영하는 점수라기보다 최근으로 갈 수록 점수 기록을 이전보다 조금은 엄격하게 해서 그런것 아닐까 싶다. 3번째 방문에 공통적으로 점수가 안좋아지고 한 동안은 점수 기록을 좀 후하게 하다가 최근 들어서는 나름 실력에 자신이 붙어서 점수 기록을 다시 살짝 엄격하게 한 것이다.

아마 내년에는 올해보다는 점수 기록을 전체적으로 엄격하게 하지 않을까 싶다.

누구랑

작년(2022년)에는 골프장에 혼자 가지 않았다. 그러다보니 같이 공치러 갈 사람을 구하지 못하면 공치러 가고 싶어도 못가는 상황이 여러번 생겼다. 그래서 2023년에는 같이 갈 사람을 구하지 못해도 그냥 혼자 공치러 갔다. 그러다보니 혼자 공치러 간 횟수가 꽤 많다.

개인정보 보호 할 겸 친구들 이름은 A부터 H까지로 대체했다.

혼자 골프 치러 간 횟수가 20번이다. 2023년 전체 42회 라운드 중에 혼자 간 것이 반이다. 나도 참 친구가 없긴하다.

위 차트를 보면 총 합이 42를 넘는다. 왜냐면 몇 명하고는 한 라운드를 같이 돌았기 때문이다. C와 D가 5회로 같은데 C와 D는 따로 같이 골프장에 간 적이 없고 항상 C, D와 같이 골프장을 갔기 때문에 횟수가 같다.

2024년에도 아마 혼자 골프장 가는 횟수가 가장 많을 것 같긴하다.

소스코드

이 글을 작성하면서 차트를 그리려고 파이썬 코딩을 했다. 이 글을 쓰는데 사용한 파이썬 코드는 아래와 같다.

글 쓰는데 필요한 차트를 그리는 것이 목적이므로 코드 자체는 그다지 깔끔하지도 않고 여기저기 중복 코드가 많다. 그러려니 해야 한다.

#!/opt/homebrew/bin/python3

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams
rcParams['font.family'] = 'D2Coding'

source = """
1. 01.29: A, 스프링밸리, 108
2. 02.04: 혼자, 산호세뮤니, 107
3. 02.18: A, 산호세뮤니, 100
4. 02.25: 혼자, 산호세뮤니, 97
5. 03.04: 혼자, 산타테레사, 98
6. 03.11: A, 산호세뮤니, 99
7. 03.18: 혼자, 산타테레사, 100
8. 03.25: 혼자, 산호세뮤니, 94
9. 04.02: 혼자, 스프링밸리, 94
10. 04.08: 혼자, 산타테레사, 104
11. 04.16: 혼자, 산호세뮤니, 100
12. 04.22: 혼자, 산타테레사, 92
13. 04.29: 혼자, 스프링밸리, 101
14. 05.06: 혼자, 스프링밸리, 96
15. 05.13: 혼자, 산호세뮤니, 98
16. 05.20: B C A, 산타테레사, 97
17. 05.27: 혼자, 산타테레사, 108
18. 05.28: 혼자, 베이뷰, 115
19. 06.03: B C A,시나바, 99
20. 07.23: D, 산타테레사, 102
21. 07.29: D, 스프링밸리, 95
22. 08.13: B,C,A, 산타테레사, 94
23. 08.19: 혼자, 산호세뮤니, 104
24. 09.04: 혼자, 델몬트, 104
25. 09.10: A, 베이뷰, 95
26. 09.14: E, 포퓰라크릭, 97
27. 09.23: D, 산타테레사, 104
28. 09.30: D, 산타테레사, 104
29. 10.01: B A C, 씨스케이프, 93
30. 10.08: F, 산호세뮤니, 102
31. 10.15: B A C, 스프링밸리, 97
32. 10.22: D, 서니베일뮤니, 93
33. 10.29: B A C, 서니베일뮤니, 96
34. 11.04: G, 푸룬릿지, 40
35. 11.05: F, 산타테레사, 99
36. 11.25: 혼자, 서니베일뮤니, 102
37. 12.02: G, 푸룬릿지, 42
38. 12.03: 혼자, 산타테레사, 97
39. 12.10: 혼자, 서니베일뮤니, 92
40. 12.17: H, 서니베일뮤니, 91
41. 12.23: 혼자, 서니베일뮤니, 99
42. 12.25: G, 산타테레사, 95
"""

no_regular_par = {"스프링밸리":70, "산타테레사":71, "서니베일뮤니":70, "푸룬릿지":30}

src_list = source.split('\n')
cources = {}

def collect_cource(el):
    d = el.split(',')
    cource_name = d[-2].strip()
    if cource_name in cources:
        cources[cource_name] += 1
    else:
        cources[cource_name] = 1
def chart_cource():
    x = np.arange(len(cources))
    fig, ax = plt.subplots()
    plt.bar(x, cources.values())
    for i in range(len(x)):
        plt.text(i, list(cources.values())[i], list(cources.values())[i], ha = 'center')
    plt.xticks(x, cources.keys(), name='D2Coding')
    plt.show()

score_list = []
def adjust_score(el):
    d = el.split(',')
    score = int(d[-1].strip())
    cource_name = d[-2].strip()
    if cource_name == "푸룬릿지":
        return
    adj = score - 72
    if cource_name in no_regular_par:
        adj = score - no_regular_par[cource_name]
    score_list.append(adj)
def chart_score():
    x = [i for i in range(len(score_list))]
    plt.subplots()
    plt.plot(x, score_list, 'ks', [0, len(score_list)], [score_list[0],score_list[-1]], 'r-', lw=2)
    plt.setp(plt.gca(), xticklabels=[])
    plt.show()

round_date = []
def collect_date(el):
    d = el.split(',')
    cource_name = d[-2].strip()
    if cource_name == "푸룬릿지":
        return
    e = d[0].split(' ')
    p = e[1].strip()[:-1]
    round_date.append(p)

course_score = {"산타테레사":[], "산호세뮤니":[], "스프링밸리":[], "서니베일뮤니":[]}
def collect_course_scroe(el):
    d = el.split(',')
    score = int(d[-1].strip())
    cource_name = d[-2].strip()
    if cource_name in course_score:
        adj = score - 72
        if cource_name in no_regular_par:
            adj = score - no_regular_par[cource_name]
        course_score[cource_name].append(adj)
def chart_course_score():
    plt.subplots()
    for course in course_score:
        x = [i for i in range(len(course_score[course]))]
        plt.plot(x, course_score[course], label=course)
    plt.setp(plt.gca(), xticklabels=[])
    plt.legend(loc="upper right")
    plt.show()

collected_who = {}
def collect_who(el):
    d = el.split(',')
    e = d[0].split(':')
    members = e[-1].strip().split(' ')
    for fr in members:
        if fr in collected_who:
            collected_who[fr] += 1
        else:
            collected_who[fr] = 1
def chart_who():
    x = np.arange(len(collected_who))
    y = collected_who.values()
    fig, ax = plt.subplots()
    plt.bar(x, y)
    for i in range(len(x)):
        plt.text(i, list(y)[i], list(y)[i], ha = 'center')
    plt.xticks(x, collected_who.keys())
    plt.show()


def collecting(func1, func2=None):
    cnt = 0
    for each_round in src_list:
        if len(each_round) == 0:
            continue
        print(each_round)
        func1(each_round)
        if func2 is not None:
            func2(each_round)
        cnt += 1
    return cnt

cnt = collecting(collect_cource)
print("")
print("전체 라운드:", cnt)

print("Course statistics:")
print(cources)
chart_cource()

cnt = collecting(adjust_score, collect_date)
print("Score statistics:")
print(score_list, "--->", len(score_list))
print(round_date, "--->", len(round_date))
chart_score()


cnt = collecting(collect_course_scroe)
print("Course Score:")
print(course_score)
chart_course_score()


cnt = collecting(collect_who)
chart_who()