Colored Pendant Sums - by Color and Cord Value


1. Number of Colored Pendant Pendant Sums - by Color and Cord Value:

Pendant cords that are sums of a set of other pendant cords of the same color, regardless of index, or parent group.

The search for sums limited to pendants of the same color removes the **adjacent cord*- constraint - the requirement that summand cords must be adjacent to each other on the primary cord (ignoring group boundaries). However, it still requires that the summands be on adjacent groups. The resulting Sum X-ray Map of sums is strikingly different.

Colored-Pendant sums are abpout ¼th (37%) (3023/8088) of the number of pendant-pendant sums.

2. Search Criteria:

Here again, there is a balance between precision and recall.

In the never ending struggle to dial it just right, the search is limited to: - Pendant cords with a value of at least 11 - The sum_cord’s knotted_value is greater than the number of summand cords - The summand cords are contiguous for at least two groups (not including 0 cords in-between).

What to do about off-by-one errors, where for example 483 should match 493? Although off-by-one knot errors occur frequently, in this particular study, unlike top cords, Sums are not matched on an off-by-one digit basis and instead an exact numerical match is required. Once again, we are trading off recall for precision.

3. Significance Criteria:

Probably we should set significance based on cord value. For now, we simply look at the number of pendant cords that sum…

4. Summary Results:

Measure Result
Number of Khipus That Match 261 (40%)
Number of Significant Khipus 49 (7%)
Five most Significant Khipu AS069, UR004, UR190, UR022, UR113
XRay Image Quilt Khipu by Colored-Pendant Sum Relationships
Database View Click here

5. Summary Charts:

Code
# Initialize plotly
import plotly
plotly.offline.init_notebook_mode(connected = False);

# Read in the Fieldmark and its associated dataframe and match dictionary
from fieldmark_ascher_colored_pendant_sum import FieldmarkColoredPendantSum
aFieldmark = FieldmarkColoredPendantSum()
fieldmark_dataframe = aFieldmark.dataframes[0].dataframe
raw_match_dict = aFieldmark.raw_match_dict()
Code
import plotly.express as px
import pandas as pd

# Plot Matching khipu
matching_khipus = aFieldmark.matching_khipus() 
matching_values = [raw_match_dict[aKhipuName] for aKhipuName in matching_khipus]
matching_df =  pd.DataFrame(list(zip(matching_khipus, matching_values)), columns =['KhipuName', 'Value'])
fig = px.bar(matching_df, x='KhipuName', y='Value', labels={"KhipuName": "Khipu Name", "Value": "Number of Pendant Pendants by Color Sum Cords", }, 
            title=f"Matching Khipu ({len(matching_khipus)}) for Number of Pendant Pendants by Color Sum Cords",  width=944, height=750).update_layout(showlegend=True).show()
Code
# Plot Significant khipu
significant_khipus = aFieldmark.significant_khipus()
significant_values = [raw_match_dict[aKhipuName] for aKhipuName in significant_khipus]
significant_df =  pd.DataFrame(list(zip(significant_khipus, significant_values)), columns =['KhipuName', 'Value'])
fig = px.bar(significant_df, x='KhipuName', y='Value', labels={"KhipuName": "Khipu Name", "Value": "Number of Pendant Pendants by Color Sum Cords", },
             title=f"Significant Khipu ({len(significant_khipus)}) for Number of Pendant Pendants by Color Sum Cords", width=944, height=750).update_layout(showlegend=True).show()

6. Exploratory Data Analysis:

6.1 Relation between Color Pendant Sums and Pendant Pendant Sum

Is there a relation between color pendant sums, summed by color across groups and pendant pendant sums?

Code
import utils_loom as uloom
import utils_khipu as ukhipu
import qollqa_chuspa as qc
(khipu_dict, all_khipus) = qc.fetch_khipus()

ascher_sum_relations_df = pd.read_csv(f"{ukhipu.fieldmarks_data_directory()}/CSV/ascher_sums_overview.csv")

pendant_pendant_sums_vec = list(ascher_sum_relations_df.num_pendant_pendant_sums.values)
pendant_pendant_color_sums_vec = list(ascher_sum_relations_df.num_colored_pendant_sums.values)
ascher_sum_relations_df.sort_values(by=['num_pendant_pendant_sums'], inplace=True, ascending=False)
fig = px.scatter(ascher_sum_relations_df, y='num_pendant_pendant_sums', x='num_colored_pendant_sums', #log_x=True,
             #size=size_vec, 
             #color='num_pendant_pendant_sum', 
             trendline="ols",
             labels={"num_pendant_pendant_sum": "# Pendant Pendant Sums", "num_colored_pendant_sum": "# Color Pendant Sums"},
             hover_name='kfg_name', hover_data=['num_pendant_pendant_sums', 'num_colored_pendant_sums'], 
             title="Relationship between Pendant Pendant Sums and Colored Pendant Sums", width=944, height=944).update_layout(showlegend=True).show()

Answer: Yes, there is a moderate relationship. An R2 coefficient of 0.57 indicates a reasonable relationship. There are about 70% the number of color pendant sums compared to pendant pendant sums.

6.2 Handedness

As usual, with these types of sum relationships, let’s explore handedness:

Code
sum_cord_df = aFieldmark.dataframes[1].dataframe

left_sum_cord_position_df = sum_cord_df[sum_cord_df.handedness < 0]
right_sum_cord_position_df = sum_cord_df[sum_cord_df.handedness >= 0]
num_left_sums = len(left_sum_cord_position_df) 
num_right_sums = len(right_sum_cord_position_df)
num_total_sums = num_left_sums + num_right_sums

left_pct = round(100.0*float(num_left_sums)/float(num_total_sums))
right_pct = round(100.0*float(num_right_sums)/float(num_total_sums))
print(f"Of {num_total_sums} pendant-pendant colors sums, \n\tthere are {right_pct}%({num_right_sums}) right_handed sums and {left_pct}%({num_left_sums}) left-handed sums")
Of 3061 pendant-pendant colors sums, 
    there are 55%(1679) right_handed sums and 45%(1382) left-handed sums
Code
sum_cord_df = aFieldmark.dataframes[1].dataframe
def handed_color(x): return 0.0 if x < 0 else 1.0
sum_cord_df['handed_color'] = [handed_color(x) for x in sum_cord_df.handedness.values]

plot_title="<b>Pendant(by Color) Sums</b><i style=\"font-size:10pt;\">&nbsp;&nbsp;Size:Num Summand Cords, Red:Left-handed, Blue:Right-handed - Hover to View Khipu/Cord Info</i>"
fig = (px.scatter(sum_cord_df, x="num_summands", y="cord_value", log_y=True,
                 size="num_summands",                   
                 color='handed_color', color_continuous_scale=['#3c3fff', '#ff3030',],
                 labels={"num_summands": "Number of contiguous cords in sum", "cord_value": "Sum Cord Value (Log(y) scale)"},
                 hover_data=['kfg_name','num_summands', 'cord_value'], title=plot_title,
                 width=944, height=944)
        .update_layout(showlegend=False).update(layout_coloraxis_showscale=False).show()
      )
Code
from statistics import mean
handedness_mean = mean(list(sum_cord_df.handedness.values))
plot_title="<b>Handeness of Pendant (by Color) Sums</b><i style=\"font-size:10pt;\">&nbsp;&nbsp;Size:Num Summand Cords, Red is Right-handed - Hover Over Circles to View Khipu/Cord Info</i>"

fig = (px.scatter(sum_cord_df, x="handedness", y="cord_value", log_y=True,
                 size="num_summands", 
                 color='handed_color', color_continuous_scale=['#3c3fff', '#ff3030',],
                 labels={"handedness": f"Handedness - Mean({handedness_mean})", "cord_value": "Cord Value (Log(y) scale)", },
                 hover_data=['kfg_name'], title=plot_title,
                 width=944, height=944)
        .add_vline(x=handedness_mean)
        .update_layout(showlegend=False).update(layout_coloraxis_showscale=False).show()
       )

This distribution is similar to the Pendant Pendant Sum distribution in that the mean is about 0 (here it is -3 due to the outsided influence of UR004). It appears symmetrical in many places, like Pendant Pendant Sums, although less so.

6.3 Position of Sum Cords.

6.3.1 Position of Sum Cords over the Whole Khipu

When looking at the sum relationship image quilt for this fieldmark, it is interesting to note how often right/left-handed relationships have the sum cord close to their respective ends of the khipu. Let’s graph group positions for right/left-handed sums.

Since, the number of cords in a khipu varies, we’ll normalize the sum cord location by dividing by the number of pendant cords.

Code
left_handed_sums_df = sum_cord_df[sum_cord_df.handedness < 0]
right_handed_sums_df = sum_cord_df[sum_cord_df.handedness >= 0] 

left_handed_khipu_names = ukhipu.lexigraphic_order(list(set(left_handed_sums_df.kfg_name.tolist()))) 
right_handed_khipu_names = ukhipu.lexigraphic_order(list(set(right_handed_sums_df.kfg_name.tolist())))

right_handed_locations = []
left_handed_locations = []

for aKhipuName in left_handed_khipu_names:
    num_pendant_cords = float(khipu_dict[aKhipuName].num_pendant_cords())
    left_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=True, right_handed=False)
    normalized_left_handed_sum_cords = [float(ukhipu.pendant_cord_index_from_cord_name(cord.cord_name))/float(num_pendant_cords) for cord in left_handed_sum_cords]
    left_handed_locations.extend(normalized_left_handed_sum_cords)

for aKhipuName in right_handed_khipu_names:
    num_pendant_cords = float(khipu_dict[aKhipuName].num_pendant_cords())   
    right_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=False, right_handed=True)
    normalized_right_handed_sum_cords = [float(ukhipu.pendant_cord_index_from_cord_name(cord.cord_name))/float(num_pendant_cords) for cord in right_handed_sum_cords] 
    right_handed_locations.extend(normalized_right_handed_sum_cords)

left_handed_locations = sorted(left_handed_locations)
right_handed_locations = sorted(right_handed_locations)

fig = px.histogram(pd.DataFrame({'left_handed_locations': left_handed_locations}), x="left_handed_locations", width=944, title="Histogram of Normalized Left Handed Sum Locations for Colored-Pendant Sums").show()
fig = px.histogram(pd.DataFrame({'right_handed_locations': right_handed_locations}), x="right_handed_locations", width=944, title="Histogram of Normalized Right Handed Sum Locations for Colored-Pendant Sums").show()

6.3.2 Position of Sum Cords By Group

In which groups do left-handed and right-handed sums appear? In this examination we will “flip” left-handed sums to count as distance from the right end of the khipu.

Code
left_handed_sums_df = sum_cord_df[sum_cord_df.handedness < 0]
right_handed_sums_df = sum_cord_df[sum_cord_df.handedness >= 0] 

left_handed_khipu_names = ukhipu.lexigraphic_order(list(set(left_handed_sums_df.kfg_name.tolist()))) 
right_handed_khipu_names = ukhipu.lexigraphic_order(list(set(right_handed_sums_df.kfg_name.tolist())))

right_handed_group_locations = []
left_handed_group_locations = []

for aKhipuName in left_handed_khipu_names:
    num_groups = khipu_dict[aKhipuName].num_groups()
    left_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=True, right_handed=False)
    left_handed_sum_cords_group_locations = [(num_groups-1) - aCord.cord_group.position_index for aCord in left_handed_sum_cords]
    left_handed_group_locations.extend(left_handed_sum_cords_group_locations)

for aKhipuName in right_handed_khipu_names:
    right_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=False, right_handed=True)
    right_handed_sum_cords_group_locations = [aCord.cord_group.position_index for aCord in right_handed_sum_cords] 
    right_handed_group_locations.extend(right_handed_sum_cords_group_locations)

right_handed_group_locations = sorted(right_handed_group_locations)
left_handed_group_locations = sorted(left_handed_group_locations)

fig = px.histogram(pd.DataFrame({'left_handed_group_locations': left_handed_group_locations}), x="left_handed_group_locations", 
                   width=944, title="Histogram of Left Handed Sum Group Locations for Colored-Pendant Sums - <b>From Right End of Khipu</b>").show()
fig = px.histogram(pd.DataFrame({'right_handed_group_locations': right_handed_group_locations}), 
                   x="right_handed_group_locations", width=944, title="Histogram of Right Handed Sum Group Locations for Colored-Pendant Sums - <b>From Left End of Khipu</b>").show()

Let’s zoom in on that… Remember that left-handed sums are indexed by the distance from the right, not the left.

Code
right_handed_group_locations = [location for location in right_handed_group_locations if location < 50 ]
left_handed_group_locations = [location for location in left_handed_group_locations if location < 50 ]

fig = (px.histogram(pd.DataFrame({'left_handed_group_locations': left_handed_group_locations}), x="left_handed_group_locations", 
                   width=944, title="Partial Histogram - Left Handed Sum Group Locations - Colored-Pendant Sums")
         .update_layout(xaxis = dict(
                        tickmode = 'linear',
                        tick0 = 0,
                        dtick =5
                        )).show())

fig = (px.histogram(pd.DataFrame({'right_handed_group_locations': right_handed_group_locations}), 
                   x="right_handed_group_locations", width=944, title="Partial Histogram - Right Handed Sum Group Locations - Colored-Pendant Sums")
         .update_layout(xaxis = dict(
                        tickmode = 'linear',
                        tick0 = 0,
                        dtick =5
                        )).show())

OBSERVATIONS:

  • As expected the largest set of Right-handed sum cords are in the first and second groups
  • Right handed sum cords occur about 55% of the time - left handed sums about 45%.

6.3.3 How often Are Colored Pendant Sums Grouped Together on A Group?

It appears, visually, that most sum cords lie together in a group. Is that true? For each khipu what is the percentage of sum that are solitary and non contiguous?

Let’s examine the search space, to see how many sum cords are in a group.

Code
left_handed_sums_df = sum_cord_df[sum_cord_df.handedness < 0]
right_handed_sums_df = sum_cord_df[sum_cord_df.handedness >= 0] 

left_handed_khipu_names = ukhipu.lexigraphic_order(list(set(left_handed_sums_df.kfg_name.tolist()))) 
right_handed_khipu_names = ukhipu.lexigraphic_order(list(set(right_handed_sums_df.kfg_name.tolist())))

right_handed_group_counts = {num_groups : 0 for num_groups in range(1, 31)}
left_handed_group_counts = {num_groups : 0 for num_groups in range(1, 31)}

for aKhipuName in left_handed_khipu_names:
    left_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=True, right_handed=False)
    left_handed_sum_cords_group_locations = sorted([(num_groups-1) - aCord.cord_group.position_index  for aCord in left_handed_sum_cords])
    for aGroupList in uloom.split_list(left_handed_sum_cords_group_locations):
        left_handed_group_counts[len(aGroupList)] = left_handed_group_counts[len(aGroupList)] + 1

for aKhipuName in right_handed_khipu_names:
    right_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=False, right_handed=True)
    right_handed_sum_cords_group_locations = sorted([aCord.cord_group.position_index for aCord in right_handed_sum_cords])
    for aGroupList in uloom.split_list(right_handed_sum_cords_group_locations):
        right_handed_group_counts[len(aGroupList)] = right_handed_group_counts[len(aGroupList)] + 1

left_handed_group_df =  pd.DataFrame(zip(left_handed_group_counts.keys(), left_handed_group_counts.values()), columns =['# Of Sums Per Group', 'Occurences'])
fig = px.bar(left_handed_group_df, x='# Of Sums Per Group', y='Occurences', log_y=True,
             title=f"# of Left-Handed Sums Per Group for Colored Pendant Sums", width=944, height=750).update_layout(showlegend=True).show()

right_handed_group_df =  pd.DataFrame(zip(right_handed_group_counts.keys(), right_handed_group_counts.values()), columns =['# Of Sums Per Group', 'Occurences'])
fig = px.bar(right_handed_group_df, x='# Of Sums Per Group', y='Occurences', log_y=True,
             title=f"# of Right-Handed Sums Per Group for Colored Pendant Sums", width=944, height=750).update_layout(showlegend=True).show()

6.3.4 Position of Sum Cords In A Group

Are sum cords usually the first cord in a group?

Code
left_handed_sums_df = sum_cord_df[sum_cord_df.handedness < 0]
right_handed_sums_df = sum_cord_df[sum_cord_df.handedness >= 0] 

left_handed_khipu_names = ukhipu.lexigraphic_order(list(set(left_handed_sums_df.kfg_name.tolist()))) 
right_handed_khipu_names = ukhipu.lexigraphic_order(list(set(right_handed_sums_df.kfg_name.tolist())))

left_handed_group_cord_index_locations = []
right_handed_group_cord_index_locations = []

for aKhipuName in left_handed_khipu_names:
    left_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=True, right_handed=False)
    group_cord_index_locations = [(aCord.group_index(), aCord.cord_group.num_pendant_cords()) for aCord in left_handed_sum_cords]
    left_handed_group_cord_index_locations.extend(group_cord_index_locations)

for aKhipuName in right_handed_khipu_names:
    right_handed_sum_cords = aFieldmark.sum_cords(khipu_dict[aKhipuName], left_handed=False, right_handed=True)
    group_cord_index_locations = [(aCord.group_index(), aCord.cord_group.num_pendant_cords()) for aCord in right_handed_sum_cords]
    right_handed_group_cord_index_locations.extend(group_cord_index_locations)

left_handed_group_cord_index_locations = sorted(left_handed_group_cord_index_locations, key=lambda x: x[0])
right_handed_group_cord_index_locations = sorted(right_handed_group_cord_index_locations, key=lambda x: x[0])


from collections import Counter
num_left_handed_cords_in_position = Counter([x[0] for x in left_handed_group_cord_index_locations])
left_handed_tuples = [(cord_index, num_pendants, num_left_handed_cords_in_position[cord_index]) for (cord_index, num_pendants) in left_handed_group_cord_index_locations]
left_handed_group_cord_index_locations_df = pd.DataFrame(left_handed_tuples, columns=['cord_group_index', 'num_pendant_cords', 'num_cords_by_index'])
num_right_handed_cords_in_position = Counter([x[0] for x in right_handed_group_cord_index_locations])
right_handed_tuples = [(cord_index, num_pendants, num_right_handed_cords_in_position[cord_index]) for (cord_index, num_pendants) in right_handed_group_cord_index_locations]
right_handed_group_cord_index_locations_df = pd.DataFrame(right_handed_tuples, columns=['cord_group_index', 'num_pendant_cords', 'num_cords_by_index'])

plot_title = "# of Cords by Position in Group for Left-handed Colored-Pendant Sums"
fig = (px.scatter(left_handed_group_cord_index_locations_df, x="num_pendant_cords", y="cord_group_index", log_y=True,
                 color="num_cords_by_index",
                 labels={"num_cords_by_index": "#Cords in Position in Group", "cord_group_index": "Cord Position in Group", "num_pendant_cords": "# of Pendant Cords in Group",},
                 title=plot_title,
                 width=944, height=944)
          .update_layout(showlegend=True).update(layout_coloraxis_showscale=True).show()
       )


plot_title = "# of Cords by Position in Group for Right-handed Colored-Pendant Sums"
fig = (px.scatter(right_handed_group_cord_index_locations_df, x="num_pendant_cords", y="cord_group_index", log_y=True,
                 color="num_cords_by_index",
                 labels={"num_cords_by_index": "#Cords in Position in Group", "cord_group_index": "Cord Position in Group", "num_pendant_cords": "# of Pendant Cords in Group",},
                 title=plot_title,
                 width=944, height=944)
          .update_layout(showlegend=True).update(layout_coloraxis_showscale=True).show()
       )

6.3.5 Color of First Cord in Group

In groups which have a sum cord, what is the first cord color?

Code
grouped_sum_cords = (aFieldmark.group_sum_cords_by_group_index())
lh_color_dict = {}
rh_color_dict = {}
for aGrouped_List in grouped_sum_cords:
    the_khipu = khipu_dict[aGrouped_List['kfg_name']]
    for aGroup in aGrouped_List['lh_cord_reps']:
        first_color = aFieldmark.first_color(the_khipu, aGroup)
        lh_color_dict[first_color] = lh_color_dict.get(first_color, 0) + 1
    for aGroup in aGrouped_List['rh_cord_reps']:
        first_color = aFieldmark.first_color(the_khipu, aGroup)
        rh_color_dict[first_color] = rh_color_dict.get(first_color, 0) + 1

lh_color_df = pd.DataFrame(list(lh_color_dict.items()), columns =['Ascher Color', 'Count']).sort_values(by=['Count'], ascending=False)
rh_color_df = pd.DataFrame(list(rh_color_dict.items()), columns =['Ascher Color', 'Count']).sort_values(by=['Count'], ascending=False)
fig = px.bar(lh_color_df, x='Ascher Color', y='Count', log_y=True,
             title=f"Color Occurence of First Cord in Group for Left-Handed Colored Pendant Sums", width=1244, height=750).update_layout(showlegend=True).show()
fig = px.bar(rh_color_df, x='Ascher Color', y='Count', log_y=True,
             title=f"Color Occurence of First Cord in Group for Right-Handed Colored Pendant Sums", width=1244, height=750).update_layout(showlegend=True).show()

How does this compare to overall khipu pendant color distribution?

Code
all_pendant_color_dict = {}
for aKhipu in all_khipus:
    pendant_cords = aKhipu.pendant_cords()
    for aCord in pendant_cords:
        all_pendant_color_dict[aCord.main_color()] = all_pendant_color_dict.get(aCord.main_color(), 0) + 1
all_pendant_color_dict = uloom.sort_dict_by_values(all_pendant_color_dict)
lh_color_dict = uloom.sort_dict_by_values(lh_color_dict)
rh_color_dict = uloom.sort_dict_by_values(rh_color_dict)
num_pendant_colors = sum(all_pendant_color_dict.values())
num_lh_pendant_colors = sum(lh_color_dict.values())
num_rh_pendant_colors = sum(rh_color_dict.values()) 

print(f"Percent Left-handed sum White cord colors= {uloom.as_percent_string(lh_color_dict['W'], num_lh_pendant_colors)} vs All pendant White cord colors= {uloom.as_percent_string(all_pendant_color_dict['W'], num_pendant_colors)}")
print(f"Percent Right-handed sum White cord colors= {uloom.as_percent_string(rh_color_dict['W'], num_rh_pendant_colors)} vs All pendant White cord colors= {uloom.as_percent_string(all_pendant_color_dict['W'], num_pendant_colors)}")
Percent Left-handed sum White cord colors= 36.5% vs All pendant White cord colors= 25.9%
Percent Right-handed sum White cord colors= 35.8% vs All pendant White cord colors= 25.9%

When looking at the first cord of a sum cord group for colored-pendant sum, chances are close to 36% that it’s white, somewhat higher odds than the overall chances of a white pendant in general (26%). Again, like the similar calculation in pendant-pendant sums, this speaks, albeit softly, in support of the argument that white is a grammatical marker for sums - not as a marker for addition, but as a tag indicating a sum group.

6.4 Colored-Pendant Sum Group Neighbors

Visually, it appears that many sum groups have a 0 value group neighboring them.Let’s see if that’s the case.

Code
num_left_zeros = 0
num_right_zeros = 0
num_both_zeros = 0
num_no_zeros = 0
num_sum_groups = 0

def is_all_zero_pendant_cord_group(aGroup):
    return aGroup and all([cord.knotted_value == 0 for cord in aGroup.pendant_cords()])

for aKhipu in aFieldmark.all_khipus():
    all_sum_groups = uloom.unique(aFieldmark.sum_groups(aKhipu, left_handed=True, right_handed=True))
    num_sum_groups += len(all_sum_groups)
    for sum_group in all_sum_groups:
        the_group_khipu = sum_group.khipu
        is_zero_left_group = is_all_zero_pendant_cord_group(the_group_khipu.left_group_neighbor(sum_group))
        is_zero_right_group = is_all_zero_pendant_cord_group(the_group_khipu.right_group_neighbor(sum_group))
        num_left_zeros += 1 if is_zero_left_group else 0    
        num_right_zeros += 1 if is_zero_right_group else 0
        num_both_zeros += 1 if is_zero_left_group and is_zero_right_group else 0
        num_no_zeros += 1 if (not is_zero_left_group) and (not is_zero_right_group) else 0

print(f"{uloom.as_percent_string(num_left_zeros, num_sum_groups)} of Sum Groups have a 0-sum cord group to their Left")
print(f"{uloom.as_percent_string(num_right_zeros, num_sum_groups)} of Sum Groups have a 0-sum cord group to their Right")
print(f"{uloom.as_percent_string(num_both_zeros, num_sum_groups)} of Sum Groups have a 0-sum cord group on BOTH their Left and Right")
print(f"{uloom.as_percent_string(num_no_zeros, num_sum_groups)} of Sum Groups have a NON-ZERO sum cord group on BOTH their Left and Right")
18.2% of Sum Groups have a 0-sum cord group to their Left
17.7% of Sum Groups have a 0-sum cord group to their Right
12.7% of Sum Groups have a 0-sum cord group on BOTH their Left and Right
76.8% of Sum Groups have a NON-ZERO sum cord group on BOTH their Left and Right

This is an even-stronger case than the pendant-pendant-sum relationship for empty cords bordering a sum group.

7. Conclusions:

The Conclusions are very similar to those of Pendant-Pendant Sums:

  • There is a moderate relationship between Color Pendant Sums and Pendant Pendant Sums (R2 = 0.70).
  • There are about ~75% the number of color pendant sums compared to pendant pendant sums.
  • As expected the largest set of Right-handed sum cords are in the first or second group, first cord position. Many of these come from smaller khipus.
  • Left handed sum cords occur about ⅔ of the time that right handed sum cords occur. 56%(1707) right-handed sums vs 44%(1316) left-handed sums
  • The most common group for a right handed cord is NOT the first group, but instead, the 5th group, the 7th group and then the 13th. Like pendant-pendant-sums, this is also unexpected.
  • Pendant color sum cords group together 60% of the time. This grouping is called a sum group.
  • Sum groups also group together with other sum groups. 70% of Sum Groups have a NON-ZERO sum cord group on BOTH their Left and Right.
  • Sum groups are often bordered by zero-valued cord groups.
  • The use of White, as a first cord color in a group, which occurs 40% of the time (higher than its overall average of 27%) may indicate that it belongs to a sum group.