I have written a code to create a NodeGroup using python inside Blender. NodeGroup and GroupInput and GroupOutput nodes inside NodeGroup are also created successfully. The GroupInput node works fine for creating sockets while the other GroupOutput node throws an error.
import bpy
def back_facing_node_group(name):
#Create NodeGroup
back_facing = bpy.data.node_groups.new(name,'ShaderNodeTree')
#Group input node and its sockets
group_inp = back_facing.nodes.new('NodeGroupInput')
group_inp.outputs.new('NodeSocketColor','Color')
#Group output node and its sockets
group_out = back_facing.nodes.new('NodeGroupOutput')
group_out.inputs.new('NodeSocketColor','Color')
#Group Nodes
geo_node = back_facing.nodes.new('ShaderNodeNewGeometry')
mix_node = back_facing.nodes.new('ShaderNodeMixRGB')
#Group Links
back_facing.links.new(group_inp.outputs['Color'],mix_node.inputs[1])
back_facing.links.new(geo_node.outputs[6], mix_node.inputs[0])
back_facing.links.new(mix_node.outputs[0], group_out.inputs['Color'])
return back_facing
group = bpy.context.object.active_material.node_tree.nodes.new('ShaderNodeGroup')
group.location = -300,200
group.node_tree = back_facing_node_group('Node_group')

